yaml-flow 7.1.0 → 8.0.1
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.
- package/browser/asset-integrity.json +8 -4
- package/browser/board-livecards-client.js +1 -1
- package/browser/board-livecards-localstorage.js +4 -4
- package/browser/live-cards.js +19 -3309
- package/cli/board-live-cards-lib-tjYsPt5U.d.ts +321 -0
- package/{dist/cli → cli}/browser-api/board-live-cards-browser-adapter.d.ts +3 -5
- package/{dist/cli → cli}/browser-api/card-store-browser-api.d.ts +1 -2
- package/{dist/cli → cli}/browser-api/card-store-browser-api.js +1 -1
- package/cli/execution-interface-ftO1W7Po.d.ts +286 -0
- package/{dist/cli → cli}/node/artifacts-store-cli.js +2 -2
- package/cli/node/batch-runner-cli.js +3 -0
- package/cli/node/board-live-cards-cli.js +15 -0
- package/{dist/cli → cli}/node/card-store-cli.js +1 -1
- package/{dist/cli → cli}/node/execution-adapter.d.ts +49 -4
- package/cli/node/execution-adapter.js +3 -0
- package/{dist/cli → cli}/node/fs-board-adapter.d.ts +24 -11
- package/cli/node/fs-board-adapter.js +14 -0
- package/cli/node/step-machine-cli.d.ts +7 -0
- package/cli/node/step-machine-cli.js +5 -0
- package/{dist/board-live-cards-public-5n1-syA3.d.cts → cli/types-C2YQXFwo.d.ts} +68 -5
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/gandalf-runtime/.config/card-store-ref.json +1 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/gandalf-runtime/.config/chat-handler.json +1 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/gandalf-runtime/.config/outputs-store-ref.json +1 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/gandalf-runtime/.config/task-executor.json +1 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/gandalf-runtime/.state-snapshot/board/graph.json +29 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/gandalf-runtime/.state-snapshot/board/lastJournalProcessedId.json +1 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/gandalf-runtime-out/.outputs/status.json +25 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/runtime-out/.outputs/cards/card-market-prices/computed_values.json +67 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/runtime-out/.outputs/cards/card-portfolio/computed_values.json +1 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/runtime-out/.outputs/cards/card-portfolio-value/computed_values.json +52 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/runtime-out/.outputs/data-objects/holdings.json +22 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/runtime-out/.outputs/data-objects/positions.json +46 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/runtime-out/.outputs/data-objects/quotes.json +35 -0
- package/examples/board/.demo-setup/run-1778665078572-3466-a8ay4k/board-default/runtime-out/.outputs/status.json +113 -0
- package/examples/{example-board → board}/demo-server-config.json +0 -1
- package/examples/{example-board → board}/demo-server.js +23 -48
- package/examples/{example-board → board}/demo-shell-with-server.html +3 -3
- package/examples/{example-board → board}/demo-task-executor.js +71 -24
- package/examples/board/gandalf-cards/card-source-kinds.json +36 -0
- package/examples/board/gandalf-cards/cards/_index.json +7 -0
- package/examples/board/gandalf-cards/cards/card-source-kinds.json +64 -0
- package/examples/board/source-def-flows/copilot.flow.json +33 -0
- package/examples/board/source-def-flows/mock.flow.json +35 -0
- package/examples/board/source-def-flows/url-list.flow.json +33 -0
- package/examples/board/source-def-flows/url.flow.json +33 -0
- package/examples/board/source-def-flows/workiq.flow.json +34 -0
- package/examples/board/source-def-handlers/copilot-source-handler.js +141 -0
- package/examples/board/source-def-handlers/http-source-handler.js +145 -0
- package/examples/board/source_def_flows.json +249 -0
- package/examples/board/test/demo-http-test.js +317 -0
- package/examples/{example-board → board-local}/demo-shell-localstorage.html +4 -4
- package/examples/{browser/boards/portfolio-tracker → portfolio-tracker/handlers}/portfolio-tracker-fetch-prices.js +1 -1
- package/examples/{browser/boards/portfolio-tracker/portfolio-tracker-public.js → portfolio-tracker/portfolio-tracker.js} +11 -14
- package/examples/{browser/boards/portfolio-tracker → portfolio-tracker/test}/portfolio-t4.js +32 -50
- package/lib/artifacts-store-lib-public-BABrgFkV.d.ts +119 -0
- package/lib/artifacts-store-lib-public-DGa8BpJT.d.cts +119 -0
- package/lib/artifacts-store-public.cjs +2 -0
- package/lib/artifacts-store-public.d.cts +5 -0
- package/lib/artifacts-store-public.d.ts +5 -0
- package/lib/artifacts-store-public.js +2 -0
- package/lib/board-live-cards-node.cjs +14 -0
- package/lib/board-live-cards-node.d.cts +178 -0
- package/lib/board-live-cards-node.d.ts +178 -0
- package/lib/board-live-cards-node.js +14 -0
- package/lib/board-live-cards-public-BnmRAbQV.d.cts +383 -0
- package/{dist/board-live-cards-public-CK_J8uv0.d.ts → lib/board-live-cards-public-CsmYrvpd.d.ts} +142 -76
- package/lib/board-live-cards-public.cjs +3 -0
- package/lib/board-live-cards-public.d.cts +4 -0
- package/lib/board-live-cards-public.d.ts +4 -0
- package/lib/board-live-cards-public.js +3 -0
- package/lib/board-live-cards-server-runtime.cjs +9 -0
- package/lib/board-live-cards-server-runtime.d.cts +6 -0
- package/lib/board-live-cards-server-runtime.d.ts +6 -0
- package/lib/board-live-cards-server-runtime.js +9 -0
- package/lib/board-livegraph-runtime/index.cjs +3 -0
- package/{dist → lib}/board-livegraph-runtime/index.d.cts +1 -2
- package/{dist → lib}/board-livegraph-runtime/index.d.ts +1 -2
- package/lib/board-livegraph-runtime/index.js +3 -0
- package/{dist/storage-refs.cjs → lib/board-worker-adapter.cjs} +2 -2
- package/{dist/storage-refs.d.cts → lib/board-worker-adapter.d.cts} +4 -3
- package/{dist/storage-refs.d.ts → lib/board-worker-adapter.d.ts} +4 -3
- package/{dist/storage-refs.js → lib/board-worker-adapter.js} +2 -2
- package/{dist → lib}/card-compute/index.cjs +1 -1
- package/{dist → lib}/card-compute/index.js +1 -1
- package/lib/card-store-public.cjs +2 -0
- package/lib/card-store-public.d.cts +61 -0
- package/lib/card-store-public.d.ts +61 -0
- package/lib/card-store-public.js +2 -0
- package/lib/card-validation.cjs +10 -0
- package/lib/card-validation.d.cts +35 -0
- package/lib/card-validation.d.ts +35 -0
- package/lib/card-validation.js +10 -0
- package/{dist/constants-oCEbNpul.d.ts → lib/constants-BPVLb3Es.d.ts} +1 -1
- package/{dist/constants-BzZUyYlp.d.cts → lib/constants-DXxsRN9y.d.cts} +1 -1
- package/{dist → lib}/continuous-event-graph/index.cjs +2 -2
- package/{dist → lib}/continuous-event-graph/index.d.cts +3 -5
- package/{dist → lib}/continuous-event-graph/index.d.ts +3 -5
- package/{dist → lib}/continuous-event-graph/index.js +2 -2
- package/{dist → lib}/event-graph/index.d.cts +2 -2
- package/{dist → lib}/event-graph/index.d.ts +2 -2
- package/lib/execution-refs.cjs +3 -0
- package/{dist → lib}/execution-refs.d.cts +33 -12
- package/{dist → lib}/execution-refs.d.ts +33 -12
- package/lib/execution-refs.js +3 -0
- package/lib/index.cjs +25 -0
- package/{dist → lib}/index.d.cts +7 -8
- package/{dist → lib}/index.d.ts +7 -8
- package/lib/index.js +25 -0
- package/{dist/live-cards-bridge-BXbVTsna.d.cts → lib/live-cards-bridge-DC_ZU0eS.d.ts} +134 -3
- package/{dist/live-cards-bridge-Ds28XR15.d.ts → lib/live-cards-bridge-b25aAVvE.d.cts} +134 -3
- package/lib/loader-CuuLjxVA.d.cts +42 -0
- package/lib/loader-Zborm2pq.d.ts +42 -0
- package/lib/server-runtime/index.cjs +9 -0
- package/{dist → lib}/server-runtime/index.d.cts +4 -4
- package/{dist → lib}/server-runtime/index.d.ts +4 -4
- package/lib/server-runtime/index.js +9 -0
- package/lib/step-machine/index.d.cts +64 -0
- package/lib/step-machine/index.d.ts +64 -0
- package/lib/step-machine-public/index.cjs +5 -0
- package/{dist → lib}/step-machine-public/index.d.cts +14 -1
- package/{dist → lib}/step-machine-public/index.d.ts +14 -1
- package/lib/step-machine-public/index.js +5 -0
- package/lib/storage-interface-BhAON-gW.d.cts +84 -0
- package/lib/storage-interface-BhAON-gW.d.ts +84 -0
- package/lib/stores/index.cjs +3 -0
- package/lib/stores/index.d.cts +4 -0
- package/lib/stores/index.d.ts +4 -0
- package/lib/stores/index.js +3 -0
- package/lib/stores/kv.cjs +3 -0
- package/lib/stores/kv.d.cts +32 -0
- package/lib/stores/kv.d.ts +32 -0
- package/lib/stores/kv.js +3 -0
- package/{dist → lib}/stores/memory.d.cts +1 -1
- package/{dist → lib}/stores/memory.d.ts +1 -1
- package/{dist/types-HGDTWIun.d.ts → lib/types-CBxkYuLY.d.ts} +2 -1
- package/{dist/types-ycun84cq.d.cts → lib/types-DQ1bKuB1.d.cts} +11 -0
- package/{dist/types-ycun84cq.d.ts → lib/types-DQ1bKuB1.d.ts} +11 -0
- package/{dist/types-CU3DjTKL.d.cts → lib/types-DkFvgxwq.d.cts} +2 -1
- package/package.json +79 -119
- package/board-live-cards-cli.js +0 -37
- package/browser/board-livecards-client.js.map +0 -1
- package/browser/board-livecards-localstorage.js.map +0 -1
- package/browser/board-livegraph-engine.js +0 -3
- package/browser/board-livegraph-engine.js.map +0 -1
- package/browser/card-compute.js +0 -266
- package/browser/compute-jsonata.js.map +0 -1
- package/card-store.js +0 -37
- package/dist/batch/index.cjs.map +0 -1
- package/dist/batch/index.js.map +0 -1
- package/dist/board-live-cards-lib-Bg6EvCo5.d.cts +0 -136
- package/dist/board-live-cards-lib-jM2uYG1v.d.ts +0 -136
- package/dist/board-livegraph-runtime/index.cjs +0 -3
- package/dist/board-livegraph-runtime/index.cjs.map +0 -1
- package/dist/board-livegraph-runtime/index.js +0 -3
- package/dist/board-livegraph-runtime/index.js.map +0 -1
- package/dist/card-compute/index.cjs.map +0 -1
- package/dist/card-compute/index.js.map +0 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +0 -3
- package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +0 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +0 -37
- package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +0 -1
- package/dist/cli/browser-api/card-store-browser-api.cjs +0 -2
- package/dist/cli/browser-api/card-store-browser-api.cjs.map +0 -1
- package/dist/cli/browser-api/card-store-browser-api.d.cts +0 -26
- package/dist/cli/browser-api/card-store-browser-api.js.map +0 -1
- package/dist/cli/node/artifacts-store-cli.cjs +0 -11
- package/dist/cli/node/artifacts-store-cli.cjs.map +0 -1
- package/dist/cli/node/artifacts-store-cli.d.cts +0 -8
- package/dist/cli/node/artifacts-store-cli.js.map +0 -1
- package/dist/cli/node/board-live-cards-cli.cjs +0 -15
- package/dist/cli/node/board-live-cards-cli.cjs.map +0 -1
- package/dist/cli/node/board-live-cards-cli.d.cts +0 -20
- package/dist/cli/node/board-live-cards-cli.js +0 -15
- package/dist/cli/node/board-live-cards-cli.js.map +0 -1
- package/dist/cli/node/card-store-cli.cjs +0 -8
- package/dist/cli/node/card-store-cli.cjs.map +0 -1
- package/dist/cli/node/card-store-cli.d.cts +0 -15
- package/dist/cli/node/card-store-cli.js.map +0 -1
- package/dist/cli/node/execution-adapter.cjs +0 -3
- package/dist/cli/node/execution-adapter.cjs.map +0 -1
- package/dist/cli/node/execution-adapter.d.cts +0 -174
- package/dist/cli/node/execution-adapter.js +0 -3
- package/dist/cli/node/execution-adapter.js.map +0 -1
- package/dist/cli/node/fs-board-adapter.cjs +0 -14
- package/dist/cli/node/fs-board-adapter.cjs.map +0 -1
- package/dist/cli/node/fs-board-adapter.d.cts +0 -204
- package/dist/cli/node/fs-board-adapter.js +0 -14
- package/dist/cli/node/fs-board-adapter.js.map +0 -1
- package/dist/cli/node/source-cli-task-executor.cjs +0 -11
- package/dist/cli/node/source-cli-task-executor.cjs.map +0 -1
- package/dist/cli/node/source-cli-task-executor.js.map +0 -1
- package/dist/config/index.cjs.map +0 -1
- package/dist/config/index.js.map +0 -1
- package/dist/continuous-event-graph/index.cjs.map +0 -1
- package/dist/continuous-event-graph/index.js.map +0 -1
- package/dist/event-graph/index.cjs.map +0 -1
- package/dist/event-graph/index.js.map +0 -1
- package/dist/execution-refs.cjs +0 -3
- package/dist/execution-refs.cjs.map +0 -1
- package/dist/execution-refs.js +0 -3
- package/dist/execution-refs.js.map +0 -1
- package/dist/index.cjs +0 -30
- package/dist/index.cjs.map +0 -1
- package/dist/index.js +0 -30
- package/dist/index.js.map +0 -1
- package/dist/inference/index.cjs +0 -7
- package/dist/inference/index.cjs.map +0 -1
- package/dist/inference/index.d.cts +0 -229
- package/dist/inference/index.d.ts +0 -229
- package/dist/inference/index.js +0 -7
- package/dist/inference/index.js.map +0 -1
- package/dist/server-runtime/index.cjs +0 -9
- package/dist/server-runtime/index.cjs.map +0 -1
- package/dist/server-runtime/index.js +0 -9
- package/dist/server-runtime/index.js.map +0 -1
- package/dist/step-machine/index.cjs.map +0 -1
- package/dist/step-machine/index.d.cts +0 -102
- package/dist/step-machine/index.d.ts +0 -102
- package/dist/step-machine/index.js.map +0 -1
- package/dist/step-machine-public/index.cjs +0 -3
- package/dist/step-machine-public/index.cjs.map +0 -1
- package/dist/step-machine-public/index.js +0 -3
- package/dist/step-machine-public/index.js.map +0 -1
- package/dist/storage-refs.cjs.map +0 -1
- package/dist/storage-refs.js.map +0 -1
- package/dist/stores/file.cjs +0 -2
- package/dist/stores/file.cjs.map +0 -1
- package/dist/stores/file.d.cts +0 -36
- package/dist/stores/file.d.ts +0 -36
- package/dist/stores/file.js +0 -2
- package/dist/stores/file.js.map +0 -1
- package/dist/stores/index.cjs +0 -2
- package/dist/stores/index.cjs.map +0 -1
- package/dist/stores/index.d.cts +0 -4
- package/dist/stores/index.d.ts +0 -4
- package/dist/stores/index.js +0 -2
- package/dist/stores/index.js.map +0 -1
- package/dist/stores/localStorage.cjs +0 -2
- package/dist/stores/localStorage.cjs.map +0 -1
- package/dist/stores/localStorage.d.cts +0 -34
- package/dist/stores/localStorage.d.ts +0 -34
- package/dist/stores/localStorage.js +0 -2
- package/dist/stores/localStorage.js.map +0 -1
- package/dist/stores/memory.cjs.map +0 -1
- package/dist/stores/memory.js.map +0 -1
- package/dist/types-CHSdoAAA.d.cts +0 -135
- package/dist/types-CoW0gQl3.d.ts +0 -135
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-fetch-prices.py +0 -201
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +0 -370
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.py +0 -398
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-inference-adapter.js +0 -196
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +0 -300
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +0 -617
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +0 -366
- package/examples/browser/livecards-browser/index.html +0 -41
- package/examples/browser/step-machine-browser/index.html +0 -367
- package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/.runtime-out +0 -1
- package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/board-graph.json +0 -32
- package/examples/cli/step-machine-cli/portfolio-tracker/cards/holdings-table.json +0 -22
- package/examples/cli/step-machine-cli/portfolio-tracker/cards/portfolio-form.json +0 -43
- package/examples/cli/step-machine-cli/portfolio-tracker/cards/portfolio-value.json +0 -15
- package/examples/cli/step-machine-cli/portfolio-tracker/cards/price-fetch.json +0 -15
- package/examples/cli/step-machine-cli/portfolio-tracker/fetch-prices.js +0 -48
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +0 -125
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +0 -32
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +0 -26
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +0 -49
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +0 -25
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +0 -23
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +0 -21
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +0 -38
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +0 -48
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +0 -31
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +0 -107
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +0 -51
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +0 -45
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +0 -71
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/reset-board-dir.py +0 -36
- package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-demo.flow.yaml +0 -26
- package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-handlers.py +0 -39
- package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker-pycli.flow.yaml +0 -80
- package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +0 -76
- package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +0 -44
- package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -43
- package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker-pycli.py +0 -77
- package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +0 -28
- package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +0 -31
- package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +0 -54
- package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +0 -21
- package/examples/cli/step-machine-demo/step-cli-echo-y.js +0 -15
- package/examples/cli/step-machine-demo/step2-double-cli.js +0 -33
- package/examples/cli/step-machine-demo/two-step-math.flow.yaml +0 -93
- package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +0 -43
- package/examples/example-board/agent-instructions-cardlayout.md +0 -56
- package/examples/example-board/agent-instructions.md +0 -834
- package/examples/example-board/demo-shell.html +0 -63
- package/examples/index.html +0 -785
- package/examples/npm-libs/batch/batch-step-machine.ts +0 -121
- package/examples/npm-libs/continuous-event-graph/live-cards-board.ts +0 -215
- package/examples/npm-libs/continuous-event-graph/live-portfolio-dashboard.ts +0 -555
- package/examples/npm-libs/continuous-event-graph/portfolio-tracker.ts +0 -287
- package/examples/npm-libs/continuous-event-graph/reactive-monitoring.ts +0 -265
- package/examples/npm-libs/continuous-event-graph/reactive-pipeline.ts +0 -168
- package/examples/npm-libs/continuous-event-graph/soc-incident-board.ts +0 -287
- package/examples/npm-libs/continuous-event-graph/stock-dashboard.ts +0 -229
- package/examples/npm-libs/event-graph/ci-cd-pipeline.ts +0 -243
- package/examples/npm-libs/event-graph/executor-diamond.ts +0 -165
- package/examples/npm-libs/event-graph/executor-pipeline.ts +0 -161
- package/examples/npm-libs/event-graph/research-pipeline.ts +0 -137
- package/examples/npm-libs/flows/ai-conversation.yaml +0 -116
- package/examples/npm-libs/flows/order-processing.yaml +0 -143
- package/examples/npm-libs/flows/simple-greeting.yaml +0 -54
- package/examples/npm-libs/graph-of-graphs/multi-stage-etl.ts +0 -307
- package/examples/npm-libs/graph-of-graphs/url-processing-pipeline.ts +0 -254
- package/examples/npm-libs/inference/azure-deployment.ts +0 -149
- package/examples/npm-libs/inference/copilot-cli.ts +0 -138
- package/examples/npm-libs/inference/data-pipeline.ts +0 -145
- package/examples/npm-libs/inference/pluggable-adapters.ts +0 -254
- package/examples/npm-libs/node/ai-conversation.ts +0 -195
- package/examples/npm-libs/node/simple-greeting.ts +0 -101
- package/examples/step-machine-cli/portfolio-tracker/cards/holdings-table.json +0 -22
- package/examples/step-machine-cli/portfolio-tracker/cards/portfolio-form.json +0 -43
- package/examples/step-machine-cli/portfolio-tracker/cards/portfolio-value.json +0 -15
- package/examples/step-machine-cli/portfolio-tracker/cards/price-fetch.json +0 -15
- package/examples/step-machine-cli/portfolio-tracker/fetch-prices.js +0 -48
- package/examples/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +0 -57
- package/examples/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +0 -27
- package/examples/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +0 -25
- package/examples/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +0 -29
- package/examples/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +0 -27
- package/examples/step-machine-cli/portfolio-tracker/handlers/status-cli.js +0 -25
- package/examples/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +0 -37
- package/examples/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +0 -53
- package/examples/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +0 -35
- package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker-task-executor.cjs +0 -96
- package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +0 -227
- package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +0 -38
- package/examples/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +0 -28
- package/step-machine-cli.js +0 -407
- /package/{dist/cli → cli}/browser-api/board-live-cards-browser-adapter.js +0 -0
- /package/{dist/board-livegraph-runtime → cli/browser-api}/jsonata-sync.cjs +0 -0
- /package/{dist/cli → cli}/node/artifacts-store-cli.d.ts +0 -0
- /package/{dist/cli/node/source-cli-task-executor.d.cts → cli/node/batch-runner-cli.d.ts} +0 -0
- /package/{dist/cli → cli}/node/board-live-cards-cli.d.ts +0 -0
- /package/{dist/cli → cli}/node/card-store-cli.d.ts +0 -0
- /package/{dist/card-compute → cli/node}/jsonata-sync.cjs +0 -0
- /package/{dist/cli → cli}/node/source-cli-task-executor.d.ts +0 -0
- /package/{dist/cli → cli}/node/source-cli-task-executor.js +0 -0
- /package/examples/{example-board → board}/cards/card-concentration.json +0 -0
- /package/examples/{example-board → board}/cards/card-my-identity.json +0 -0
- /package/examples/{example-board → board}/cards/card-portfolio-action.json +0 -0
- /package/examples/{example-board → board}/cards/card-portfolio-intelligence.json +0 -0
- /package/examples/{example-board → board}/cards/card-portfolio-risks.json +0 -0
- /package/examples/{example-board → board}/cards/card-rebalance-impact.json +0 -0
- /package/examples/{example-board → board}/cards/card-rebalance-sim.json +0 -0
- /package/examples/{example-board → board}/cards/cardT-market-prices.json +0 -0
- /package/examples/{example-board → board}/cards/cardT-portfolio-value.json +0 -0
- /package/examples/{example-board → board}/cards/cardT-portfolio.json +0 -0
- /package/examples/{example-board → board}/demo-chat-handler.js +0 -0
- /package/examples/{example-board → board}/scripts/copilot_wrapper.bat +0 -0
- /package/examples/{example-board → board}/scripts/copilot_wrapper_helper.ps1 +0 -0
- /package/examples/{example-board → board}/scripts/workiq_wrapper.mjs +0 -0
- /package/examples/{browser/boards/portfolio-tracker → board/test}/portfolio-tracker-sse-worker.js +0 -0
- /package/{dist → lib}/batch/index.cjs +0 -0
- /package/{dist → lib}/batch/index.d.cts +0 -0
- /package/{dist → lib}/batch/index.d.ts +0 -0
- /package/{dist → lib}/batch/index.js +0 -0
- /package/{dist/cli/browser-api → lib/board-livegraph-runtime}/jsonata-sync.cjs +0 -0
- /package/{dist → lib}/card-compute/index.d.cts +0 -0
- /package/{dist → lib}/card-compute/index.d.ts +0 -0
- /package/{dist/cli/node → lib/card-compute}/jsonata-sync.cjs +0 -0
- /package/{dist → lib}/config/index.cjs +0 -0
- /package/{dist → lib}/config/index.d.cts +0 -0
- /package/{dist → lib}/config/index.d.ts +0 -0
- /package/{dist → lib}/config/index.js +0 -0
- /package/{dist → lib}/continuous-event-graph/jsonata-sync.cjs +0 -0
- /package/{dist → lib}/event-graph/index.cjs +0 -0
- /package/{dist → lib}/event-graph/index.js +0 -0
- /package/{dist → lib}/jsonata-sync.cjs +0 -0
- /package/{dist → lib}/server-runtime/jsonata-sync.cjs +0 -0
- /package/{dist → lib}/step-machine/index.cjs +0 -0
- /package/{dist → lib}/step-machine/index.js +0 -0
- /package/{dist → lib}/step-machine-public/jsonata-sync.cjs +0 -0
- /package/{dist → lib}/stores/memory.cjs +0 -0
- /package/{dist → lib}/stores/memory.js +0 -0
- /package/{dist → lib}/types-BBhqYGhE.d.cts +0 -0
- /package/{dist → lib}/types-BBhqYGhE.d.ts +0 -0
- /package/{dist → lib}/validate-BAVzUJWa.d.ts +0 -0
- /package/{dist → lib}/validate-Dbu7ygys.d.cts +0 -0
|
@@ -1,9 +0,0 @@
|
|
|
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]??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 R=t.tasks[x];R?.lastDataHash&&(o[f]=R.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 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 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},R=[...new Set([...t.availableOutputs,...f])];return {...t,tasks:{...t.tasks,[n]:F},availableOutputs:R,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 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 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 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=[],F=[],R=[];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),$=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})||($=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})||($=true);break}case "time-based":{let M=g.refreshInterval??0;if(M<=0){$=true;break}let U=y.completedAt;if(!U){$=true;break}(Date.now()-Date.parse(U))/1e3<M&&($=true);break}case "manual":$=true;break}if($)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 $=s[T]||[];$.length===0?B.push(T):$.every(U=>Yt(n.tasks[U]))?G.push({token:T,failedProducer:$[0]}):q.push(T);}B.length>0?F.push({taskName:w,missingTokens:B}):G.length>0?R.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:F,blocked:R,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 Ce(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 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,R=false,j=false;function w(){if(!u){if(R){j=true;return}R=true;try{do j=!1,g();while(j)}finally{R=false;}}}function g(){let m=F.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:$}=G;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,$).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??[],q=new Map;for(let[T,$]of Object.entries(i.config.tasks))for(let M of $.provides??[])q.set(M,T);let G={};for(let T of B){let $=q.get(T);$?G[T]=i.state.tasks[$]?.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 $ of G){let M=x.get($);if(!M)throw new Error(`Handler '${$}' not found in registry (task '${m}')`);let U={nodeId:m,state:T,taskState:i.state.tasks[m],config:q,callbackToken:A,update:B};if(await M(U)==="task-initiate-failure")throw new Error(`Handler '${$}' 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 q=Ce(m),G=v(m,q).catch(T=>{u||(F.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;}}}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 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))),qt=yn("./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 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 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 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}),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 Cn(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 Rn(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 qt(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 Gt={run:kn,runSync:Sn,eval:Cn,resolve:Rn,validate:wn,enrichSources:vn,enrichSourcesSync:xn};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 R=u[F],j=x[R],w=j&&typeof j=="object"&&!Array.isArray(j)?{...j}:{};x[R]=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),R=t.writeCard(f.key,F);u[o]={key:f.key,checksum:R,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 Ut="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!==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=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 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)),q=E.filter(U=>!e.state.availableOutputs.includes(U)),G=u.get(g)??q,T=new Set;for(let U of m)for(let K of f.get(U)??[])K!==g&&T.add(K);let $=y.failedAt,M=y.error?{message:y.error,code:"TASK_FAILED",at:$,source:"task-runtime"}:void 0;return {name:g,status:y.status,error:M,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 F=x.map(g=>({name:g.name,fanOut:g.unblocks.length})).sort((g,y)=>y.fanOut-g.fanOut||g.name.localeCompare(y.name)),R=F.length>0?F[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:R.name,max_fan_out:R.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 F=x.id,R=x.card_data??{},j=x.source_defs??[],w=j.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,P)=>{g._sources[D]=P,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,P=D.outputFile;if(P){let S=E(P);if(D.failure)m(P,_e(S,D.reason??"unknown"));else {let l=D.rqt;if(!S.lastFetchedAt||l>S.lastFetchedAt){let _=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,I=false;_&&(I=n.fetchedSourcesStore.commitSourceData(F,P,_)),I?m(P,Tn(S,l)):m(P,_e(S,`source delivery commit failed for ${P} token=${String(_)}`));}}v();}}let q={};for(let D of j)if(D.outputFile){let P=n.fetchedSourcesStore.readSourceData(F,D.outputFile);P!==null&&(q[D.bindTo]=P);}let G={};for(let[D,P]of Object.entries(u.state??{}))if(P!==null&&typeof P=="object"&&!Array.isArray(P)){let S=P[D];G[D]=S!==void 0?S:P;}else G[D]=P;let T={id:F,card_data:{...R},requires:G,source_defs:j,compute:x.compute};T._sourcesData=q,x.compute&&Gt.runSync(T,{sourcesData:q}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))(F,T.computed_values??{});let $={...x},M=Gt.enrichSourcesSync(Array.isArray(x.source_defs)?x.source_defs:void 0,{card_data:x.card_data,requires:G}),U=t.value;$.source_defs=Array.isArray(M)?M.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:U})):M;let K=In(),Y=u.update?void 0:K,X=w.filter(D=>{let P=D.outputFile;if(typeof P!="string"||!P)return true;let S=E(P);Y&&(S={...S,queueRequestedAt:Y},m(P,S));let l=S.queueRequestedAt??S.lastRequestedAt??K,_=En(S,l);return _==="in-flight"?false:_==="dispatch"});if(v(),X.length>0){let D=false,P=K;for(let S of X){let l=S.outputFile;if(typeof l!="string"||!l)continue;let _=E(l),I=_.queueRequestedAt??K;m(l,{..._,lastRequestedAt:I}),P=I,D=true;}return D&&v(),D&&(f.push({taskKind:"source-fetch",payload:{boardRef:ht(t),enrichedCard:$,callbackToken:u.callbackToken,rqt:P}}),n.executionRequestStore.appendEntries(e,f)),"task-initiated"}let St=x.provides??[],Ct={};for(let{bindTo:D,ref:P}of St)Ct[D]=Gt.resolve(T,P);return (i??n.outputStore.writeDataObjects.bind(n.outputStore))(Ct),j.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let P=E(D.outputFile);return !P.lastRequestedAt||!P.lastFetchedAt?true:P.lastFetchedAt<=P.lastRequestedAt}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:ht(t),enrichedCard:$,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 Be(t){return {[wt]:t.graph,[Ie]:t.lastDrainedJournalId}}function De(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 Le(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 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 Pe(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(_,I){return l.write(_,I),e.hashFn(I)},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 I={};for(let H of _)I[H]=l.read(H);return {version:e.hashFn(I),values:I}},writeValues(S,l,_){let I=e.kvStorage("state-snapshot");for(let H of _)I.delete(H);for(let[H,J]of Object.entries(l))I.write(H,J);return e.hashFn(l)}},u=()=>Ne(e.kvStorage("config")),f=()=>je(i),x=()=>Ee(e.journalAdapter()),F=()=>Vt(s(),n),R=()=>{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 De(S.values)}function g(S,l){let _=f().commitSnapshot(t.value,{schemaVersion:Ut,expectedVersion:l,commitId:e.genId(),committedAt:st(),deleteKeys:[],shallowMerge:Be(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 N=p.payload,L=(N?.enrichedCard??{}).id??N?.cardId??"unknown";y({type:"task-failed",taskName:L,error:h,timestamp:st()});},l=Te(e.kvStorage("execution-requests"),S),_=Oe(e.kvStorage("card-runtime")),I=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 N=`${p}/${h}`;return rt.has(N)?rt.get(N):I.readSourceData(p,h)},ingestSourceDataStaged(p,h,N,V){I.ingestSourceDataStaged(p,h,N,V);},commitSourceData(p,h,N){let V=`${p}/.staged/${N}/${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:N}),true},hasSource(p,h){let N=`${p}/${h}`;return rt.has(N)?true:I.hasSource(p,h)}},it={cardStore:F(),cardRuntimeStore:J,fetchedSourcesStore:lt,outputStore:R(),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":Fe(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 N=it.cardStore.readCard(h.taskName);N&&Et.set(h.taskName,N);}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:N}of at)I.commitSourceData(p,h,N);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,N]of Object.entries(p))h&&C.push({kind:"data_object",key:h,payload:N});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 O=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,N=h.enrichedCard?.id??"unknown",V=h.enrichedCard?.source_defs??[];for(let L of V){if(!L.outputFile){n(`[dispatch] source "${L.bindTo}" has no outputFile \u2014 skipping`);continue}let Q=jn({cbk:h.callbackToken,rg:t.value,br:ht(t),cid:N,b:L.bindTo,d:L.outputFile,cs:void 0,rqt:h.rqt});e.dispatchExecution(O,{source_def:L,base_ref:ht(t),callback:{token:Q,via:e.selfRef}}).catch(tt=>Nt(N,tt instanceof Error?tt.message:String(tt)));}});}async function E(){try{let S=()=>{let _=w(),{events:I}=x().readEntriesAfterCursor(_.lastDrainedJournalId);I.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(!j()){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 I=u();I.writeCardStoreRef(l),I.writeOutputsStoreRef(_);let H=S.body??{};H["task-executor-ref"]&&I.writeTaskExecutorRef(H["task-executor-ref"]),H["chat-handler-ref"]&&I.writeChatHandlerRef(H["chat-handler-ref"]);try{R().writeStatusSnapshot(Mt(r,Pt(w().graph)));}catch{}return et()}catch(l){return nt(l)}}function A(S){try{let l=R().readStatusSnapshot();if(!l){l=Mt(r,Pt(w().graph));try{R().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 q(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 G(S){return E()}function T(S){try{let l=S.params?.cardId,_=S.params?.all,I=!!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=Le(at),lt=e.hashFn(rt),it=e.kvStorage("card-upsert"),ft=it.read(J),pt=ft?.taskConfigHash!==lt;if(!(!pt&&!I)){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()});}I&&y({type:"task-restart",taskName:J,timestamp:st()});}}return E(),et()}catch(l){return nt(l)}}function $(S){try{let l=S.params?.token;if(!l)return z("taskFailed requires params.token");let _=S.params?.error??"unknown error",I=Ht(l);return I?(y({type:"task-failed",taskName:I.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 I=(S.body??{}).update??{},H=Ht(l);return H?(y({type:"task-progress",taskName:H.taskName,update:I,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 I=Pe(l);if(!I)return z("Invalid source token");let{cbk:H,cid:J,b:at,d:rt,cs:lt,rqt:it}=I,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 I=Pe(l);if(!I)return z("Invalid source token");let{cbk:H,b:J,d:at,cs:rt}=I,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(),I;switch(l){case "task-executor":I=_.readTaskExecutorRef()??null;break;case "chat-handler":I=_.readChatHandlerRef()??null;break;case "card-store-ref":I=_.readCardStoreRef();break;case "outputs-store-ref":I=_.readOutputsStoreRef();break;default:return z(`getConfig: unknown key "${l}"`)}return et({value:I})}catch(l){return nt(l)}}function Ct(S){try{let l=S.params?.key;if(!l)return z("getOutputsDataObject requires params.key");let _=R().readDataObject(l);return et(_)}catch(l){return nt(l)}}function Rt(S){try{return et(R().readAllDataObjects())}catch(l){return nt(l)}}function D(S){try{let l=S.params?.key;if(!l)return z("getOutputsComputedValues requires params.key");let _=R().readComputedValues(l);return et(_)}catch(l){return nt(l)}}function P(S){try{return et(R().readAllComputedValues())}catch(l){return nt(l)}}return {init:m,status:A,getCardStoreRef:Y,getOutputsStoreRef:X,getConfig:St,getOutputsDataObject:Ct,getAllOutputsDataObjects:Rt,getOutputsComputedValues:D,getAllOutputsComputedValues:P,removeCard:B,retrigger:q,processAccumulatedEvents:G,upsertCard:T,taskFailed:$,taskProgress:M,sourceDataFetched:U,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 Ue(){return new Date().toISOString()}function Me(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 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 Bn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Dn(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 Ln(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=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:Me(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??Ue(),s.size=s.size??Me(r);let i=jt(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??Ue(),s.size=s.size??r.byteLength;let i=jt(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=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 Ke(t,e){let n=e?.indexFileName;function r(R){return `${R}/${n}`}function o(R){let j=t.getText(r(R));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:`${R}/chats/${String(g.stored_name)}`,updated_at:typeof g.updated_at=="string"?g.updated_at:null})):[]}catch{return []}}function s(R,j){t.putText(r(R),JSON.stringify(j,null,2),"application/json; charset=utf-8");}function i(R){let j=o(R),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(R,j){let w=o(R);w.push(j),s(R,w);}function f(R){let j=o(R),w=[];for(let g of j){let y=`${R}/${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:`${R}/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(R){let j=`${R}/`;for(let w of t.list(j))t.remove(w.key);}function F(R){let j=`${R}/`,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:F}}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(Ln(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}=Dn(o),F=Bn(x),R=Fn(f),j=`${String(s).padStart(3,"0")}-`,w=F,g=u-j.length-w.length;g<1&&(w="",g=u-j.length);let y=R.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"},Pn=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 F(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,N)=>(d.write(h,N),h),cardExists:h=>d.read(h)!==null,defaultCardKey:h=>h},o.warn)),C=a.artifactsAdapter||a.boardAdapter,O=null,p=null;return {label:a.label,board:c,cardStore:k,get filesArtifacts(){return O??=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:qn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let R=t.boards.map(F),j=new Map;function w(a){return j.get(a)??0}function g(a){let c=R[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[C,O]of Object.entries(b.data))C&&c.push({kind:"data_object",key:C,payload:O});let k=a.board.getAllOutputsComputedValues({});if(k.status==="success"&&k.data!=null)for(let[C,O]of Object.entries(k.data))C&&c.push({kind:"computed_values",cardId:C,values:O});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 R)await B(a);}async function $(){await T();for(let a=0;a<R.length;a++)q(R[a]),G(R[a],a);}function M(a){return R[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 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 R)c.push(...a(d));return c}function Y(){let a=R.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"],b={};for(let C of d)b[C]=0;for(let C of a){let O=C,p=Array.isArray(O.cards)?O.cards:[];c.push(...p);for(let h of d)b[h]+=Number(O?.summary?.[h]||0);}let k=a[0];return {...k,cards:c,summary:{...k.summary||{},card_count:c.length,...b}}}function X(){let a={},c=d=>{for(let[b,k]of Object.entries(d.notification.computedValues)){let C=d.notification.cards[b];a[b]={schema_version:"v1",card_id:b,card_data:C?.card_data??{},computed_values:k??{}};}};for(let d of R)c(d);return a}function St(){let a={};for(let c of R)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(),b={};for(let k of a){if(!k?.id)continue;let C=k.id,O=c[C]||{},p=Ct(C),h={...O.card_data&&typeof O.card_data=="object"?O.card_data:k.card_data&&typeof k.card_data=="object"?k.card_data:{},__chat_signal:p};b[C]={schema_version:O.schema_version||"v1",card_id:O.card_id||C,card_data:h,computed_values:O.computed_values&&typeof O.computed_values=="object"?O.computed_values:{}};}return {boardId:r,cardDefinitions:a,statusSnapshot:Y(),dataObjectsByToken:d,cardRuntimeById:b}}function D(a,c,d){let b=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 O=c(C)||C,p=k.cardStore.set({body:O});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 P(a,c){D(a,c,{syncBoard:true});}function S(a,c){D(a,c,{syncBoard:false});}function l(a,c){P(a,d=>{if(!c||typeof c!="object"||Object.keys(c).length===0)return d;function b(k,C,O){let p=String(C||"").split(".").filter(Boolean);if(!p.length)return;let h=k;for(let N=0;N<p.length-1;N++){let V=p[N];(!h[V]||typeof h[V]!="object")&&(h[V]={}),h=h[V];}h[p[p.length-1]]=O;}if(c.fieldValues!==void 0&&c.fieldValues!==null){let k=null,C=d.view;if(C&&Array.isArray(C.elements)){for(let O of C.elements)if(O?.data&&O.data.writeTo){k=O.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,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 I(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,C=String(c||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(k).padStart(3,"0")}_${C}.txt`}function at(a,c,d,b){let k=new Date().toISOString(),C=m(a),O=g(a),p=J(a,c||"system"),h=`${C}/${p}`,N=[],V=typeof d=="string"?d.trim():"";V&&N.push(V);let L=Array.isArray(b)?b:[];if(L.length){N.length&&N.push(""),N.push("files:");for(let W of L){if(!W||typeof W!="object")continue;let ut=typeof W.name=="string"?W.name:"file",ct=typeof W.stored_name=="string"?W.stored_name:"";N.push(ct?`- ${ut} -> ${ct}`:`- ${ut}`);}}O.chats&&O.chats.putText(h,`${N.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:L,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=U(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),C=g(a),O=I(c),p=v(a),h=p?p.allocateStoredName(k,O,{seedNames:lt(a),maxLen:Pn}):`${String(Date.now())}-${O}`;return C.files&&C.files.putBytes(`${k}/${h}`,new Uint8Array(b),d||"application/octet-stream"),{name:O,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=M(a);if(!b)return;let k=b.board.getConfig({params:{key:"chat-handler"}});if(k.status!=="success")return;let C=k.data?.value;if(!C||typeof C!="object")return;let O=m(a),p=g(a),h=`${O}/.processing`;try{p.chats?.putText(h,"","text/plain; charset=utf-8");}catch{}let N={boardId:r,cardId:String(a),chatsKeyPrefix:c,chatProcessingMarkerKey:h,lastChatFile:d,...f,...u?{serverUrl:u}:{}};s.invoke(C,N).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:P,k;b(a,C=>{let O=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():"",N=[];if(Array.isArray(d?.files)){for(let V of d.files)if(V){if(typeof V=="string"){N.push({name:V});continue}if(typeof V=="object"){let L=V;typeof L.name=="string"&&N.push({name:L.name,size:L.size,mime_type:L.mime_type,path:L.path,uploaded_at:L.uploaded_at,stored_name:L.stored_name});}}}if(h||N.length>0){let V=m(a),Q=at(a,"user",h,N).path,tt=Q.includes("/")?Q.slice(Q.lastIndexOf("/")+1):Q;k={chatsKeyPrefix:`${V}/chats`,lastChatFile:tt};for(let W of N){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,O);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:O},p.lastActionText=`${h} @ ${O}`;}return C}),k&&ft(a,k.chatsKeyPrefix,k.lastChatFile);}function Z(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,C)=>k+C.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 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(),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,C=k.pathname;try{if(b==="GET"&&C===`${e}/init-board`)return await T(),Z(c,200,Rt()),!0;if(b==="GET"&&C===`${e}/sse`){await T(),Nt(a,c);for(let L=0;L<R.length;L++)q(R[L]),G(R[L],L);return !0}if(b==="GET"&&C===`${e}/board-status`)return Z(c,200,Rt()),!0;let O=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)$`));if(b==="PATCH"&&O){await $();let L=decodeURIComponent(O[1]),Q=await gt(a);return l(L,Q),Z(c,200,{ok:!0}),!0}let p=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/actions$`));if(b==="POST"&&p){await $();let L=decodeURIComponent(p[1]),Q=await gt(a);return pt(L,Q?.actionType,Q?.payload),Z(c,200,{ok:!0}),!0}let h=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/chats$`));if(b==="GET"&&h){await $();let L=decodeURIComponent(h[1]);return Z(c,200,{ok:!0,messages:rt(L)}),!0}let N=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/files$`));if(b==="POST"&&N){await $();let L=decodeURIComponent(N[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(L,ct,W,$t);return Q&&(S(L,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(L,"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(b==="GET"&&V){let L=decodeURIComponent(V[1]),Q=parseInt(V[2],10),tt=k.searchParams.get("sn"),W=U(L);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(L),dt=g(L),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(O){let p=O?.statusCode||500;return Z(c,p,{error:String(O?.message||O)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleRuntimeApi:se,buildPublishedRuntimePayload:Rt,clearChatRecords:H,reportSourceFetched(a,c){let d=R[0];return d?d.board.sourceDataFetched({params:{token:a,ref:c}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,c){let d=R[0];return d?d.board.sourceDataFetchFailure({params:{token:a,reason:c}}):{status:"fail",error:"no board context"}},get cardStore(){return R[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Dr(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 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 R(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 R(E,200,{ok:true,boards:u().boards}),true;if(A==="POST"&&B===e){let q=[];for await(let Y of v)q.push(Y);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 $=x(T.id);if(!$)return R(E,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let M=u();if(M.boards.some(Y=>Y.id===$))return R(E,409,{error:`Board "${$}" is already registered`}),true;let U=typeof T.label=="string"&&T.label.trim()?T.label.trim():$,K={id:$,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),R(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($=>$.id===q)?!!await F(q).handleRuntimeApi(v,E,m):(R(E,404,{error:`Board "${q}" not registered. POST ${e} with {id} to register it first.`}),true):(R(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:F(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=Dr;exports.createSingleBoardServerRuntime=Br;//# sourceMappingURL=index.cjs.map
|
|
9
|
-
//# sourceMappingURL=index.cjs.map
|