yaml-flow 6.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/board-live-cards-cli.js +4 -4
  2. package/browser/asset-integrity.json +3 -3
  3. package/browser/board-livecards-client.js +2 -0
  4. package/browser/board-livecards-client.js.map +1 -0
  5. package/browser/board-livecards-localstorage.js +10 -0
  6. package/browser/board-livecards-localstorage.js.map +1 -0
  7. package/browser/board-livegraph-engine.js +2 -2
  8. package/browser/board-livegraph-engine.js.map +1 -1
  9. package/browser/card-compute.js +28 -28
  10. package/browser/compute-jsonata.js +5 -0
  11. package/browser/compute-jsonata.js.map +1 -0
  12. package/browser/live-cards.js +264 -151
  13. package/card-store.js +4 -4
  14. package/dist/{board-live-cards-public-CltXYgaY.d.cts → board-live-cards-public-5n1-syA3.d.cts} +8 -5
  15. package/dist/{board-live-cards-public-f-E-FAyp.d.ts → board-live-cards-public-CK_J8uv0.d.ts} +8 -5
  16. package/dist/board-livegraph-runtime/index.cjs +2 -2
  17. package/dist/board-livegraph-runtime/index.cjs.map +1 -1
  18. package/dist/board-livegraph-runtime/index.d.cts +11 -9
  19. package/dist/board-livegraph-runtime/index.d.ts +11 -9
  20. package/dist/board-livegraph-runtime/index.js +2 -2
  21. package/dist/board-livegraph-runtime/index.js.map +1 -1
  22. package/dist/board-livegraph-runtime/jsonata-sync.cjs +37 -1
  23. package/dist/card-compute/index.cjs +4 -4
  24. package/dist/card-compute/index.cjs.map +1 -1
  25. package/dist/card-compute/index.d.cts +5 -1
  26. package/dist/card-compute/index.d.ts +5 -1
  27. package/dist/card-compute/index.js +4 -4
  28. package/dist/card-compute/index.js.map +1 -1
  29. package/dist/card-compute/jsonata-sync.cjs +37 -1
  30. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +2 -1
  31. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +1 -1
  32. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +27 -14
  33. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.ts +27 -14
  34. package/dist/cli/browser-api/board-live-cards-browser-adapter.js +2 -1
  35. package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +1 -1
  36. package/dist/cli/browser-api/card-store-browser-api.cjs +1 -1
  37. package/dist/cli/browser-api/card-store-browser-api.cjs.map +1 -1
  38. package/dist/cli/browser-api/card-store-browser-api.js +1 -1
  39. package/dist/cli/browser-api/card-store-browser-api.js.map +1 -1
  40. package/dist/cli/browser-api/jsonata-sync.cjs +37 -1
  41. package/dist/cli/node/artifacts-store-cli.cjs +8 -8
  42. package/dist/cli/node/artifacts-store-cli.cjs.map +1 -1
  43. package/dist/cli/node/artifacts-store-cli.js +8 -8
  44. package/dist/cli/node/artifacts-store-cli.js.map +1 -1
  45. package/dist/cli/node/board-live-cards-cli.cjs +7 -7
  46. package/dist/cli/node/board-live-cards-cli.cjs.map +1 -1
  47. package/dist/cli/node/board-live-cards-cli.js +7 -7
  48. package/dist/cli/node/board-live-cards-cli.js.map +1 -1
  49. package/dist/cli/node/card-store-cli.cjs +5 -5
  50. package/dist/cli/node/card-store-cli.cjs.map +1 -1
  51. package/dist/cli/node/card-store-cli.js +5 -5
  52. package/dist/cli/node/card-store-cli.js.map +1 -1
  53. package/dist/cli/node/execution-adapter.cjs +3 -0
  54. package/dist/cli/node/execution-adapter.cjs.map +1 -0
  55. package/dist/cli/node/execution-adapter.d.cts +174 -0
  56. package/dist/cli/node/execution-adapter.d.ts +174 -0
  57. package/dist/cli/node/execution-adapter.js +3 -0
  58. package/dist/cli/node/execution-adapter.js.map +1 -0
  59. package/dist/cli/node/fs-board-adapter.cjs +7 -7
  60. package/dist/cli/node/fs-board-adapter.cjs.map +1 -1
  61. package/dist/cli/node/fs-board-adapter.d.cts +2 -2
  62. package/dist/cli/node/fs-board-adapter.d.ts +2 -2
  63. package/dist/cli/node/fs-board-adapter.js +7 -7
  64. package/dist/cli/node/fs-board-adapter.js.map +1 -1
  65. package/dist/cli/node/jsonata-sync.cjs +37 -1
  66. package/dist/cli/node/source-cli-task-executor.cjs +4 -4
  67. package/dist/cli/node/source-cli-task-executor.cjs.map +1 -1
  68. package/dist/cli/node/source-cli-task-executor.js +4 -4
  69. package/dist/cli/node/source-cli-task-executor.js.map +1 -1
  70. package/dist/continuous-event-graph/index.cjs +2 -2
  71. package/dist/continuous-event-graph/index.cjs.map +1 -1
  72. package/dist/continuous-event-graph/index.js +2 -2
  73. package/dist/continuous-event-graph/index.js.map +1 -1
  74. package/dist/continuous-event-graph/jsonata-sync.cjs +37 -1
  75. package/dist/execution-refs.cjs +2 -1
  76. package/dist/execution-refs.cjs.map +1 -1
  77. package/dist/execution-refs.d.cts +55 -12
  78. package/dist/execution-refs.d.ts +55 -12
  79. package/dist/execution-refs.js +2 -1
  80. package/dist/execution-refs.js.map +1 -1
  81. package/dist/index.cjs +10 -10
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.js +10 -10
  84. package/dist/index.js.map +1 -1
  85. package/dist/jsonata-sync.cjs +37 -1
  86. package/dist/server-runtime/index.cjs +9 -0
  87. package/dist/server-runtime/index.cjs.map +1 -0
  88. package/dist/server-runtime/index.d.cts +31 -0
  89. package/dist/server-runtime/index.d.ts +31 -0
  90. package/dist/server-runtime/index.js +9 -0
  91. package/dist/server-runtime/index.js.map +1 -0
  92. package/dist/server-runtime/jsonata-sync.cjs +7623 -0
  93. package/dist/step-machine-public/index.cjs +3 -0
  94. package/dist/step-machine-public/index.cjs.map +1 -0
  95. package/dist/step-machine-public/index.d.cts +166 -0
  96. package/dist/step-machine-public/index.d.ts +166 -0
  97. package/dist/step-machine-public/index.js +3 -0
  98. package/dist/step-machine-public/index.js.map +1 -0
  99. package/dist/step-machine-public/jsonata-sync.cjs +7623 -0
  100. package/dist/storage-refs.cjs +2 -2
  101. package/dist/storage-refs.cjs.map +1 -1
  102. package/dist/storage-refs.d.cts +6 -6
  103. package/dist/storage-refs.d.ts +6 -6
  104. package/dist/storage-refs.js +2 -2
  105. package/dist/storage-refs.js.map +1 -1
  106. package/dist/types-CU3DjTKL.d.cts +147 -0
  107. package/dist/types-HGDTWIun.d.ts +147 -0
  108. package/examples/browser/boards/portfolio-tracker/portfolio-t4.js +9 -10
  109. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +370 -0
  110. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.py +398 -0
  111. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-public.js +9 -10
  112. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +300 -0
  113. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +617 -0
  114. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-sse-worker.js +48 -0
  115. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +11 -10
  116. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +19 -4
  117. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +4 -8
  118. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +6 -10
  119. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +8 -16
  120. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +2 -6
  121. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +4 -8
  122. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +3 -7
  123. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +4 -8
  124. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +7 -16
  125. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +2 -6
  126. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +13 -3
  127. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +2 -1
  128. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +2 -1
  129. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +2 -1
  130. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +20 -24
  131. package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -3
  132. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +8 -13
  133. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +33 -9
  134. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +3 -1
  135. package/examples/cli/step-machine-demo/step2-double-cli.js +6 -12
  136. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +66 -4
  137. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +13 -5
  138. package/examples/example-board/agent-instructions.md +1 -1
  139. package/examples/example-board/cards/card-my-identity.json +30 -6
  140. package/examples/example-board/cards/card-portfolio-action.json +24 -6
  141. package/examples/example-board/cards/card-portfolio-intelligence.json +97 -0
  142. package/examples/example-board/cards/card-portfolio-risks.json +24 -6
  143. package/examples/example-board/cards/card-rebalance-impact.json +22 -6
  144. package/examples/example-board/cards/card-rebalance-sim.json +66 -15
  145. package/examples/example-board/cards/cardT-market-prices.json +80 -0
  146. package/examples/example-board/cards/{card-portfolio-value.json → cardT-portfolio-value.json} +38 -10
  147. package/examples/example-board/cards/cardT-portfolio.json +78 -0
  148. package/examples/example-board/demo-server-config.json +1 -1
  149. package/examples/example-board/demo-server.js +383 -69
  150. package/examples/example-board/demo-shell-localstorage.html +774 -0
  151. package/examples/example-board/demo-shell-with-server.html +18 -36
  152. package/examples/example-board/demo-shell.html +5 -4
  153. package/examples/example-board/demo-task-executor.js +213 -265
  154. package/package.json +15 -13
  155. package/step-machine-cli.js +43 -310
  156. package/board-livecards-server-runtime.js +0 -1513
  157. package/browser/board-livecards-runtime-client.js +0 -263
  158. package/dist/pycli/quickjs-board-runtime.global.js +0 -9
  159. package/dist/pycli/quickjs-board-runtime.global.js.map +0 -1
  160. package/dist/pycli/quickjs-step-machine-runtime.global.js +0 -5
  161. package/dist/pycli/quickjs-step-machine-runtime.global.js.map +0 -1
  162. package/examples/cli/step-machine-demo/two-step-math-handlers.js +0 -32
  163. package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +0 -24
  164. package/examples/example-board/cards/card-market-prices.json +0 -56
  165. package/examples/example-board/cards/card-portfolio.json +0 -44
  166. package/examples/example-board/demo-shell-browser.html +0 -675
