yaml-flow 5.4.2 → 7.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 (252) hide show
  1. package/board-live-cards-cli.js +6 -6
  2. package/browser/asset-integrity.json +10 -0
  3. package/browser/board-livecards-client.js +2 -0
  4. package/browser/board-livecards-client.js.map +1 -0
  5. package/browser/board-livecards-localstorage.js +10 -0
  6. package/browser/board-livecards-localstorage.js.map +1 -0
  7. package/browser/board-livegraph-engine.js +2 -1676
  8. package/browser/board-livegraph-engine.js.map +1 -1
  9. package/browser/card-compute.js +28 -28
  10. package/browser/compute-jsonata.js +5 -0
  11. package/browser/compute-jsonata.js.map +1 -0
  12. package/browser/live-cards.js +561 -129
  13. package/browser/live-cards.schema.json +418 -132
  14. package/card-store.js +37 -0
  15. package/dist/batch/index.cjs +1 -108
  16. package/dist/batch/index.cjs.map +1 -1
  17. package/dist/batch/index.js +1 -106
  18. package/dist/batch/index.js.map +1 -1
  19. package/dist/board-live-cards-lib-Bg6EvCo5.d.cts +136 -0
  20. package/dist/board-live-cards-lib-jM2uYG1v.d.ts +136 -0
  21. package/dist/board-live-cards-public-CW5074xr.d.cts +318 -0
  22. package/dist/board-live-cards-public-hnZo0mAf.d.ts +318 -0
  23. package/dist/board-livegraph-runtime/index.cjs +2 -1671
  24. package/dist/board-livegraph-runtime/index.cjs.map +1 -1
  25. package/dist/board-livegraph-runtime/index.d.cts +12 -11
  26. package/dist/board-livegraph-runtime/index.d.ts +12 -11
  27. package/dist/board-livegraph-runtime/index.js +2 -1662
  28. package/dist/board-livegraph-runtime/index.js.map +1 -1
  29. package/dist/board-livegraph-runtime/jsonata-sync.cjs +7623 -0
  30. package/dist/card-compute/index.cjs +9 -7159
  31. package/dist/card-compute/index.cjs.map +1 -1
  32. package/dist/card-compute/index.d.cts +27 -1
  33. package/dist/card-compute/index.d.ts +27 -1
  34. package/dist/card-compute/index.js +9 -7145
  35. package/dist/card-compute/index.js.map +1 -1
  36. package/dist/card-compute/jsonata-sync.cjs +7623 -0
  37. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +3 -0
  38. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +1 -0
  39. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +37 -0
  40. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.ts +37 -0
  41. package/dist/cli/browser-api/board-live-cards-browser-adapter.js +3 -0
  42. package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +1 -0
  43. package/dist/cli/browser-api/card-store-browser-api.cjs +2 -0
  44. package/dist/cli/browser-api/card-store-browser-api.cjs.map +1 -0
  45. package/dist/cli/browser-api/card-store-browser-api.d.cts +26 -0
  46. package/dist/cli/browser-api/card-store-browser-api.d.ts +26 -0
  47. package/dist/cli/browser-api/card-store-browser-api.js +2 -0
  48. package/dist/cli/browser-api/card-store-browser-api.js.map +1 -0
  49. package/dist/cli/browser-api/jsonata-sync.cjs +7623 -0
  50. package/dist/cli/node/artifacts-store-cli.cjs +11 -0
  51. package/dist/cli/node/artifacts-store-cli.cjs.map +1 -0
  52. package/dist/cli/node/artifacts-store-cli.d.cts +8 -0
  53. package/dist/cli/node/artifacts-store-cli.d.ts +8 -0
  54. package/dist/cli/node/artifacts-store-cli.js +11 -0
  55. package/dist/cli/node/artifacts-store-cli.js.map +1 -0
  56. package/dist/cli/node/board-live-cards-cli.cjs +15 -0
  57. package/dist/cli/node/board-live-cards-cli.cjs.map +1 -0
  58. package/dist/cli/node/board-live-cards-cli.d.cts +20 -0
  59. package/dist/cli/node/board-live-cards-cli.d.ts +20 -0
  60. package/dist/cli/node/board-live-cards-cli.js +15 -0
  61. package/dist/cli/node/board-live-cards-cli.js.map +1 -0
  62. package/dist/cli/node/card-store-cli.cjs +8 -0
  63. package/dist/cli/node/card-store-cli.cjs.map +1 -0
  64. package/dist/cli/node/card-store-cli.d.cts +15 -0
  65. package/dist/cli/node/card-store-cli.d.ts +15 -0
  66. package/dist/cli/node/card-store-cli.js +8 -0
  67. package/dist/cli/node/card-store-cli.js.map +1 -0
  68. package/dist/cli/node/execution-adapter.cjs +3 -0
  69. package/dist/cli/node/execution-adapter.cjs.map +1 -0
  70. package/dist/cli/node/execution-adapter.d.cts +174 -0
  71. package/dist/cli/node/execution-adapter.d.ts +174 -0
  72. package/dist/cli/node/execution-adapter.js +3 -0
  73. package/dist/cli/node/execution-adapter.js.map +1 -0
  74. package/dist/cli/node/fs-board-adapter.cjs +14 -0
  75. package/dist/cli/node/fs-board-adapter.cjs.map +1 -0
  76. package/dist/cli/node/fs-board-adapter.d.cts +204 -0
  77. package/dist/cli/node/fs-board-adapter.d.ts +204 -0
  78. package/dist/cli/node/fs-board-adapter.js +14 -0
  79. package/dist/cli/node/fs-board-adapter.js.map +1 -0
  80. package/dist/cli/node/jsonata-sync.cjs +7623 -0
  81. package/dist/cli/node/source-cli-task-executor.cjs +11 -0
  82. package/dist/cli/node/source-cli-task-executor.cjs.map +1 -0
  83. package/dist/cli/node/source-cli-task-executor.d.cts +1 -0
  84. package/dist/cli/node/source-cli-task-executor.d.ts +1 -0
  85. package/dist/cli/node/source-cli-task-executor.js +11 -0
  86. package/dist/cli/node/source-cli-task-executor.js.map +1 -0
  87. package/dist/config/index.cjs +1 -79
  88. package/dist/config/index.cjs.map +1 -1
  89. package/dist/config/index.js +1 -76
  90. package/dist/config/index.js.map +1 -1
  91. package/dist/continuous-event-graph/index.cjs +2 -2129
  92. package/dist/continuous-event-graph/index.cjs.map +1 -1
  93. package/dist/continuous-event-graph/index.d.cts +81 -5
  94. package/dist/continuous-event-graph/index.d.ts +81 -5
  95. package/dist/continuous-event-graph/index.js +2 -2088
  96. package/dist/continuous-event-graph/index.js.map +1 -1
  97. package/dist/continuous-event-graph/jsonata-sync.cjs +7623 -0
  98. package/dist/event-graph/index.cjs +22 -8292
  99. package/dist/event-graph/index.cjs.map +1 -1
  100. package/dist/event-graph/index.js +22 -8237
  101. package/dist/event-graph/index.js.map +1 -1
  102. package/dist/execution-refs.cjs +3 -0
  103. package/dist/execution-refs.cjs.map +1 -0
  104. package/dist/execution-refs.d.cts +260 -0
  105. package/dist/execution-refs.d.ts +260 -0
  106. package/dist/execution-refs.js +3 -0
  107. package/dist/execution-refs.js.map +1 -0
  108. package/dist/index.cjs +29 -13221
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +2 -4
  111. package/dist/index.d.ts +2 -4
  112. package/dist/index.js +29 -13112
  113. package/dist/index.js.map +1 -1
  114. package/dist/inference/index.cjs +5 -617
  115. package/dist/inference/index.cjs.map +1 -1
  116. package/dist/inference/index.js +5 -610
  117. package/dist/inference/index.js.map +1 -1
  118. package/dist/jsonata-sync.cjs +7623 -0
  119. package/dist/{live-cards-bridge-x5XREkXm.d.cts → live-cards-bridge-BXbVTsna.d.cts} +27 -4
  120. package/dist/{live-cards-bridge-EQjytzI_.d.ts → live-cards-bridge-Ds28XR15.d.ts} +27 -4
  121. package/dist/server-runtime/index.cjs +9 -0
  122. package/dist/server-runtime/index.cjs.map +1 -0
  123. package/dist/server-runtime/index.d.cts +31 -0
  124. package/dist/server-runtime/index.d.ts +31 -0
  125. package/dist/server-runtime/index.js +9 -0
  126. package/dist/server-runtime/index.js.map +1 -0
  127. package/dist/server-runtime/jsonata-sync.cjs +7623 -0
  128. package/dist/step-machine/index.cjs +11 -7129
  129. package/dist/step-machine/index.cjs.map +1 -1
  130. package/dist/step-machine/index.js +11 -7113
  131. package/dist/step-machine/index.js.map +1 -1
  132. package/dist/step-machine-public/index.cjs +2 -0
  133. package/dist/step-machine-public/index.cjs.map +1 -0
  134. package/dist/step-machine-public/index.d.cts +159 -0
  135. package/dist/step-machine-public/index.d.ts +159 -0
  136. package/dist/step-machine-public/index.js +2 -0
  137. package/dist/step-machine-public/index.js.map +1 -0
  138. package/dist/step-machine-public/jsonata-sync.cjs +7623 -0
  139. package/dist/storage-refs.cjs +10 -0
  140. package/dist/storage-refs.cjs.map +1 -0
  141. package/dist/storage-refs.d.cts +93 -0
  142. package/dist/storage-refs.d.ts +93 -0
  143. package/dist/storage-refs.js +10 -0
  144. package/dist/storage-refs.js.map +1 -0
  145. package/dist/stores/file.cjs +1 -114
  146. package/dist/stores/file.cjs.map +1 -1
  147. package/dist/stores/file.js +1 -112
  148. package/dist/stores/file.js.map +1 -1
  149. package/dist/stores/index.cjs +1 -231
  150. package/dist/stores/index.cjs.map +1 -1
  151. package/dist/stores/index.js +1 -227
  152. package/dist/stores/index.js.map +1 -1
  153. package/dist/stores/localStorage.cjs +1 -76
  154. package/dist/stores/localStorage.cjs.map +1 -1
  155. package/dist/stores/localStorage.js +1 -74
  156. package/dist/stores/localStorage.js.map +1 -1
  157. package/dist/stores/memory.cjs +1 -47
  158. package/dist/stores/memory.cjs.map +1 -1
  159. package/dist/stores/memory.js +1 -45
  160. package/dist/stores/memory.js.map +1 -1
  161. package/dist/types-B1ZRa4aI.d.ts +147 -0
  162. package/dist/types-BxEFcVK9.d.cts +147 -0
  163. package/examples/browser/boards/portfolio-tracker/portfolio-t4.js +291 -0
  164. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-fetch-prices.js +218 -0
  165. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-fetch-prices.py +201 -0
  166. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +357 -0
  167. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-inference-adapter.js +25 -16
  168. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-public.js +552 -0
  169. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +300 -0
  170. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +617 -0
  171. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-sse-worker.js +48 -0
  172. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +366 -0
  173. package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/.runtime-out +1 -0
  174. package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/board-graph.json +32 -0
  175. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +70 -3
  176. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +16 -11
  177. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +9 -8
  178. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +49 -0
  179. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +2 -6
  180. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +4 -8
  181. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +3 -7
  182. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +9 -8
  183. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +12 -17
  184. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +2 -6
  185. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +107 -0
  186. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +51 -0
  187. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +45 -0
  188. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +71 -0
  189. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/reset-board-dir.py +36 -0
  190. package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-demo.flow.yaml +26 -0
  191. package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-handlers.py +39 -0
  192. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker-pycli.flow.yaml +80 -0
  193. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +36 -187
  194. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +40 -34
  195. package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +43 -0
  196. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker-pycli.py +77 -0
  197. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +1 -2
  198. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +8 -13
  199. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +33 -9
  200. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +3 -1
  201. package/examples/cli/step-machine-demo/step2-double-cli.js +6 -12
  202. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +66 -4
  203. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +13 -5
  204. package/examples/example-board/agent-instructions.md +11 -5
  205. package/examples/example-board/cards/_index.json +47 -0
  206. package/examples/example-board/cards/card-market-prices.json +33 -9
  207. package/examples/example-board/cards/card-my-identity.json +30 -6
  208. package/examples/example-board/cards/card-portfolio-action.json +24 -6
  209. package/examples/example-board/cards/card-portfolio-intelligence.json +97 -0
  210. package/examples/example-board/cards/card-portfolio-risks.json +24 -6
  211. package/examples/example-board/cards/card-portfolio-value.json +38 -10
  212. package/examples/example-board/cards/card-portfolio.json +57 -13
  213. package/examples/example-board/cards/card-rebalance-impact.json +22 -6
  214. package/examples/example-board/cards/card-rebalance-sim.json +66 -15
  215. package/examples/example-board/demo-chat-handler.js +14 -4
  216. package/examples/example-board/demo-server-config.json +1 -0
  217. package/examples/example-board/demo-server.js +366 -68
  218. package/examples/example-board/demo-shell-localstorage.html +774 -0
  219. package/examples/example-board/demo-shell-with-server.html +20 -37
  220. package/examples/example-board/demo-shell.html +5 -4
  221. package/examples/example-board/demo-task-executor.js +273 -275
  222. package/examples/index.html +0 -14
  223. package/examples/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +0 -1
  224. package/examples/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +1 -2
  225. package/package.json +46 -8
  226. package/schema/live-cards.schema.json +418 -132
  227. package/step-machine-cli.js +43 -310
  228. package/board-livecards-server-runtime.js +0 -1574
  229. package/browser/board-livecards-runtime-client.js +0 -263
  230. package/dist/cli/board-live-cards-cli.cjs +0 -10650
  231. package/dist/cli/board-live-cards-cli.cjs.map +0 -1
  232. package/dist/cli/board-live-cards-cli.d.cts +0 -179
  233. package/dist/cli/board-live-cards-cli.d.ts +0 -179
  234. package/dist/cli/board-live-cards-cli.js +0 -10598
  235. package/dist/cli/board-live-cards-cli.js.map +0 -1
  236. package/dist/journal-9HEgs7dU.d.ts +0 -28
  237. package/dist/journal-B-JCfQnh.d.cts +0 -28
  238. package/dist/schedule-Cszq9LYY.d.ts +0 -21
  239. package/dist/schedule-qWNL0RQh.d.cts +0 -21
  240. package/examples/browser/boards/portfolio-tracker/cards/holdings-table.json +0 -22
  241. package/examples/browser/boards/portfolio-tracker/cards/portfolio-form.json +0 -16
  242. package/examples/browser/boards/portfolio-tracker/cards/portfolio-risk-assessment.json +0 -28
  243. package/examples/browser/boards/portfolio-tracker/cards/portfolio-value.json +0 -15
  244. package/examples/browser/boards/portfolio-tracker/cards/price-fetch.json +0 -15
  245. package/examples/browser/boards/portfolio-tracker/cards/rebalancing-strategy.json +0 -28
  246. package/examples/browser/boards/portfolio-tracker/fetch-prices.js +0 -43
  247. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-task-executor.cjs +0 -96
  248. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.bat +0 -7
  249. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.js +0 -351
  250. package/examples/cli/step-machine-demo/two-step-math-handlers.js +0 -32
  251. package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +0 -24
  252. package/examples/example-board/demo-shell-browser.html +0 -674
