yaml-flow 7.1.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 (386) 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 -3309
  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/{dist/cli → cli}/browser-api/card-store-browser-api.d.ts +1 -2
  8. package/{dist/cli → cli}/browser-api/card-store-browser-api.js +1 -1
  9. package/cli/execution-interface-C_A6WCiK.d.ts +284 -0
  10. package/{dist/cli → cli}/node/artifacts-store-cli.js +2 -2
  11. package/cli/node/batch-runner-cli.js +3 -0
  12. package/cli/node/board-live-cards-cli.js +15 -0
  13. package/{dist/cli → cli}/node/execution-adapter.d.ts +3 -3
  14. package/cli/node/execution-adapter.js +3 -0
  15. package/{dist/cli → cli}/node/fs-board-adapter.d.ts +24 -11
  16. package/cli/node/fs-board-adapter.js +14 -0
  17. package/cli/node/step-machine-cli.d.ts +7 -0
  18. package/cli/node/step-machine-cli.js +5 -0
  19. package/{dist/board-live-cards-public-5n1-syA3.d.cts → cli/types-CziUxkiv.d.ts} +68 -5
  20. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/card-store-ref.json +1 -0
  21. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/chat-handler.json +1 -0
  22. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/outputs-store-ref.json +1 -0
  23. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/task-executor.json +1 -0
  24. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.state-snapshot/board/graph.json +29 -0
  25. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.state-snapshot/board/lastJournalProcessedId.json +1 -0
  26. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime-out/.outputs/status.json +25 -0
  27. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-market-prices/computed_values.json +67 -0
  28. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-portfolio/computed_values.json +1 -0
  29. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-portfolio-value/computed_values.json +52 -0
  30. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/holdings.json +22 -0
  31. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/positions.json +46 -0
  32. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/quotes.json +35 -0
  33. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/status.json +113 -0
  34. package/examples/{example-board → board}/demo-server-config.json +0 -1
  35. package/examples/{example-board → board}/demo-server.js +23 -48
  36. package/examples/{example-board → board}/demo-shell-with-server.html +3 -3
  37. package/examples/{example-board → board}/demo-task-executor.js +71 -24
  38. package/examples/board/gandalf-cards/card-source-kinds.json +36 -0
  39. package/examples/board/gandalf-cards/cards/_index.json +7 -0
  40. package/examples/board/gandalf-cards/cards/card-source-kinds.json +64 -0
  41. package/examples/board/source-def-flows/copilot.flow.json +33 -0
  42. package/examples/board/source-def-flows/mock.flow.json +35 -0
  43. package/examples/board/source-def-flows/url-list.flow.json +33 -0
  44. package/examples/board/source-def-flows/url.flow.json +33 -0
  45. package/examples/board/source-def-flows/workiq.flow.json +34 -0
  46. package/examples/board/source-def-handlers/copilot-source-handler.js +141 -0
  47. package/examples/board/source-def-handlers/http-source-handler.js +145 -0
  48. package/examples/board/source_def_flows.json +249 -0
  49. package/examples/board/test/demo-http-test.js +317 -0
  50. package/examples/{example-board → board-local}/demo-shell-localstorage.html +4 -4
  51. package/examples/{browser/boards/portfolio-tracker → portfolio-tracker/handlers}/portfolio-tracker-fetch-prices.js +1 -1
  52. package/examples/{browser/boards/portfolio-tracker/portfolio-tracker-public.js → portfolio-tracker/portfolio-tracker.js} +11 -14
  53. package/examples/{browser/boards/portfolio-tracker → portfolio-tracker/test}/portfolio-t4.js +32 -50
  54. package/lib/artifacts-store-lib-public-BABrgFkV.d.ts +119 -0
  55. package/lib/artifacts-store-lib-public-DGa8BpJT.d.cts +119 -0
  56. package/lib/artifacts-store-public.cjs +2 -0
  57. package/lib/artifacts-store-public.d.cts +5 -0
  58. package/lib/artifacts-store-public.d.ts +5 -0
  59. package/lib/artifacts-store-public.js +2 -0
  60. package/lib/board-live-cards-node.cjs +14 -0
  61. package/{dist/cli/node/execution-adapter.d.cts → lib/board-live-cards-node.d.cts} +45 -85
  62. package/lib/board-live-cards-node.d.ts +134 -0
  63. package/lib/board-live-cards-node.js +14 -0
  64. package/lib/board-live-cards-public-BnmRAbQV.d.cts +383 -0
  65. package/{dist/board-live-cards-public-CK_J8uv0.d.ts → lib/board-live-cards-public-CsmYrvpd.d.ts} +142 -76
  66. package/lib/board-live-cards-public.cjs +3 -0
  67. package/lib/board-live-cards-public.d.cts +4 -0
  68. package/lib/board-live-cards-public.d.ts +4 -0
  69. package/lib/board-live-cards-public.js +3 -0
  70. package/lib/board-live-cards-server-runtime.cjs +9 -0
  71. package/lib/board-live-cards-server-runtime.d.cts +6 -0
  72. package/lib/board-live-cards-server-runtime.d.ts +6 -0
  73. package/lib/board-live-cards-server-runtime.js +9 -0
  74. package/lib/board-livegraph-runtime/index.cjs +3 -0
  75. package/{dist → lib}/board-livegraph-runtime/index.d.cts +1 -2
  76. package/{dist → lib}/board-livegraph-runtime/index.d.ts +1 -2
  77. package/lib/board-livegraph-runtime/index.js +3 -0
  78. package/{dist/storage-refs.cjs → lib/board-worker-adapter.cjs} +2 -2
  79. package/{dist/storage-refs.d.cts → lib/board-worker-adapter.d.cts} +4 -3
  80. package/{dist/storage-refs.d.ts → lib/board-worker-adapter.d.ts} +4 -3
  81. package/{dist/storage-refs.js → lib/board-worker-adapter.js} +2 -2
  82. package/{dist → lib}/card-compute/index.cjs +1 -1
  83. package/{dist → lib}/card-compute/index.js +1 -1
  84. package/lib/card-store-public.cjs +2 -0
  85. package/lib/card-store-public.d.cts +61 -0
  86. package/lib/card-store-public.d.ts +61 -0
  87. package/lib/card-store-public.js +2 -0
  88. package/lib/card-validation.cjs +10 -0
  89. package/lib/card-validation.d.cts +35 -0
  90. package/lib/card-validation.d.ts +35 -0
  91. package/lib/card-validation.js +10 -0
  92. package/{dist/constants-oCEbNpul.d.ts → lib/constants-BPVLb3Es.d.ts} +1 -1
  93. package/{dist/constants-BzZUyYlp.d.cts → lib/constants-DXxsRN9y.d.cts} +1 -1
  94. package/{dist → lib}/continuous-event-graph/index.cjs +2 -2
  95. package/{dist → lib}/continuous-event-graph/index.d.cts +3 -5
  96. package/{dist → lib}/continuous-event-graph/index.d.ts +3 -5
  97. package/{dist → lib}/continuous-event-graph/index.js +2 -2
  98. package/{dist → lib}/event-graph/index.d.cts +2 -2
  99. package/{dist → lib}/event-graph/index.d.ts +2 -2
  100. package/{dist → lib}/execution-refs.d.cts +29 -10
  101. package/{dist → lib}/execution-refs.d.ts +29 -10
  102. package/lib/index.cjs +25 -0
  103. package/{dist → lib}/index.d.cts +7 -8
  104. package/{dist → lib}/index.d.ts +7 -8
  105. package/lib/index.js +25 -0
  106. package/{dist/live-cards-bridge-BXbVTsna.d.cts → lib/live-cards-bridge-DC_ZU0eS.d.ts} +134 -3
  107. package/{dist/live-cards-bridge-Ds28XR15.d.ts → lib/live-cards-bridge-b25aAVvE.d.cts} +134 -3
  108. package/lib/loader-CuuLjxVA.d.cts +42 -0
  109. package/lib/loader-Zborm2pq.d.ts +42 -0
  110. package/lib/server-runtime/index.cjs +9 -0
  111. package/{dist → lib}/server-runtime/index.d.cts +4 -4
  112. package/{dist → lib}/server-runtime/index.d.ts +4 -4
  113. package/lib/server-runtime/index.js +9 -0
  114. package/lib/step-machine/index.d.cts +64 -0
  115. package/lib/step-machine/index.d.ts +64 -0
  116. package/lib/step-machine-public/index.cjs +5 -0
  117. package/{dist → lib}/step-machine-public/index.d.cts +14 -1
  118. package/{dist → lib}/step-machine-public/index.d.ts +14 -1
  119. package/lib/step-machine-public/index.js +5 -0
  120. package/lib/storage-interface-BhAON-gW.d.cts +84 -0
  121. package/lib/storage-interface-BhAON-gW.d.ts +84 -0
  122. package/lib/stores/index.cjs +3 -0
  123. package/lib/stores/index.d.cts +4 -0
  124. package/lib/stores/index.d.ts +4 -0
  125. package/lib/stores/index.js +3 -0
  126. package/lib/stores/kv.cjs +3 -0
  127. package/lib/stores/kv.d.cts +32 -0
  128. package/lib/stores/kv.d.ts +32 -0
  129. package/lib/stores/kv.js +3 -0
  130. package/{dist → lib}/stores/memory.d.cts +1 -1
  131. package/{dist → lib}/stores/memory.d.ts +1 -1
  132. package/{dist/types-HGDTWIun.d.ts → lib/types-CBxkYuLY.d.ts} +2 -1
  133. package/{dist/types-ycun84cq.d.cts → lib/types-DQ1bKuB1.d.cts} +11 -0
  134. package/{dist/types-ycun84cq.d.ts → lib/types-DQ1bKuB1.d.ts} +11 -0
  135. package/{dist/types-CU3DjTKL.d.cts → lib/types-DkFvgxwq.d.cts} +2 -1
  136. package/package.json +79 -119
  137. package/board-live-cards-cli.js +0 -37
  138. package/browser/board-livecards-client.js.map +0 -1
  139. package/browser/board-livecards-localstorage.js.map +0 -1
  140. package/browser/board-livegraph-engine.js +0 -3
  141. package/browser/board-livegraph-engine.js.map +0 -1
  142. package/browser/card-compute.js +0 -266
  143. package/browser/compute-jsonata.js.map +0 -1
  144. package/card-store.js +0 -37
  145. package/dist/batch/index.cjs.map +0 -1
  146. package/dist/batch/index.js.map +0 -1
  147. package/dist/board-live-cards-lib-Bg6EvCo5.d.cts +0 -136
  148. package/dist/board-live-cards-lib-jM2uYG1v.d.ts +0 -136
  149. package/dist/board-livegraph-runtime/index.cjs +0 -3
  150. package/dist/board-livegraph-runtime/index.cjs.map +0 -1
  151. package/dist/board-livegraph-runtime/index.js +0 -3
  152. package/dist/board-livegraph-runtime/index.js.map +0 -1
  153. package/dist/card-compute/index.cjs.map +0 -1
  154. package/dist/card-compute/index.js.map +0 -1
  155. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +0 -3
  156. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +0 -1
  157. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +0 -37
  158. package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +0 -1
  159. package/dist/cli/browser-api/card-store-browser-api.cjs +0 -2
  160. package/dist/cli/browser-api/card-store-browser-api.cjs.map +0 -1
  161. package/dist/cli/browser-api/card-store-browser-api.d.cts +0 -26
  162. package/dist/cli/browser-api/card-store-browser-api.js.map +0 -1
  163. package/dist/cli/node/artifacts-store-cli.cjs +0 -11
  164. package/dist/cli/node/artifacts-store-cli.cjs.map +0 -1
  165. package/dist/cli/node/artifacts-store-cli.d.cts +0 -8
  166. package/dist/cli/node/artifacts-store-cli.js.map +0 -1
  167. package/dist/cli/node/board-live-cards-cli.cjs +0 -15
  168. package/dist/cli/node/board-live-cards-cli.cjs.map +0 -1
  169. package/dist/cli/node/board-live-cards-cli.d.cts +0 -20
  170. package/dist/cli/node/board-live-cards-cli.js +0 -15
  171. package/dist/cli/node/board-live-cards-cli.js.map +0 -1
  172. package/dist/cli/node/card-store-cli.cjs +0 -8
  173. package/dist/cli/node/card-store-cli.cjs.map +0 -1
  174. package/dist/cli/node/card-store-cli.d.cts +0 -15
  175. package/dist/cli/node/card-store-cli.js.map +0 -1
  176. package/dist/cli/node/execution-adapter.cjs +0 -3
  177. package/dist/cli/node/execution-adapter.cjs.map +0 -1
  178. package/dist/cli/node/execution-adapter.js +0 -3
  179. package/dist/cli/node/execution-adapter.js.map +0 -1
  180. package/dist/cli/node/fs-board-adapter.cjs +0 -14
  181. package/dist/cli/node/fs-board-adapter.cjs.map +0 -1
  182. package/dist/cli/node/fs-board-adapter.d.cts +0 -204
  183. package/dist/cli/node/fs-board-adapter.js +0 -14
  184. package/dist/cli/node/fs-board-adapter.js.map +0 -1
  185. package/dist/cli/node/source-cli-task-executor.cjs +0 -11
  186. package/dist/cli/node/source-cli-task-executor.cjs.map +0 -1
  187. package/dist/cli/node/source-cli-task-executor.js.map +0 -1
  188. package/dist/config/index.cjs.map +0 -1
  189. package/dist/config/index.js.map +0 -1
  190. package/dist/continuous-event-graph/index.cjs.map +0 -1
  191. package/dist/continuous-event-graph/index.js.map +0 -1
  192. package/dist/event-graph/index.cjs.map +0 -1
  193. package/dist/event-graph/index.js.map +0 -1
  194. package/dist/execution-refs.cjs.map +0 -1
  195. package/dist/execution-refs.js.map +0 -1
  196. package/dist/index.cjs +0 -30
  197. package/dist/index.cjs.map +0 -1
  198. package/dist/index.js +0 -30
  199. package/dist/index.js.map +0 -1
  200. package/dist/inference/index.cjs +0 -7
  201. package/dist/inference/index.cjs.map +0 -1
  202. package/dist/inference/index.d.cts +0 -229
  203. package/dist/inference/index.d.ts +0 -229
  204. package/dist/inference/index.js +0 -7
  205. package/dist/inference/index.js.map +0 -1
  206. package/dist/server-runtime/index.cjs +0 -9
  207. package/dist/server-runtime/index.cjs.map +0 -1
  208. package/dist/server-runtime/index.js +0 -9
  209. package/dist/server-runtime/index.js.map +0 -1
  210. package/dist/step-machine/index.cjs.map +0 -1
  211. package/dist/step-machine/index.d.cts +0 -102
  212. package/dist/step-machine/index.d.ts +0 -102
  213. package/dist/step-machine/index.js.map +0 -1
  214. package/dist/step-machine-public/index.cjs +0 -3
  215. package/dist/step-machine-public/index.cjs.map +0 -1
  216. package/dist/step-machine-public/index.js +0 -3
  217. package/dist/step-machine-public/index.js.map +0 -1
  218. package/dist/storage-refs.cjs.map +0 -1
  219. package/dist/storage-refs.js.map +0 -1
  220. package/dist/stores/file.cjs +0 -2
  221. package/dist/stores/file.cjs.map +0 -1
  222. package/dist/stores/file.d.cts +0 -36
  223. package/dist/stores/file.d.ts +0 -36
  224. package/dist/stores/file.js +0 -2
  225. package/dist/stores/file.js.map +0 -1
  226. package/dist/stores/index.cjs +0 -2
  227. package/dist/stores/index.cjs.map +0 -1
  228. package/dist/stores/index.d.cts +0 -4
  229. package/dist/stores/index.d.ts +0 -4
  230. package/dist/stores/index.js +0 -2
  231. package/dist/stores/index.js.map +0 -1
  232. package/dist/stores/localStorage.cjs +0 -2
  233. package/dist/stores/localStorage.cjs.map +0 -1
  234. package/dist/stores/localStorage.d.cts +0 -34
  235. package/dist/stores/localStorage.d.ts +0 -34
  236. package/dist/stores/localStorage.js +0 -2
  237. package/dist/stores/localStorage.js.map +0 -1
  238. package/dist/stores/memory.cjs.map +0 -1
  239. package/dist/stores/memory.js.map +0 -1
  240. package/dist/types-CHSdoAAA.d.cts +0 -135
  241. package/dist/types-CoW0gQl3.d.ts +0 -135
  242. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-fetch-prices.py +0 -201
  243. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +0 -370
  244. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.py +0 -398
  245. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-inference-adapter.js +0 -196
  246. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +0 -300
  247. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +0 -617
  248. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +0 -366
  249. package/examples/browser/livecards-browser/index.html +0 -41
  250. package/examples/browser/step-machine-browser/index.html +0 -367
  251. package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/.runtime-out +0 -1
  252. package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/board-graph.json +0 -32
  253. package/examples/cli/step-machine-cli/portfolio-tracker/cards/holdings-table.json +0 -22
  254. package/examples/cli/step-machine-cli/portfolio-tracker/cards/portfolio-form.json +0 -43
  255. package/examples/cli/step-machine-cli/portfolio-tracker/cards/portfolio-value.json +0 -15
  256. package/examples/cli/step-machine-cli/portfolio-tracker/cards/price-fetch.json +0 -15
  257. package/examples/cli/step-machine-cli/portfolio-tracker/fetch-prices.js +0 -48
  258. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +0 -125
  259. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +0 -32
  260. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +0 -26
  261. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +0 -49
  262. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +0 -25
  263. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +0 -23
  264. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +0 -21
  265. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +0 -38
  266. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +0 -48
  267. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +0 -31
  268. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +0 -107
  269. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +0 -51
  270. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +0 -45
  271. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +0 -71
  272. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/reset-board-dir.py +0 -36
  273. package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-demo.flow.yaml +0 -26
  274. package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-handlers.py +0 -39
  275. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker-pycli.flow.yaml +0 -80
  276. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +0 -76
  277. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +0 -44
  278. package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -43
  279. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker-pycli.py +0 -77
  280. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +0 -28
  281. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +0 -31
  282. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +0 -54
  283. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +0 -21
  284. package/examples/cli/step-machine-demo/step-cli-echo-y.js +0 -15
  285. package/examples/cli/step-machine-demo/step2-double-cli.js +0 -33
  286. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +0 -93
  287. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +0 -43
  288. package/examples/example-board/agent-instructions-cardlayout.md +0 -56
  289. package/examples/example-board/agent-instructions.md +0 -834
  290. package/examples/example-board/demo-shell.html +0 -63
  291. package/examples/index.html +0 -785
  292. package/examples/npm-libs/batch/batch-step-machine.ts +0 -121
  293. package/examples/npm-libs/continuous-event-graph/live-cards-board.ts +0 -215
  294. package/examples/npm-libs/continuous-event-graph/live-portfolio-dashboard.ts +0 -555
  295. package/examples/npm-libs/continuous-event-graph/portfolio-tracker.ts +0 -287
  296. package/examples/npm-libs/continuous-event-graph/reactive-monitoring.ts +0 -265
  297. package/examples/npm-libs/continuous-event-graph/reactive-pipeline.ts +0 -168
  298. package/examples/npm-libs/continuous-event-graph/soc-incident-board.ts +0 -287
  299. package/examples/npm-libs/continuous-event-graph/stock-dashboard.ts +0 -229
  300. package/examples/npm-libs/event-graph/ci-cd-pipeline.ts +0 -243
  301. package/examples/npm-libs/event-graph/executor-diamond.ts +0 -165
  302. package/examples/npm-libs/event-graph/executor-pipeline.ts +0 -161
  303. package/examples/npm-libs/event-graph/research-pipeline.ts +0 -137
  304. package/examples/npm-libs/flows/ai-conversation.yaml +0 -116
  305. package/examples/npm-libs/flows/order-processing.yaml +0 -143
  306. package/examples/npm-libs/flows/simple-greeting.yaml +0 -54
  307. package/examples/npm-libs/graph-of-graphs/multi-stage-etl.ts +0 -307
  308. package/examples/npm-libs/graph-of-graphs/url-processing-pipeline.ts +0 -254
  309. package/examples/npm-libs/inference/azure-deployment.ts +0 -149
  310. package/examples/npm-libs/inference/copilot-cli.ts +0 -138
  311. package/examples/npm-libs/inference/data-pipeline.ts +0 -145
  312. package/examples/npm-libs/inference/pluggable-adapters.ts +0 -254
  313. package/examples/npm-libs/node/ai-conversation.ts +0 -195
  314. package/examples/npm-libs/node/simple-greeting.ts +0 -101
  315. package/examples/step-machine-cli/portfolio-tracker/cards/holdings-table.json +0 -22
  316. package/examples/step-machine-cli/portfolio-tracker/cards/portfolio-form.json +0 -43
  317. package/examples/step-machine-cli/portfolio-tracker/cards/portfolio-value.json +0 -15
  318. package/examples/step-machine-cli/portfolio-tracker/cards/price-fetch.json +0 -15
  319. package/examples/step-machine-cli/portfolio-tracker/fetch-prices.js +0 -48
  320. package/examples/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +0 -57
  321. package/examples/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +0 -27
  322. package/examples/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +0 -25
  323. package/examples/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +0 -29
  324. package/examples/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +0 -27
  325. package/examples/step-machine-cli/portfolio-tracker/handlers/status-cli.js +0 -25
  326. package/examples/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +0 -37
  327. package/examples/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +0 -53
  328. package/examples/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +0 -35
  329. package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker-task-executor.cjs +0 -96
  330. package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +0 -227
  331. package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +0 -38
  332. package/examples/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +0 -28
  333. package/step-machine-cli.js +0 -407
  334. /package/{dist/cli → cli}/browser-api/board-live-cards-browser-adapter.js +0 -0
  335. /package/{dist/board-livegraph-runtime → cli/browser-api}/jsonata-sync.cjs +0 -0
  336. /package/{dist/cli → cli}/node/artifacts-store-cli.d.ts +0 -0
  337. /package/{dist/cli/node/source-cli-task-executor.d.cts → cli/node/batch-runner-cli.d.ts} +0 -0
  338. /package/{dist/cli → cli}/node/board-live-cards-cli.d.ts +0 -0
  339. /package/{dist/cli → cli}/node/card-store-cli.d.ts +0 -0
  340. /package/{dist/cli → cli}/node/card-store-cli.js +0 -0
  341. /package/{dist/card-compute → cli/node}/jsonata-sync.cjs +0 -0
  342. /package/{dist/cli → cli}/node/source-cli-task-executor.d.ts +0 -0
  343. /package/{dist/cli → cli}/node/source-cli-task-executor.js +0 -0
  344. /package/examples/{example-board → board}/cards/card-concentration.json +0 -0
  345. /package/examples/{example-board → board}/cards/card-my-identity.json +0 -0
  346. /package/examples/{example-board → board}/cards/card-portfolio-action.json +0 -0
  347. /package/examples/{example-board → board}/cards/card-portfolio-intelligence.json +0 -0
  348. /package/examples/{example-board → board}/cards/card-portfolio-risks.json +0 -0
  349. /package/examples/{example-board → board}/cards/card-rebalance-impact.json +0 -0
  350. /package/examples/{example-board → board}/cards/card-rebalance-sim.json +0 -0
  351. /package/examples/{example-board → board}/cards/cardT-market-prices.json +0 -0
  352. /package/examples/{example-board → board}/cards/cardT-portfolio-value.json +0 -0
  353. /package/examples/{example-board → board}/cards/cardT-portfolio.json +0 -0
  354. /package/examples/{example-board → board}/demo-chat-handler.js +0 -0
  355. /package/examples/{example-board → board}/scripts/copilot_wrapper.bat +0 -0
  356. /package/examples/{example-board → board}/scripts/copilot_wrapper_helper.ps1 +0 -0
  357. /package/examples/{example-board → board}/scripts/workiq_wrapper.mjs +0 -0
  358. /package/examples/{browser/boards/portfolio-tracker → board/test}/portfolio-tracker-sse-worker.js +0 -0
  359. /package/{dist → lib}/batch/index.cjs +0 -0
  360. /package/{dist → lib}/batch/index.d.cts +0 -0
  361. /package/{dist → lib}/batch/index.d.ts +0 -0
  362. /package/{dist → lib}/batch/index.js +0 -0
  363. /package/{dist/cli/browser-api → lib/board-livegraph-runtime}/jsonata-sync.cjs +0 -0
  364. /package/{dist → lib}/card-compute/index.d.cts +0 -0
  365. /package/{dist → lib}/card-compute/index.d.ts +0 -0
  366. /package/{dist/cli/node → lib/card-compute}/jsonata-sync.cjs +0 -0
  367. /package/{dist → lib}/config/index.cjs +0 -0
  368. /package/{dist → lib}/config/index.d.cts +0 -0
  369. /package/{dist → lib}/config/index.d.ts +0 -0
  370. /package/{dist → lib}/config/index.js +0 -0
  371. /package/{dist → lib}/continuous-event-graph/jsonata-sync.cjs +0 -0
  372. /package/{dist → lib}/event-graph/index.cjs +0 -0
  373. /package/{dist → lib}/event-graph/index.js +0 -0
  374. /package/{dist → lib}/execution-refs.cjs +0 -0
  375. /package/{dist → lib}/execution-refs.js +0 -0
  376. /package/{dist → lib}/jsonata-sync.cjs +0 -0
  377. /package/{dist → lib}/server-runtime/jsonata-sync.cjs +0 -0
  378. /package/{dist → lib}/step-machine/index.cjs +0 -0
  379. /package/{dist → lib}/step-machine/index.js +0 -0
  380. /package/{dist → lib}/step-machine-public/jsonata-sync.cjs +0 -0
  381. /package/{dist → lib}/stores/memory.cjs +0 -0
  382. /package/{dist → lib}/stores/memory.js +0 -0
  383. /package/{dist → lib}/types-BBhqYGhE.d.cts +0 -0
  384. /package/{dist → lib}/types-BBhqYGhE.d.ts +0 -0
  385. /package/{dist → lib}/validate-BAVzUJWa.d.ts +0 -0
  386. /package/{dist → lib}/validate-Dbu7ygys.d.cts +0 -0
