yaml-flow 7.1.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/asset-integrity.json +8 -4
- package/browser/board-livecards-client.js +1 -1
- package/browser/board-livecards-localstorage.js +5 -5
- 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-C_A6WCiK.d.ts +284 -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/execution-adapter.d.ts +3 -3
- 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-CziUxkiv.d.ts} +68 -5
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/card-store-ref.json +1 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/chat-handler.json +1 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/outputs-store-ref.json +1 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/task-executor.json +1 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.state-snapshot/board/graph.json +29 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.state-snapshot/board/lastJournalProcessedId.json +1 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime-out/.outputs/status.json +25 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-market-prices/computed_values.json +67 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-portfolio/computed_values.json +1 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-portfolio-value/computed_values.json +52 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/holdings.json +22 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/positions.json +46 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/quotes.json +35 -0
- package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/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/{dist/cli/node/execution-adapter.d.cts → lib/board-live-cards-node.d.cts} +45 -85
- package/lib/board-live-cards-node.d.ts +134 -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/{dist → lib}/execution-refs.d.cts +29 -10
- package/{dist → lib}/execution-refs.d.ts +29 -10
- 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.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.map +0 -1
- 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/cli → cli}/node/card-store-cli.js +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}/execution-refs.cjs +0 -0
- /package/{dist → lib}/execution-refs.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,366 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""portfolio-tracker.py — E2E orchestrator for the portfolio board demo.
|
|
3
|
-
|
|
4
|
-
Black-box CLI client. All board and card-store operations are performed by
|
|
5
|
-
shelling out to board-live-cards-cli and card-store-cli. No env vars. No
|
|
6
|
-
fallbacks or defaults.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import copy
|
|
10
|
-
import base64
|
|
11
|
-
import json
|
|
12
|
-
import os
|
|
13
|
-
import shutil
|
|
14
|
-
import subprocess
|
|
15
|
-
import sys
|
|
16
|
-
import tempfile
|
|
17
|
-
import time
|
|
18
|
-
import argparse
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def serialize_ref(ref: dict[str, str]) -> str:
|
|
22
|
-
payload = json.dumps({"kind": ref.get("kind", ""), "value": ref.get("value", "")}, separators=(",", ":")).encode("utf-8")
|
|
23
|
-
return "b64:" + base64.urlsafe_b64encode(payload).decode("ascii").rstrip("=")
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
_CLI_PARSER = argparse.ArgumentParser()
|
|
27
|
-
_MODE_GROUP = _CLI_PARSER.add_mutually_exclusive_group()
|
|
28
|
-
_MODE_GROUP.add_argument('--run-pycli', action='store_true', help='Use pycli for board/card operations (default)')
|
|
29
|
-
_MODE_GROUP.add_argument('--run-nodecli', action='store_true', help='Use node cli for board/card operations')
|
|
30
|
-
_CLI_ARGS = _CLI_PARSER.parse_args()
|
|
31
|
-
RUN_PYCLI = not _CLI_ARGS.run_nodecli
|
|
32
|
-
|
|
33
|
-
# ── Path resolution ────────────────────────────────────────────────────────────
|
|
34
|
-
_HERE = os.path.dirname(os.path.abspath(__file__))
|
|
35
|
-
_REPO_ROOT = os.path.normpath(os.path.join(_HERE, '..', '..', '..', '..'))
|
|
36
|
-
|
|
37
|
-
NODE = shutil.which('node')
|
|
38
|
-
if not NODE:
|
|
39
|
-
print('[ERROR] node not found on PATH', file=sys.stderr)
|
|
40
|
-
sys.exit(1)
|
|
41
|
-
|
|
42
|
-
BOARD_CLI = os.path.join(_REPO_ROOT, 'board-live-cards-cli.js')
|
|
43
|
-
CARD_STORE_CLI = os.path.join(_REPO_ROOT, 'card-store.js')
|
|
44
|
-
FETCH_PRICES_PY = os.path.join(_HERE, 'portfolio-tracker-fetch-prices.py')
|
|
45
|
-
|
|
46
|
-
PYTHON = shutil.which('python')
|
|
47
|
-
if not PYTHON:
|
|
48
|
-
print('[ERROR] python not found on PATH (required for portfolio-tracker-fetch-prices.py)', file=sys.stderr)
|
|
49
|
-
sys.exit(1)
|
|
50
|
-
|
|
51
|
-
PYTHON_RUNNER = sys.executable or PYTHON
|
|
52
|
-
|
|
53
|
-
BOARD_PYCLI = os.path.join(_REPO_ROOT, 'pycli', 'main', 'board_live_cards_pycli.py')
|
|
54
|
-
CARD_STORE_PYCLI = os.path.join(_REPO_ROOT, 'pycli', 'main', 'card_store_pycli.py')
|
|
55
|
-
|
|
56
|
-
if RUN_PYCLI:
|
|
57
|
-
if not os.path.exists(BOARD_PYCLI):
|
|
58
|
-
print(f'[ERROR] pycli entry not found: {BOARD_PYCLI}', file=sys.stderr)
|
|
59
|
-
sys.exit(1)
|
|
60
|
-
if not os.path.exists(CARD_STORE_PYCLI):
|
|
61
|
-
print(f'[ERROR] pycli entry not found: {CARD_STORE_PYCLI}', file=sys.stderr)
|
|
62
|
-
sys.exit(1)
|
|
63
|
-
|
|
64
|
-
if RUN_PYCLI:
|
|
65
|
-
ACTIVE_BOARD_BIN = [PYTHON_RUNNER, BOARD_PYCLI]
|
|
66
|
-
ACTIVE_CARD_STORE_BIN = [PYTHON_RUNNER, CARD_STORE_PYCLI]
|
|
67
|
-
ACTIVE_BOARD_SUFFIX = []
|
|
68
|
-
else:
|
|
69
|
-
ACTIVE_BOARD_BIN = [NODE, BOARD_CLI]
|
|
70
|
-
ACTIVE_CARD_STORE_BIN = [NODE, CARD_STORE_CLI]
|
|
71
|
-
ACTIVE_BOARD_SUFFIX = []
|
|
72
|
-
|
|
73
|
-
# ── Runtime directories (under os.tmpdir()/experiment/) ───────────────────────
|
|
74
|
-
_TMP_BASE = tempfile.mkdtemp(prefix='experiment-')
|
|
75
|
-
CARDSTORE_DIR = os.path.join(_TMP_BASE, 'cardstore')
|
|
76
|
-
BOARDRUNTIME_DIR = os.path.join(_TMP_BASE, 'boardruntime')
|
|
77
|
-
OUTPUTS_DIR = os.path.join(_TMP_BASE, 'outputs')
|
|
78
|
-
|
|
79
|
-
CARDSTORE_REF = serialize_ref({'kind': 'fs-path', 'value': CARDSTORE_DIR})
|
|
80
|
-
BOARDRUNTIME_REF = serialize_ref({'kind': 'fs-path', 'value': BOARDRUNTIME_DIR})
|
|
81
|
-
OUTPUTS_REF = serialize_ref({'kind': 'fs-path', 'value': OUTPUTS_DIR})
|
|
82
|
-
|
|
83
|
-
# ── Inline card definitions ────────────────────────────────────────────────────
|
|
84
|
-
CARD_PORTFOLIO_FORM = {
|
|
85
|
-
"id": "portfolio-form",
|
|
86
|
-
"meta": {"title": "Portfolio Holdings Form"},
|
|
87
|
-
"provides": [{"bindTo": "holdings", "ref": "card_data.holdings"}],
|
|
88
|
-
"card_data": {"holdings": []},
|
|
89
|
-
"view": {
|
|
90
|
-
"elements": [
|
|
91
|
-
{"kind": "table", "label": "Holdings",
|
|
92
|
-
"data": {"bind": "card_data.holdings", "columns": ["symbol", "qty"]}}
|
|
93
|
-
]
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
CARD_PRICE_FETCH = {
|
|
98
|
-
"id": "price-fetch",
|
|
99
|
-
"meta": {"title": "Fetch Market Prices"},
|
|
100
|
-
"requires": ["holdings"],
|
|
101
|
-
"provides": [{"bindTo": "prices", "ref": "fetched_sources.prices"}],
|
|
102
|
-
"card_data": {},
|
|
103
|
-
"source_defs": [{
|
|
104
|
-
"kind": "mock-quotes",
|
|
105
|
-
"bindTo": "prices",
|
|
106
|
-
"outputFile": "prices.json",
|
|
107
|
-
"projections": {"tickers": "requires.holdings.symbol"}
|
|
108
|
-
}],
|
|
109
|
-
"view": {
|
|
110
|
-
"elements": [
|
|
111
|
-
{"kind": "table", "label": "Market Prices",
|
|
112
|
-
"data": {"bind": "fetched_sources.prices"}}
|
|
113
|
-
]
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
CARD_HOLDINGS_TABLE = {
|
|
118
|
-
"id": "holdings-table",
|
|
119
|
-
"meta": {"title": "Holdings Table"},
|
|
120
|
-
"requires": ["holdings", "prices"],
|
|
121
|
-
"provides": [{"bindTo": "table", "ref": "computed_values.table"}],
|
|
122
|
-
"card_data": {},
|
|
123
|
-
"compute": [{
|
|
124
|
-
"bindTo": "table",
|
|
125
|
-
"expr": (
|
|
126
|
-
'{ "rows": $map(requires.holdings, function($h) { '
|
|
127
|
-
'{ "symbol": $h.symbol, "qty": $h.qty, '
|
|
128
|
-
'"price": $lookup(requires.prices, $h.symbol), '
|
|
129
|
-
'"value": $h.qty * $lookup(requires.prices, $h.symbol) } }) }'
|
|
130
|
-
)
|
|
131
|
-
}],
|
|
132
|
-
"view": {
|
|
133
|
-
"elements": [
|
|
134
|
-
{"kind": "table", "label": "Portfolio Positions",
|
|
135
|
-
"data": {"bind": "computed_values.table.rows",
|
|
136
|
-
"columns": ["symbol", "qty", "price", "value"]}}
|
|
137
|
-
]
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
CARD_PORTFOLIO_VALUE = {
|
|
142
|
-
"id": "portfolio-value",
|
|
143
|
-
"meta": {"title": "Portfolio Total Value"},
|
|
144
|
-
"requires": ["table"],
|
|
145
|
-
"provides": [{"bindTo": "totalValue", "ref": "computed_values.totalValue"}],
|
|
146
|
-
"card_data": {},
|
|
147
|
-
"compute": [
|
|
148
|
-
{"bindTo": "totalValue", "expr": "$sum(requires.table.rows.value)"}
|
|
149
|
-
],
|
|
150
|
-
"view": {
|
|
151
|
-
"elements": [
|
|
152
|
-
{"kind": "metric", "label": "Total Portfolio Value",
|
|
153
|
-
"data": {"bind": "computed_values.totalValue"}}
|
|
154
|
-
]
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
# ── Helpers ────────────────────────────────────────────────────────────────────
|
|
159
|
-
def set_holdings(card_json: dict, holdings: dict) -> dict:
|
|
160
|
-
card = copy.deepcopy(card_json)
|
|
161
|
-
card["card_data"]["holdings"] = [
|
|
162
|
-
{"symbol": symbol, "qty": qty}
|
|
163
|
-
for symbol, qty in holdings.items()
|
|
164
|
-
]
|
|
165
|
-
return card
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
def run_board(*args):
|
|
169
|
-
subprocess.run([*ACTIVE_BOARD_BIN, *args, *ACTIVE_BOARD_SUFFIX], check=True, shell=False)
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def run_board_with_input(*args, input_json: str):
|
|
173
|
-
subprocess.run(
|
|
174
|
-
[*ACTIVE_BOARD_BIN, *args, *ACTIVE_BOARD_SUFFIX],
|
|
175
|
-
input=input_json, check=True, shell=False, text=True,
|
|
176
|
-
)
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def run_board_capture(*args) -> str:
|
|
180
|
-
result = subprocess.run(
|
|
181
|
-
[*ACTIVE_BOARD_BIN, *args, *ACTIVE_BOARD_SUFFIX],
|
|
182
|
-
check=True, shell=False, capture_output=True, text=True,
|
|
183
|
-
)
|
|
184
|
-
return result.stdout
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def run_card_store_set(card: dict):
|
|
188
|
-
subprocess.run(
|
|
189
|
-
[*ACTIVE_CARD_STORE_BIN, 'set', '--store-ref', CARDSTORE_REF],
|
|
190
|
-
input=json.dumps(card),
|
|
191
|
-
check=True,
|
|
192
|
-
shell=False,
|
|
193
|
-
text=True,
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
def read_json(path: str):
|
|
198
|
-
with open(path, encoding='utf-8') as f:
|
|
199
|
-
return json.load(f)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
def wait_for_completed(label: str, timeout_s: float = 10.0, poll_s: float = 0.5):
|
|
203
|
-
required_names = {'portfolio-form', 'price-fetch', 'holdings-table', 'portfolio-value'}
|
|
204
|
-
deadline = time.monotonic() + timeout_s
|
|
205
|
-
while time.monotonic() < deadline:
|
|
206
|
-
raw = run_board_capture('status', '--base-ref', BOARDRUNTIME_REF)
|
|
207
|
-
data = json.loads(raw).get('data', {})
|
|
208
|
-
cards = data.get('cards', [])
|
|
209
|
-
completed = {c['name'] for c in cards if c.get('status') == 'completed'}
|
|
210
|
-
if required_names.issubset(completed):
|
|
211
|
-
print(f'[{label}] all cards completed.')
|
|
212
|
-
return
|
|
213
|
-
time.sleep(poll_s)
|
|
214
|
-
# timed out — print status and exit
|
|
215
|
-
raw = run_board_capture('status', '--base-ref', BOARDRUNTIME_REF)
|
|
216
|
-
print(f'[ERROR] {label}: timed out waiting for all cards to complete.', file=sys.stderr)
|
|
217
|
-
print(raw, file=sys.stderr)
|
|
218
|
-
sys.exit(1)
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
# ── T0a — Create runtime directories ──────────────────────────────────────────
|
|
222
|
-
print('\n=== T0a: Create runtime directories ===')
|
|
223
|
-
for d in (CARDSTORE_DIR, BOARDRUNTIME_DIR, OUTPUTS_DIR):
|
|
224
|
-
os.makedirs(d)
|
|
225
|
-
print(f' created: {d}')
|
|
226
|
-
|
|
227
|
-
# ── T0b — Init board ───────────────────────────────────────────────────────────
|
|
228
|
-
print('\n=== T0b: Init board ===')
|
|
229
|
-
_task_executor_body = json.dumps({
|
|
230
|
-
'task-executor-ref': {
|
|
231
|
-
'meta': 'task-executor',
|
|
232
|
-
'howToRun': 'local-python',
|
|
233
|
-
'whatToRun': serialize_ref({'kind': 'fs-path', 'value': FETCH_PRICES_PY}),
|
|
234
|
-
}
|
|
235
|
-
})
|
|
236
|
-
run_board_with_input(
|
|
237
|
-
'init',
|
|
238
|
-
'--base-ref', BOARDRUNTIME_REF,
|
|
239
|
-
'--card-store-ref', CARDSTORE_REF,
|
|
240
|
-
'--outputs-store-ref', OUTPUTS_REF,
|
|
241
|
-
input_json=_task_executor_body,
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
# ── T0c — Set all cards into card store ────────────────────────────────────────
|
|
245
|
-
print('\n=== T0c: Set all cards into card store ===')
|
|
246
|
-
run_card_store_set(set_holdings(CARD_PORTFOLIO_FORM, {"AAPL": 50, "MSFT": 30}))
|
|
247
|
-
run_card_store_set(CARD_PRICE_FETCH)
|
|
248
|
-
run_card_store_set(CARD_HOLDINGS_TABLE)
|
|
249
|
-
run_card_store_set(CARD_PORTFOLIO_VALUE)
|
|
250
|
-
|
|
251
|
-
# ── T0d — Upsert cards to board ────────────────────────────────────────────────
|
|
252
|
-
print('\n=== T0d: Upsert cards to board ===')
|
|
253
|
-
for _card_id in ('portfolio-form', 'price-fetch', 'holdings-table', 'portfolio-value'):
|
|
254
|
-
run_board('upsert-card', '--base-ref', BOARDRUNTIME_REF, '--card-id', _card_id)
|
|
255
|
-
|
|
256
|
-
# ── T1 — Wait for all cards completed ──────────────────────────────────────────
|
|
257
|
-
print('\n=== T1: Wait for all cards completed ===')
|
|
258
|
-
wait_for_completed('T1')
|
|
259
|
-
|
|
260
|
-
_prices_path = os.path.join(OUTPUTS_DIR, 'data-objects', 'prices.json')
|
|
261
|
-
_prices_t1 = read_json(_prices_path)
|
|
262
|
-
assert isinstance(_prices_t1, dict) and len(_prices_t1) > 0, \
|
|
263
|
-
'T1: prices.json is empty or not an object'
|
|
264
|
-
assert set(_prices_t1.keys()) == {'AAPL', 'MSFT'}, \
|
|
265
|
-
f'T1: expected keys {{AAPL, MSFT}}, got {set(_prices_t1.keys())}'
|
|
266
|
-
assert all(isinstance(v, (int, float)) for v in _prices_t1.values()), \
|
|
267
|
-
'T1: all price values must be numbers'
|
|
268
|
-
print('[T1] assertion passed: prices.json has AAPL, MSFT with numeric values.')
|
|
269
|
-
|
|
270
|
-
# ── T2a — Update holdings (GOOG added) ────────────────────────────────────────
|
|
271
|
-
print('\n=== T2a: Update holdings (GOOG added) ===')
|
|
272
|
-
run_card_store_set(set_holdings(CARD_PORTFOLIO_FORM, {"AAPL": 50, "MSFT": 30, "GOOG": 100}))
|
|
273
|
-
|
|
274
|
-
# ── T2b — Upsert portfolio-form with --restart ─────────────────────────────────
|
|
275
|
-
print('\n=== T2b: Upsert portfolio-form --restart ===')
|
|
276
|
-
run_board('upsert-card', '--base-ref', BOARDRUNTIME_REF,
|
|
277
|
-
'--card-id', 'portfolio-form', '--restart')
|
|
278
|
-
|
|
279
|
-
# ── T2c — Wait and assert ──────────────────────────────────────────────────────
|
|
280
|
-
print('\n=== T2c: Wait for all cards completed ===')
|
|
281
|
-
wait_for_completed('T2c')
|
|
282
|
-
|
|
283
|
-
_prices_t2c = read_json(_prices_path)
|
|
284
|
-
assert set(_prices_t2c.keys()) == {'AAPL', 'MSFT', 'GOOG'}, \
|
|
285
|
-
f'T2c: expected keys {{AAPL, MSFT, GOOG}}, got {set(_prices_t2c.keys())}'
|
|
286
|
-
|
|
287
|
-
_ht_cv_path = os.path.join(OUTPUTS_DIR, 'cards', 'holdings-table', 'computed_values.json')
|
|
288
|
-
_ht_cv_t2c = read_json(_ht_cv_path)
|
|
289
|
-
assert len(_ht_cv_t2c['table']['rows']) == 3, \
|
|
290
|
-
f'T2c: expected 3 rows in holdings-table, got {len(_ht_cv_t2c["table"]["rows"])}'
|
|
291
|
-
print('[T2c] assertions passed: 3 tickers in prices, 3 rows in holdings-table.')
|
|
292
|
-
|
|
293
|
-
# ── T3 — Retrigger price-fetch, wait ──────────────────────────────────────────
|
|
294
|
-
print('\n=== T3: Retrigger price-fetch ===')
|
|
295
|
-
run_board('retrigger', '--base-ref', BOARDRUNTIME_REF, '--id', 'price-fetch')
|
|
296
|
-
wait_for_completed('T3')
|
|
297
|
-
|
|
298
|
-
_prices_t3 = read_json(_prices_path)
|
|
299
|
-
assert set(_prices_t3.keys()) == {'AAPL', 'MSFT', 'GOOG'}, \
|
|
300
|
-
f'T3: expected 3 tickers, got {set(_prices_t3.keys())}'
|
|
301
|
-
assert _prices_t3 != _prices_t2c, \
|
|
302
|
-
'T3: prices must differ from T2c values after retrigger (random regeneration)'
|
|
303
|
-
print('[T3] assertions passed: 3 tickers, prices differ from T2c.')
|
|
304
|
-
|
|
305
|
-
# ── T4 — Rapid 5× portfolio-form updates (queue stress test) ──────────────────
|
|
306
|
-
print('\n=== T4: Rapid 5x portfolio-form updates ===')
|
|
307
|
-
for _holdings in [
|
|
308
|
-
{"AAPL": 50, "MSFT": 30, "GOOG": 100, "AMZN": 40}, # V3
|
|
309
|
-
{"AAPL": 45, "MSFT": 30, "GOOG": 110, "AMZN": 40, "TSLA": 60}, # V4
|
|
310
|
-
{"AAPL": 45, "MSFT": 30, "GOOG": 110, "AMZN": 100}, # V4a
|
|
311
|
-
{"AAPL": 45, "MSFT": 30, "GOOG": 110, "AMZN": 140, "TSLA": 60}, # V4b
|
|
312
|
-
{"AAPL": 40, "MSFT": 35, "GOOG": 120, "TSLA": 70}, # V5
|
|
313
|
-
]:
|
|
314
|
-
run_card_store_set(set_holdings(CARD_PORTFOLIO_FORM, _holdings))
|
|
315
|
-
run_board('upsert-card', '--base-ref', BOARDRUNTIME_REF,
|
|
316
|
-
'--card-id', 'portfolio-form', '--restart')
|
|
317
|
-
|
|
318
|
-
wait_for_completed('T4')
|
|
319
|
-
|
|
320
|
-
_prices_t4 = read_json(_prices_path)
|
|
321
|
-
assert set(_prices_t4.keys()) == {'AAPL', 'MSFT', 'GOOG', 'TSLA'}, \
|
|
322
|
-
f'T4: expected keys {{AAPL, MSFT, GOOG, TSLA}}, got {set(_prices_t4.keys())}'
|
|
323
|
-
assert 'AMZN' not in _prices_t4, \
|
|
324
|
-
'T4: AMZN must not be present (board must have settled on V5 holdings)'
|
|
325
|
-
print('[T4] assertions passed: V5 tickers only, AMZN absent.')
|
|
326
|
-
|
|
327
|
-
# ── T5 — Print final status and cross-check ────────────────────────────────────
|
|
328
|
-
print('\n=== T5: Print final status and cross-check ===')
|
|
329
|
-
|
|
330
|
-
# Step 1: Wait for all cards completed (stable state before any assertions)
|
|
331
|
-
wait_for_completed('T5')
|
|
332
|
-
|
|
333
|
-
# Step 2: Capture live CLI status
|
|
334
|
-
_cli_raw = run_board_capture('status', '--base-ref', BOARDRUNTIME_REF)
|
|
335
|
-
_cli_status = json.loads(_cli_raw)['data']
|
|
336
|
-
|
|
337
|
-
# Step 3: Read status.json from outputs store
|
|
338
|
-
_file_status = read_json(os.path.join(OUTPUTS_DIR, 'status.json'))
|
|
339
|
-
|
|
340
|
-
# Step 4: Cross-check CLI vs file status
|
|
341
|
-
assert json.dumps(_cli_status, sort_keys=True) == json.dumps(_file_status, sort_keys=True), \
|
|
342
|
-
'T5: CLI status does not match status.json snapshot'
|
|
343
|
-
print('[T5] cross-check passed: CLI status matches status.json.')
|
|
344
|
-
|
|
345
|
-
# Step 5: Print holdings-table computed values
|
|
346
|
-
_ht_cv = read_json(_ht_cv_path)
|
|
347
|
-
print('\nFinal portfolio positions table:')
|
|
348
|
-
print(json.dumps(_ht_cv['table'], indent=2))
|
|
349
|
-
|
|
350
|
-
# Step 6: Totals cross-verify: holdings × prices == totalValue
|
|
351
|
-
V5_HOLDINGS = {"AAPL": 40, "MSFT": 35, "GOOG": 120, "TSLA": 70}
|
|
352
|
-
_prices_final = read_json(_prices_path)
|
|
353
|
-
_pv_cv = read_json(
|
|
354
|
-
os.path.join(OUTPUTS_DIR, 'cards', 'portfolio-value', 'computed_values.json')
|
|
355
|
-
)
|
|
356
|
-
_total_value = _pv_cv['totalValue']
|
|
357
|
-
_expected = sum(qty * _prices_final[sym] for sym, qty in V5_HOLDINGS.items())
|
|
358
|
-
assert round(_expected, 2) == round(_total_value, 2), \
|
|
359
|
-
f'T5: totals mismatch: expected={round(_expected, 2)}, got={round(_total_value, 2)}'
|
|
360
|
-
print(f'[T5] totals assertion passed: expected={round(_expected, 2)}, totalValue={round(_total_value, 2)}')
|
|
361
|
-
|
|
362
|
-
# Step 7: Print full CLI status
|
|
363
|
-
print('\nFinal board status:')
|
|
364
|
-
print(json.dumps(_cli_status, indent=2))
|
|
365
|
-
|
|
366
|
-
print('\n=== portfolio-tracker completed successfully ===')
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
-
<title>LiveCards Browser Demo Moved</title>
|
|
7
|
-
<meta http-equiv="refresh" content="0; url=../../example-board/demo-shell.html" />
|
|
8
|
-
<style>
|
|
9
|
-
body {
|
|
10
|
-
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
11
|
-
background: #f5f1e8;
|
|
12
|
-
color: #1f2937;
|
|
13
|
-
margin: 0;
|
|
14
|
-
min-height: 100vh;
|
|
15
|
-
display: grid;
|
|
16
|
-
place-items: center;
|
|
17
|
-
padding: 24px;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
main {
|
|
21
|
-
max-width: 680px;
|
|
22
|
-
background: #fffdf8;
|
|
23
|
-
border: 1px solid #d6cdbd;
|
|
24
|
-
border-radius: 16px;
|
|
25
|
-
padding: 28px;
|
|
26
|
-
box-shadow: 0 20px 50px rgba(56, 46, 33, 0.08);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
a {
|
|
30
|
-
color: #8a3b12;
|
|
31
|
-
}
|
|
32
|
-
</style>
|
|
33
|
-
</head>
|
|
34
|
-
<body>
|
|
35
|
-
<main>
|
|
36
|
-
<h1>LiveCards browser demo moved</h1>
|
|
37
|
-
<p>The maintained browser demo is now the example-board shell so there is a single LiveCards example path to keep current.</p>
|
|
38
|
-
<p><a href="../../example-board/demo-shell.html">Open the example-board demo shell</a></p>
|
|
39
|
-
</main>
|
|
40
|
-
</body>
|
|
41
|
-
</html>
|