@@ -1,3 +1,3 @@
1
- var BoardLiveGraph=(function(exports){'use strict';var Re=Object.defineProperty;var Te=(e,t,r)=>t in e?Re(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var te=(e,t,r)=>Te(e,t+"",r);var Se=typeof globalThis<"u"&&globalThis.jsonata||typeof window<"u"&&window.jsonata,j=Se;function re(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonata;throw new Error("Unsupported require in browser bundle: "+e)}}var we=re(),oe=we("./jsonata-sync.cjs")??j;function ne(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function ae(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Ce(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r={card_data:e.card_data,requires:e.requires??{},fetched_sources:e._sourcesData,computed_values:e.computed_values};for(let n of e.compute)try{let s=await j(n.expr).evaluate(r);ae(e.computed_values,n.bindTo,s),r.computed_values=e.computed_values;}catch(s){console.error(`CardCompute.run error on "${e.id??"?"}.${n.bindTo}":`,s);}return e}function _e(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r={card_data:e.card_data,requires:e.requires??{},fetched_sources:e._sourcesData,computed_values:e.computed_values};for(let n of e.compute)try{let s=oe(n.expr).evaluate(r);ae(e.computed_values,n.bindTo,s),r.computed_values=e.computed_values;}catch(s){console.error(`CardCompute.runSync error on "${e.id??"?"}.${n.bindTo}":`,s);}return {ok:true,node:e}}async function xe(e,t){let r={card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return j(e).evaluate(r)}function Ae(e,t){return t.startsWith("fetched_sources.")?ne(e._sourcesData??{},t.slice(16)):ne(e,t)}var se=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Ee=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Oe(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Ee.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,i)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${i}]: must be an object`);else {let d=o;typeof d.bindTo!="string"||!d.bindTo?t.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(d.bindTo)&&t.push(`source_defs[${i}]: bindTo "${d.bindTo}" is not unique across source_defs`),n.add(d.bindTo)),typeof d.outputFile!="string"||!d.outputFile?t.push(`source_defs[${i}]: missing required "outputFile" property`):(s.has(d.outputFile)&&t.push(`source_defs[${i}]: outputFile "${d.outputFile}" is not unique across source_defs`),s.add(d.outputFile)),d.optionalForCompletionGating!=null&&typeof d.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):se.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...se].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Ge(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[o]=await j(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Ne(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[o]=oe(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var D={run:Ce,runSync:_e,eval:xe,resolve:Ae,validate:Oe,enrichSources:Ge,enrichSourcesSync:Ne};var G={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function O(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function N(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function H(e){return e.tasks??{}}function P(e){return e?e.status===G.FAILED||e.status===G.INACTIVATED:false}function ie(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function ce(e){return e.maxExecutions}function de(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===G.COMPLETED){let o=e.tasks[n];o&&O(o).forEach(d=>r.add(d));}return Array.from(r)}function ue(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;O(s).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function pe(e,t,r){let n=e.tasks[t]??q(),s={};if(r){let i=r.tasks[t],d=N(i);for(let m of d)for(let[S,y]of Object.entries(r.tasks))if(O(y).includes(m)){let R=e.tasks[S];R?.lastDataHash&&(s[m]=R.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function fe(e,t,r,n,s,o){let i=e.tasks[r]??q(),d=t.tasks[r];if(!d)throw new Error(`Task "${r}" not found in graph`);let m;n&&d.on&&d.on[n]?m=d.on[n]:m=O(d);let S=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let g=d.requires??[];for(let p of g)for(let[h,T]of Object.entries(t.tasks))if(O(T).includes(p)){let v=e.tasks[h];v?.lastDataHash&&(S[p]=v.lastDataHash);break}}let y={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:S,error:void 0},R=[...new Set([...e.availableOutputs,...m])];return {...e,tasks:{...e.tasks,[r]:y},availableOutputs:R,lastUpdated:new Date().toISOString()}}function le(e,t,r,n){let s=e.tasks[r]??q(),o=t.tasks[r];if(o?.retry){let m=s.retryCount+1;if(m<=o.retry.max_attempts){let S={...s,status:"not-started",retryCount:m,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:S},lastUpdated:new Date().toISOString()}}}let i={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},d=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(d=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&i.executionCount>=o.circuit_breaker.max_executions){let m=o.circuit_breaker.on_break;d=[...new Set([...d,...m])];}return {...e,tasks:{...e.tasks,[r]:i},availableOutputs:d,lastUpdated:new Date().toISOString()}}function ge(e,t,r,n){let s=e.tasks[t]??q(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function me(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,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 {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function q(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function B(e,t){let r=t??`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=he();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function ke(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:pe(n,t.taskName,r)};case "task-completed":return {config:r,state:fe(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:le(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:ge(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:me(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Ie(n,t.action)};case "task-upsert":return K(e,t.taskName,t.taskConfig);case "task-removal":return V(e,t.taskName);case "node-requires-add":return W(e,t.nodeName,t.tokens);case "node-requires-remove":return J(e,t.nodeName,t.tokens);case "node-provides-add":return X(e,t.nodeName,t.tokens);case "node-provides-remove":return Y(e,t.nodeName,t.tokens);default:return e}}function M(e,t){return t.reduce((r,n)=>ke(r,n),e)}function K(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:he()},lastUpdated:new Date().toISOString()}}}function V(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function W(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=N(n),o=r.filter(i=>!s.includes(i));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function J(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=N(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function X(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=O(n),o=r.filter(i=>!s.includes(i));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function Y(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=O(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function z(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function he(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ie(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function F(e){let{config:t,state:r}=e,n=H(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=je(n),i=de(t,r.tasks),d=new Set([...i,...r.availableOutputs]),m=[],S=[],y=[],R=[];for(let[p,h]of Object.entries(n)){let T=r.tasks[p],v=ie(h,t.settings),E=v!=="once";if(T?.status===G.RUNNING||P(T))continue;let c=ce(h);if(c!==void 0&&T&&T.executionCount>=c||h.circuit_breaker&&T&&T.executionCount>=h.circuit_breaker.max_executions||!E&&T?.status===G.COMPLETED)continue;if(E&&T?.status===G.COMPLETED){let u=N(h),l=false;switch(v){case "data-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(O(x).includes(C)){let w=r.tasks[_];if(!w)continue;let be=T.lastConsumedHashes?.[C];return w.lastDataHash==null?w.executionCount>T.lastEpoch:w.lastDataHash!==be}return false})||(l=true);break}case "epoch-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(O(x).includes(C)){let w=r.tasks[_];if(w&&w.executionCount>T.lastEpoch)return true}return false})||(l=true);break}case "time-based":{let A=h.refreshInterval??0;if(A<=0){l=true;break}let C=T.completedAt;if(!C){l=true;break}(Date.now()-Date.parse(C))/1e3<A&&(l=true);break}case "manual":l=true;break}if(l)continue}let a=N(h);if(a.length===0){m.push(p);continue}let k=[],f=[],b=[];for(let u of a){if(d.has(u))continue;let l=o[u]||[];l.length===0?k.push(u):l.every(C=>P(r.tasks[C]))?b.push({token:u,failedProducer:l[0]}):f.push(u);}k.length>0?y.push({taskName:p,missingTokens:k}):b.length>0?R.push({taskName:p,failedTokens:b.map(u=>u.token),failedProducers:[...new Set(b.map(u=>u.failedProducer))]}):f.length>0?S.push({taskName:p,waitingOn:f}):m.push(p);}let g={};if(m.length>1){let p=ue(m,n);for(let[h,T]of Object.entries(p))T.length>1&&(g[h]=T);}return {eligible:m,pending:S,unresolved:y,blocked:R,conflicts:g}}function je(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of O(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var L=class{constructor(){te(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function U(e){let t=Q(e);return Le(t)}function Q(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Q).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Q(t[n])).join(",")+"}"}function Le(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function De(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function He(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function ve(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return De(t)}function Pe(e){try{let t=JSON.parse(He(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function $(e,t,r){let{handlers:n,onDrain:s}=t,o=new L,i="state"in e&&"config"in e?e:B(e,r),d=false,m=new Set,S=new Map(Object.entries(n)),y=new L,R=false,g=false;function p(){if(!d){if(R){g=true;return}R=true;try{do g=!1,h();while(g)}finally{R=false;}}}function h(){let c=y.drain(),a=o.drain(),k=[...c,...a];k.length>0&&(i=M(i,k));let f=F(i);k.length>0&&s?.(k,i,f);for(let b of f.eligible)E(b);for(let b of k)if(b.type==="task-progress"){let{taskName:u,update:l}=b;if(!i.config.tasks[u])continue;let C=i.state.tasks[u];if(!C||C.status!=="running")continue;let _=ve(u),x=v(u,_,l).catch(w=>{d||(y.append({type:"task-failed",taskName:u,error:w.message??String(w),timestamp:new Date().toISOString()}),p());}).finally(()=>{m.delete(x);});m.add(x);}}function T(c){let k=i.config.tasks[c].requires??[],f=new Map;for(let[u,l]of Object.entries(i.config.tasks))for(let A of l.provides??[])f.set(A,u);let b={};for(let u of k){let l=f.get(u);l?b[u]=i.state.tasks[l]?.data:b[u]=void 0;}return b}async function v(c,a,k){let f=i.config.tasks[c],b=f.taskHandlers??[],u=T(c);for(let l of b){let A=S.get(l);if(!A)throw new Error(`Handler '${l}' not found in registry (task '${c}')`);let C={nodeId:c,state:u,taskState:i.state.tasks[c],config:f,callbackToken:a,update:k};if(await A(C)==="task-initiate-failure")throw new Error(`Handler '${l}' returned task-initiate-failure (task '${c}')`)}}function E(c){let k=i.config.tasks[c]?.taskHandlers;if(!k||k.length===0)return;y.append({type:"task-started",taskName:c,timestamp:new Date().toISOString()}),p();let f=ve(c),b=v(c,f).catch(u=>{d||(y.append({type:"task-failed",taskName:c,error:u.message??String(u),timestamp:new Date().toISOString()}),p());}).finally(()=>{m.delete(b);});m.add(b);}return {push(c){d||(c.type==="task-completed"&&c.data&&!c.dataHash&&(c={...c,dataHash:U(c.data)}),o.append(c),p());},pushAll(c){if(!d){for(let a of c)a.type==="task-completed"&&a.data&&!a.dataHash?o.append({...a,dataHash:U(a.data)}):o.append(a);p();}},resolveCallback(c,a,k){if(d)return;let f=Pe(c);if(!f)return;let{taskName:b}=f;if(i.config.tasks[b]){if(k&&k.length>0)o.append({type:"task-failed",taskName:b,error:k.join("; "),timestamp:new Date().toISOString()});else {let u=a&&Object.keys(a).length>0?U(a):void 0;o.append({type:"task-completed",taskName:b,data:a,dataHash:u,timestamp:new Date().toISOString()});}p();}},addNode(c,a){d||(o.append({type:"task-upsert",taskName:c,taskConfig:a,timestamp:new Date().toISOString()}),p());},removeNode(c){d||(o.append({type:"task-removal",taskName:c,timestamp:new Date().toISOString()}),p());},addRequires(c,a){d||(o.append({type:"node-requires-add",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),p());},removeRequires(c,a){d||(o.append({type:"node-requires-remove",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),p());},addProvides(c,a){d||(o.append({type:"node-provides-add",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),p());},removeProvides(c,a){d||(o.append({type:"node-provides-remove",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),p());},registerHandler(c,a){S.set(c,a);},unregisterHandler(c){S.delete(c);},retrigger(c){d||i.config.tasks[c]&&(o.append({type:"task-restart",taskName:c,timestamp:new Date().toISOString()}),p());},retriggerAll(c){if(!d){for(let a of c)i.config.tasks[a]&&o.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()});p();}},snapshot(){return z(i)},getState(){return i},getSchedule(){return F(i)},async waitForHandlers(){m.size>0&&await Promise.allSettled([...m]);},async dispose(c){c?.wait&&m.size>0&&await Promise.allSettled([...m]),d=true;}}}function I(e){return JSON.parse(JSON.stringify(e))}function Z(e){let t=e.provides&&e.provides.length>0?e.provides.map(r=>r.bindTo):[e.id];return {requires:e.requires&&e.requires.length>0?[...e.requires]:void 0,provides:t,taskHandlers:[e.id],description:e.meta?.title??e.id}}function Be(e){let t=new Map;for(let[r,n]of e.entries()){let s=n.provides&&n.provides.length>0?n.provides:[{bindTo:r,ref:"card_data"}];for(let o of s)t.set(o.bindTo,r);}return t}function ee(e,t){let r=Be(e),n=e.get(t);if(n){for(let s of n.requires??[])if(!r.has(s))throw new Error(`Card "${t}" requires token "${s}" but no card provides it`)}}var Rr={CARD_PREFIX:"yf:cards:",RUNTIME_OUT_PREFIX:"yf:runtime-out:cards:",STATUS_KEY:"yf:runtime-out:status",writeCard(e,t){try{localStorage.setItem(this.CARD_PREFIX+e,JSON.stringify(t));}catch(r){console.warn(`Failed to write card ${e} to localStorage:`,r);}},readCard(e){try{let t=localStorage.getItem(this.CARD_PREFIX+e);return t?JSON.parse(t):null}catch(t){return console.warn(`Failed to read card ${e} from localStorage:`,t),null}},readAllCards(e){let t={};for(let r of e){let n=this.readCard(r);n&&(t[r]=n);}return t},writeComputedArtifact(e){if(!(!e||!e.card_id))try{localStorage.setItem(this.RUNTIME_OUT_PREFIX+String(e.card_id),JSON.stringify(e));}catch(t){console.warn(`Failed to write computed artifact ${e.card_id}:`,t);}},readComputedArtifact(e){try{let t=localStorage.getItem(this.RUNTIME_OUT_PREFIX+e);return t?JSON.parse(t):null}catch(t){return console.warn(`Failed to read computed artifact ${e}:`,t),null}},readAllComputedArtifacts(e){let t={};for(let r of e){let n=this.readComputedArtifact(r);n&&(t[r]=n);}return t},writeStatusSnapshot(e){try{localStorage.setItem(this.STATUS_KEY,JSON.stringify(e));}catch(t){console.warn("Failed to write status snapshot to localStorage:",t);}},readStatusSnapshot(){try{let e=localStorage.getItem(this.STATUS_KEY);return e?JSON.parse(e):null}catch(e){return console.warn("Failed to read status snapshot from localStorage:",e),null}},clear(){let e=[];for(let t=0;t<localStorage.length;t++){let r=localStorage.key(t);r&&(r.startsWith(this.CARD_PREFIX)||r.startsWith(this.RUNTIME_OUT_PREFIX)||r===this.STATUS_KEY)&&e.push(r);}for(let t of e)localStorage.removeItem(t);}};function Tr(e,t={}){let r=Array.isArray(e)?{}:{id:e.id,title:e.title,mode:e.mode,positions:e.positions,settings:e.settings},n=Array.isArray(e)?e:e.nodes,s=new Map;for(let a of n){if(s.has(a.id))throw new Error(`Duplicate card ID: "${a.id}"`);s.set(a.id,I(a));}let o=new Set,i=t.taskExecutor,d=t.sourceAdapters??{},m=t.defaultSourceAdapter,S=null,y=(a,k)=>{let f={events:a,graph:k,nodes:E()};for(let b of o)b(f);},R=a=>async k=>{let f=s.get(a);if(!f)return "task-initiate-failure";let b={};for(let _ of f.requires??[]){let x=k.state[_];if(!x||typeof x!="object")continue;let w=x.provides_data;!w||typeof w!="object"||Object.prototype.hasOwnProperty.call(w,_)&&(b[_]=w[_]);}let u={};if(f.source_defs&&f.source_defs.length>0){let _=d[a]??m,x=i?await i({card:f,input:k}):_?await _({card:f,input:k}):void 0;if(x&&typeof x=="object")for(let w of f.source_defs)Object.prototype.hasOwnProperty.call(x,w.bindTo)?u[w.bindTo]=x[w.bindTo]:f.source_defs.length===1&&(u[w.bindTo]=x);}let l={id:f.id,card_data:I(f.card_data??{}),requires:b,source_defs:f.source_defs,compute:f.compute};l._sourcesData=u,l.compute&&l.compute.length>0&&await D.run(l,{sourcesData:u});let A={};if(f.provides&&f.provides.length>0)for(let{bindTo:_,ref:x}of f.provides)A[_]=D.resolve(l,x);else A[f.id]={...l.card_data??{},...l.computed_values??{},...l._sourcesData??{}};let C={provides_data:A,card_data:l.card_data??{},computed_values:l.computed_values??{},fetched_sources:u,requires:b};return S?.resolveCallback(k.callbackToken,C),"task-initiated"},g={},p={};for(let[a,k]of s.entries())ee(s,a),g[a]=Z(k),p[a]=R(a);let h={id:r.id??`browser-board-${Date.now()}`,settings:{completion:"manual",execution_mode:"eligibility-mode",...r.settings??{},...t.graphSettings??{}},tasks:g},T=t.reactiveOptions?.onDrain,v=$(h,{...t.reactiveOptions??{},handlers:p,onDrain:(a,k,f)=>{T?.(a,k,f),y(a,k);}},t.executionId);S=v;function E(){let a=v.getState(),k=[];for(let[f,b]of s.entries()){let u=a.state.tasks[f]?.data,l=a.state.tasks[f],A={...b.card_data??{},...u&&typeof u.card_data=="object"?u.card_data:{}},C=l?.status==="running"?"loading":l?.status,_={...A,...C?{status:C}:{},...l?.lastUpdated?{lastRun:l.lastUpdated}:{},...l?.status==="failed"&&l.error?{error:l.error}:{}};k.push({id:f,card:I(b),card_data:_,fetched_sources:u&&typeof u.fetched_sources=="object"?I(u.fetched_sources):{},requires:u&&typeof u.requires=="object"?I(u.requires):{},computed_values:u&&typeof u.computed_values=="object"?I(u.computed_values):{},runtime_state:l?I(l):{}});}return k}return {getGraph:()=>v,getState:()=>v.getState(),getSchedule:()=>v.getSchedule(),getNodes:()=>E(),getBoard:()=>({...r,nodes:E()}),subscribe(a){return o.add(a),a({events:[],graph:v.getState(),nodes:E()}),()=>o.delete(a)},addCard(a){if(s.has(a.id))throw new Error(`Card "${a.id}" already exists`);s.set(a.id,I(a)),ee(s,a.id),v.registerHandler(a.id,R(a.id)),v.addNode(a.id,Z(a));},upsertCard(a){s.set(a.id,I(a)),ee(s,a.id),v.registerHandler(a.id,R(a.id)),v.addNode(a.id,Z(a));},removeCard(a){s.delete(a),v.unregisterHandler(a),v.removeNode(a);},patchCardState(a,k){let f=s.get(a);if(!f)throw new Error(`Card "${a}" not found`);f.card_data={...f.card_data??{},...k},v.retrigger(a);},retrigger(a){v.retrigger(a);},retriggerAll(){v.retriggerAll(Array.from(s.keys()));},push(a){v.push(a);},pushAll(a){v.pushAll(a);},dispose(){o.clear(),v.dispose();}}}function ye(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function Ke(e){return e==="loading"?"in-progress":e==="error"?"failed":e==="stale"?"pending":e==="fresh"?"completed":"pending"}function Ve(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{},fetched_sources:r.fetched_sources&&typeof r.fetched_sources=="object"&&!Array.isArray(r.fetched_sources)?structuredClone(r.fetched_sources):{},requires:r.requires&&typeof r.requires=="object"&&!Array.isArray(r.requires)?structuredClone(r.requires):{}}}function Sr(e){if(!e||typeof e!="object")throw new Error("payload must be an object");let t=Array.isArray(e.cardDefinitions)?e.cardDefinitions:[],r=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},n=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},s=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},o=Array.isArray(r.cards)?r.cards:[],i=new Map(o.map(d=>[d.name,d]));return t.map(d=>{let m=structuredClone(d),S=m.id;if(!S)throw new Error("cardDefinitions entry missing id");let y=i.get(S),R=Ve(S,n[S]),p={...m.card_data&&typeof m.card_data=="object"&&!Array.isArray(m.card_data)?m.card_data:{},...R.card_data||{},status:ye(y?.status),lastRun:y?.runtime?.last_transition_at??null};y?.error?.message&&(p.error=y.error.message);let h=y?{task_status:y.status??null,card_status:ye(y.status),runtime:structuredClone(y.runtime??{}),error:y.error?structuredClone(y.error):null,blocked_by:Array.isArray(y.blocked_by)?structuredClone(y.blocked_by):[],requires_missing:Array.isArray(y.requires_missing)?structuredClone(y.requires_missing):[]}:{task_status:null,card_status:p.status??"fresh",runtime:{last_transition_at:p.lastRun??null},error:p.error?{message:p.error}:null,blocked_by:[],requires_missing:[]},T=Array.isArray(m.requires)?m.requires:[],v={};for(let E of T)Object.prototype.hasOwnProperty.call(s,E)&&(v[E]=structuredClone(s[E]));return {id:S,card:m,card_data:p,fetched_sources:R.fetched_sources,requires:v,computed_values:R.computed_values,runtime_state:h}})}function wr({boardPath:e,cardDefinitions:t,runtimeModels:r,graphState:n}){let s=Array.isArray(t)?t:[],o=Array.isArray(r)?r:[],i=new Map(o.map(g=>[g.id,g])),m=n.state?.tasks??{},S={};for(let g of o)g?.id&&(S[g.id]={schema_version:"v1",card_id:g.id,card_data:structuredClone(g.card_data??{}),computed_values:structuredClone(g.computed_values??{}),fetched_sources:structuredClone(g.fetched_sources??{}),requires:structuredClone(g.requires??{})});let y={};for(let g of Object.keys(m)){let p=m[g]?.data?.provides_data;if(p&&typeof p=="object")for(let h of Object.keys(p))y[h]=structuredClone(p[h]);}let R=s.map(g=>{let p=i.get(g.id)??{},h=m[g.id],T=typeof h?.status=="string"?h.status:Ke(p.card_data?.status),v=typeof h?.error=="string"?h.error:typeof p.card_data?.error=="string"?p.card_data.error:null;return {name:g.id,status:T,...v?{error:{message:v,code:"TASK_FAILED",at:h?.failedAt??null,source:"browser-runtime"}}:{},requires:Array.isArray(g.requires)?g.requires:[],requires_satisfied:[],requires_missing:[],provides_declared:Array.isArray(g.provides)?g.provides.map(E=>E.bindTo):[g.id],provides_runtime:Object.keys(h?.data?.provides_data??{}).sort(),blocked_by:[],unblocks:[],runtime:{attempt_count:h?.executionCount??0,restart_count:h?.retryCount??0,in_progress_since:T==="in-progress"?h?.startedAt??null:null,last_transition_at:h?.lastUpdated??p.card_data?.lastRun??null,last_completed_at:h?.completedAt??null,last_restarted_at:h?.startedAt??null,status_age_ms:null}}});return {cardDefinitions:structuredClone(s),cardRuntimeById:S,dataObjectsByToken:y,statusSnapshot:{schema_version:"v1",meta:{board:{path:e??"browser-runtime"}},summary:{card_count:R.length,completed:R.filter(g=>g.status==="completed").length,eligible:0,pending:R.filter(g=>g.status==="pending").length,blocked:0,unresolved:0,failed:R.filter(g=>g.status==="failed").length,in_progress:R.filter(g=>g.status==="in-progress").length,orphan_cards:0,topology:{edge_count:0,max_fan_out_card:null,max_fan_out:0}},cards:R}}}
2
- exports.LocalStorageService=Rr;exports.buildBrowserArtifactsFromRuntime=wr;exports.buildLiveCardModelsFromArtifacts=Sr;exports.createBoardLiveGraphRuntime=Tr;return exports;})({});//# sourceMappingURL=board-livegraph-engine.js.map
1
+ var BoardLiveGraph=(function(exports){'use strict';var Re=Object.defineProperty;var Te=(e,t,r)=>t in e?Re(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var re=(e,t,r)=>Te(e,t+"",r);function j(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var Se=j();Se("./jsonata-sync.cjs");var we=j(),D=we("./jsonata-sync.cjs"),oe=D;function ne(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function ae(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Ce(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await D(s.expr).evaluate(n);ae(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch(o){console.error(`CardCompute.run error on "${e.id??"?"}.${s.bindTo}":`,o);}return e}function _e(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let i=oe(o.expr).evaluate(n);ae(e.computed_values,o.bindTo,i),n.computed_values=e.computed_values;}catch(i){let d=i instanceof Error?i.message:String(i);s.push({bindTo:o.bindTo,error:d}),console.error(`CardCompute.runSync error on "${e.id??"?"}.${o.bindTo}":`,i);}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function xe(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return D(e).evaluate(n)}function Ae(e,t){return t.startsWith("fetched_sources.")?ne(e._sourcesData??{},t.slice(16)):ne(e,t)}var se=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Ee=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Oe(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Ee.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,i)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${i}]: must be an object`);else {let d=o;typeof d.bindTo!="string"||!d.bindTo?t.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(d.bindTo)&&t.push(`source_defs[${i}]: bindTo "${d.bindTo}" is not unique across source_defs`),n.add(d.bindTo)),typeof d.outputFile!="string"||!d.outputFile?t.push(`source_defs[${i}]: missing required "outputFile" property`):(s.has(d.outputFile)&&t.push(`source_defs[${i}]: outputFile "${d.outputFile}" is not unique across source_defs`),s.add(d.outputFile)),d.optionalForCompletionGating!=null&&typeof d.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):se.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...se].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Ge(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[o]=await D(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Ne(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[o]=oe(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var H={run:Ce,runSync:_e,eval:xe,resolve:Ae,validate:Oe,enrichSources:Ge,enrichSourcesSync:Ne};var G={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function E(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function N(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function P(e){return e.tasks??{}}function q(e){return e?e.status===G.FAILED||e.status===G.INACTIVATED:false}function ie(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function ce(e){return e.maxExecutions}function de(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===G.COMPLETED){let o=e.tasks[n];o&&E(o).forEach(d=>r.add(d));}return Array.from(r)}function ue(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;E(s).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function pe(e,t,r){let n=e.tasks[t]??M(),s={};if(r){let i=r.tasks[t],d=N(i);for(let p of d)for(let[R,w]of Object.entries(r.tasks))if(E(w).includes(p)){let T=e.tasks[R];T?.lastDataHash&&(s[p]=T.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function fe(e,t,r,n,s,o){let i=e.tasks[r]??M(),d=t.tasks[r];if(!d)throw new Error(`Task "${r}" not found in graph`);let p;n&&d.on&&d.on[n]?p=d.on[n]:p=E(d);let R=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let f=d.requires??[];for(let m of f)for(let[v,b]of Object.entries(t.tasks))if(E(b).includes(m)){let k=e.tasks[v];k?.lastDataHash&&(R[m]=k.lastDataHash);break}}let w={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:R,error:void 0},T=[...new Set([...e.availableOutputs,...p])];return {...e,tasks:{...e.tasks,[r]:w},availableOutputs:T,lastUpdated:new Date().toISOString()}}function le(e,t,r,n){let s=e.tasks[r]??M(),o=t.tasks[r];if(o?.retry){let p=s.retryCount+1;if(p<=o.retry.max_attempts){let R={...s,status:"not-started",retryCount:p,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:R},lastUpdated:new Date().toISOString()}}}let i={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},d=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(d=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&i.executionCount>=o.circuit_breaker.max_executions){let p=o.circuit_breaker.on_break;d=[...new Set([...d,...p])];}return {...e,tasks:{...e.tasks,[r]:i},availableOutputs:d,lastUpdated:new Date().toISOString()}}function ge(e,t,r,n){let s=e.tasks[t]??M(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function me(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,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 {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function M(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function K(e,t){let r=t??`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=he();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function ke(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:pe(n,t.taskName,r)};case "task-completed":return {config:r,state:fe(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:le(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:ge(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:me(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Le(n,t.action)};case "task-upsert":return V(e,t.taskName,t.taskConfig);case "task-removal":return W(e,t.taskName);case "node-requires-add":return J(e,t.nodeName,t.tokens);case "node-requires-remove":return X(e,t.nodeName,t.tokens);case "node-provides-add":return Y(e,t.nodeName,t.tokens);case "node-provides-remove":return z(e,t.nodeName,t.tokens);default:return e}}function F(e,t){return t.reduce((r,n)=>ke(r,n),e)}function V(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:he()},lastUpdated:new Date().toISOString()}}}function W(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function J(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=N(n),o=r.filter(i=>!s.includes(i));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function X(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=N(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function Y(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=E(n),o=r.filter(i=>!s.includes(i));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function z(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=E(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function Q(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function he(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Le(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function U(e){let{config:t,state:r}=e,n=P(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=Ie(n),i=de(t,r.tasks),d=new Set([...i,...r.availableOutputs]),p=[],R=[],w=[],T=[];for(let[m,v]of Object.entries(n)){let b=r.tasks[m],k=ie(v,t.settings),O=k!=="once";if(b?.status===G.RUNNING||q(b))continue;let c=ce(v);if(c!==void 0&&b&&b.executionCount>=c||v.circuit_breaker&&b&&b.executionCount>=v.circuit_breaker.max_executions||!O&&b?.status===G.COMPLETED)continue;if(O&&b?.status===G.COMPLETED){let u=N(v),g=false;switch(k){case "data-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(E(x).includes(C)){let S=r.tasks[_];if(!S)continue;let be=b.lastConsumedHashes?.[C];return S.lastDataHash==null?S.executionCount>b.lastEpoch:S.lastDataHash!==be}return false})||(g=true);break}case "epoch-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(E(x).includes(C)){let S=r.tasks[_];if(S&&S.executionCount>b.lastEpoch)return true}return false})||(g=true);break}case "time-based":{let A=v.refreshInterval??0;if(A<=0){g=true;break}let C=b.completedAt;if(!C){g=true;break}(Date.now()-Date.parse(C))/1e3<A&&(g=true);break}case "manual":g=true;break}if(g)continue}let a=N(v);if(a.length===0){p.push(m);continue}let h=[],l=[],y=[];for(let u of a){if(d.has(u))continue;let g=o[u]||[];g.length===0?h.push(u):g.every(C=>q(r.tasks[C]))?y.push({token:u,failedProducer:g[0]}):l.push(u);}h.length>0?w.push({taskName:m,missingTokens:h}):y.length>0?T.push({taskName:m,failedTokens:y.map(u=>u.token),failedProducers:[...new Set(y.map(u=>u.failedProducer))]}):l.length>0?R.push({taskName:m,waitingOn:l}):p.push(m);}let f={};if(p.length>1){let m=ue(p,n);for(let[v,b]of Object.entries(m))b.length>1&&(f[v]=b);}return {eligible:p,pending:R,unresolved:w,blocked:T,conflicts:f}}function Ie(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of E(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var I=class{constructor(){re(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function $(e){let t=Z(e);return je(t)}function Z(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Z).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Z(t[n])).join(",")+"}"}function je(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function De(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function He(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function ve(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return De(t)}function Pe(e){try{let t=JSON.parse(He(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function B(e,t,r){let{handlers:n,onDrain:s}=t,o=new I,i="state"in e&&"config"in e?e:K(e,r),d=false,p=new Set,R=new Map(Object.entries(n)),w=new I,T=false,f=false;function m(){if(!d){if(T){f=true;return}T=true;try{do f=!1,v();while(f)}finally{T=false;}}}function v(){let c=w.drain(),a=o.drain(),h=[...c,...a];h.length>0&&(i=F(i,h));let l=U(i);h.length>0&&s?.(h,i,l);for(let y of l.eligible)O(y);for(let y of h)if(y.type==="task-progress"){let{taskName:u,update:g}=y;if(!i.config.tasks[u])continue;let C=i.state.tasks[u];if(!C||C.status!=="running")continue;let _=ve(u),x=k(u,_,g).catch(S=>{d||(w.append({type:"task-failed",taskName:u,error:S.message??String(S),timestamp:new Date().toISOString()}),m());}).finally(()=>{p.delete(x);});p.add(x);}}function b(c){let h=i.config.tasks[c].requires??[],l=new Map;for(let[u,g]of Object.entries(i.config.tasks))for(let A of g.provides??[])l.set(A,u);let y={};for(let u of h){let g=l.get(u);g?y[u]=i.state.tasks[g]?.data:y[u]=void 0;}return y}async function k(c,a,h){let l=i.config.tasks[c],y=l.taskHandlers??[],u=b(c);for(let g of y){let A=R.get(g);if(!A)throw new Error(`Handler '${g}' not found in registry (task '${c}')`);let C={nodeId:c,state:u,taskState:i.state.tasks[c],config:l,callbackToken:a,update:h};if(await A(C)==="task-initiate-failure")throw new Error(`Handler '${g}' returned task-initiate-failure (task '${c}')`)}}function O(c){let h=i.config.tasks[c]?.taskHandlers;if(!h||h.length===0)return;w.append({type:"task-started",taskName:c,timestamp:new Date().toISOString()}),m();let l=ve(c),y=k(c,l).catch(u=>{d||(w.append({type:"task-failed",taskName:c,error:u.message??String(u),timestamp:new Date().toISOString()}),m());}).finally(()=>{p.delete(y);});p.add(y);}return {push(c){d||(c.type==="task-completed"&&c.data&&!c.dataHash&&(c={...c,dataHash:$(c.data)}),o.append(c),m());},pushAll(c){if(!d){for(let a of c)a.type==="task-completed"&&a.data&&!a.dataHash?o.append({...a,dataHash:$(a.data)}):o.append(a);m();}},resolveCallback(c,a,h){if(d)return;let l=Pe(c);if(!l)return;let{taskName:y}=l;if(i.config.tasks[y]){if(h&&h.length>0)o.append({type:"task-failed",taskName:y,error:h.join("; "),timestamp:new Date().toISOString()});else {let u=a&&Object.keys(a).length>0?$(a):void 0;o.append({type:"task-completed",taskName:y,data:a,dataHash:u,timestamp:new Date().toISOString()});}m();}},addNode(c,a){d||(o.append({type:"task-upsert",taskName:c,taskConfig:a,timestamp:new Date().toISOString()}),m());},removeNode(c){d||(o.append({type:"task-removal",taskName:c,timestamp:new Date().toISOString()}),m());},addRequires(c,a){d||(o.append({type:"node-requires-add",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),m());},removeRequires(c,a){d||(o.append({type:"node-requires-remove",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),m());},addProvides(c,a){d||(o.append({type:"node-provides-add",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),m());},removeProvides(c,a){d||(o.append({type:"node-provides-remove",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),m());},registerHandler(c,a){R.set(c,a);},unregisterHandler(c){R.delete(c);},retrigger(c){d||i.config.tasks[c]&&(o.append({type:"task-restart",taskName:c,timestamp:new Date().toISOString()}),m());},retriggerAll(c){if(!d){for(let a of c)i.config.tasks[a]&&o.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()});m();}},snapshot(){return Q(i)},getState(){return i},getSchedule(){return U(i)},async waitForHandlers(){p.size>0&&await Promise.allSettled([...p]);},async dispose(c){c?.wait&&p.size>0&&await Promise.allSettled([...p]),d=true;}}}function L(e){return JSON.parse(JSON.stringify(e))}function ee(e){let t=e.provides&&e.provides.length>0?e.provides.map(r=>r.bindTo):[e.id];return {requires:e.requires&&e.requires.length>0?[...e.requires]:void 0,provides:t,taskHandlers:[e.id],description:e.meta?.title??e.id}}function Be(e){let t=new Map;for(let[r,n]of e.entries()){let s=n.provides&&n.provides.length>0?n.provides:[{bindTo:r,ref:"card_data"}];for(let o of s)t.set(o.bindTo,r);}return t}function te(e,t){let r=Be(e),n=e.get(t);if(n){for(let s of n.requires??[])if(!r.has(s))throw new Error(`Card "${t}" requires token "${s}" but no card provides it`)}}var Rr={CARD_PREFIX:"yf:cards:",RUNTIME_OUT_PREFIX:"yf:runtime-out:cards:",STATUS_KEY:"yf:runtime-out:status",writeCard(e,t){try{localStorage.setItem(this.CARD_PREFIX+e,JSON.stringify(t));}catch(r){console.warn(`Failed to write card ${e} to localStorage:`,r);}},readCard(e){try{let t=localStorage.getItem(this.CARD_PREFIX+e);return t?JSON.parse(t):null}catch(t){return console.warn(`Failed to read card ${e} from localStorage:`,t),null}},readAllCards(e){let t={};for(let r of e){let n=this.readCard(r);n&&(t[r]=n);}return t},writeComputedArtifact(e){if(!(!e||!e.card_id))try{localStorage.setItem(this.RUNTIME_OUT_PREFIX+String(e.card_id),JSON.stringify(e));}catch(t){console.warn(`Failed to write computed artifact ${e.card_id}:`,t);}},readComputedArtifact(e){try{let t=localStorage.getItem(this.RUNTIME_OUT_PREFIX+e);return t?JSON.parse(t):null}catch(t){return console.warn(`Failed to read computed artifact ${e}:`,t),null}},readAllComputedArtifacts(e){let t={};for(let r of e){let n=this.readComputedArtifact(r);n&&(t[r]=n);}return t},writeStatusSnapshot(e){try{localStorage.setItem(this.STATUS_KEY,JSON.stringify(e));}catch(t){console.warn("Failed to write status snapshot to localStorage:",t);}},readStatusSnapshot(){try{let e=localStorage.getItem(this.STATUS_KEY);return e?JSON.parse(e):null}catch(e){return console.warn("Failed to read status snapshot from localStorage:",e),null}},clear(){let e=[];for(let t=0;t<localStorage.length;t++){let r=localStorage.key(t);r&&(r.startsWith(this.CARD_PREFIX)||r.startsWith(this.RUNTIME_OUT_PREFIX)||r===this.STATUS_KEY)&&e.push(r);}for(let t of e)localStorage.removeItem(t);}};function Tr(e,t={}){let r=Array.isArray(e)?{}:{id:e.id,title:e.title,mode:e.mode,positions:e.positions,settings:e.settings},n=Array.isArray(e)?e:e.nodes,s=new Map;for(let a of n){if(s.has(a.id))throw new Error(`Duplicate card ID: "${a.id}"`);s.set(a.id,L(a));}let o=new Set,i=t.taskExecutor,d=t.sourceAdapters??{},p=t.defaultSourceAdapter,R=null,w=(a,h)=>{let l={events:a,graph:h,nodes:O()};for(let y of o)y(l);},T=a=>async h=>{let l=s.get(a);if(!l)return "task-initiate-failure";let y={};for(let _ of l.requires??[]){let x=h.state[_];if(!x||typeof x!="object")continue;let S=x.provides_data;!S||typeof S!="object"||Object.prototype.hasOwnProperty.call(S,_)&&(y[_]=S[_]);}let u={};if(l.source_defs&&l.source_defs.length>0){let _=d[a]??p,x=i?await i({card:l,input:h}):_?await _({card:l,input:h}):void 0;if(x&&typeof x=="object")for(let S of l.source_defs)Object.prototype.hasOwnProperty.call(x,S.bindTo)?u[S.bindTo]=x[S.bindTo]:l.source_defs.length===1&&(u[S.bindTo]=x);}let g={id:l.id,card_data:L(l.card_data??{}),requires:y,source_defs:l.source_defs,compute:l.compute};g._sourcesData=u,g.compute&&g.compute.length>0&&await H.run(g,{sourcesData:u});let A={};if(l.provides&&l.provides.length>0)for(let{bindTo:_,ref:x}of l.provides)A[_]=H.resolve(g,x);else A[l.id]={...g.card_data??{},...g.computed_values??{},...g._sourcesData??{}};let C={provides_data:A,card_data:g.card_data??{},computed_values:g.computed_values??{},fetched_sources:u,requires:y};return R?.resolveCallback(h.callbackToken,C),"task-initiated"},f={},m={};for(let[a,h]of s.entries())te(s,a),f[a]=ee(h),m[a]=T(a);let v={id:r.id??`browser-board-${Date.now()}`,settings:{completion:"manual",execution_mode:"eligibility-mode",...r.settings??{},...t.graphSettings??{}},tasks:f},b=t.reactiveOptions?.onDrain,k=B(v,{...t.reactiveOptions??{},handlers:m,onDrain:(a,h,l)=>{b?.(a,h,l),w(a,h);}},t.executionId);R=k;function O(){let a=k.getState(),h=[];for(let[l,y]of s.entries()){let u=a.state.tasks[l]?.data,g=a.state.tasks[l],A={...y.card_data??{},...u&&typeof u.card_data=="object"?u.card_data:{}},C=g?.status==="running"?"loading":g?.status,_={...A,...C?{status:C}:{},...g?.lastUpdated?{lastRun:g.lastUpdated}:{},...g?.status==="failed"&&g.error?{error:g.error}:{}};h.push({id:l,card:L(y),card_data:_,requires:u&&typeof u.requires=="object"?L(u.requires):{},computed_values:u&&typeof u.computed_values=="object"?L(u.computed_values):{},runtime_state:g?L(g):{}});}return h}return {getGraph:()=>k,getState:()=>k.getState(),getSchedule:()=>k.getSchedule(),getNodes:()=>O(),getBoard:()=>({...r,nodes:O()}),subscribe(a){return o.add(a),a({events:[],graph:k.getState(),nodes:O()}),()=>o.delete(a)},addCard(a){if(s.has(a.id))throw new Error(`Card "${a.id}" already exists`);s.set(a.id,L(a)),te(s,a.id),k.registerHandler(a.id,T(a.id)),k.addNode(a.id,ee(a));},upsertCard(a){s.set(a.id,L(a)),te(s,a.id),k.registerHandler(a.id,T(a.id)),k.addNode(a.id,ee(a));},removeCard(a){s.delete(a),k.unregisterHandler(a),k.removeNode(a);},patchCardState(a,h){let l=s.get(a);if(!l)throw new Error(`Card "${a}" not found`);l.card_data={...l.card_data??{},...h},k.retrigger(a);},retrigger(a){k.retrigger(a);},retriggerAll(){k.retriggerAll(Array.from(s.keys()));},push(a){k.push(a);},pushAll(a){k.pushAll(a);},dispose(){o.clear(),k.dispose();}}}function ye(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function Ke(e){return e==="loading"?"in-progress":e==="error"?"failed":e==="stale"?"pending":e==="fresh"?"completed":"pending"}function Ve(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function We(e,t){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!t)throw new Error("cardId is required");let n=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(k=>k.id===t);if(!n)throw new Error(`cardDefinitions has no entry with id ${t}`);let s=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},o=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},i=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},p=(Array.isArray(s.cards)?s.cards:[]).find(k=>k.name===t),R=structuredClone(n),w=Ve(t,o[t]),f={...R.card_data&&typeof R.card_data=="object"&&!Array.isArray(R.card_data)?R.card_data:{},...w.card_data||{},status:ye(p?.status),lastRun:p?.runtime?.last_transition_at??null};p?.error?.message&&(f.error=p.error.message);let m=p?{task_status:p.status??null,card_status:ye(p.status),runtime:structuredClone(p.runtime??{}),error:p.error?structuredClone(p.error):null,blocked_by:Array.isArray(p.blocked_by)?structuredClone(p.blocked_by):[],requires_missing:Array.isArray(p.requires_missing)?structuredClone(p.requires_missing):[]}:{task_status:null,card_status:f.status??"fresh",runtime:{last_transition_at:f.lastRun??null},error:f.error?{message:f.error}:null,blocked_by:[],requires_missing:[]},v=Array.isArray(R.requires)?R.requires:[],b={};for(let[k,O]of Object.entries(i))b[k]=structuredClone(O);for(let k of v)Object.prototype.hasOwnProperty.call(b,k)||(b[k]=null);return {id:t,card:R,card_data:f,requires:b,computed_values:w.computed_values,runtime_state:m}}function Sr(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(r=>We(e,r.id))}function wr({boardPath:e,cardDefinitions:t,runtimeModels:r,graphState:n}){let s=Array.isArray(t)?t:[],o=Array.isArray(r)?r:[],i=new Map(o.map(f=>[f.id,f])),p=n.state?.tasks??{},R={};for(let f of o)f?.id&&(R[f.id]={schema_version:"v1",card_id:f.id,card_data:structuredClone(f.card_data??{}),computed_values:structuredClone(f.computed_values??{})});let w={};for(let f of Object.keys(p)){let m=p[f]?.data?.provides_data;if(m&&typeof m=="object")for(let v of Object.keys(m))w[v]=structuredClone(m[v]);}let T=s.map(f=>{let m=i.get(f.id)??{},v=p[f.id],b=typeof v?.status=="string"?v.status:Ke(m.card_data?.status),k=typeof v?.error=="string"?v.error:typeof m.card_data?.error=="string"?m.card_data.error:null;return {name:f.id,status:b,...k?{error:{message:k,code:"TASK_FAILED",at:v?.failedAt??null,source:"browser-runtime"}}:{},requires:Array.isArray(f.requires)?f.requires:[],requires_satisfied:[],requires_missing:[],provides_declared:Array.isArray(f.provides)?f.provides.map(O=>O.bindTo):[f.id],provides_runtime:Object.keys(v?.data?.provides_data??{}).sort(),blocked_by:[],unblocks:[],runtime:{attempt_count:v?.executionCount??0,restart_count:v?.retryCount??0,in_progress_since:b==="in-progress"?v?.startedAt??null:null,last_transition_at:v?.lastUpdated??m.card_data?.lastRun??null,last_completed_at:v?.completedAt??null,last_restarted_at:v?.startedAt??null,status_age_ms:null}}});return {cardDefinitions:structuredClone(s),cardRuntimeById:R,dataObjectsByToken:w,statusSnapshot:{schema_version:"v1",meta:{board:{path:e??"browser-runtime"}},summary:{card_count:T.length,completed:T.filter(f=>f.status==="completed").length,eligible:0,pending:T.filter(f=>f.status==="pending").length,blocked:0,unresolved:0,failed:T.filter(f=>f.status==="failed").length,in_progress:T.filter(f=>f.status==="in-progress").length,orphan_cards:0,topology:{edge_count:0,max_fan_out_card:null,max_fan_out:0}},cards:T}}}
2
+ exports.LocalStorageService=Rr;exports.buildBrowserArtifactsFromRuntime=wr;exports.createBoardLiveGraphRuntime=Tr;exports.selectAllLiveCardModels=Sr;exports.selectLiveCardModel=We;return exports;})({});//# sourceMappingURL=board-livegraph-engine.js.map
3
3
  //# sourceMappingURL=board-livegraph-engine.js.map