@@ -1,5 +1,136 @@
1
- import { L as LiveGraph, S as ScheduleResult, b as LiveGraphSnapshot } from './types-CHSdoAAA.cjs';
2
- import { f as GraphEvent, T as TaskConfig, e as GraphEngineStore, G as GraphConfig } from './types-BBhqYGhE.cjs';
1
+ import { G as GraphConfig, c as ExecutionState, T as TaskConfig, e as GraphEngineStore, f as GraphEvent } from './types-BBhqYGhE.js';
2
+
3
+ /**
4
+ * Continuous Event Graph — Types
5
+ *
6
+ * A long-lived, evolving event-graph where both config and state
7
+ * mutate over time. The single `LiveGraph` type bundles them.
8
+ *
9
+ * Events are shared with event-graph (task-started, task-completed, etc.).
10
+ * Graph mutations (addNode, removeNode, etc.) are unique to this mode.
11
+ */
12
+
13
+ /**
14
+ * The single evolving object for a continuous-mode graph.
15
+ * Bundles config + state so they can't get out of sync.
16
+ */
17
+ interface LiveGraph {
18
+ /** The current graph configuration (evolves as nodes are added/removed) */
19
+ config: GraphConfig;
20
+ /** The current execution state (evolves as events arrive) */
21
+ state: ExecutionState;
22
+ }
23
+ interface ScheduleResult {
24
+ /** Tasks ready to dispatch now — all requires satisfied */
25
+ eligible: string[];
26
+ /** Tasks waiting on tokens that some producer will eventually provide (normal) */
27
+ pending: PendingTask[];
28
+ /** Tasks waiting on tokens that NO task can produce (caller's problem) */
29
+ unresolved: UnresolvedDependency[];
30
+ /** Tasks waiting on tokens whose producer FAILED (caller's problem) */
31
+ blocked: BlockedTask[];
32
+ /** Token conflicts: multiple tasks produce the same token */
33
+ conflicts: Record<string, string[]>;
34
+ }
35
+ interface PendingTask {
36
+ taskName: string;
37
+ /** Tokens this task needs that haven't been produced yet but have a viable producer */
38
+ waitingOn: string[];
39
+ }
40
+ interface UnresolvedDependency {
41
+ taskName: string;
42
+ /** Tokens this task needs that no task in the graph can produce */
43
+ missingTokens: string[];
44
+ }
45
+ interface BlockedTask {
46
+ taskName: string;
47
+ /** Tokens this task needs whose only producer has failed */
48
+ failedTokens: string[];
49
+ /** The tasks that failed and would have produced those tokens */
50
+ failedProducers: string[];
51
+ }
52
+ interface LiveGraphHealth {
53
+ /** Total number of tasks in the graph */
54
+ totalNodes: number;
55
+ /** Task counts by status */
56
+ running: number;
57
+ completed: number;
58
+ failed: number;
59
+ waiting: number;
60
+ notStarted: number;
61
+ /** Number of disabled (inactivated) nodes */
62
+ disabled: number;
63
+ /** Number of tasks with unresolvable dependencies */
64
+ unresolvedCount: number;
65
+ /** Number of tasks whose producer has failed */
66
+ blockedCount: number;
67
+ /** Tokens that no task produces (open dependencies) */
68
+ openDependencies: string[];
69
+ /** Cycles detected in the current graph (if any) */
70
+ cycles: string[][];
71
+ /** Tokens produced by multiple tasks */
72
+ conflictTokens: string[];
73
+ }
74
+ interface NodeInfo {
75
+ /** Node name */
76
+ name: string;
77
+ /** The task configuration */
78
+ config: TaskConfig;
79
+ /** The current runtime state */
80
+ state: GraphEngineStore;
81
+ }
82
+ interface LiveGraphSnapshot {
83
+ /** Schema version for forward compatibility */
84
+ version: number;
85
+ /** The graph config at snapshot time */
86
+ config: GraphConfig;
87
+ /** The execution state at snapshot time */
88
+ state: ExecutionState;
89
+ /** ISO timestamp of when the snapshot was taken */
90
+ snapshotAt: string;
91
+ }
92
+ interface UnreachableTokensResult {
93
+ tokens: {
94
+ /** The token that cannot be produced */
95
+ token: string;
96
+ /** Why it's unreachable */
97
+ reason: 'no-producer' | 'all-producers-failed' | 'transitive';
98
+ /** Tasks that could produce it (but are themselves unreachable/failed) */
99
+ producers: string[];
100
+ }[];
101
+ }
102
+ interface UnreachableNodesResult {
103
+ nodes: {
104
+ /** The node that can never become eligible */
105
+ nodeName: string;
106
+ /** Unreachable tokens this node requires (empty if the node itself is failed/disabled) */
107
+ missingTokens: string[];
108
+ }[];
109
+ }
110
+ interface UpstreamResult {
111
+ /** The target node being inspected */
112
+ nodeName: string;
113
+ /** All upstream nodes that transitively feed into the target */
114
+ nodes: {
115
+ nodeName: string;
116
+ /** Tokens this node provides that are in the dependency chain */
117
+ providesTokens: string[];
118
+ }[];
119
+ /** All tokens in the upstream dependency chain */
120
+ tokens: string[];
121
+ }
122
+ interface DownstreamResult {
123
+ /** The target node being inspected */
124
+ nodeName: string;
125
+ /** All downstream nodes that transitively depend on the target */
126
+ nodes: {
127
+ nodeName: string;
128
+ /** Tokens this node requires that are in the dependency chain */
129
+ requiresTokens: string[];
130
+ }[];
131
+ /** All tokens in the downstream dependency chain */
132
+ tokens: string[];
133
+ }
3
134
 