@@ -0,0 +1,31 @@
1
+ import { M as MultiBoardRuntimeOptions, a as MultiBoardRuntime, S as SingleBoardRuntimeOptions, b as SingleBoardRuntime } from '../types-BxEFcVK9.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-BxEFcVK9.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-CW5074xr.cjs';
4
+ export { ExecutionRef } from '../execution-refs.cjs';
5
+ import '../board-live-cards-lib-Bg6EvCo5.cjs';
6
+ import '../types-BBhqYGhE.cjs';
7
+
8
+ /**
9
+ * server-runtime/index.ts
10
+ *
11
+ * Platform-free board server runtime.
12
+ *
13
+ * ─────────────────────────────────────────────────────────────────────────────
14
+ * LAYER DIAGRAM
15
+ * ─────────────────────────────────────────────────────────────────────────────
16
+ *
17
+ * HOST (demo-server / Azure Fn / Firebase Fn)
18
+ * ↓ constructs adapters, calls createSingleBoardServerRuntime(options)
19
+ * THIS FILE — routes, contexts, chat/file orchestration
20
+ * ↓ delegates to
21
+ * board-live-cards-public.ts — graph, journal, dispatch (already platform-free)
22
+ *
23
+ * No node:fs, node:net, node:child_process, node:os imports.
24
+ * All platform access flows through injected adapters.
25
+ * ─────────────────────────────────────────────────────────────────────────────
26
+ */
27
+
28
+ declare function createSingleBoardServerRuntime(options: SingleBoardRuntimeOptions): SingleBoardRuntime;
29
+ declare function createMultiBoardServerRuntime(options: MultiBoardRuntimeOptions): MultiBoardRuntime;
30
+
31
+ export { MultiBoardRuntime, MultiBoardRuntimeOptions, SingleBoardRuntime, SingleBoardRuntimeOptions, createMultiBoardServerRuntime, createSingleBoardServerRuntime };
@@ -0,0 +1,31 @@
1
+ import { M as MultiBoardRuntimeOptions, a as MultiBoardRuntime, S as SingleBoardRuntimeOptions, b as SingleBoardRuntime } from '../types-B1ZRa4aI.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-B1ZRa4aI.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-hnZo0mAf.js';
4
+ export { ExecutionRef } from '../execution-refs.js';
5
+ import '../board-live-cards-lib-jM2uYG1v.js';
6
+ import '../types-BBhqYGhE.js';
7
+
8
+ /**
9
+ * server-runtime/index.ts
10
+ *
11
+ * Platform-free board server runtime.
12
+ *
13
+ * ─────────────────────────────────────────────────────────────────────────────
14
+ * LAYER DIAGRAM
15
+ * ─────────────────────────────────────────────────────────────────────────────
16
+ *
17
+ * HOST (demo-server / Azure Fn / Firebase Fn)
18
+ * ↓ constructs adapters, calls createSingleBoardServerRuntime(options)
19
+ * THIS FILE — routes, contexts, chat/file orchestration
20
+ * ↓ delegates to
21
+ * board-live-cards-public.ts — graph, journal, dispatch (already platform-free)
22
+ *
23
+ * No node:fs, node:net, node:child_process, node:os imports.
24
+ * All platform access flows through injected adapters.
25
+ * ─────────────────────────────────────────────────────────────────────────────
26
+ */
27
+
28
+ declare function createSingleBoardServerRuntime(options: SingleBoardRuntimeOptions): SingleBoardRuntime;
29
+ declare function createMultiBoardServerRuntime(options: MultiBoardRuntimeOptions): MultiBoardRuntime;
30
+
31
+ export { MultiBoardRuntime, MultiBoardRuntimeOptions, SingleBoardRuntime, SingleBoardRuntimeOptions, createMultiBoardServerRuntime, createSingleBoardServerRuntime };
@@ -0,0 +1,9 @@
1
+ import {createRequire}from'module';import'ajv-formats';var Bt="b64:";function Xe(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 We(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}${Xe(JSON.stringify(t))}`}function ae(t){if(t.startsWith("::fs-path::"))return {kind:"fs-path",value:t.slice(11)};if(!t.startsWith(Bt))throw new Error(`Invalid ref format (expected ${Bt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(We(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]??Dt(),o={};if(n){let i=n.tasks[e],u=kt(i);for(let f of u)for(let[x,F]of Object.entries(n.tasks))if(ot(F).includes(f)){let b=t.tasks[x];b?.lastDataHash&&(o[f]=b.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]??Dt(),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 O=u.requires??[];for(let w of O)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 F={...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},b=[...new Set([...t.availableOutputs,...f])];return {...t,tasks:{...t.tasks,[n]:F},availableOutputs:b,lastUpdated:new Date().toISOString()}}function me(t,e,n,r){let o=t.tasks[n]??Dt(),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]??Dt(),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 Dt(){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 Qe(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:sn(r,e.action)};case "task-upsert":return Ze(t,e.taskName,e.taskConfig);case "task-removal":return tn(t,e.taskName);case "node-requires-add":return en(t,e.nodeName,e.tokens);case "node-requires-remove":return nn(t,e.nodeName,e.tokens);case "node-provides-add":return rn(t,e.nodeName,e.tokens);case "node-provides-remove":return on(t,e.nodeName,e.tokens);default:return t}}function ke(t,e){return e.reduce((n,r)=>Qe(n,r),t)}function Ze(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 tn(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 en(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 nn(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 rn(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 on(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 Pt(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 sn(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=an(r),i=le(e,n.tasks),u=new Set([...i,...n.availableOutputs]),f=[],x=[],F=[],b=[];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),j=false;switch(v){case "data-changed":{T.length>0&&T.some(U=>{for(let[K,Y]of Object.entries(r))if(ot(Y).includes(U)){let X=n.tasks[K];if(!X)continue;let St=y.lastConsumedHashes?.[U];return X.lastDataHash==null?X.executionCount>y.lastEpoch:X.lastDataHash!==St}return false})||(j=true);break}case "epoch-changed":{T.length>0&&T.some(U=>{for(let[K,Y]of Object.entries(r))if(ot(Y).includes(U)){let X=n.tasks[K];if(X&&X.executionCount>y.lastEpoch)return true}return false})||(j=true);break}case "time-based":{let M=g.refreshInterval??0;if(M<=0){j=true;break}let U=y.completedAt;if(!U){j=true;break}(Date.now()-Date.parse(U))/1e3<M&&(j=true);break}case "manual":j=true;break}if(j)continue}let A=kt(g);if(A.length===0){f.push(w);continue}let B=[],L=[],P=[];for(let T of A){if(u.has(T))continue;let j=s[T]||[];j.length===0?B.push(T):j.every(U=>Yt(n.tasks[U]))?P.push({token:T,failedProducer:j[0]}):L.push(T);}B.length>0?F.push({taskName:w,missingTokens:B}):P.length>0?b.push({taskName:w,failedTokens:P.map(T=>T.token),failedProducers:[...new Set(P.map(T=>T.failedProducer))]}):L.length>0?x.push({taskName:w,waitingOn:L}):f.push(w);}let O={};if(f.length>1){let w=fe(f,r);for(let[g,y]of Object.entries(w))y.length>1&&(O[g]=y);}return {eligible:f,pending:x,unresolved:F,blocked:b,conflicts:O}}function an(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 un(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 un(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 cn(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 dn(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 Ce(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return cn(e)}function ln(t){try{let e=JSON.parse(dn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Re(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)),F=new Ot,b=false,O=false;function w(){if(!u){if(b){O=true;return}b=true;try{do O=!1,g();while(O)}finally{b=false;}}}function g(){let m=F.drain(),A=s.drain(),B=[...m,...A];B.length>0&&(i=ke(i,B));let L=It(i);B.length>0&&o?.(B,i,L);for(let P of L.eligible)E(P);for(let P of B)if(P.type==="task-progress"){let{taskName:T,update:j}=P;if(!i.config.tasks[T])continue;let U=i.state.tasks[T];if(!U||U.status!=="running")continue;let K=Ce(T),Y=v(T,K,j).catch(X=>{u||(F.append({type:"task-failed",taskName:T,error:X.message??String(X),timestamp:new Date().toISOString()}),w());}).finally(()=>{f.delete(Y);});f.add(Y);}}function y(m){let B=i.config.tasks[m].requires??[],L=new Map;for(let[T,j]of Object.entries(i.config.tasks))for(let M of j.provides??[])L.set(M,T);let P={};for(let T of B){let j=L.get(T);j?P[T]=i.state.tasks[j]?.data:P[T]=void 0;}return P}async function v(m,A,B){let L=i.config.tasks[m],P=L.taskHandlers??[],T=y(m);for(let j of P){let M=x.get(j);if(!M)throw new Error(`Handler '${j}' not found in registry (task '${m}')`);let U={nodeId:m,state:T,taskState:i.state.tasks[m],config:L,callbackToken:A,update:B};if(await M(U)==="task-initiate-failure")throw new Error(`Handler '${j}' returned task-initiate-failure (task '${m}')`)}}function E(m){let B=i.config.tasks[m]?.taskHandlers;if(!B||B.length===0)return;F.append({type:"task-started",taskName:m,timestamp:new Date().toISOString()}),w();let L=Ce(m),P=v(m,L).catch(T=>{u||(F.append({type:"task-failed",taskName:m,error:T.message??String(T),timestamp:new Date().toISOString()}),w());}).finally(()=>{f.delete(P);});f.add(P);}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 L=ln(m);if(!L)return;let{taskName:P}=L;if(i.config.tasks[P]){if(B&&B.length>0)s.append({type:"task-failed",taskName:P,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:P,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;}}}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}var pn=createRequire(import.meta.url);pn("./jsonata-sync.cjs");var mn=createRequire(import.meta.url),qt=mn("./jsonata-sync.cjs"),ve=qt;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 hn(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 qt(o.expr).evaluate(r);xe(t.computed_values,o.bindTo,s),r.computed_values=t.computed_values;}catch(s){console.error(`CardCompute.run error on "${t.id??"?"}.${o.bindTo}":`,s);}return t}function yn(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}),console.error(`CardCompute.runSync error on "${t.id??"?"}.${s.bindTo}":`,i);}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function kn(t,e,n){let r={...n??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return qt(t).evaluate(r)}function Sn(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"]),Cn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Rn(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))Cn.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 bn(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 qt(i).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function wn(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 Gt={run:hn,runSync:yn,eval:kn,resolve:Sn,validate:Rn,enrichSources:bn,enrichSourcesSync:wn};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 F=0;F<u.length-1;F++){let b=u[F],O=x[b],w=O&&typeof O=="object"&&!Array.isArray(O)?{...O}:{};x[b]=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 F=r(x,s,i),b=t.writeCard(f.key,F);u[o]={key:f.key,checksum:b,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 _e(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 Ee(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 Ut="v1",wt="board/graph",Te="board/lastJournalProcessedId";function Ae(t){return `cards/${t}/runtime`}function Ie(t){return {readRuntime(e){return t.read(Ae(e))??{_sources:{}}},writeRuntime(e,n){t.write(Ae(e),n);}}}function vn(t,e){let n={...t};for(let r of e.deleteKeys)delete n[r];return {...n,...e.shallowMerge}}function Oe(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,n){if(n.schemaVersion!==Ut)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=vn(r.values,n);return {ok:true,newVersion:t.writeValues(e,o,n.deleteKeys)}}}}function je(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 Ne(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 xn(t){return t?.lastRequestedAt?!t.lastFetchedAt||t.lastFetchedAt<t.lastRequestedAt:false}function An(t,e){return t?.lastRequestedAt?xn(t)?"in-flight":!t.lastFetchedAt||t.lastFetchedAt<e?"dispatch":"idle":"dispatch"}function _n(t,e){let n={...t,lastFetchedAt:e};return delete n.lastError,n}function En(t,e){let n={...t,lastError:e};return delete n.lastFetchedAt,n}function Mt(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(U=>e.state.availableOutputs.includes(U)),L=E.filter(U=>!e.state.availableOutputs.includes(U)),P=u.get(g)??L,T=new Set;for(let U of m)for(let K of f.get(U)??[])K!==g&&T.add(K);let j=y.failedAt,M=y.error?{message:y.error,code:"TASK_FAILED",at:j,source:"task-runtime"}:void 0;return {name:g,status:y.status,error:M,requires:E,requires_satisfied:B,requires_missing:L,provides_declared:m,provides_runtime:A,blocked_by:P,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 F=x.map(g=>({name:g.name,fanOut:g.unblocks.length})).sort((g,y)=>y.fanOut-g.fanOut||g.name.localeCompare(y.name)),b=F.length>0?F[0]:{name:null,fanOut:0},O=new Set;for(let g of Object.values(r))for(let y of g.requires??[])O.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(O).length,max_fan_out_card:b.name,max_fan_out:b.fanOut}},cards:x}}function Tn(){return new Date().toISOString()}function $e(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 F=x.id,b=x.card_data??{},O=x.source_defs??[],w=O.filter(D=>D.optionalForCompletionGating!==true),g=n.cardRuntimeStore.readRuntime(F),y=false,v=()=>{y&&(n.cardRuntimeStore.writeRuntime(F,g),y=false);},E=D=>({...g._sources[D]??{}}),m=(D,q)=>{g._sources[D]=q,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 D=u.update,q=D.outputFile;if(q){let S=E(q);if(D.failure)m(q,En(S,D.reason??"unknown"));else {let l=D.rqt;if(!S.lastFetchedAt||l>S.lastFetchedAt){let _=typeof D.deliveryToken=="string"?D.deliveryToken:void 0;_&&n.fetchedSourcesStore.commitSourceData(F,q,_),m(q,_n(S,l));}}v();}}let L={};for(let D of O)if(D.outputFile){let q=n.fetchedSourcesStore.readSourceData(F,D.outputFile);q!==null&&(L[D.bindTo]=q);}let P={};for(let[D,q]of Object.entries(u.state??{}))if(q!==null&&typeof q=="object"&&!Array.isArray(q)){let S=q[D];P[D]=S!==void 0?S:q;}else P[D]=q;let T={id:F,card_data:{...b},requires:P,source_defs:O,compute:x.compute};T._sourcesData=L,x.compute&&Gt.runSync(T,{sourcesData:L}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))(F,T.computed_values??{});let j={...x},M=Gt.enrichSourcesSync(Array.isArray(x.source_defs)?x.source_defs:void 0,{card_data:x.card_data,requires:P}),U=t.value;j.source_defs=Array.isArray(M)?M.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:U})):M;let K=Tn(),Y=u.update?void 0:K,X=w.filter(D=>{let q=D.outputFile;if(typeof q!="string"||!q)return true;let S=E(q);Y&&(S={...S,queueRequestedAt:Y},m(q,S));let l=S.queueRequestedAt??S.lastRequestedAt??K,_=An(S,l);return _==="in-flight"?false:_==="dispatch"});if(v(),X.length>0){let D=false,q=K;for(let S of X){let l=S.outputFile;if(typeof l!="string"||!l)continue;let _=E(l),N=_.queueRequestedAt??K;m(l,{..._,lastRequestedAt:N}),q=N,D=true;}return D&&v(),D&&(f.push({taskKind:"source-fetch",payload:{boardRef:ht(t),enrichedCard:j,callbackToken:u.callbackToken,rqt:q}}),n.executionRequestStore.appendEntries(e,f)),"task-initiated"}let St=x.provides??[],Ct={};for(let{bindTo:D,ref:q}of St)Ct[D]=Gt.resolve(T,q);return (i??n.outputStore.writeDataObjects.bind(n.outputStore))(Ct),O.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let q=E(D.outputFile);return !q.lastRequestedAt||!q.lastFetchedAt?true:q.lastFetchedAt<=q.lastRequestedAt}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:ht(t),enrichedCard:j,callbackToken:u.callbackToken,rqt:K}}),r(u.nodeId,Ct),f.length>0&&n.executionRequestStore.appendEntries(e,f),"task-initiated"}}var ee={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Fe(t){return {[wt]:t.graph,[Te]:t.lastDrainedJournalId}}function Be(t){let e=t[wt],n=t[Te];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${wt}`);return {graph:e,lastDrainedJournalId:typeof n=="string"?n:""}}function De(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 z(t){return {status:"fail",error:t}}function nt(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function In(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 Pe(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(Pe(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function On(t){return In(JSON.stringify(t))}function Le(t){try{let e=JSON.parse(Pe(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 qe(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(_,N){return l.write(_,N),e.hashFn(N)},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 N={};for(let H of _)N[H]=l.read(H);return {version:e.hashFn(N),values:N}},writeValues(S,l,_){let N=e.kvStorage("state-snapshot");for(let H of _)N.delete(H);for(let[H,J]of Object.entries(l))N.write(H,J);return e.hashFn(l)}},u=()=>je(e.kvStorage("config")),f=()=>Oe(i),x=()=>_e(e.journalAdapter()),F=()=>Vt(s(),n),b=()=>{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 Ne(e.kvStorageForRef(S))};function O(){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:Ut,expectedVersion:l,commitId:e.genId(),committedAt:st(),deleteKeys:[],shallowMerge:Fe(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,G=($?.enrichedCard??{}).id??$?.cardId??"unknown";y({type:"task-failed",taskName:G,error:h,timestamp:st()});},l=Ee(e.kvStorage("execution-requests"),S),_=Ie(e.kvStorage("card-runtime")),N=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($):N.readSourceData(p,h)},ingestSourceDataStaged(p,h,$,V){N.ingestSourceDataStaged(p,h,$,V);},commitSourceData(p,h,$){let V=`${p}/.staged/${$}/${h}`,Q=e.blobStorage("sources").read(V);if(Q==null)return false;let tt=`${p}/${h}`,W=Q.trim();try{rt.set(tt,JSON.parse(W));}catch{rt.set(tt,W);}return at.push({cardId:p,outputFile:h,deliveryToken:$}),true},hasSource(p,h){let $=`${p}/${h}`;return rt.has($)?true:N.hasSource(p,h)}},it={cardStore:F(),cardRuntimeStore:J,fetchedSourcesStore:lt,outputStore:b(),executionRequestStore:l},ft=w(),pt=Pt(ft.graph),{events:Z,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()});},Nt=(p,h)=>y({type:"task-failed",taskName:p,error:h,timestamp:st()}),c=Re(pt,{handlers:{"card-handler":$e(t,gt,it,Jt,Nt,(p,h)=>{vt.push({cardId:p,values:h});},p=>{xt.push(p);})}});for(mt=Z;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 R=f().readSnapshot(t.value).version;g({lastDrainedJournalId:gt,graph:Tt(d)},R);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)N.commitSourceData(p,h,$);let k;try{k=Mt(r,d),it.outputStore.writeStatusSnapshot(k);}catch(p){n(`[board-live-cards-public] status publish failed: ${p instanceof Error?p.message:String(p)}`);}let C=[];for(let{cardId:p,values:h}of vt)C.push({kind:"computed_values",cardId:p,values:h});for(let p of xt)for(let[h,$]of Object.entries(p))h&&C.push({kind:"data_object",key:h,payload:$});for(let[p,h]of Et)C.push({kind:"card_refreshed",cardId:p,card:h});k!==void 0&&C.push({kind:"status",status:k}),o(C);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 G of V){if(!G.outputFile){n(`[dispatch] source "${G.bindTo}" has no outputFile \u2014 skipping`);continue}let Q=On({cbk:h.callbackToken,rg:t.value,br:ht(t),cid:$,b:G.bindTo,d:G.outputFile,cs:void 0,rqt:h.rqt});e.dispatchExecution(I,{source_def:G,base_ref:ht(t),callback:{token:Q,via:e.selfRef}}).catch(tt=>Nt($,tt instanceof Error?tt.message:String(tt)));}});}async function E(){try{let S=()=>{let _=w(),{events:N}=x().readEntriesAfterCursor(_.lastDrainedJournalId);N.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 z("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!O()){let J=Lt(ee);g({lastDrainedJournalId:"",graph:Tt(J)},null);}let _=S.params?.outputsStoreRef;if(!_)return z("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let N=u();N.writeCardStoreRef(l),N.writeOutputsStoreRef(_);let H=S.body??{};H["task-executor-ref"]&&N.writeTaskExecutorRef(H["task-executor-ref"]),H["chat-handler-ref"]&&N.writeChatHandlerRef(H["chat-handler-ref"]);try{b().writeStatusSnapshot(Mt(r,Pt(w().graph)));}catch{}return et()}catch(l){return nt(l)}}function A(S){try{let l=b().readStatusSnapshot();if(!l){l=Mt(r,Pt(w().graph));try{b().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()):z("removeCard requires params.id")}catch(l){return nt(l)}}function L(S){try{let l=S.params?.id;return l?(y({type:"task-restart",taskName:l,timestamp:st()}),E(),et()):z("retrigger requires params.id")}catch(l){return nt(l)}}async function P(S){return E()}function T(S){try{let l=S.params?.cardId,_=S.params?.all,N=!!S.params?.restart;if(!l&&!_)return z("upsertCard requires --card-id <id> or --all");let H=_?F().readAllCards().map(J=>J.id):[l];for(let J of H)if(!F().readCard(J))return z(`Card "${J}" not found in board at ${t.value}`);for(let J of H){let at=F().readCard(J),rt=De(at),lt=e.hashFn(rt),it=e.kvStorage("card-upsert"),ft=it.read(J),pt=ft?.taskConfigHash!==lt;if(!(!pt&&!N)){if(pt){let Z=ft?.blobRef??F().readCardKey(J)??J;y({type:"task-upsert",taskName:J,taskConfig:rt,timestamp:st()}),it.write(J,{blobRef:Z,taskConfigHash:lt,updatedAt:st()});}N&&y({type:"task-restart",taskName:J,timestamp:st()});}}return E(),et()}catch(l){return nt(l)}}function j(S){try{let l=S.params?.token;if(!l)return z("taskFailed requires params.token");let _=S.params?.error??"unknown error",N=Ht(l);return N?(y({type:"task-failed",taskName:N.taskName,error:_,timestamp:st()}),E(),et()):z("Invalid callback token")}catch(l){return nt(l)}}function M(S){try{let l=S.params?.token;if(!l)return z("taskProgress requires params.token");let N=(S.body??{}).update??{},H=Ht(l);return H?(y({type:"task-progress",taskName:H.taskName,update:N,timestamp:st()}),E(),et()):z("Invalid callback token")}catch(l){return nt(l)}}function U(S){try{let l=S.params?.token,_=S.params?.ref;if(!l)return z("sourceDataFetched requires params.token");if(!_)return z("sourceDataFetched requires params.ref");let N=Le(l);if(!N)return z("Invalid source token");let{cbk:H,cid:J,b:at,d:rt,cs:lt,rqt:it}=N,ft=te(e.blobStorage("sources"),mt=>e.resolveBlob(mt)),pt=e.genId();ft.ingestSourceDataStaged(J,rt,ae(_),pt);let Z=Ht(H);if(!Z)return z("Invalid callback token embedded in source token");let gt=st();return y({type:"task-progress",taskName:Z.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 z("sourceDataFetchFailure requires params.token");let N=Le(l);if(!N)return z("Invalid source token");let{cbk:H,b:J,d:at,cs:rt}=N,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()):z("Invalid callback token embedded in source token")}catch(l){return nt(l)}}function Y(S){try{let l=u().readCardStoreRef();return l?et({storeRef:l}):z(`Board at ${t.value} has no card store configured`)}catch(l){return nt(l)}}function X(S){try{let l=u().readOutputsStoreRef();return l?et({storeRef:l}):z(`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 z("getConfig requires params.key");let _=u(),N;switch(l){case "task-executor":N=_.readTaskExecutorRef()??null;break;case "chat-handler":N=_.readChatHandlerRef()??null;break;case "card-store-ref":N=_.readCardStoreRef();break;case "outputs-store-ref":N=_.readOutputsStoreRef();break;default:return z(`getConfig: unknown key "${l}"`)}return et({value:N})}catch(l){return nt(l)}}function Ct(S){try{let l=S.params?.key;if(!l)return z("getOutputsDataObject requires params.key");let _=b().readDataObject(l);return et(_)}catch(l){return nt(l)}}function Rt(S){try{return et(b().readAllDataObjects())}catch(l){return nt(l)}}function D(S){try{let l=S.params?.key;if(!l)return z("getOutputsComputedValues requires params.key");let _=b().readComputedValues(l);return et(_)}catch(l){return nt(l)}}function q(S){try{return et(b().readAllComputedValues())}catch(l){return nt(l)}}return {init:m,status:A,getCardStoreRef:Y,getOutputsStoreRef:X,getConfig:St,getOutputsDataObject:Ct,getAllOutputsDataObjects:Rt,getOutputsComputedValues:D,getAllOutputsComputedValues:q,removeCard:B,retrigger:L,processAccumulatedEvents:P,upsertCard:T,taskFailed:j,taskProgress:M,sourceDataFetched:U,sourceDataFetchFailure:K}}function Ge(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 Ve(){return new Date().toISOString()}function Ue(t){return new TextEncoder().encode(t).byteLength}function jt(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 jn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function Me(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 Nn(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 $n(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Fn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Bn(t){let e=Nn(t),n=e.lastIndexOf(".");return n<=0||n===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,n),ext:e.slice(n)}}function Dn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function oe(t){function e(n){let r=t.stat?jn(t.stat(n)):null;if(r)return r;let s=jt(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??Ve(),s.size=s.size??Ue(r);let i=jt(t);return Me(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??Ve(),s.size=s.size??r.byteLength;let i=jt(t);return Me(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=jt(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=jt(t);delete r.entries[n],ne(t,r);}}}function He(t,e){let n=e?.indexFileName;function r(b){return `${b}/${n}`}function o(b){let O=t.getText(r(b));if(!O)return [];try{let w=JSON.parse(O);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:`${b}/chats/${String(g.stored_name)}`,updated_at:typeof g.updated_at=="string"?g.updated_at:null})):[]}catch{return []}}function s(b,O){t.putText(r(b),JSON.stringify(O,null,2),"application/json; charset=utf-8");}function i(b){let O=o(b),w=0;for(let g of O){let y=Number(g.serial||0);Number.isFinite(y)&&y>w&&(w=y);}return w+1}function u(b,O){let w=o(b);w.push(O),s(b,w);}function f(b){let O=o(b),w=[];for(let g of O){let y=`${b}/${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:`${b}/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(b){let O=`${b}/`;for(let w of t.list(O))t.remove(w.key);}function F(b){let O=`${b}/`,w=t.list(O),g=0,y=0,v=false;for(let E of w){let m=E.key.slice(O.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:F}}function Ke(t){function e(o,s){let i=0,u=[];Array.isArray(s)&&u.push(...s);for(let f of t.list(`${o}/`))u.push(Dn(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),F=Fn(x),b=$n(f),O=`${String(s).padStart(3,"0")}-`,w=F,g=u-O.length-w.length;g<1&&(w="",g=u-O.length);let y=b.slice(0,Math.max(1,g)),v=`${O}${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 Je(){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 ze={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Ln=32;function Pn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Ye(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)Ye(t,r);return}n.kind==="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 Fr(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),n={...ze,...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 F(a){let c=qe(a.baseRef,a.boardAdapter),d=a.boardAdapter.kvStorageForRef(a.cardStoreRef),k=Ge(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)),C=a.artifactsAdapter||a.boardAdapter,I=null,p=null;return {label:a.label,board:c,cardStore:k,get filesArtifacts(){return I??=oe(C.blobStorage("files"))},get chatsArtifacts(){return p??=oe(C.blobStorage("chats"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,inferenceAdapterRef:a.inferenceAdapterRef,notification:Pn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let b=t.boards.map(F),O=new Map;function w(a){return O.get(a)??0}function g(a){let c=b[w(a)];return {files:c?c.filesArtifacts:null,chats:c?c.chatsArtifacts:null}}function y(a){let c=g(a);return c.chats?He(c.chats,{indexFileName:".index.json"}):null}function v(a){let c=g(a);return c.files?Ke(c.files):null}function E(){return Je()}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=>{Ye(a.notification,d);let R=d.kind==="notification-batch"?d.notifications:[d];Jt(R);});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 R=a.board.init({params:c,body:d});if(R.status!=="success")throw Object.assign(new Error(R.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 L(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let c=[],d=a.board.status({});d.status==="success"&&d.data!=null&&c.push({kind:"status",status:d.data});let R=a.board.getAllOutputsDataObjects({});if(R.status==="success"&&R.data!=null)for(let[C,I]of Object.entries(R.data))C&&c.push({kind:"data_object",key:C,payload:I});let k=a.board.getAllOutputsComputedValues({});if(k.status==="success"&&k.data!=null)for(let[C,I]of Object.entries(k.data))C&&c.push({kind:"computed_values",cardId:C,values:I});c.length>0&&a.boardAdapter.publishBoardChangeNotifications(c);}function P(a,c){if(!a||a.cardsBootstrapped)return;let d=a.cardStore.get({}),R=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let k of R)typeof k.id=="string"&&(O.set(k.id,c),a.board.upsertCard({params:{cardId:k.id}}));a.cardsBootstrapped=true;}async function T(){for(let a of b)await B(a);}async function j(){await T();for(let a=0;a<b.length;a++)L(b[a]),P(b[a],a);}function M(a){return b[w(a)]??null}function U(a){let c=M(a);if(!c)return null;let d=c.cardStore.get({params:{id:a}});if(d.status!=="success")return null;let R=Array.isArray(d.data?.cards)?d.data.cards:[];return R.length>0?R[0]:null}function K(){let a=d=>{if(!d||!d.cardStore)return [];let R=d.cardStore.get({});return R.status!=="success"||!Array.isArray(R.data?.cards)?[]:R.data.cards},c=[];for(let d of b)c.push(...a(d));return c}function Y(){let a=b.map(C=>{try{let p=C.boardAdapter.kvStorageForRef(C.outputsStoreRef).read("status");if(p!=null)return p}catch{}return C.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"],R={};for(let C of d)R[C]=0;for(let C of a){let I=C,p=Array.isArray(I.cards)?I.cards:[];c.push(...p);for(let h of d)R[h]+=Number(I?.summary?.[h]||0);}let k=a[0];return {...k,cards:c,summary:{...k.summary||{},card_count:c.length,...R}}}function X(){let a={},c=d=>{for(let[R,k]of Object.entries(d.notification.computedValues)){let C=d.notification.cards[R];a[R]={schema_version:"v1",card_id:R,card_data:C?.card_data??{},computed_values:k??{}};}};for(let d of b)c(d);return a}function St(){let a={};for(let c of b)Object.assign(a,c.notification.dataObjects||{});return a}function Ct(a){let c=m(a),d=y(a);return d?d.readSignal(c):{count:0,latest_mtime_ms:0,processing:false}}function Rt(){let a=K(),c=X(),d=St(),R={};for(let k of a){if(!k?.id)continue;let C=k.id,I=c[C]||{},p=Ct(C),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};R[C]={schema_version:I.schema_version||"v1",card_id:I.card_id||C,card_data:h,computed_values:I.computed_values&&typeof I.computed_values=="object"?I.computed_values:{}};}return {boardId:r,cardDefinitions:a,statusSnapshot:Y(),dataObjectsByToken:d,cardRuntimeById:R}}function D(a,c,d){let R=d?.syncBoard!==false,k=M(a);if(!k)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let C=U(a);if(!C)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let I=c(C)||C,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(R){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 q(a,c){D(a,c,{syncBoard:true});}function S(a,c){D(a,c,{syncBoard:false});}function l(a,c){q(a,d=>{if(!c||typeof c!="object"||Object.keys(c).length===0)return d;function R(k,C,I){let p=String(C||"").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&&typeof c.fieldValues=="object"){let k=null,C=d.view;if(C&&Array.isArray(C.elements)){for(let I of C.elements)if(I?.data&&I.data.writeTo){k=I.data.writeTo;break}}k?R(d,k,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,C]of Object.entries(c))k!=="_stagedFiles"&&(C!==null&&typeof C=="object"&&!Array.isArray(C)&&d[k]!==null&&typeof d[k]=="object"&&!Array.isArray(d[k])?d[k]={...d[k],...C}:d[k]=C);}return d});}function _(a){let c=String(a||"").match(/^(\d+)[-_]/);return c?parseInt(c[1],10):0}function N(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),R=y(a),k=R?R.nextSerial(d):1,C=String(c||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(k).padStart(3,"0")}_${C}.txt`}function at(a,c,d,R){let k=new Date().toISOString(),C=m(a),I=g(a),p=J(a,c||"system"),h=`${C}/${p}`,$=[],V=typeof d=="string"?d.trim():"";V&&$.push(V);let G=Array.isArray(R)?R:[];if(G.length){$.length&&$.push(""),$.push("files:");for(let W of G){if(!W||typeof W!="object")continue;let ut=typeof W.name=="string"?W.name:"file",ct=typeof W.stored_name=="string"?W.stored_name:"";$.push(ct?`- ${ut} -> ${ct}`:`- ${ut}`);}}I.chats&&I.chats.putText(h,`${$.join(`
2
+ `)}
3
+ `);let Q=_(p),tt=y(a);return tt&&tt.appendIndexRecord(C,{serial:Q,role:c||"system",stored_name:p,path:`${a}/chats/${p}`,updated_at:k}),{at:k,role:c||"system",text:V,files:G,path:`${a}/chats/${p}`}}function rt(a){let c=m(a),d=y(a);return d?d.readRecords(c).map(R=>({...R,path:`${a}/chats/${R.stored_name}`})):[]}function lt(a){let c=[];try{let d=U(a);if(!d)return c;let R=E().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let k of R)c.push(k.stored_name);}catch{}return c}function it(a,c,d,R){let k=m(a),C=g(a),I=N(c),p=v(a),h=p?p.allocateStoredName(k,I,{seedNames:lt(a),maxLen:Ln}):`${String(Date.now())}-${I}`;return C.files&&C.files.putBytes(`${k}/${h}`,new Uint8Array(R),d||"application/octet-stream"),{name:I,stored_name:h,size:R.length,mime_type:d||"application/octet-stream",path:`${a}/files/${h}`,uploaded_at:new Date().toISOString()}}function ft(a,c,d){let R=M(a);if(!R)return;let k=R.board.getConfig({params:{key:"chat-handler"}});if(k.status!=="success")return;let C=k.data?.value;if(!C||typeof C!="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(C,$).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 R=c==="chat-send"?S:q,k;R(a,C=>{let I=new Date().toISOString(),p=C.card_data&&typeof C.card_data=="object"?C.card_data:{};if(C.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 G=V;typeof G.name=="string"&&$.push({name:G.name,size:G.size,mime_type:G.mime_type,path:G.path,uploaded_at:G.uploaded_at,stored_name:G.stored_name});}}}if(h||$.length>0){let V=m(a),Q=at(a,"user",h,$).path,tt=Q.includes("/")?Q.slice(Q.lastIndexOf("/")+1):Q;k={chatsKeyPrefix:`${V}/chats`,lastChatFile:tt};for(let W of $){if(!W||typeof W!="object")continue;let ut=typeof W.name=="string"?W.name:"file",ct=typeof W.stored_name=="string"?W.stored_name:null;ct&&at(a,"system",`File ${ut} uploaded as ${ct}.`,[]);}}return C}if(c==="file-upload"){let h=E().normalizeIncoming(d?.files,I);return h.length>0&&E().merge(p,h),C}if(c==="action"){let h=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!h)return C;p.lastAction={buttonId:h,at:I},p.lastActionText=`${h} @ ${I}`;}return C}),k&&ft(a,k.chatsKeyPrefix,k.lastChatFile);}function Z(a,c,d){let R=JSON.stringify(d),k=typeof Buffer<"u"?Buffer.byteLength(R):new TextEncoder().encode(R).length;a.writeHead(c,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":k}),a.end(R);}async function gt(a){let c=[];for await(let R of a)c.push(R);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,C)=>k+C.length,0),d=new Uint8Array(c),R=0;for(let k of a)d.set(k,R),R+=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 Nt(a,c){c.writeHead(200,{...n,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),x.add(c);let d=Rt(),R=Et(d);c.write(R);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 R=a.method||"GET",k=d,C=k.pathname;try{if(R==="GET"&&C===`${e}/init-board`)return await T(),Z(c,200,Rt()),!0;if(R==="GET"&&C===`${e}/sse`)return await j(),Nt(a,c),!0;if(R==="GET"&&C===`${e}/board-status`)return Z(c,200,Rt()),!0;let I=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)$`));if(R==="PATCH"&&I){await j();let G=decodeURIComponent(I[1]),Q=await gt(a);return l(G,Q),Z(c,200,{ok:!0}),!0}let p=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/actions$`));if(R==="POST"&&p){await j();let G=decodeURIComponent(p[1]),Q=await gt(a);return pt(G,Q?.actionType,Q?.payload),Z(c,200,{ok:!0}),!0}let h=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/chats$`));if(R==="GET"&&h){await j();let G=decodeURIComponent(h[1]);return Z(c,200,{ok:!0,messages:rt(G)}),!0}let $=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/files$`));if(R==="POST"&&$){await j();let G=decodeURIComponent($[1]),Q=String(k.searchParams.get("inChat")||"").toLowerCase()==="true",tt=a.headers["x-file-name"],W=String(a.headers["content-type"]||"application/octet-stream"),ut=Array.isArray(tt)?tt[0]:tt,ct=ut?decodeURIComponent(String(ut)):"upload.bin",$t=await mt(a);if(!$t.length)return Z(c,400,{error:"Empty upload body"}),!0;let dt=it(G,ct,W,$t);return Q&&(S(G,bt=>{let At=new Date().toISOString(),Ft=bt.card_data&&typeof bt.card_data=="object"?bt.card_data:{};bt.card_data=Ft;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(Ft,zt),bt}),at(G,"system",`file uploaded: ${dt.name} as ${dt.stored_name}`,[])),Z(c,200,{ok:!0,file:dt}),!0}let V=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/files/(\\d+)$`));if(R==="GET"&&V){let G=decodeURIComponent(V[1]),Q=parseInt(V[2],10),tt=k.searchParams.get("sn"),W=U(G);if(!W)return Z(c,404,{error:"Card not found"}),!0;let ut=E().resolve(W.card_data,Q,tt);if(!ut.ok&&ut.reason==="stale_reference")return Z(c,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ut.ok)return Z(c,404,{error:"File not found"}),!0;let ct=ut.file,$t=m(G),dt=g(G),bt=`${$t}/${ct.stored_name}`,At=dt.files?dt.files.getBytes(bt):null;if(!At)return Z(c,404,{error:"File not found"}),!0;let Ft=ct.name||ct.stored_name,zt=ct.mime_type||"application/octet-stream";return c.writeHead(200,{"Content-Type":zt,"Content-Disposition":`attachment; filename="${Ft}"`,"Content-Length":At.length}),c.end(At),!0}return !1}catch(I){let p=I?.statusCode||500;return Z(c,p,{error:String(I?.message||I)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleRuntimeApi:se,buildPublishedRuntimePayload:Rt,clearChatRecords:H,reportSourceFetched(a,c){let d=b[0];return d?d.board.sourceDataFetched({params:{token:a,ref:c}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,c){let d=b[0];return d?d.board.sourceDataFetchFailure({params:{token:a,reason:c}}):{status:"fail",error:"no board context"}},get cardStore(){return b[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Br(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),n={...ze,...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 F(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 b(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 O(v,E,m){let A=v.method||"GET",B=m.pathname;if(A==="GET"&&B===e)return b(E,200,{ok:true,boards:u().boards}),true;if(A==="POST"&&B===e){let L=[];for await(let Y of v)L.push(Y);let P=typeof Buffer<"u"?Buffer.concat(L).toString("utf-8").trim():new TextDecoder().decode(qn(L)).trim(),T={};try{T=P?JSON.parse(P):{};}catch{T={};}let j=x(T.id);if(!j)return b(E,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let M=u();if(M.boards.some(Y=>Y.id===j))return b(E,409,{error:`Board "${j}" is already registered`}),true;let U=typeof T.label=="string"&&T.label.trim()?T.label.trim():j,K={id:j,label:U};for(let[Y,X]of Object.entries(T))Y==="id"||Y==="label"||X!=null&&(K[Y]=X);return M.boards.push(K),f(M),b(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 L=x(decodeURIComponent(B[1]));return L?u().boards.some(j=>j.id===L)?!!await F(L).handleRuntimeApi(v,E,m):(b(E,404,{error:`Board "${L}" not registered. POST ${e} with {id} to register it first.`}),true):(b(E,400,{error:"Invalid board id"}),true)}async function g(v,E,m){return !!(await O(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:F(v)}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleApi:g,requireBoardService:y}}function _t(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qn(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}export{Br as createMultiBoardServerRuntime,Fr as createSingleBoardServerRuntime};//# sourceMappingURL=index.js.map
9
+ //# sourceMappingURL=index.js.map