4
135
  /**
5
136
  * Continuous Event Graph — Schedule
@@ -345,4 +476,4 @@ interface LiveCardsToReactiveResult {
345
476
  */
346
477
  declare function liveCardsToReactiveGraph(input: LiveCard[] | LiveBoard, options?: LiveCardsToReactiveOptions): LiveCardsToReactiveResult;
347
478
 
348
- export { type LiveBoard as L, type ReactiveGraph as R, type TaskHandlerFn as T, type LiveCard as a, type LiveCardsToReactiveOptions as b, type LiveCardsToReactiveResult as c, type ReactiveGraphOptions as d, type TaskHandlerInput as e, type TaskHandlerReturn as f, createReactiveGraph as g, computeDataHash as h, liveCardsToReactiveGraph as l, schedule as s };
479
+ export { type BlockedTask as B, type DownstreamResult as D, type LiveBoard as L, type NodeInfo as N, type PendingTask as P, type ReactiveGraph as R, type ScheduleResult as S, type TaskHandlerFn as T, type UnreachableNodesResult as U, type LiveCard as a, type LiveCardsToReactiveOptions as b, type LiveCardsToReactiveResult as c, type LiveGraph as d, type LiveGraphHealth as e, type LiveGraphSnapshot as f, type ReactiveGraphOptions as g, type TaskHandlerInput as h, type TaskHandlerReturn as i, type UnreachableTokensResult as j, type UnresolvedDependency as k, type UpstreamResult as l, createReactiveGraph as m, liveCardsToReactiveGraph as n, computeDataHash as o, schedule as s };
@@ -1,5 +1,136 @@
1
- import { L as LiveGraph, S as ScheduleResult, b as LiveGraphSnapshot } from './types-CoW0gQl3.js';
2
- import { f as GraphEvent, T as TaskConfig, e as GraphEngineStore, G as GraphConfig } from './types-BBhqYGhE.js';
1
+ import { G as GraphConfig, c as ExecutionState, T as TaskConfig, e as GraphEngineStore, f as GraphEvent } from './types-BBhqYGhE.cjs';
2
+
3
+ /**
4
+ * Continuous Event Graph — Types
5
+ *
6
+ * A long-lived, evolving event-graph where both config and state
7
+ * mutate over time. The single `LiveGraph` type bundles them.
8
+ *
9
+ * Events are shared with event-graph (task-started, task-completed, etc.).
10
+ * Graph mutations (addNode, removeNode, etc.) are unique to this mode.
11
+ */
12
+
13
+ /**
14
+ * The single evolving object for a continuous-mode graph.
15
+ * Bundles config + state so they can't get out of sync.
16
+ */
17
+ interface LiveGraph {
18
+ /** The current graph configuration (evolves as nodes are added/removed) */
19
+ config: GraphConfig;
20
+ /** The current execution state (evolves as events arrive) */
21
+ state: ExecutionState;
22
+ }
23
+ interface ScheduleResult {
24
+ /** Tasks ready to dispatch now — all requires satisfied */
25
+ eligible: string[];
26
+ /** Tasks waiting on tokens that some producer will eventually provide (normal) */
27
+ pending: PendingTask[];
28
+ /** Tasks waiting on tokens that NO task can produce (caller's problem) */
29
+ unresolved: UnresolvedDependency[];
30
+ /** Tasks waiting on tokens whose producer FAILED (caller's problem) */
31
+ blocked: BlockedTask[];
32
+ /** Token conflicts: multiple tasks produce the same token */
33
+ conflicts: Record<string, string[]>;
34
+ }
35
+ interface PendingTask {
36
+ taskName: string;
37
+ /** Tokens this task needs that haven't been produced yet but have a viable producer */
38
+ waitingOn: string[];
39
+ }
40
+ interface UnresolvedDependency {
41
+ taskName: string;
42
+ /** Tokens this task needs that no task in the graph can produce */
43
+ missingTokens: string[];
44
+ }
45
+ interface BlockedTask {
46
+ taskName: string;
47
+ /** Tokens this task needs whose only producer has failed */
48
+ failedTokens: string[];
49
+ /** The tasks that failed and would have produced those tokens */
50
+ failedProducers: string[];
51
+ }
52
+ interface LiveGraphHealth {
53
+ /** Total number of tasks in the graph */
54
+ totalNodes: number;
55
+ /** Task counts by status */
56
+ running: number;
57
+ completed: number;
58
+ failed: number;
59
+ waiting: number;
60
+ notStarted: number;
61
+ /** Number of disabled (inactivated) nodes */
62
+ disabled: number;
63
+ /** Number of tasks with unresolvable dependencies */
64
+ unresolvedCount: number;
65
+ /** Number of tasks whose producer has failed */
66
+ blockedCount: number;
67
+ /** Tokens that no task produces (open dependencies) */
68
+ openDependencies: string[];
69
+ /** Cycles detected in the current graph (if any) */
70
+ cycles: string[][];
71
+ /** Tokens produced by multiple tasks */
72
+ conflictTokens: string[];
73
+ }
74
+ interface NodeInfo {
75
+ /** Node name */
76
+ name: string;
77
+ /** The task configuration */
78
+ config: TaskConfig;
79
+ /** The current runtime state */
80
+ state: GraphEngineStore;
81
+ }
82
+ interface LiveGraphSnapshot {
83
+ /** Schema version for forward compatibility */
84
+ version: number;
85
+ /** The graph config at snapshot time */
86
+ config: GraphConfig;
87
+ /** The execution state at snapshot time */
88
+ state: ExecutionState;
89
+ /** ISO timestamp of when the snapshot was taken */
90
+ snapshotAt: string;
91
+ }
92
+ interface UnreachableTokensResult {
93
+ tokens: {
94
+ /** The token that cannot be produced */
95
+ token: string;
96
+ /** Why it's unreachable */
97
+ reason: 'no-producer' | 'all-producers-failed' | 'transitive';
98
+ /** Tasks that could produce it (but are themselves unreachable/failed) */
99
+ producers: string[];
100
+ }[];
101
+ }
102
+ interface UnreachableNodesResult {
103
+ nodes: {
104
+ /** The node that can never become eligible */
105
+ nodeName: string;
106
+ /** Unreachable tokens this node requires (empty if the node itself is failed/disabled) */
107
+ missingTokens: string[];
108
+ }[];
109
+ }
110
+ interface UpstreamResult {
111
+ /** The target node being inspected */
112
+ nodeName: string;
113
+ /** All upstream nodes that transitively feed into the target */
114
+ nodes: {
115
+ nodeName: string;
116
+ /** Tokens this node provides that are in the dependency chain */
117
+ providesTokens: string[];
118
+ }[];
119
+ /** All tokens in the upstream dependency chain */
120
+ tokens: string[];
121
+ }
122
+ interface DownstreamResult {
123
+ /** The target node being inspected */
124
+ nodeName: string;
125
+ /** All downstream nodes that transitively depend on the target */
126
+ nodes: {
127
+ nodeName: string;
128
+ /** Tokens this node requires that are in the dependency chain */
129
+ requiresTokens: string[];
130
+ }[];
131
+ /** All tokens in the downstream dependency chain */
132
+ tokens: string[];
133
+ }
3
134
 
4
135
  /**
5
136
  * Continuous Event Graph — Schedule
@@ -345,4 +476,4 @@ interface LiveCardsToReactiveResult {
345
476
  */
346
477
  declare function liveCardsToReactiveGraph(input: LiveCard[] | LiveBoard, options?: LiveCardsToReactiveOptions): LiveCardsToReactiveResult;
347
478
 
348
- export { type LiveBoard as L, type ReactiveGraph as R, type TaskHandlerFn as T, type LiveCard as a, type LiveCardsToReactiveOptions as b, type LiveCardsToReactiveResult as c, type ReactiveGraphOptions as d, type TaskHandlerInput as e, type TaskHandlerReturn as f, createReactiveGraph as g, computeDataHash as h, liveCardsToReactiveGraph as l, schedule as s };
479
+ export { type BlockedTask as B, type DownstreamResult as D, type LiveBoard as L, type NodeInfo as N, type PendingTask as P, type ReactiveGraph as R, type ScheduleResult as S, type TaskHandlerFn as T, type UnreachableNodesResult as U, type LiveCard as a, type LiveCardsToReactiveOptions as b, type LiveCardsToReactiveResult as c, type LiveGraph as d, type LiveGraphHealth as e, type LiveGraphSnapshot as f, type ReactiveGraphOptions as g, type TaskHandlerInput as h, type TaskHandlerReturn as i, type UnreachableTokensResult as j, type UnresolvedDependency as k, type UpstreamResult as l, createReactiveGraph as m, liveCardsToReactiveGraph as n, computeDataHash as o, schedule as s };
@@ -0,0 +1,42 @@
1
+ import { e as StepFlowConfig, g as StepHandler, i as StepMachineOptions, d as StepEventType, c as StepEventListener, j as StepMachineResult } from './types-DQ1bKuB1.cjs';
2
+
3
+ /**
4
+ * Step Machine — Convenience Driver Class
5
+ *
6
+ * Wraps the pure reducer with a run loop and store I/O.
7
+ * This is the framework layer. The reducer is the pure core.
8
+ */
9
+
10
+ declare class StepMachine {
11
+ private flow;
12
+ private handlers;
13
+ private store;
14
+ private components;
15
+ private options;
16
+ private listeners;
17
+ private aborted;
18
+ constructor(flow: StepFlowConfig, handlers: Record<string, StepHandler>, options?: StepMachineOptions);
19
+ private validateFlow;
20
+ on(eventType: StepEventType, listener: StepEventListener): void;
21
+ off(eventType: StepEventType, listener: StepEventListener): void;
22
+ private emit;
23
+ private sleep;
24
+ run(initialData?: Record<string, unknown>): Promise<StepMachineResult>;
25
+ resume(runId: string): Promise<StepMachineResult>;
26
+ pause(runId: string): Promise<void>;
27
+ private executeLoop;
28
+ }
29
+ /** Convenience factory */
30
+ declare function createStepMachine(flow: StepFlowConfig, handlers: Record<string, StepHandler>, options?: StepMachineOptions): StepMachine;
31
+
32
+ /**
33
+ * Step Machine — Loader
34
+ *
35
+ * Utilities for loading and validating step-machine flow configurations.
36
+ */
37
+
38
+ declare function parseStepFlowYaml(yamlString: string): Promise<StepFlowConfig>;
39
+ declare function validateStepFlowConfig(flow: unknown): string[];
40
+ declare function loadStepFlow(source: string | StepFlowConfig): Promise<StepFlowConfig>;
41
+
42
+ export { StepMachine as S, createStepMachine as c, loadStepFlow as l, parseStepFlowYaml as p, validateStepFlowConfig as v };
@@ -0,0 +1,42 @@
1
+ import { e as StepFlowConfig, g as StepHandler, i as StepMachineOptions, d as StepEventType, c as StepEventListener, j as StepMachineResult } from './types-DQ1bKuB1.js';
2
+
3
+ /**
4
+ * Step Machine — Convenience Driver Class
5
+ *
6
+ * Wraps the pure reducer with a run loop and store I/O.
7
+ * This is the framework layer. The reducer is the pure core.
8
+ */
9
+
10
+ declare class StepMachine {
11
+ private flow;
12
+ private handlers;
13
+ private store;
14
+ private components;
15
+ private options;
16
+ private listeners;
17
+ private aborted;
18
+ constructor(flow: StepFlowConfig, handlers: Record<string, StepHandler>, options?: StepMachineOptions);
19
+ private validateFlow;
20
+ on(eventType: StepEventType, listener: StepEventListener): void;
21
+ off(eventType: StepEventType, listener: StepEventListener): void;
22
+ private emit;
23
+ private sleep;
24
+ run(initialData?: Record<string, unknown>): Promise<StepMachineResult>;
25
+ resume(runId: string): Promise<StepMachineResult>;
26
+ pause(runId: string): Promise<void>;
27
+ private executeLoop;
28
+ }
29
+ /** Convenience factory */
30
+ declare function createStepMachine(flow: StepFlowConfig, handlers: Record<string, StepHandler>, options?: StepMachineOptions): StepMachine;
31
+
32
+ /**
33
+ * Step Machine — Loader
34
+ *
35
+ * Utilities for loading and validating step-machine flow configurations.
36
+ */
37
+
38
+ declare function parseStepFlowYaml(yamlString: string): Promise<StepFlowConfig>;
39
+ declare function validateStepFlowConfig(flow: unknown): string[];
40
+ declare function loadStepFlow(source: string | StepFlowConfig): Promise<StepFlowConfig>;
41
+
42
+ export { StepMachine as S, createStepMachine as c, loadStepFlow as l, parseStepFlowYaml as p, validateStepFlowConfig as v };
@@ -0,0 +1,9 @@
1
+ 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Bt="b64:";function Qe(t){let e=new TextEncoder().encode(t),n=globalThis.Buffer,r;if(n)r=n.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);r=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Ze(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),n=globalThis.Buffer;if(n)return n.from(e,"base64").toString("utf8");if(typeof atob=="function"){let r=atob(e),o=new Uint8Array(r.length);for(let s=0;s<r.length;s+=1)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ht(t){return `${Bt}${Qe(JSON.stringify(t))}`}function ae(t){if(!t.startsWith(Bt))throw new Error(`Invalid ref format (expected ${Bt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(Ze(t.slice(Bt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!e||typeof e!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let n=e;if(typeof n.kind!="string"||typeof n.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:n.kind,value:n.value}}async function ie(t,e,n){let r=t.tryAcquire();if(!r)return false;try{await e();}finally{r();}return n?.(),true}var yt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ot(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function kt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ue(t){return t.tasks??{}}function Yt(t){return t?t.status===yt.FAILED||t.status===yt.INACTIVATED:false}function ce(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function de(t){return t.maxExecutions}function le(t,e){let n=new Set;for(let[r,o]of Object.entries(e))if(o.status===yt.COMPLETED){let s=t.tasks[r];s&&ot(s).forEach(u=>n.add(u));}return Array.from(n)}function fe(t,e){let n={};return t.forEach(r=>{let o=e[r];if(!o)return;ot(o).forEach(i=>{n[i]||(n[i]=[]),n[i].push(r);});}),n}function pe(t,e,n){let r=t.tasks[e]??Pt(),o={};if(n){let i=n.tasks[e],u=kt(i);for(let f of u)for(let[x,D]of Object.entries(n.tasks))if(ot(D).includes(f)){let C=t.tasks[x];C?.lastDataHash&&(o[f]=C.lastDataHash);break}}let s={...r,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function ge(t,e,n,r,o,s){let i=t.tasks[n]??Pt(),u=e.tasks[n];if(!u)throw new Error(`Task "${n}" not found in graph`);let f;r&&u.on&&u.on[r]?f=u.on[r]:f=ot(u);let x=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let j=u.requires??[];for(let w of j)for(let[g,y]of Object.entries(e.tasks))if(ot(y).includes(w)){let v=t.tasks[g];v?.lastDataHash&&(x[w]=v.lastDataHash);break}}let D={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:x,error:void 0},C=[...new Set([...t.availableOutputs,...f])];return {...t,tasks:{...t.tasks,[n]:D},availableOutputs:C,lastUpdated:new Date().toISOString()}}function me(t,e,n,r){let o=t.tasks[n]??Pt(),s=e.tasks[n];if(s?.retry){let f=o.retryCount+1;if(f<=s.retry.max_attempts){let x={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:r};return {...t,tasks:{...t.tasks,[n]:x},lastUpdated:new Date().toISOString()}}}let i={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:r,executionCount:o.executionCount+1},u=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(u=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&i.executionCount>=s.circuit_breaker.max_executions){let f=s.circuit_breaker.on_break;u=[...new Set([...u,...f])];}return {...t,tasks:{...t.tasks,[n]:i},availableOutputs:u,lastUpdated:new Date().toISOString()}}function he(t,e,n,r){let o=t.tasks[e]??Pt(),s={...o,progress:typeof r=="number"?r:o.progress,messages:[...o.messages??[],...n?[{message:n,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function ye(t,e){let n=t.tasks[e];if(!n)return t;let r={...n,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:r},lastUpdated:new Date().toISOString()}}function Pt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Lt(t,e){let n=`live-${Date.now()}`,r={};for(let s of Object.keys(t.tasks))r[s]=Se();let o={status:"running",tasks:r,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:n,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function tn(t,e){let{config:n,state:r}=t;if("executionId"in e&&e.executionId&&e.executionId!==r.executionId)return t;switch(e.type){case "task-started":return {config:n,state:pe(r,e.taskName,n)};case "task-completed":return {config:n,state:ge(r,n,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:n,state:me(r,n,e.taskName,e.error)};case "task-progress":return {config:n,state:he(r,e.taskName,e.message,e.progress)};case "task-restart":return {config:n,state:ye(r,e.taskName)};case "inject-tokens":return {config:n,state:{...r,availableOutputs:[...new Set([...r.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:n,state:un(r,e.action)};case "task-upsert":return en(t,e.taskName,e.taskConfig);case "task-removal":return nn(t,e.taskName);case "node-requires-add":return rn(t,e.nodeName,e.tokens);case "node-requires-remove":return on(t,e.nodeName,e.tokens);case "node-provides-add":return sn(t,e.nodeName,e.tokens);case "node-provides-remove":return an(t,e.nodeName,e.tokens);default:return t}}function ke(t,e){return e.reduce((n,r)=>tn(n,r),t)}function en(t,e,n){let r=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:n}},state:{...t.state,tasks:{...t.state.tasks,[e]:r?t.state.tasks[e]:Se()},lastUpdated:new Date().toISOString()}}}function nn(t,e){if(!t.config.tasks[e])return t;let{[e]:n,...r}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:r},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function rn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=kt(r),s=n.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:[...o,...s]}}},state:t.state}}function on(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=kt(r),s=o.filter(i=>!n.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:s}}},state:t.state}}function sn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ot(r),s=n.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:[...o,...s]}}},state:t.state}}function an(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ot(r),s=o.filter(i=>!n.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:s}}},state:t.state}}function Tt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function qt(t){if(!t||typeof t!="object")throw new Error("Invalid snapshot: expected an object");let e=t;if(!e.config||typeof e.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!e.state||typeof e.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let n=e.config,r=e.state;if(!n.settings||typeof n.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(r.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:n,state:r}}function Se(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function un(t,e){let n=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:n};case "pause":return {...t,status:"paused",lastUpdated:n};case "resume":return {...t,status:"running",lastUpdated:n};default:return t}}function It(t){let{config:e,state:n}=t,r=ue(e);if(Object.keys(r).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=cn(r),i=le(e,n.tasks),u=new Set([...i,...n.availableOutputs]),f=[],x=[],D=[],C=[];for(let[w,g]of Object.entries(r)){let y=n.tasks[w],v=ce(g,e.settings),E=v!=="once";if(y?.status===yt.RUNNING||Yt(y))continue;let m=de(g);if(m!==void 0&&y&&y.executionCount>=m||g.circuit_breaker&&y&&y.executionCount>=g.circuit_breaker.max_executions||!E&&y?.status===yt.COMPLETED)continue;if(E&&y?.status===yt.COMPLETED){let T=kt(g),N=false;switch(v){case "data-changed":{T.length>0&&T.some(M=>{for(let[K,X]of Object.entries(r))if(ot(X).includes(M)){let W=n.tasks[K];if(!W)continue;let St=y.lastConsumedHashes?.[M];return W.lastDataHash==null?W.executionCount>y.lastEpoch:W.lastDataHash!==St}return false})||(N=true);break}case "epoch-changed":{T.length>0&&T.some(M=>{for(let[K,X]of Object.entries(r))if(ot(X).includes(M)){let W=n.tasks[K];if(W&&W.executionCount>y.lastEpoch)return true}return false})||(N=true);break}case "time-based":{let U=g.refreshInterval??0;if(U<=0){N=true;break}let M=y.completedAt;if(!M){N=true;break}(Date.now()-Date.parse(M))/1e3<U&&(N=true);break}case "manual":N=true;break}if(N)continue}let A=kt(g);if(A.length===0){f.push(w);continue}let B=[],q=[],G=[];for(let T of A){if(u.has(T))continue;let N=s[T]||[];N.length===0?B.push(T):N.every(M=>Yt(n.tasks[M]))?G.push({token:T,failedProducer:N[0]}):q.push(T);}B.length>0?D.push({taskName:w,missingTokens:B}):G.length>0?C.push({taskName:w,failedTokens:G.map(T=>T.token),failedProducers:[...new Set(G.map(T=>T.failedProducer))]}):q.length>0?x.push({taskName:w,waitingOn:q}):f.push(w);}let j={};if(f.length>1){let w=fe(f,r);for(let[g,y]of Object.entries(w))y.length>1&&(j[g]=y);}return {eligible:f,pending:x,unresolved:D,blocked:C,conflicts:j}}function cn(t){let e={};for(let[n,r]of Object.entries(t)){for(let o of ot(r))e[o]||(e[o]=[]),e[o].push(n);if(r.on)for(let o of Object.values(r.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(n)||e[s].push(n);if(r.on_failure)for(let o of r.on_failure)e[o]||(e[o]=[]),e[o].includes(n)||e[o].push(n);}return e}var Ot=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function Xt(t){let e=Wt(t);return dn(e)}function Wt(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(Wt).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+Wt(e[r])).join(",")+"}"}function dn(t){let e=0xcbf29ce484222325n,n=0x100000001b3n,r=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*n&r;return e.toString(16).padStart(16,"0")}function ln(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),n="";for(let r of e)n+=String.fromCharCode(r);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function fn(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=new Uint8Array(r.length);for(let s=0;s<r.length;s++)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Re(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return ln(e)}function pn(t){try{let e=JSON.parse(fn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ce(t,e,n){let{handlers:r,onDrain:o}=e,s=new Ot,i="state"in t&&"config"in t?t:Lt(t),u=false,f=new Set,x=new Map(Object.entries(r)),D=new Ot,C=false,j=false;function w(){if(!u){if(C){j=true;return}C=true;try{do j=!1,g();while(j)}finally{C=false;}}}function g(){let m=D.drain(),A=s.drain(),B=[...m,...A];B.length>0&&(i=ke(i,B));let q=It(i);B.length>0&&o?.(B,i,q);for(let G of q.eligible)E(G);for(let G of B)if(G.type==="task-progress"){let{taskName:T,update:N}=G;if(!i.config.tasks[T])continue;let M=i.state.tasks[T];if(!M||M.status!=="running")continue;let K=Re(T),X=v(T,K,N).catch(W=>{u||(D.append({type:"task-failed",taskName:T,error:W.message??String(W),timestamp:new Date().toISOString()}),w());}).finally(()=>{f.delete(X);});f.add(X);}}function y(m){let B=i.config.tasks[m].requires??[],q=new Map;for(let[T,N]of Object.entries(i.config.tasks))for(let U of N.provides??[])q.set(U,T);let G={};for(let T of B){let N=q.get(T);N?G[T]=i.state.tasks[N]?.data:G[T]=void 0;}return G}async function v(m,A,B){let q=i.config.tasks[m],G=q.taskHandlers??[],T=y(m);for(let N of G){let U=x.get(N);if(!U)throw new Error(`Handler '${N}' not found in registry (task '${m}')`);let M={nodeId:m,state:T,taskState:i.state.tasks[m],config:q,callbackToken:A,update:B};if(await U(M)==="task-initiate-failure")throw new Error(`Handler '${N}' returned task-initiate-failure (task '${m}')`)}}function E(m){let B=i.config.tasks[m]?.taskHandlers;if(!B||B.length===0)return;D.append({type:"task-started",taskName:m,timestamp:new Date().toISOString()}),w();let q=Re(m),G=v(m,q).catch(T=>{u||(D.append({type:"task-failed",taskName:m,error:T.message??String(T),timestamp:new Date().toISOString()}),w());}).finally(()=>{f.delete(G);});f.add(G);}return {push(m){u||(m.type==="task-completed"&&m.data&&!m.dataHash&&(m={...m,dataHash:Xt(m.data)}),s.append(m),w());},pushAll(m){if(!u){for(let A of m)A.type==="task-completed"&&A.data&&!A.dataHash?s.append({...A,dataHash:Xt(A.data)}):s.append(A);w();}},resolveCallback(m,A,B){if(u)return;let q=pn(m);if(!q)return;let{taskName:G}=q;if(i.config.tasks[G]){if(B&&B.length>0)s.append({type:"task-failed",taskName:G,error:B.join("; "),timestamp:new Date().toISOString()});else {let T=A&&Object.keys(A).length>0?Xt(A):void 0;s.append({type:"task-completed",taskName:G,data:A,dataHash:T,timestamp:new Date().toISOString()});}w();}},addNode(m,A){u||(s.append({type:"task-upsert",taskName:m,taskConfig:A,timestamp:new Date().toISOString()}),w());},removeNode(m){u||(s.append({type:"task-removal",taskName:m,timestamp:new Date().toISOString()}),w());},addRequires(m,A){u||(s.append({type:"node-requires-add",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),w());},removeRequires(m,A){u||(s.append({type:"node-requires-remove",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),w());},addProvides(m,A){u||(s.append({type:"node-provides-add",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),w());},removeProvides(m,A){u||(s.append({type:"node-provides-remove",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),w());},registerHandler(m,A){x.set(m,A);},unregisterHandler(m){x.delete(m);},retrigger(m){u||i.config.tasks[m]&&(s.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()}),w());},retriggerAll(m){if(!u){for(let A of m)i.config.tasks[A]&&s.append({type:"task-restart",taskName:A,timestamp:new Date().toISOString()});w();}},snapshot(){return Tt(i)},getState(){return i},getSchedule(){return It(i)},async waitForHandlers(){f.size>0&&await Promise.allSettled([...f]);},async dispose(m){m?.wait&&f.size>0&&await Promise.allSettled([...f]),u=true;}}}var mn=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));mn("./jsonata-sync.cjs");var yn=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),Gt=yn("./jsonata-sync.cjs"),ve=Gt;function be(t,e){if(!e||!t)return;let n=e.split("."),r=t;for(let o=0;o<n.length;o++){if(r==null)return;r=r[n[o]];}return r}function xe(t,e,n){let r=e.split("."),o=t;for(let s=0;s<r.length-1;s++)(o[r[s]]==null||typeof o[r[s]]!="object")&&(o[r[s]]={}),o=o[r[s]];o[r[r.length-1]]=n;}async function kn(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await Gt(o.expr).evaluate(r);xe(t.computed_values,o.bindTo,s),r.computed_values=t.computed_values;}catch{}return t}function Sn(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let i=ve(s.expr).evaluate(r);xe(t.computed_values,s.bindTo,i),r.computed_values=t.computed_values;}catch(i){let u=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:u});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function Rn(t,e,n){let r={...n??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return Gt(t).evaluate(r)}function Cn(t,e){return e.startsWith("fetched_sources.")?be(t._sourcesData??{},e.slice(16)):be(t,e)}var we=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),bn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function wn(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let n=t;(typeof n.id!="string"||!n.id)&&e.push("id: required, must be a non-empty string");for(let r of Object.keys(n))bn.has(r)||e.push(`Unknown top-level key: "${r}"`);if((n.card_data==null||typeof n.card_data!="object"||Array.isArray(n.card_data))&&e.push("card_data: required, must be an object"),n.meta!=null)if(typeof n.meta!="object"||Array.isArray(n.meta))e.push("meta: must be an object");else {let r=n.meta;r.title!=null&&typeof r.title!="string"&&e.push("meta.title: must be a string"),r.tags!=null&&!Array.isArray(r.tags)&&e.push("meta.tags: must be an array");}if(n.requires!=null&&!Array.isArray(n.requires)&&e.push("requires: must be an array of strings"),n.provides!=null&&(Array.isArray(n.provides)?n.provides.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=r;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),n.compute!=null&&(Array.isArray(n.compute)?n.compute.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`compute[${o}]: must be a compute step object`);else {let s=r;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),n.source_defs!=null)if(!Array.isArray(n.source_defs))e.push("source_defs: must be an array");else {let r=new Set,o=new Set;n.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${i}]: must be an object`);else {let u=s;typeof u.bindTo!="string"||!u.bindTo?e.push(`source_defs[${i}]: missing required "bindTo" property`):(r.has(u.bindTo)&&e.push(`source_defs[${i}]: bindTo "${u.bindTo}" is not unique across source_defs`),r.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?e.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(u.outputFile)&&e.push(`source_defs[${i}]: outputFile "${u.outputFile}" is not unique across source_defs`),o.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(n.view!=null)if(typeof n.view!="object"||Array.isArray(n.view))e.push("view: must be an object");else {let r=n.view;!Array.isArray(r.elements)||r.elements.length===0?e.push("view.elements: required, must be a non-empty array"):r.elements.forEach((o,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):we.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...we].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),r.layout!=null&&(typeof r.layout!="object"||Array.isArray(r.layout))&&e.push("view.layout: must be an object"),r.features!=null&&(typeof r.features!="object"||Array.isArray(r.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function vn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,i]of Object.entries(r.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await Gt(i).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function xn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return t.map(r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,i]of Object.entries(r.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=ve(i).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}})}var jt={run:kn,runSync:Sn,eval:Rn,resolve:Cn,validate:wn,enrichSources:vn,enrichSourcesSync:xn};function Qt(t){return JSON.stringify(t)}function Zt(t){let e;try{e=JSON.parse(t);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${t}`)}if(typeof e!="object"||e===null||typeof e.howToRun!="string"||typeof e.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${t}`);return e}function Vt(t,e){function n(){return t.readIndex()??{}}function r(o,s,i){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return i&&typeof i=="object"&&!Array.isArray(i)?i:{value:i};let f={...o},x=f;for(let D=0;D<u.length-1;D++){let C=u[D],j=x[C],w=j&&typeof j=="object"&&!Array.isArray(j)?{...j}:{};x[C]=w,x=w;}return x[u[u.length-1]]=i,f}return {readCard(o){let s=n()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return n()[o]?.key??null},readAllCards(){let o=[];for(let[s,i]of Object.entries(n())){if(!t.cardExists(i.key))continue;let u=t.readCard(i.key);u?o.push(u):e?.(`[card-store] could not read card "${s}" at key "${i.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,i]of Object.entries(n()))o[s]=i.checksum;return o},changedSince(o){let s=n(),i=[];for(let[u,f]of Object.entries(s))o[u]!==f.checksum&&i.push(u);for(let u of Object.keys(o))s[u]||i.push(u);return i},validateUpsert(o,s){let i=n(),u=i[o],f=Object.entries(i).find(([,x])=>x.key===s);return u&&u.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:f&&f[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${f[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,i){let u=n(),f=i??u[o]?.key??t.defaultCardKey(o),x=t.writeCard(f,s);u[o]={key:f,checksum:x,updatedAt:new Date().toISOString()},t.writeIndex(u);},patchCard(o,s,i){let u=n(),f=u[o];if(!f||!t.cardExists(f.key))throw new Error(`card "${o}" not found`);let x=t.readCard(f.key);if(!x||typeof x!="object"||Array.isArray(x))throw new Error(`card "${o}" is not patchable`);let D=r(x,s,i),C=t.writeCard(f.key,D);u[o]={key:f.key,checksum:C,updatedAt:new Date().toISOString()},t.writeIndex(u);},removeCard(o){let s=n();s[o]&&(delete s[o],t.writeIndex(s));},readIndex(){return n()}}}function te(t,e){return {readSourceData(n,r){let o=t.read(`${n}/${r}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(n,r,o,s){let i=e(o);t.write(`${n}/.staged/${s}/${r}`,i);},commitSourceData(n,r,o){let s=`${n}/.staged/${o}/${r}`,i=t.read(s);return i==null?false:(t.write(`${n}/${r}`,i),t.remove(s),true)},hasSource(n,r){return t.exists(`${n}/${r}`)}}}function Ee(t){function e(n){let r=t.readAllEntries();if(!n)return r;let o=r.findIndex(s=>s.id===n);return o===-1?r:r.slice(o+1)}return {readEntriesAfterCursor(n){let r=e(n);return r.length===0?{events:[],newCursor:n}:{events:r.map(o=>o.event),newCursor:r[r.length-1].id}},pendingCount(n){return e(n).length},appendEvent(n){t.appendEntry({id:t.generateId(),event:n});}}}function Te(t,e){return {appendEntries(n,r){if(!n||r.length===0)return;let o=t.read(n)??[];t.write(n,[...o,...r]);},dispatchEntriesForJournalId(n,r){if(!n)return;let o=t.read(n);if(!(!o||o.length===0)){for(let s of o)try{r(s);}catch(i){let u=i instanceof Error?i.message:String(i);try{e(s,u);}catch{}}t.delete(n);}}}}var Mt="v1",wt="board/graph",Ie="board/lastJournalProcessedId";function Ae(t){return `cards/${t}/runtime`}function Oe(t){return {readRuntime(e){return t.read(Ae(e))??{_sources:{}}},writeRuntime(e,n){t.write(Ae(e),n);}}}function An(t,e){let n={...t};for(let r of e.deleteKeys)delete n[r];return {...n,...e.shallowMerge}}function je(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,n){if(n.schemaVersion!==Mt)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);let r=t.readValues(e);if(r.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:r.version};let o=An(r.values,n);return {ok:true,newVersion:t.writeValues(e,o,n.deleteKeys)}}}}function Ne(t){function e(n){let r=t.read(n);return r==null?null:typeof r=="string"?r:JSON.stringify(r)}return {readTaskExecutorRef(){let n=e("task-executor");if(n?.trim())return Zt(n.trim())},writeTaskExecutorRef(n){t.write("task-executor",Qt(n));},readChatHandlerRef(){let n=e("chat-handler");if(n?.trim())return Zt(n.trim())},writeChatHandlerRef(n){t.write("chat-handler",Qt(n));},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(n){t.write("card-store-ref",n);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(n){t.write("outputs-store-ref",n);},readChatHandler(){return e("chat-handler")?.trim()||void 0},writeChatHandler(n){t.write("chat-handler",n);}}}function $e(t){return {writeComputedValues(e,n){t.write(`cards/${e}/computed_values`,n);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let n of t.listKeys("cards/")){let r=n.match(/^cards\/([^/]+)\/computed_values$/);r&&(e[r[1]]=t.read(n));}return e},writeDataObjects(e){for(let[n,r]of Object.entries(e))n&&t.write(`data-objects/${n}`,r);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let n of t.listKeys("data-objects/"))e[n.slice(13)]=t.read(n);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function _n(t){return t?.lastRequestedAt?!t.lastFetchedAt||t.lastFetchedAt<t.lastRequestedAt:false}function En(t,e){return t?.lastRequestedAt?_n(t)?"in-flight":!t.lastFetchedAt||t.lastFetchedAt<e?"dispatch":"idle":"dispatch"}function Tn(t,e){let n={...t,lastFetchedAt:e};return delete n.lastError,n}function _e(t,e){let n={...t,lastError:e};return delete n.lastFetchedAt,n}function Ut(t,e){let n=e.state.tasks,r=e.config.tasks,o=Object.keys(n),s=It(e),i={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let g of s.pending)u.set(g.taskName,g.waitingOn);for(let g of s.unresolved)u.set(g.taskName,g.missingTokens);for(let g of s.blocked)u.set(g.taskName,g.failedTokens);let f=new Map;for(let[g,y]of Object.entries(r))for(let v of y.requires??[]){let E=f.get(v)??[];E.push(g),f.set(v,E);}let x=o.sort().map(g=>{let y=n[g],v=r[g]??{requires:[],provides:[]};y.status==="completed"?i.completed+=1:y.status==="failed"?i.failed+=1:y.status==="in-progress"&&(i.in_progress+=1);let E=v.requires??[],m=v.provides??[],A=Object.keys(y.data??{}).sort(),B=E.filter(M=>e.state.availableOutputs.includes(M)),q=E.filter(M=>!e.state.availableOutputs.includes(M)),G=u.get(g)??q,T=new Set;for(let M of m)for(let K of f.get(M)??[])K!==g&&T.add(K);let N=y.failedAt,U=y.error?{message:y.error,code:"TASK_FAILED",at:N,source:"task-runtime"}:void 0;return {name:g,status:y.status,error:U,requires:E,requires_satisfied:B,requires_missing:q,provides_declared:m,provides_runtime:A,blocked_by:G,unblocks:Array.from(T).sort(),runtime:{attempt_count:y.executionCount??0,restart_count:y.retryCount??0,in_progress_since:y.status==="in-progress"?y.startedAt??null:null,last_transition_at:y.lastUpdated??null,last_completed_at:y.completedAt??null,last_restarted_at:y.startedAt??null,status_age_ms:y.lastUpdated?0:null}}});i.pending=s.pending.length,i.blocked=s.blocked.length,i.unresolved=s.unresolved.length;let D=x.map(g=>({name:g.name,fanOut:g.unblocks.length})).sort((g,y)=>y.fanOut-g.fanOut||g.name.localeCompare(y.name)),C=D.length>0?D[0]:{name:null,fanOut:0},j=new Set;for(let g of Object.values(r))for(let y of g.requires??[])j.add(y);let w=0;for(let[g,y]of Object.entries(r)){let v=(y.requires??[]).length===0,m=(y.provides??[]).some(A=>(f.get(A)??[]).some(B=>B!==g));v&&!m&&(w+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:i.completed,eligible:s.eligible.length,pending:i.pending,blocked:i.blocked,unresolved:i.unresolved,failed:i.failed,in_progress:i.in_progress,orphan_cards:w,topology:{edge_count:Array.from(j).length,max_fan_out_card:C.name,max_fan_out:C.fanOut}},cards:x}}function In(){return new Date().toISOString()}function Fe(t,e,n,r,o,s,i){return async u=>{let f=[],x=n.cardStore.readCard(u.nodeId);if(!x)return "task-initiate-failure";let D=x.id,C=x.card_data??{},j=x.source_defs??[],w=j.filter(P=>P.optionalForCompletionGating!==true),g=n.cardRuntimeStore.readRuntime(D),y=false,v=()=>{y&&(n.cardRuntimeStore.writeRuntime(D,g),y=false);},E=P=>({...g._sources[P]??{}}),m=(P,L)=>{g._sources[P]=L,y=true;},A=u.taskState?.executionCount??0,B=g._lastExecutionCount;if(typeof B=="number"&&B!==A&&(g._sources={},y=true),B!==A&&(g._lastExecutionCount=A,y=true),u.update){let P=u.update,L=P.outputFile;if(L){let S=E(L);if(P.failure)m(L,_e(S,P.reason??"unknown"));else {let l=P.rqt;if(!S.lastFetchedAt||l>S.lastFetchedAt){let _=typeof P.deliveryToken=="string"?P.deliveryToken:void 0,O=false;_&&(O=n.fetchedSourcesStore.commitSourceData(D,L,_)),O?m(L,Tn(S,l)):m(L,_e(S,`source delivery commit failed for ${L} token=${String(_)}`));}}v();}}let q={};for(let P of j)if(P.outputFile){let L=n.fetchedSourcesStore.readSourceData(D,P.outputFile);L!==null&&(q[P.bindTo]=L);}let G={};for(let[P,L]of Object.entries(u.state??{}))if(L!==null&&typeof L=="object"&&!Array.isArray(L)){let S=L[P];G[P]=S!==void 0?S:L;}else G[P]=L;let T={id:D,card_data:{...C},requires:G,source_defs:j,compute:x.compute};T._sourcesData=q,x.compute&&jt.runSync(T,{sourcesData:q}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))(D,T.computed_values??{});let N={...x},U=jt.enrichSourcesSync(Array.isArray(x.source_defs)?x.source_defs:void 0,{card_data:x.card_data,requires:G}),M=t.value;N.source_defs=Array.isArray(U)?U.map(P=>({...P,boardDir:typeof P.boardDir=="string"&&P.boardDir?P.boardDir:M})):U;let K=In(),X=u.update?void 0:K,W=w.filter(P=>{let L=P.outputFile;if(typeof L!="string"||!L)return true;let S=E(L);X&&(S={...S,queueRequestedAt:X},m(L,S));let l=S.queueRequestedAt??S.lastRequestedAt??K,_=En(S,l);return _==="in-flight"?false:_==="dispatch"});if(v(),W.length>0){let P=false,L=K;for(let S of W){let l=S.outputFile;if(typeof l!="string"||!l)continue;let _=E(l),O=_.queueRequestedAt??K;m(l,{..._,lastRequestedAt:O}),L=O,P=true;}return P&&v(),P&&(f.push({taskKind:"source-fetch",payload:{boardRef:ht(t),enrichedCard:N,callbackToken:u.callbackToken,rqt:L}}),n.executionRequestStore.appendEntries(e,f)),"task-initiated"}let St=x.provides??[],Rt={};for(let{bindTo:P,ref:L}of St)Rt[P]=jt.resolve(T,L);return (i??n.outputStore.writeDataObjects.bind(n.outputStore))(Rt),j.filter(P=>{if(P.optionalForCompletionGating!==true)return false;let L=E(P.outputFile);return !L.lastRequestedAt||!L.lastFetchedAt?true:L.lastFetchedAt<=L.lastRequestedAt}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:ht(t),enrichedCard:N,callbackToken:u.callbackToken,rqt:K}}),r(u.nodeId,Rt),f.length>0&&n.executionRequestStore.appendEntries(e,f),"task-initiated"}}var ee={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function De(t){return {[wt]:t.graph,[Ie]:t.lastDrainedJournalId}}function Be(t){let e=t[wt],n=t[Ie];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${wt}`);return {graph:e,lastDrainedJournalId:typeof n=="string"?n:""}}function Pe(t){let e=t.requires,n=t.provides?.map(r=>r.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:n,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function et(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function Y(t){return {status:"fail",error:t}}function nt(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function On(t){let e=new TextEncoder().encode(t),n=Array.from(e,r=>String.fromCharCode(r)).join("");return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function qe(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=Uint8Array.from(r,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function Ht(t){try{let e=JSON.parse(qe(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function jn(t){return On(JSON.stringify(t))}function Le(t){try{let e=JSON.parse(qe(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function st(){return new Date().toISOString()}function Ge(t,e){let n=e.onWarn??(()=>{}),r=ht(t);function o(S){if(S.length!==0)try{let l=e.publishBoardChangeNotifications?.(S);l&&typeof l.catch=="function"&&l.catch(_=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${_ instanceof Error?_.message:String(_)}`));}catch(l){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${l instanceof Error?l.message:String(l)}`);}}function s(){let S=u().readCardStoreRef();if(!S)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let l=e.kvStorageForRef(S);return {readIndex(){return l.read("_index")},writeIndex(_){l.write("_index",_);},readCard(_){return l.read(_)},writeCard(_,O){return l.write(_,O),e.hashFn(O)},cardExists(_){return l.read(_)!==null},defaultCardKey(_){return _}}}let i={readValues(S){let l=e.kvStorage("state-snapshot"),_=l.listKeys().sort();if(_.length===0)return {version:null,values:{}};let O={};for(let H of _)O[H]=l.read(H);return {version:e.hashFn(O),values:O}},writeValues(S,l,_){let O=e.kvStorage("state-snapshot");for(let H of _)O.delete(H);for(let[H,J]of Object.entries(l))O.write(H,J);return e.hashFn(l)}},u=()=>Ne(e.kvStorage("config")),f=()=>je(i),x=()=>Ee(e.journalAdapter()),D=()=>Vt(s(),n),C=()=>{let S=u().readOutputsStoreRef();if(!S)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return $e(e.kvStorageForRef(S))};function j(){return !!f().readSnapshot(t.value).values[wt]}function w(){let S=f().readSnapshot(t.value);if(!S.values[wt])throw new Error(`Board not initialized at ${t.value}`);return Be(S.values)}function g(S,l){let _=f().commitSnapshot(t.value,{schemaVersion:Mt,expectedVersion:l,commitId:e.genId(),committedAt:st(),deleteKeys:[],shallowMerge:De(S)});if(!_.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${l??"null"} current=${_.currentVersion??"null"}`)}function y(S){x().appendEvent(S);}async function v(){let S=(p,h)=>{let $=p.payload,F=($?.enrichedCard??{}).id??$?.cardId??"unknown";y({type:"task-failed",taskName:F,error:h,timestamp:st()});},l=Te(e.kvStorage("execution-requests"),S),_=Oe(e.kvStorage("card-runtime")),O=te(e.blobStorage("sources"),p=>e.resolveBlob(p)),H=new Map,J={readRuntime(p){return H.get(p)??_.readRuntime(p)},writeRuntime(p,h){H.set(p,h);}},at=[],rt=new Map,lt={readSourceData(p,h){let $=`${p}/${h}`;return rt.has($)?rt.get($):O.readSourceData(p,h)},ingestSourceDataStaged(p,h,$,V){O.ingestSourceDataStaged(p,h,$,V);},commitSourceData(p,h,$){let V=`${p}/.staged/${$}/${h}`,z=e.blobStorage("sources").read(V);if(z==null)return false;let tt=`${p}/${h}`,Z=z.trim();try{rt.set(tt,JSON.parse(Z));}catch{rt.set(tt,Z);}return at.push({cardId:p,outputFile:h,deliveryToken:$}),true},hasSource(p,h){let $=`${p}/${h}`;return rt.has($)?true:O.hasSource(p,h)}},it={cardStore:D(),cardRuntimeStore:J,fetchedSourcesStore:lt,outputStore:C(),executionRequestStore:l},ft=w(),pt=qt(ft.graph),{events:Q,newCursor:gt}=x().readEntriesAfterCursor(ft.lastDrainedJournalId),mt=[],vt=[],xt=[],Et=new Map,Jt=(p,h)=>{mt.push({type:"task-completed",taskName:p,data:h,timestamp:st()});},$t=(p,h)=>y({type:"task-failed",taskName:p,error:h,timestamp:st()}),c=Ce(pt,{handlers:{"card-handler":Fe(t,gt,it,Jt,$t,(p,h)=>{vt.push({cardId:p,values:h});},p=>{xt.push(p);})}});for(mt=Q;mt.length>0;){let p=mt;mt=[];for(let h of p)if(h.type==="task-restart"){let $=it.cardStore.readCard(h.taskName);$&&Et.set(h.taskName,$);}c.pushAll(p),await c.waitForHandlers();}let d=c.getState();await c.dispose({wait:true});let b=f().readSnapshot(t.value).version;g({lastDrainedJournalId:gt,graph:Tt(d)},b);for(let{cardId:p,values:h}of vt)it.outputStore.writeComputedValues(p,h);for(let p of xt)it.outputStore.writeDataObjects(p);for(let[p,h]of H)_.writeRuntime(p,h);for(let{cardId:p,outputFile:h,deliveryToken:$}of at)O.commitSourceData(p,h,$);let k;try{k=Ut(r,d),it.outputStore.writeStatusSnapshot(k);}catch(p){n(`[board-live-cards-public] status publish failed: ${p instanceof Error?p.message:String(p)}`);}let R=[];for(let{cardId:p,values:h}of vt)R.push({kind:"computed_values",cardId:p,values:h});for(let p of xt)for(let[h,$]of Object.entries(p))h&&R.push({kind:"data_object",key:h,payload:$});for(let[p,h]of Et)R.push({kind:"card_refreshed",cardId:p,card:h});k!==void 0&&R.push({kind:"status",status:k}),o(R);let I=u().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:ht({kind:"built-in",value:"source-cli-task-executor"})};l.dispatchEntriesForJournalId(gt,p=>{if(p.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${p.taskKind}" \u2014 skipping`);return}let h=p.payload,$=h.enrichedCard?.id??"unknown",V=h.enrichedCard?.source_defs??[];for(let F of V){if(!F.outputFile){n(`[dispatch] source "${F.bindTo}" has no outputFile \u2014 skipping`);continue}let z=jn({cbk:h.callbackToken,rg:t.value,br:ht(t),cid:$,b:F.bindTo,d:F.outputFile,cs:void 0,rqt:h.rqt});e.dispatchExecution(I,{source_def:F,base_ref:ht(t),callback:{token:z,via:e.selfRef}}).catch(tt=>$t($,tt instanceof Error?tt.message:String(tt)));}});}async function E(){try{let S=()=>{let _=w(),{events:O}=x().readEntriesAfterCursor(_.lastDrainedJournalId);O.length<=0||(E(),e.requestProcessAccumulated?.());},l=await ie(e.lock,v,S);return et({ran:l!==!1})}catch(S){return nt(S)}}function m(S){try{let l=S.params?.cardStoreRef;if(!l)return Y("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!j()){let J=Lt(ee);g({lastDrainedJournalId:"",graph:Tt(J)},null);}let _=S.params?.outputsStoreRef;if(!_)return Y("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let O=u();O.writeCardStoreRef(l),O.writeOutputsStoreRef(_);let H=S.body??{};H["task-executor-ref"]&&O.writeTaskExecutorRef(H["task-executor-ref"]),H["chat-handler-ref"]&&O.writeChatHandlerRef(H["chat-handler-ref"]);try{C().writeStatusSnapshot(Ut(r,qt(w().graph)));}catch{}return et()}catch(l){return nt(l)}}function A(S){try{let l=C().readStatusSnapshot();if(!l){l=Ut(r,qt(w().graph));try{C().writeStatusSnapshot(l);}catch{}}return et(l)}catch(l){return nt(l)}}function B(S){try{let l=S.params?.id;return l?(y({type:"task-removal",taskName:l,timestamp:st()}),E(),et()):Y("removeCard requires params.id")}catch(l){return nt(l)}}function q(S){try{let l=S.params?.id;return l?(y({type:"task-restart",taskName:l,timestamp:st()}),E(),et()):Y("retrigger requires params.id")}catch(l){return nt(l)}}async function G(S){return E()}function T(S){try{let l=S.params?.cardId,_=S.params?.all,O=!!S.params?.restart;if(!l&&!_)return Y("upsertCard requires --card-id <id> or --all");let H=_?D().readAllCards().map(J=>J.id):[l];for(let J of H)if(!D().readCard(J))return Y(`Card "${J}" not found in board at ${t.value}`);for(let J of H){let at=D().readCard(J),rt=Pe(at),lt=e.hashFn(rt),it=e.kvStorage("card-upsert"),ft=it.read(J),pt=ft?.taskConfigHash!==lt;if(!(!pt&&!O)){if(pt){let Q=ft?.blobRef??D().readCardKey(J)??J;y({type:"task-upsert",taskName:J,taskConfig:rt,timestamp:st()}),it.write(J,{blobRef:Q,taskConfigHash:lt,updatedAt:st()});}O&&y({type:"task-restart",taskName:J,timestamp:st()});}}return E(),et()}catch(l){return nt(l)}}function N(S){try{let l=S.params?.token;if(!l)return Y("taskFailed requires params.token");let _=S.params?.error??"unknown error",O=Ht(l);return O?(y({type:"task-failed",taskName:O.taskName,error:_,timestamp:st()}),E(),et()):Y("Invalid callback token")}catch(l){return nt(l)}}function U(S){try{let l=S.params?.token;if(!l)return Y("taskProgress requires params.token");let O=(S.body??{}).update??{},H=Ht(l);return H?(y({type:"task-progress",taskName:H.taskName,update:O,timestamp:st()}),E(),et()):Y("Invalid callback token")}catch(l){return nt(l)}}function M(S){try{let l=S.params?.token,_=S.params?.ref;if(!l)return Y("sourceDataFetched requires params.token");if(!_)return Y("sourceDataFetched requires params.ref");let O=Le(l);if(!O)return Y("Invalid source token");let{cbk:H,cid:J,b:at,d:rt,cs:lt,rqt:it}=O,ft=te(e.blobStorage("sources"),mt=>e.resolveBlob(mt)),pt=e.genId();ft.ingestSourceDataStaged(J,rt,ae(_),pt);let Q=Ht(H);if(!Q)return Y("Invalid callback token embedded in source token");let gt=st();return y({type:"task-progress",taskName:Q.taskName,update:{bindTo:at,outputFile:rt,fetchedAt:gt,deliveryToken:pt,sourceChecksum:lt,rqt:it},timestamp:gt}),E(),et()}catch(l){return nt(l)}}function K(S){try{let l=S.params?.token,_=S.params?.reason??"unknown";if(!l)return Y("sourceDataFetchFailure requires params.token");let O=Le(l);if(!O)return Y("Invalid source token");let{cbk:H,b:J,d:at,cs:rt}=O,lt=Ht(H);return lt?(y({type:"task-progress",taskName:lt.taskName,update:{bindTo:J,outputFile:at,failure:!0,reason:_,sourceChecksum:rt},timestamp:st()}),E(),et()):Y("Invalid callback token embedded in source token")}catch(l){return nt(l)}}function X(S){try{let l=u().readCardStoreRef();return l?et({storeRef:l}):Y(`Board at ${t.value} has no card store configured`)}catch(l){return nt(l)}}function W(S){try{let l=u().readOutputsStoreRef();return l?et({storeRef:l}):Y(`Board at ${t.value} has no outputs store configured`)}catch(l){return nt(l)}}function St(S){try{let l=S.params?.key;if(!l)return Y("getConfig requires params.key");let _=u(),O;switch(l){case "task-executor":O=_.readTaskExecutorRef()??null;break;case "chat-handler":O=_.readChatHandlerRef()??null;break;case "card-store-ref":O=_.readCardStoreRef();break;case "outputs-store-ref":O=_.readOutputsStoreRef();break;default:return Y(`getConfig: unknown key "${l}"`)}return et({value:O})}catch(l){return nt(l)}}function Rt(S){try{let l=S.params?.key;if(!l)return Y("getOutputsDataObject requires params.key");let _=C().readDataObject(l);return et(_)}catch(l){return nt(l)}}function Ct(S){try{return et(C().readAllDataObjects())}catch(l){return nt(l)}}function P(S){try{let l=S.params?.key;if(!l)return Y("getOutputsComputedValues requires params.key");let _=C().readComputedValues(l);return et(_)}catch(l){return nt(l)}}function L(S){try{return et(C().readAllComputedValues())}catch(l){return nt(l)}}return {init:m,status:A,getCardStoreRef:X,getOutputsStoreRef:W,getConfig:St,getOutputsDataObject:Rt,getAllOutputsDataObjects:Ct,getOutputsComputedValues:P,getAllOutputsComputedValues:L,removeCard:B,retrigger:q,processAccumulatedEvents:G,upsertCard:T,taskFailed:N,taskProgress:U,sourceDataFetched:M,sourceDataFetchFailure:K}}function Ve(t){function e(o){return {status:"success",data:o}}function n(o){return {status:"fail",error:o}}function r(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let i=t.readCard(s);return i?e({cards:[i]}):n(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return r(s)}},set(o){try{let s=o.body;if(s==null)return n("set requires a body (card object or array of cards)");let i=Array.isArray(s)?s:[s];for(let u of i){if(typeof u.id!="string")return n("each card must have a string `id` field");t.writeCard(u.id,u);}return e({count:i.length})}catch(s){return r(s)}},del(o){try{let s=o.body?.ids??[],i=o.params?.id,u=i?[...s,i]:s;if(u.length===0)return n("del requires body.ids (string[]) or params.id");for(let f of u)t.removeCard(f);return e({count:u.length})}catch(s){return r(s)}},patch(o){try{let s=o.params?.id,i=o.params?.path;if(!s)return n("patch requires params.id");if(!i)return n("patch requires params.path");let u=o.body,f=u&&Object.prototype.hasOwnProperty.call(u,"value")?u.value:o.body;return t.patchCard(s,i,f),e({count:1})}catch(s){return r(s)}}}}var Kt=".artifacts-index.json";function Me(){return new Date().toISOString()}function Ue(t){return new TextEncoder().encode(t).byteLength}function Nt(t){let e=t.read(Kt);if(!e)return {entries:{}};try{let n=JSON.parse(e);if(n&&n.entries&&typeof n.entries=="object")return n}catch{}return {entries:{}}}function ne(t,e){t.write(Kt,JSON.stringify(e,null,2));}function Nn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function He(t,e,n){t.entries[e]={key:e,size:n.size,updatedAt:n.updatedAt,contentType:n.contentType};}function re(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function $n(t){let e=String(t||"").trim();if(!e)return "upload.bin";let n=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (n>=0?e.slice(n+1):e)||"upload.bin"}function Fn(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Dn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Bn(t){let e=$n(t),n=e.lastIndexOf(".");return n<=0||n===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,n),ext:e.slice(n)}}function Pn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function oe(t){function e(n){let r=t.stat?Nn(t.stat(n)):null;if(r)return r;let s=Nt(t).entries[n];if(s)return {...s};if(!t.exists(n))return null;let i=t.read(n);return i===null?{key:n}:{key:n,size:Ue(i)}}return {exists(n){return t.exists(n)},putText(n,r,o="text/plain; charset=utf-8"){t.write(n,r);let s=e(n)??{key:n};s.contentType=o,s.updatedAt=s.updatedAt??Me(),s.size=s.size??Ue(r);let i=Nt(t);return He(i,n,s),ne(t,i),s},putBytes(n,r,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(n,r);else {let u=JSON.stringify({__kind:"bytes-array",data:[...r]});t.write(n,u);}let s=e(n)??{key:n};s.contentType=o,s.updatedAt=s.updatedAt??Me(),s.size=s.size??r.byteLength;let i=Nt(t);return He(i,n,s),ne(t,i),s},getText(n){let r=t.read(n);if(r===null){if(!t.readBytes)return null;let o=t.readBytes(n);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return r},getBytes(n){if(t.readBytes){let o=t.readBytes(n);if(o!==null)return o}let r=t.read(n);if(r===null)return null;try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(r)},head:e,list(n=""){let r=new Map;if(t.listKeys)for(let s of t.listKeys(n)){if(s===Kt)continue;let i=e(s)??{key:s};r.set(s,i);}let o=Nt(t);for(let[s,i]of Object.entries(o.entries))s===Kt||n&&!s.startsWith(n)||r.has(s)||r.set(s,{...i});return [...r.values()].sort((s,i)=>s.key.localeCompare(i.key))},remove(n){t.remove(n);let r=Nt(t);delete r.entries[n],ne(t,r);}}}function Ke(t,e){let n=e?.indexFileName;function r(C){return `${C}/${n}`}function o(C){let j=t.getText(r(C));if(!j)return [];try{let w=JSON.parse(j);return Array.isArray(w)?w.filter(g=>g&&typeof g.stored_name=="string").map(g=>({serial:Number(g.serial||re(String(g.stored_name))||0),role:String(g.role||"system").toLowerCase(),stored_name:String(g.stored_name),path:typeof g.path=="string"?g.path:`${C}/chats/${String(g.stored_name)}`,updated_at:typeof g.updated_at=="string"?g.updated_at:null})):[]}catch{return []}}function s(C,j){t.putText(r(C),JSON.stringify(j,null,2),"application/json; charset=utf-8");}function i(C){let j=o(C),w=0;for(let g of j){let y=Number(g.serial||0);Number.isFinite(y)&&y>w&&(w=y);}return w+1}function u(C,j){let w=o(C);w.push(j),s(C,w);}function f(C){let j=o(C),w=[];for(let g of j){let y=`${C}/${g.stored_name}`,v=t.getText(y);v!==null&&w.push({serial:Number(g.serial||re(g.stored_name)||0),role:String(g.role||"system").toLowerCase(),text:v,path:typeof g.path=="string"?g.path:`${C}/chats/${g.stored_name}`,stored_name:g.stored_name,updated_at:g.updated_at||null});}return w.sort((g,y)=>g.serial-y.serial||g.stored_name.localeCompare(y.stored_name)),w}function x(C){let j=`${C}/`;for(let w of t.list(j))t.remove(w.key);}function D(C){let j=`${C}/`,w=t.list(j),g=0,y=0,v=false;for(let E of w){let m=E.key.slice(j.length);if(m===".processing"){v=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(m))continue;g+=1;let A=E.updatedAt?Number(new Date(E.updatedAt).getTime()||0):0;A>y&&(y=A);}return {count:g,latest_mtime_ms:y,processing:v}}return {indexKey:r,loadIndex:o,saveIndex:s,nextSerial:i,appendIndexRecord:u,readRecords:f,clear:x,readSignal:D}}function Je(t){function e(o,s){let i=0,u=[];Array.isArray(s)&&u.push(...s);for(let f of t.list(`${o}/`))u.push(Pn(f.key));for(let f of u){let x=re(f);Number.isFinite(x)&&x>i&&(i=x);}return i+1}function n(o,s,i){let u=Number(i?.maxLen||32),{stem:f,ext:x}=Bn(o),D=Dn(x),C=Fn(f),j=`${String(s).padStart(3,"0")}-`,w=D,g=u-j.length-w.length;g<1&&(w="",g=u-j.length);let y=C.slice(0,Math.max(1,g)),v=`${j}${y}${w}`;return v.length>u&&(v=v.slice(0,u).replace(/\.$/,"")),v}function r(o,s,i){let u=e(o,i?.seedNames),f=n(s,u,{maxLen:i?.maxLen});for(;t.exists(`${o}/${f}`);)u+=1,f=n(s,u,{maxLen:i?.maxLen});return f}return {nextSerial:e,buildStoredName:n,allocateStoredName:r}}function ze(){function t(o,s){if(!Array.isArray(o))return [];let i=[];for(let u of o){if(!u||typeof u!="object")continue;let f=u;typeof f.stored_name=="string"&&i.push({name:typeof f.name=="string"?f.name:f.stored_name,stored_name:f.stored_name,size:typeof f.size=="number"&&Number.isFinite(f.size)?f.size:null,mime_type:typeof f.mime_type=="string"?f.mime_type:null,path:typeof f.path=="string"?f.path:null,uploaded_at:typeof f.uploaded_at=="string"?f.uploaded_at:s||null});}return i}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function n(o,s){let i=e(o);if(s.length===0)return o.files=i,i;let u=new Set(i.map(f=>f.stored_name));for(let f of s)u.has(f.stored_name)||(i.push(f),u.add(f.stored_name));return o.files=i,i}function r(o,s,i){let u=e(o);if(!Number.isInteger(s)||s<0||s>=u.length)return {ok:false,reason:"index_out_of_range"};let f=u[s];return !f||!f.stored_name?{ok:false,reason:"missing_stored_name"}:i&&i!==f.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:f}}return {read:e,normalizeIncoming:t,merge:n,resolve:r}}var Ye={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Ln=32;function qn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Xe(t){if(!t||typeof t!="object")return false;let e=t.summary;return !e||typeof e!="object"?false:Number(e.card_count||0)>0}function We(t,e){if(!e||typeof e!="object")return;let n=e;if(n.kind==="notification-batch"&&Array.isArray(n.notifications)){for(let r of n.notifications)We(t,r);return}n.kind==="status"&&Xe(n.status)&&(t.status=n.status),n.kind==="computed_values"&&n.cardId&&(t.computedValues[n.cardId]=n.values),n.kind==="data_object"&&n.key&&(t.dataObjects[n.key]=n.payload),n.kind==="card_refreshed"&&n.cardId&&(t.cards[n.cardId]=n.card);}function Br(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),n={...Ye,...t.corsHeaders||{}},r=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,i=t.notificationTransport||null,u=t.serverUrl||null,f=t.executionExtra||{},x=new Set;function D(a){let c=Ge(a.baseRef,a.boardAdapter),d=a.boardAdapter.kvStorageForRef(a.cardStoreRef),k=Ve(Vt({readIndex:()=>d.read("_index"),writeIndex:h=>d.write("_index",h),readCard:h=>d.read(h),writeCard:(h,$)=>(d.write(h,$),h),cardExists:h=>d.read(h)!==null,defaultCardKey:h=>h},o.warn)),R=a.artifactsAdapter||a.boardAdapter,I=null,p=null;return {label:a.label,board:c,cardStore:k,get filesArtifacts(){return I??=oe(R.blobStorage("files"))},get chatsArtifacts(){return p??=oe(R.blobStorage("chats"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,inferenceAdapterRef:a.inferenceAdapterRef,notification:qn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let C=t.boards.map(D),j=new Map;function w(a){return j.get(a)??0}function g(a){let c=C[w(a)];return {files:c?c.filesArtifacts:null,chats:c?c.chatsArtifacts:null}}function y(a){let c=g(a);return c.chats?Ke(c.chats,{indexFileName:".index.json"}):null}function v(a){let c=g(a);return c.files?Je(c.files):null}function E(){return ze()}function m(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function A(a){if(!a||a.notificationTeardown||!i||!a.notifyRef)return;let c=await i.subscribe(a.notifyRef,d=>{We(a.notification,d);let b=d.kind==="notification-batch"?d.notifications:[d];Jt(b);});a.notificationTeardown=c;}async function B(a){if(!a||a.initialized)return;let c={cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef},d={};a.taskExecutorRef&&(d["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerRef&&(d["chat-handler-ref"]=a.chatHandlerRef),a.inferenceAdapterRef&&(d["inference-adapter-ref"]=a.inferenceAdapterRef);let b=a.board.init({params:c,body:d});if(b.status!=="success")throw Object.assign(new Error(b.error||`init failed for ${a.label}`),{statusCode:500});if(await A(a),a.chatHandlerRef&&s.describe)try{let k=await s.describe(a.chatHandlerRef);k&&k.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${k.kind}", expected "chat-handler" for ${a.label}`):k&&o.info(`[init] chat-handler validated: ${k.name} (protocol ${k.protocolVersion}) for ${a.label}`);}catch(k){o.warn(`[init] chat-handler describe failed for ${a.label}: ${k?.message||String(k)}`);}a.initialized=true;}function q(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let c=[],d=a.board.status({});d.status==="success"&&d.data!=null&&Xe(d.data)&&c.push({kind:"status",status:d.data});let b=a.board.getAllOutputsDataObjects({});if(b.status==="success"&&b.data!=null)for(let[R,I]of Object.entries(b.data))R&&c.push({kind:"data_object",key:R,payload:I});let k=a.board.getAllOutputsComputedValues({});if(k.status==="success"&&k.data!=null)for(let[R,I]of Object.entries(k.data))R&&c.push({kind:"computed_values",cardId:R,values:I});c.length>0&&a.boardAdapter.publishBoardChangeNotifications(c);}function G(a,c){if(!a||a.cardsBootstrapped)return;let d=a.cardStore.get({}),b=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let k of b)typeof k.id=="string"&&(j.set(k.id,c),a.board.upsertCard({params:{cardId:k.id}}));a.cardsBootstrapped=true;}async function T(){for(let a of C)await B(a);}async function N(){await T();for(let a=0;a<C.length;a++)q(C[a]),G(C[a],a);}function U(a){return C[w(a)]??null}function M(a){let c=U(a);if(!c)return null;let d=c.cardStore.get({params:{id:a}});if(d.status!=="success")return null;let b=Array.isArray(d.data?.cards)?d.data.cards:[];return b.length>0?b[0]:null}function K(){let a=d=>{if(!d||!d.cardStore)return [];let b=d.cardStore.get({});return b.status!=="success"||!Array.isArray(b.data?.cards)?[]:b.data.cards},c=[];for(let d of C)c.push(...a(d));return c}function X(){let a=C.map(R=>{try{let p=R.boardAdapter.kvStorageForRef(R.outputsStoreRef).read("status");if(p!=null)return p}catch{}return R.notification.status}).filter(Boolean);if(a.length===0)return null;if(a.length===1)return a[0];let c=[],d=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],b={};for(let R of d)b[R]=0;for(let R of a){let I=R,p=Array.isArray(I.cards)?I.cards:[];c.push(...p);for(let h of d)b[h]+=Number(I?.summary?.[h]||0);}let k=a[0];return {...k,cards:c,summary:{...k.summary||{},card_count:c.length,...b}}}function W(){let a={},c=d=>{for(let[b,k]of Object.entries(d.notification.computedValues)){let R=d.notification.cards[b];a[b]={schema_version:"v1",card_id:b,card_data:R?.card_data??{},computed_values:k??{}};}};for(let d of C)c(d);return a}function St(){let a={};for(let c of C)Object.assign(a,c.notification.dataObjects||{});return a}function Rt(a){let c=m(a),d=y(a);return d?d.readSignal(c):{count:0,latest_mtime_ms:0,processing:false}}function Ct(){let a=K(),c=W(),d=St(),b={};for(let k of a){if(!k?.id)continue;let R=k.id,I=c[R]||{},p=Rt(R),h={...I.card_data&&typeof I.card_data=="object"?I.card_data:k.card_data&&typeof k.card_data=="object"?k.card_data:{},__chat_signal:p};b[R]={schema_version:I.schema_version||"v1",card_id:I.card_id||R,card_data:h,computed_values:I.computed_values&&typeof I.computed_values=="object"?I.computed_values:{}};}return {boardId:r,cardDefinitions:a,statusSnapshot:X(),dataObjectsByToken:d,cardRuntimeById:b}}function P(a,c,d){let b=d?.syncBoard!==false,k=U(a);if(!k)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let R=M(a);if(!R)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let I=c(R)||R,p=k.cardStore.set({body:I});if(p.status!=="success")throw Object.assign(new Error(p.error||`Failed to persist card: ${a}`),{statusCode:500});if(b){let h=k.board.upsertCard({params:{cardId:a,restart:true}});if(h.status!=="success")throw Object.assign(new Error(h.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function L(a,c){P(a,c,{syncBoard:true});}function S(a,c){P(a,c,{syncBoard:false});}function l(a,c){L(a,d=>{if(!c||typeof c!="object"||Object.keys(c).length===0)return d;function b(k,R,I){let p=String(R||"").split(".").filter(Boolean);if(!p.length)return;let h=k;for(let $=0;$<p.length-1;$++){let V=p[$];(!h[V]||typeof h[V]!="object")&&(h[V]={}),h=h[V];}h[p[p.length-1]]=I;}if(c.fieldValues!==void 0&&c.fieldValues!==null){let k=null,R=d.view;if(R&&Array.isArray(R.elements)){for(let I of R.elements)if(I?.data&&I.data.writeTo){k=I.data.writeTo;break}}k?b(d,k,c.fieldValues):typeof c.fieldValues=="object"&&!Array.isArray(c.fieldValues)&&(d.card_data={...d.card_data||{},...c.fieldValues});}else {if(Array.isArray(c._stagedFiles)&&c._stagedFiles.length>0)return d;for(let[k,R]of Object.entries(c))k!=="_stagedFiles"&&(R!==null&&typeof R=="object"&&!Array.isArray(R)&&d[k]!==null&&typeof d[k]=="object"&&!Array.isArray(d[k])?d[k]={...d[k],...R}:d[k]=R);}return d});}function _(a){let c=String(a||"").match(/^(\d+)[-_]/);return c?parseInt(c[1],10):0}function O(a){let c=String(a||"").trim();if(!c)return "upload.bin";let d=Math.max(c.lastIndexOf("/"),c.lastIndexOf("\\"));return (d>=0?c.slice(d+1):c)||"upload.bin"}function H(a){let c=m(a),d=y(a);d&&d.clear(c);}function J(a,c){let d=m(a),b=y(a),k=b?b.nextSerial(d):1,R=String(c||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(k).padStart(3,"0")}_${R}.txt`}function at(a,c,d,b){let k=new Date().toISOString(),R=m(a),I=g(a),p=J(a,c||"system"),h=`${R}/${p}`,$=[],V=typeof d=="string"?d.trim():"";V&&$.push(V);let F=Array.isArray(b)?b:[];if(F.length){$.length&&$.push(""),$.push("files:");for(let Z of F){if(!Z||typeof Z!="object")continue;let ut=typeof Z.name=="string"?Z.name:"file",ct=typeof Z.stored_name=="string"?Z.stored_name:"";$.push(ct?`- ${ut} -> ${ct}`:`- ${ut}`);}}I.chats&&I.chats.putText(h,`${$.join(`
2
+ `)}
3
+ `);let z=_(p),tt=y(a);return tt&&tt.appendIndexRecord(R,{serial:z,role:c||"system",stored_name:p,path:`${a}/chats/${p}`,updated_at:k}),{at:k,role:c||"system",text:V,files:F,path:`${a}/chats/${p}`}}function rt(a){let c=m(a),d=y(a);return d?d.readRecords(c).map(b=>({...b,path:`${a}/chats/${b.stored_name}`})):[]}function lt(a){let c=[];try{let d=M(a);if(!d)return c;let b=E().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let k of b)c.push(k.stored_name);}catch{}return c}function it(a,c,d,b){let k=m(a),R=g(a),I=O(c),p=v(a),h=p?p.allocateStoredName(k,I,{seedNames:lt(a),maxLen:Ln}):`${String(Date.now())}-${I}`;return R.files&&R.files.putBytes(`${k}/${h}`,new Uint8Array(b),d||"application/octet-stream"),{name:I,stored_name:h,size:b.length,mime_type:d||"application/octet-stream",path:`${a}/files/${h}`,uploaded_at:new Date().toISOString()}}function ft(a,c,d){let b=U(a);if(!b)return;let k=b.board.getConfig({params:{key:"chat-handler"}});if(k.status!=="success")return;let R=k.data?.value;if(!R||typeof R!="object")return;let I=m(a),p=g(a),h=`${I}/.processing`;try{p.chats?.putText(h,"","text/plain; charset=utf-8");}catch{}let $={boardId:r,cardId:String(a),chatsKeyPrefix:c,chatProcessingMarkerKey:h,lastChatFile:d,...f,...u?{serverUrl:u}:{}};s.invoke(R,$).then(V=>{if(V.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${r}")`);else {try{p.chats?.remove(h);}catch{}o.warn(`[chat-handler] dispatch failed for card "${a}": ${V.error||"unknown"}`);}},V=>{try{p.chats?.remove(h);}catch{}o.warn(`[chat-handler] invoke failed for card "${a}": ${V?.message||String(V)}`);});}function pt(a,c,d){let b=c==="chat-send"?S:L,k;b(a,R=>{let I=new Date().toISOString(),p=R.card_data&&typeof R.card_data=="object"?R.card_data:{};if(R.card_data=p,c==="chat-send"){let h=d&&typeof d.text=="string"?d.text.trim():"",$=[];if(Array.isArray(d?.files)){for(let V of d.files)if(V){if(typeof V=="string"){$.push({name:V});continue}if(typeof V=="object"){let F=V;typeof F.name=="string"&&$.push({name:F.name,size:F.size,mime_type:F.mime_type,path:F.path,uploaded_at:F.uploaded_at,stored_name:F.stored_name});}}}if(h||$.length>0){let V=m(a),z=at(a,"user",h,$).path,tt=z.includes("/")?z.slice(z.lastIndexOf("/")+1):z;k={chatsKeyPrefix:`${V}/chats`,lastChatFile:tt};for(let Z of $){if(!Z||typeof Z!="object")continue;let ut=typeof Z.name=="string"?Z.name:"file",ct=typeof Z.stored_name=="string"?Z.stored_name:null;ct&&at(a,"system",`File ${ut} uploaded as ${ct}.`,[]);}}return R}if(c==="file-upload"){let h=E().normalizeIncoming(d?.files,I);return h.length>0&&E().merge(p,h),R}if(c==="action"){let h=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!h)return R;p.lastAction={buttonId:h,at:I},p.lastActionText=`${h} @ ${I}`;}return R}),k&&ft(a,k.chatsKeyPrefix,k.lastChatFile);}function Q(a,c,d){let b=JSON.stringify(d),k=typeof Buffer<"u"?Buffer.byteLength(b):new TextEncoder().encode(b).length;a.writeHead(c,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":k}),a.end(b);}async function gt(a){let c=[];for await(let b of a)c.push(b);let d=typeof Buffer<"u"?Buffer.concat(c).toString("utf-8").trim():new TextDecoder().decode(vt(c)).trim();return d?JSON.parse(d):{}}async function mt(a){let c=[];for await(let d of a)c.push(d);return typeof Buffer<"u"?Buffer.concat(c):vt(c)}function vt(a){let c=a.reduce((k,R)=>k+R.length,0),d=new Uint8Array(c),b=0;for(let k of a)d.set(k,b),b+=k.length;return d}let xt=0;function Et(a){let c=JSON.stringify(a);return xt++,`id: ${xt}
4
+ data: ${c}
5
+
6
+ `}function Jt(a){if(!a||a.length===0)return;let c=Et({kind:"notification-batch",notifications:a});for(let d of x)try{d.write(c);}catch{x.delete(d);}}function $t(a,c){c.writeHead(200,{...n,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),x.add(c);let d=Ct(),b=Et(d);c.write(b);let k=setInterval(()=>{try{c.write(`: keepalive
7
+
8
+ `);}catch{}},15e3);a.on("close",()=>{clearInterval(k),x.delete(c),c.end();});}async function se(a,c,d){let b=a.method||"GET",k=d,R=k.pathname;try{if(b==="GET"&&R===`${e}/init-board`)return await T(),Q(c,200,Ct()),!0;if(b==="GET"&&R===`${e}/sse`){await T(),$t(a,c);for(let F=0;F<C.length;F++)q(C[F]),G(C[F],F);return !0}if(b==="GET"&&R===`${e}/board-status`)return Q(c,200,Ct()),!0;let I=R.match(new RegExp(`^${_t(e)}/cards/([^/]+)$`));if(b==="GET"&&I){await N();let F=decodeURIComponent(I[1]),z=M(F);return z?(Q(c,200,z),!0):(Q(c,404,{error:`card not found: ${F}`}),!0)}if(b==="PATCH"&&I){await N();let F=decodeURIComponent(I[1]),z=await gt(a);return l(F,z),Q(c,200,{ok:!0}),!0}let p=R.match(new RegExp(`^${_t(e)}/cards/([^/]+)/actions$`));if(b==="POST"&&p){await N();let F=decodeURIComponent(p[1]),z=await gt(a);return pt(F,z?.actionType,z?.payload),Q(c,200,{ok:!0}),!0}let h=R.match(new RegExp(`^${_t(e)}/cards/([^/]+)/chats$`));if(b==="GET"&&h){await N();let F=decodeURIComponent(h[1]);return Q(c,200,{ok:!0,messages:rt(F)}),!0}let $=R.match(new RegExp(`^${_t(e)}/cards/([^/]+)/files$`));if(b==="POST"&&$){await N();let F=decodeURIComponent($[1]),z=String(k.searchParams.get("inChat")||"").toLowerCase()==="true",tt=a.headers["x-file-name"],Z=String(a.headers["content-type"]||"application/octet-stream"),ut=Array.isArray(tt)?tt[0]:tt,ct=ut?decodeURIComponent(String(ut)):"upload.bin",Ft=await mt(a);if(!Ft.length)return Q(c,400,{error:"Empty upload body"}),!0;let dt=it(F,ct,Z,Ft);return z&&(S(F,bt=>{let At=new Date().toISOString(),Dt=bt.card_data&&typeof bt.card_data=="object"?bt.card_data:{};bt.card_data=Dt;let zt=E().normalizeIncoming([{name:dt.name,stored_name:dt.stored_name,size:dt.size,mime_type:dt.mime_type,path:dt.path,uploaded_at:dt.uploaded_at||At}],At);return E().merge(Dt,zt),bt}),at(F,"system",`file uploaded: ${dt.name} as ${dt.stored_name}`,[])),Q(c,200,{ok:!0,file:dt}),!0}let V=R.match(new RegExp(`^${_t(e)}/cards/([^/]+)/files/(\\d+)$`));if(b==="GET"&&V){let F=decodeURIComponent(V[1]),z=parseInt(V[2],10),tt=k.searchParams.get("sn"),Z=M(F);if(!Z)return Q(c,404,{error:"Card not found"}),!0;let ut=E().resolve(Z.card_data,z,tt);if(!ut.ok&&ut.reason==="stale_reference")return Q(c,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ut.ok)return Q(c,404,{error:"File not found"}),!0;let ct=ut.file,Ft=m(F),dt=g(F),bt=`${Ft}/${ct.stored_name}`,At=dt.files?dt.files.getBytes(bt):null;if(!At)return Q(c,404,{error:"File not found"}),!0;let Dt=ct.name||ct.stored_name,zt=ct.mime_type||"application/octet-stream";return c.writeHead(200,{"Content-Type":zt,"Content-Disposition":`attachment; filename="${Dt}"`,"Content-Length":At.length}),c.end(At),!0}return !1}catch(I){let p=I?.statusCode||500;return Q(c,p,{error:String(I?.message||I)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleRuntimeApi:se,buildPublishedRuntimePayload:Ct,clearChatRecords:H,reportSourceFetched(a,c){let d=C[0];return d?d.board.sourceDataFetched({params:{token:a,ref:c}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,c){let d=C[0];return d?d.board.sourceDataFetchFailure({params:{token:a,reason:c}}):{status:"fail",error:"no board context"}},get cardStore(){return C[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Pr(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),n={...Ye,...t.corsHeaders||{}},r=t.serverMetaStore,o=t.boardRuntimeFactory,s=new Map,i="boards-config.json";function u(){let v=r.getText(i);if(!v)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(v)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function f(v){r.putText(i,JSON.stringify(v,null,2));}function x(v){let E=String(v||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return E.length>0&&E.length<=64?E:null}function D(v){if(s.has(v))return s.get(v);let m=u().boards.find(B=>B.id===v)||{},A=o(v,m);return s.set(v,A),A}function C(v,E,m){let A=JSON.stringify(m),B=typeof Buffer<"u"?Buffer.byteLength(A):new TextEncoder().encode(A).length;v.writeHead(E,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":B}),v.end(A);}async function j(v,E,m){let A=v.method||"GET",B=m.pathname;if(A==="GET"&&B===e)return C(E,200,{ok:true,boards:u().boards}),true;if(A==="POST"&&B===e){let q=[];for await(let X of v)q.push(X);let G=typeof Buffer<"u"?Buffer.concat(q).toString("utf-8").trim():new TextDecoder().decode(Gn(q)).trim(),T={};try{T=G?JSON.parse(G):{};}catch{T={};}let N=x(T.id);if(!N)return C(E,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let U=u();if(U.boards.some(X=>X.id===N))return C(E,409,{error:`Board "${N}" is already registered`}),true;let M=typeof T.label=="string"&&T.label.trim()?T.label.trim():N,K={id:N,label:M};for(let[X,W]of Object.entries(T))X==="id"||X==="label"||W!=null&&(K[X]=W);return U.boards.push(K),f(U),C(E,200,{ok:true,board:K}),true}return false}async function w(v,E,m){let B=m.pathname.match(new RegExp(`^${_t(e)}/([^/]+)(/|$)`));if(!B)return false;let q=x(decodeURIComponent(B[1]));return q?u().boards.some(N=>N.id===q)?!!await D(q).handleRuntimeApi(v,E,m):(C(E,404,{error:`Board "${q}" not registered. POST ${e} with {id} to register it first.`}),true):(C(E,400,{error:"Invalid board id"}),true)}async function g(v,E,m){return !!(await j(v,E,m)||await w(v,E,m))}function y(v){if(!u().boards.some(m=>m.id===v))throw Object.assign(new Error(`Board "${v}" not registered`),{statusCode:404});return {service:D(v)}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleApi:g,requireBoardService:y}}function _t(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Gn(t){let e=t.reduce((o,s)=>o+s.length,0),n=new Uint8Array(e),r=0;for(let o of t)n.set(o,r),r+=o.length;return n}exports.createMultiBoardServerRuntime=Pr;exports.createSingleBoardServerRuntime=Br;//# sourceMappingURL=index.cjs.map
9
+ //# sourceMappingURL=index.cjs.map
@@ -1,8 +1,8 @@
1
- import { M as MultiBoardRuntimeOptions, a as MultiBoardRuntime, S as SingleBoardRuntimeOptions, b as SingleBoardRuntime } from '../types-CU3DjTKL.cjs';
2
- export { B as BoardContextConfig, D as DescribeEnvelope, I as InvocationAdapter, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse } from '../types-CU3DjTKL.cjs';
3
- export { a as BlobStorage, b as BoardChangeNotification, c as BoardLiveCardsPublic, B as BoardPlatformAdapter, C as CommandInput, d as CommandResult, K as KVStorage, e as KindValueRef } from '../board-live-cards-public-5n1-syA3.cjs';
1
+ import { M as MultiBoardRuntimeOptions, a as MultiBoardRuntime, S as SingleBoardRuntimeOptions, b as SingleBoardRuntime } from '../types-DkFvgxwq.cjs';
2
+ export { B as BoardContextConfig, D as DescribeEnvelope, I as InvocationAdapter, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse } from '../types-DkFvgxwq.cjs';
3
+ export { B as BlobStorage, K as KVStorage, a as KindValueRef } from '../storage-interface-BhAON-gW.cjs';
4
+ export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardPlatformAdapter, C as CommandInput, a as CommandResult } from '../board-live-cards-public-BnmRAbQV.cjs';
4
5
  export { ExecutionRef } from '../execution-refs.cjs';
5
- import '../board-live-cards-lib-Bg6EvCo5.cjs';
6
6
  import '../types-BBhqYGhE.cjs';
7
7
 
8
8
  /**
@@ -1,8 +1,8 @@
1
- import { M as MultiBoardRuntimeOptions, a as MultiBoardRuntime, S as SingleBoardRuntimeOptions, b as SingleBoardRuntime } from '../types-HGDTWIun.js';
2
- export { B as BoardContextConfig, D as DescribeEnvelope, I as InvocationAdapter, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse } from '../types-HGDTWIun.js';
3
- export { a as BlobStorage, b as BoardChangeNotification, c as BoardLiveCardsPublic, B as BoardPlatformAdapter, C as CommandInput, d as CommandResult, K as KVStorage, e as KindValueRef } from '../board-live-cards-public-CK_J8uv0.js';
1
+ import { M as MultiBoardRuntimeOptions, a as MultiBoardRuntime, S as SingleBoardRuntimeOptions, b as SingleBoardRuntime } from '../types-CBxkYuLY.js';
2
+ export { B as BoardContextConfig, D as DescribeEnvelope, I as InvocationAdapter, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse } from '../types-CBxkYuLY.js';
3
+ export { B as BlobStorage, K as KVStorage, a as KindValueRef } from '../storage-interface-BhAON-gW.js';
4
+ export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardPlatformAdapter, C as CommandInput, a as CommandResult } from '../board-live-cards-public-CsmYrvpd.js';
4
5
  export { ExecutionRef } from '../execution-refs.js';
5
- import '../board-live-cards-lib-jM2uYG1v.js';
6
6
  import '../types-BBhqYGhE.js';
7
7
 
8
8
  /**