yaml-flow 8.1.1 → 8.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/browser/asset-integrity.json +3 -3
  2. package/browser/board-livecards-client.js +1 -1
  3. package/browser/board-livecards-localstorage.js +4 -6
  4. package/cli/{board-live-cards-lib-tjYsPt5U.d.ts → board-live-cards-lib-Iq_XAC09.d.ts} +1 -1
  5. package/cli/browser-api/board-live-cards-browser-adapter.d.ts +4 -3
  6. package/cli/browser-api/board-live-cards-browser-adapter.js +2 -2
  7. package/cli/browser-api/card-store-browser-api.d.ts +1 -1
  8. package/cli/node/artifacts-store-cli.js +8 -8
  9. package/cli/node/board-live-cards-cli.js +8 -8
  10. package/cli/node/card-store-cli.js +4 -4
  11. package/cli/node/fs-board-adapter.d.ts +6 -33
  12. package/cli/node/fs-board-adapter.js +10 -8
  13. package/cli/node/step-machine-cli.js +3 -3
  14. package/cli/{types-D2XnLbBj.d.ts → types--rXGWbSR.d.ts} +77 -5
  15. package/examples/board/.board-ws/cards/store/_index.json +17 -0
  16. package/examples/board/.board-ws/cards/store/card-market-prices.json +80 -0
  17. package/examples/board/.board-ws/cards/store/card-portfolio-value.json +90 -0
  18. package/examples/board/.board-ws/cards/store/card-portfolio.json +78 -0
  19. package/examples/board/cards/cardT-market-prices.json +6 -4
  20. package/examples/board/cards/cardT-portfolio-value.json +10 -38
  21. package/examples/board/cards/cardT-portfolio.json +9 -4
  22. package/examples/board/demo-shell-with-server.html +3 -3
  23. package/examples/board/server/board-server.js +593 -0
  24. package/examples/board/server/board-worker/source-def-flows/mock-handler/mock-db.js +13 -0
  25. package/examples/board/server/board-worker/source-def-flows/sqlite-handler/.retain/compliance.db +0 -0
  26. package/examples/board/server/board-worker/source-def-flows/sqlite-handler/.retain/optimus.db +0 -0
  27. package/examples/board/server/board-worker/source-def-flows/sqlite-handler/query.cjs +51 -0
  28. package/examples/board/server/board-worker/source-def-flows/sqlite-handler/seed-cpm.cjs +197 -0
  29. package/examples/board/server/board-worker/source-def-flows/sqlite-handler/seed-cpmV2.cjs +128 -0
  30. package/examples/board/server/board-worker/source-def-flows/sqlite-handler/seed-optimus.cjs +352 -0
  31. package/examples/board/server/board-worker/source-def-flows/sqlite-handler/sqlite-config.json +3 -0
  32. package/examples/board/server/board-worker/source-def-flows/sqlite-handler/sqlite-handler.js +84 -0
  33. package/examples/board/{source-def-flows/url.flow.json → server/board-worker/source-def-flows/sqlite.flow.json} +7 -7
  34. package/examples/board/{source-def-handlers → server/board-worker/source-def-flows/url-handler}/http-source-handler.js +29 -21
  35. package/examples/board/server/board-worker/source-def-flows/url.flow.json +73 -0
  36. package/examples/board/{source_def_flows.json → server/board-worker/source_def_flows.json} +61 -115
  37. package/examples/board/server/board-worker/task-executor.js +475 -0
  38. package/examples/board/server/chat-flow/chat-clear-processing.js +41 -0
  39. package/examples/board/server/chat-flow/chat-open-turn.js +144 -0
  40. package/examples/board/server/chat-flow/chat-write-assistant.js +44 -0
  41. package/examples/board/server/chat-flow/copilot-chat/assistant.js +253 -0
  42. package/examples/board/server/chat-flow/echo-probe/assistant.js +28 -0
  43. package/examples/board/server/chat-flow/flow-steps.json +167 -0
  44. package/examples/board/server-config.json +22 -0
  45. package/examples/board/test/server-http-test.js +707 -0
  46. package/examples/board/test/{portfolio-tracker-sse-worker.js → sse-worker.js} +9 -8
  47. package/examples/board-local/demo-shell-localstorage.html +3 -3
  48. package/lib/{artifacts-store-lib-public-DBICnGL6.d.cts → artifacts-store-lib-public-C5UL5tyG.d.cts} +3 -31
  49. package/lib/{artifacts-store-lib-public-BWC3YuLa.d.ts → artifacts-store-lib-public-GD4H-fFp.d.ts} +3 -31
  50. package/lib/artifacts-store-public.d.cts +3 -3
  51. package/lib/artifacts-store-public.d.ts +3 -3
  52. package/lib/board-live-cards-node.cjs +10 -8
  53. package/lib/board-live-cards-node.d.cts +9 -8
  54. package/lib/board-live-cards-node.d.ts +9 -8
  55. package/lib/board-live-cards-node.js +10 -8
  56. package/lib/{board-live-cards-public-BF9FP0mL.d.cts → board-live-cards-public-BLXbcBNk.d.cts} +2 -2
  57. package/lib/{board-live-cards-public-dJAl5IL-.d.ts → board-live-cards-public-BZaNb2mi.d.ts} +2 -2
  58. package/lib/board-live-cards-public.cjs +2 -2
  59. package/lib/board-live-cards-public.d.cts +2 -2
  60. package/lib/board-live-cards-public.d.ts +2 -2
  61. package/lib/board-live-cards-public.js +2 -2
  62. package/lib/board-live-cards-server-runtime.cjs +4 -6
  63. package/lib/board-live-cards-server-runtime.d.cts +3 -3
  64. package/lib/board-live-cards-server-runtime.d.ts +3 -3
  65. package/lib/board-live-cards-server-runtime.js +4 -6
  66. package/lib/board-livegraph-runtime/index.cjs +2 -2
  67. package/lib/board-livegraph-runtime/index.js +2 -2
  68. package/lib/card-store-public.d.cts +2 -2
  69. package/lib/card-store-public.d.ts +2 -2
  70. package/lib/execution-refs.cjs +1 -1
  71. package/lib/execution-refs.js +1 -1
  72. package/lib/index.cjs +1 -1
  73. package/lib/index.d.cts +1 -1
  74. package/lib/index.d.ts +1 -1
  75. package/lib/index.js +1 -1
  76. package/lib/server-runtime/index.cjs +4 -6
  77. package/lib/server-runtime/index.d.cts +4 -4
  78. package/lib/server-runtime/index.d.ts +4 -4
  79. package/lib/server-runtime/index.js +4 -6
  80. package/lib/step-machine-public/index.cjs +3 -3
  81. package/lib/step-machine-public/index.d.cts +27 -10
  82. package/lib/step-machine-public/index.d.ts +27 -10
  83. package/lib/step-machine-public/index.js +3 -3
  84. package/lib/{storage-interface-BhAON-gW.d.ts → storage-interface-B6ecOulj.d.cts} +25 -3
  85. package/lib/{storage-interface-BhAON-gW.d.cts → storage-interface-B6ecOulj.d.ts} +25 -3
  86. package/lib/stores/index.d.cts +1 -1
  87. package/lib/stores/index.d.ts +1 -1
  88. package/lib/stores/kv.d.cts +1 -1
  89. package/lib/stores/kv.d.ts +1 -1
  90. package/lib/{types-CXBzvC0s.d.cts → types-Bztd1KoK.d.cts} +75 -3
  91. package/lib/{types-D48hpnTR.d.ts → types-D-xVWPdY.d.ts} +75 -3
  92. package/package.json +1 -1
  93. package/examples/board/demo-chat-handler.js +0 -169
  94. package/examples/board/demo-server-config.json +0 -10
  95. package/examples/board/demo-server.js +0 -580
  96. package/examples/board/demo-task-executor.js +0 -721
  97. package/examples/board/gandalf-cards/card-source-kinds.json +0 -36
  98. package/examples/board/gandalf-cards/cards/_index.json +0 -7
  99. package/examples/board/gandalf-cards/cards/card-source-kinds.json +0 -64
  100. package/examples/board/scripts/copilot_wrapper.bat +0 -157
  101. package/examples/board/scripts/copilot_wrapper_helper.ps1 +0 -190
  102. package/examples/board/scripts/workiq_wrapper.mjs +0 -66
  103. package/examples/board/source-def-flows/copilot.flow.json +0 -33
  104. package/examples/board/source-def-flows/url-list.flow.json +0 -33
  105. package/examples/board/source-def-flows/workiq.flow.json +0 -34
  106. package/examples/board/source-def-handlers/copilot-source-handler.js +0 -141
  107. package/examples/board/test/demo-http-test.js +0 -317
  108. /package/examples/board/{source-def-flows → server/board-worker/source-def-flows}/mock.flow.json +0 -0
@@ -1,3 +1,3 @@
1
- import {createRequire}from'module';import'ajv-formats';import'child_process';var be=createRequire(import.meta.url);be("./jsonata-sync.cjs");var Se=createRequire(import.meta.url),j=Se("./jsonata-sync.cjs"),ne=j;function te(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 se(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 Te(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 j(s.expr).evaluate(n);se(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function we(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=ne(o.expr).evaluate(n);se(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});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Ce(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return j(e).evaluate(n)}function _e(e,t){return t.startsWith("fetched_sources.")?te(e._sourcesData??{},t.slice(16)):te(e,t)}var re=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),xe=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Ae(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))xe.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`):re.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...re].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 Ee(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 Oe(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]=ne(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var D={run:Te,runSync:we,eval:Ce,resolve:_e,validate:Ae,enrichSources:Ee,enrichSourcesSync:Oe};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 oe(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function ae(e){return e.maxExecutions}function ie(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 ce(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 de(e,t,r){let n=e.tasks[t]??q(),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(O(w).includes(p)){let S=e.tasks[R];S?.lastDataHash&&(s[p]=S.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 ue(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 p;n&&d.on&&d.on[n]?p=d.on[n]:p=O(d);let R=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let l=d.requires??[];for(let m of l)for(let[h,b]of Object.entries(t.tasks))if(O(b).includes(m)){let v=e.tasks[h];v?.lastDataHash&&(R[m]=v.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},S=[...new Set([...e.availableOutputs,...p])];return {...e,tasks:{...e.tasks,[r]:w},availableOutputs:S,lastUpdated:new Date().toISOString()}}function pe(e,t,r,n){let s=e.tasks[r]??q(),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 le(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 fe(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]=me();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 ge(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:de(n,t.taskName,r)};case "task-completed":return {config:r,state:ue(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:pe(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:le(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:fe(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:Ge(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)=>ge(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]:me()},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 me(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ge(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=Ne(n),i=ie(t,r.tasks),d=new Set([...i,...r.availableOutputs]),p=[],R=[],w=[],S=[];for(let[m,h]of Object.entries(n)){let b=r.tasks[m],v=oe(h,t.settings),A=v!=="once";if(b?.status===G.RUNNING||P(b))continue;let c=ae(h);if(c!==void 0&&b&&b.executionCount>=c||h.circuit_breaker&&b&&b.executionCount>=h.circuit_breaker.max_executions||!A&&b?.status===G.COMPLETED)continue;if(A&&b?.status===G.COMPLETED){let u=N(h),g=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 T=r.tasks[_];if(!T)continue;let ve=b.lastConsumedHashes?.[C];return T.lastDataHash==null?T.executionCount>b.lastEpoch:T.lastDataHash!==ve}return false})||(g=true);break}case "epoch-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(O(x).includes(C)){let T=r.tasks[_];if(T&&T.executionCount>b.lastEpoch)return true}return false})||(g=true);break}case "time-based":{let E=h.refreshInterval??0;if(E<=0){g=true;break}let C=b.completedAt;if(!C){g=true;break}(Date.now()-Date.parse(C))/1e3<E&&(g=true);break}case "manual":g=true;break}if(g)continue}let a=N(h);if(a.length===0){p.push(m);continue}let k=[],f=[],y=[];for(let u of a){if(d.has(u))continue;let g=o[u]||[];g.length===0?k.push(u):g.every(C=>P(r.tasks[C]))?y.push({token:u,failedProducer:g[0]}):f.push(u);}k.length>0?w.push({taskName:m,missingTokens:k}):y.length>0?S.push({taskName:m,failedTokens:y.map(u=>u.token),failedProducers:[...new Set(y.map(u=>u.failedProducer))]}):f.length>0?R.push({taskName:m,waitingOn:f}):p.push(m);}let l={};if(p.length>1){let m=ce(p,n);for(let[h,b]of Object.entries(m))b.length>1&&(l[h]=b);}return {eligible:p,pending:R,unresolved:w,blocked:S,conflicts:l}}function Ne(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{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 Ie(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 Ie(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 Le(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 je(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 ke(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Le(t)}function De(e){try{let t=JSON.parse(je(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,p=new Set,R=new Map(Object.entries(n)),w=new L,S=false,l=false;function m(){if(!d){if(S){l=true;return}S=true;try{do l=!1,h();while(l)}finally{S=false;}}}function h(){let c=w.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 y of f.eligible)A(y);for(let y of k)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 _=ke(u),x=v(u,_,g).catch(T=>{d||(w.append({type:"task-failed",taskName:u,error:T.message??String(T),timestamp:new Date().toISOString()}),m());}).finally(()=>{p.delete(x);});p.add(x);}}function b(c){let k=i.config.tasks[c].requires??[],f=new Map;for(let[u,g]of Object.entries(i.config.tasks))for(let E of g.provides??[])f.set(E,u);let y={};for(let u of k){let g=f.get(u);g?y[u]=i.state.tasks[g]?.data:y[u]=void 0;}return y}async function v(c,a,k){let f=i.config.tasks[c],y=f.taskHandlers??[],u=b(c);for(let g of y){let E=R.get(g);if(!E)throw new Error(`Handler '${g}' 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 E(C)==="task-initiate-failure")throw new Error(`Handler '${g}' returned task-initiate-failure (task '${c}')`)}}function A(c){let k=i.config.tasks[c]?.taskHandlers;if(!k||k.length===0)return;w.append({type:"task-started",taskName:c,timestamp:new Date().toISOString()}),m();let f=ke(c),y=v(c,f).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:U(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:U(a.data)}):o.append(a);m();}},resolveCallback(c,a,k){if(d)return;let f=De(c);if(!f)return;let{taskName:y}=f;if(i.config.tasks[y]){if(k&&k.length>0)o.append({type:"task-failed",taskName:y,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: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 z(i)},getState(){return i},getSchedule(){return F(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 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 Ue(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=Ue(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 lr={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 fr(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??{},p=t.defaultSourceAdapter,R=null,w=(a,k)=>{let f={events:a,graph:k,nodes:A()};for(let y of o)y(f);},S=a=>async k=>{let f=s.get(a);if(!f)return "task-initiate-failure";let y={};for(let _ of f.requires??[]){let x=k.state[_];if(!x||typeof x!="object")continue;let T=x.provides_data;!T||typeof T!="object"||Object.prototype.hasOwnProperty.call(T,_)&&(y[_]=T[_]);}let u={};if(f.source_defs&&f.source_defs.length>0){let _=d[a]??p,x=i?await i({card:f,input:k}):_?await _({card:f,input:k}):void 0;if(x&&typeof x=="object")for(let T of f.source_defs)Object.prototype.hasOwnProperty.call(x,T.bindTo)?u[T.bindTo]=x[T.bindTo]:f.source_defs.length===1&&(u[T.bindTo]=x);}let g={id:f.id,card_data:I(f.card_data??{}),requires:y,source_defs:f.source_defs,compute:f.compute};g._sourcesData=u,g.compute&&g.compute.length>0&&await D.run(g,{sourcesData:u});let E={};if(f.provides&&f.provides.length>0)for(let{bindTo:_,ref:x}of f.provides)E[_]=D.resolve(g,x);else E[f.id]={...g.card_data??{},...g.computed_values??{},...g._sourcesData??{}};let C={provides_data:E,card_data:g.card_data??{},computed_values:g.computed_values??{},fetched_sources:u,requires:y};return R?.resolveCallback(k.callbackToken,C),"task-initiated"},l={},m={};for(let[a,k]of s.entries())ee(s,a),l[a]=Z(k),m[a]=S(a);let h={id:r.id??`browser-board-${Date.now()}`,settings:{completion:"manual",execution_mode:"eligibility-mode",...r.settings??{},...t.graphSettings??{}},tasks:l},b=t.reactiveOptions?.onDrain,v=$(h,{...t.reactiveOptions??{},handlers:m,onDrain:(a,k,f)=>{b?.(a,k,f),w(a,k);}},t.executionId);R=v;function A(){let a=v.getState(),k=[];for(let[f,y]of s.entries()){let u=a.state.tasks[f]?.data,g=a.state.tasks[f],E={...y.card_data??{},...u&&typeof u.card_data=="object"?u.card_data:{}},C=g?.status==="running"?"loading":g?.status,_={...E,...C?{status:C}:{},...g?.lastUpdated?{lastRun:g.lastUpdated}:{},...g?.status==="failed"&&g.error?{error:g.error}:{}};k.push({id:f,card:I(y),card_data:_,requires:u&&typeof u.requires=="object"?I(u.requires):{},computed_values:u&&typeof u.computed_values=="object"?I(u.computed_values):{},runtime_state:g?I(g):{}});}return k}return {getGraph:()=>v,getState:()=>v.getState(),getSchedule:()=>v.getSchedule(),getNodes:()=>A(),getBoard:()=>({...r,nodes:A()}),subscribe(a){return o.add(a),a({events:[],graph:v.getState(),nodes:A()}),()=>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,S(a.id)),v.addNode(a.id,Z(a));},upsertCard(a){s.set(a.id,I(a)),ee(s,a.id),v.registerHandler(a.id,S(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 he(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function $e(e){return e==="loading"?"in-progress":e==="error"?"failed":e==="stale"?"pending":e==="fresh"?"completed":"pending"}function Be(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 Ke(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(a=>a.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(a=>a.name===t),R=structuredClone(n),w=Be(t,o[t]),l={...R.card_data&&typeof R.card_data=="object"&&!Array.isArray(R.card_data)?R.card_data:{},...w.card_data||{},status:he(p?.status),lastRun:p?.runtime?.last_transition_at??null};p?.error?.message&&(l.error=p.error.message);let m=p?{task_status:p.status??null,card_status:he(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:l.status??"fresh",runtime:{last_transition_at:l.lastRun??null},error:l.error?{message:l.error}:null,blocked_by:[],requires_missing:[]},h=Array.isArray(R.requires)?R.requires:[],b={};for(let[a,k]of Object.entries(i))b[a]=structuredClone(k);for(let a of h)Object.prototype.hasOwnProperty.call(b,a)||(b[a]=null);let A=(e.cardChatsByCardId&&typeof e.cardChatsByCardId=="object"?e.cardChatsByCardId:{})[t],c=A?{messages:Array.isArray(A.messages)?A.messages:[],receiving:!!A.receiving,processing:!!A.processing}:null;return {id:t,card:R,card_data:l,requires:b,computed_values:w.computed_values,runtime_state:m,card_chats:c}}function gr(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(r=>Ke(e,r.id))}function mr({boardPath:e,cardDefinitions:t,runtimeModels:r,graphState:n}){let s=Array.isArray(t)?t:[],o=Array.isArray(r)?r:[],i=new Map(o.map(l=>[l.id,l])),p=n.state?.tasks??{},R={};for(let l of o)l?.id&&(R[l.id]={schema_version:"v1",card_id:l.id,card_data:structuredClone(l.card_data??{}),computed_values:structuredClone(l.computed_values??{})});let w={};for(let l of Object.keys(p)){let m=p[l]?.data?.provides_data;if(m&&typeof m=="object")for(let h of Object.keys(m))w[h]=structuredClone(m[h]);}let S=s.map(l=>{let m=i.get(l.id)??{},h=p[l.id],b=typeof h?.status=="string"?h.status:$e(m.card_data?.status),v=typeof h?.error=="string"?h.error:typeof m.card_data?.error=="string"?m.card_data.error:null;return {name:l.id,status:b,...v?{error:{message:v,code:"TASK_FAILED",at:h?.failedAt??null,source:"browser-runtime"}}:{},requires:Array.isArray(l.requires)?l.requires:[],requires_satisfied:[],requires_missing:[],provides_declared:Array.isArray(l.provides)?l.provides.map(A=>A.bindTo):[l.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:b==="in-progress"?h?.startedAt??null:null,last_transition_at:h?.lastUpdated??m.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:R,dataObjectsByToken:w,statusSnapshot:{schema_version:"v1",meta:{board:{path:e??"browser-runtime"}},summary:{card_count:S.length,completed:S.filter(l=>l.status==="completed").length,eligible:0,pending:S.filter(l=>l.status==="pending").length,blocked:0,unresolved:0,failed:S.filter(l=>l.status==="failed").length,in_progress:S.filter(l=>l.status==="in-progress").length,orphan_cards:0,topology:{edge_count:0,max_fan_out_card:null,max_fan_out:0}},cards:S}}}
2
- export{lr as LocalStorageService,mr as buildBrowserArtifactsFromRuntime,fr as createBoardLiveGraphRuntime,gr as selectAllLiveCardModels,Ke as selectLiveCardModel};//# sourceMappingURL=index.js.map
1
+ import {createRequire}from'module';import'ajv-formats';var lt=createRequire(import.meta.url);lt("./jsonata-sync.cjs");var mt=createRequire(import.meta.url),L=mt("./jsonata-sync.cjs"),V=L;function H(t,e){if(!e||!t)return;let r=e.split("."),n=t;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function J(t,e,r){let n=e.split("."),s=t;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 ht(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let s of t.compute)try{let o=await L(s.expr).evaluate(n);J(t.computed_values,s.bindTo,o),n.computed_values=t.computed_values;}catch{}return t}function kt(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},s=[];for(let o of t.compute)try{let i=V(o.expr).evaluate(n);J(t.computed_values,o.bindTo,i),n.computed_values=t.computed_values;}catch(i){let c=i instanceof Error?i.message:String(i);s.push({bindTo:o.bindTo,error:c});}return s.length>0?{ok:true,node:t,errors:s}:{ok:true,node:t}}async function yt(t,e,r){let n={...r??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return L(t).evaluate(n)}function vt(t,e){return e.startsWith("fetched_sources.")?H(t._sourcesData??{},e.slice(16)):H(t,e)}var K=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),St=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function bt(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let r=t;(typeof r.id!="string"||!r.id)&&e.push("id: required, must be a non-empty string");for(let n of Object.keys(r))St.has(n)||e.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&e.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))e.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&e.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&e.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&e.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))e.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&e.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&e.push(`provides[${s}]: missing required "ref" string`);}}):e.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))e.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&e.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&e.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))e.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))e.push(`source_defs[${i}]: must be an object`);else {let c=o;typeof c.bindTo!="string"||!c.bindTo?e.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(c.bindTo)&&e.push(`source_defs[${i}]: bindTo "${c.bindTo}" is not unique across source_defs`),n.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?e.push(`source_defs[${i}]: missing required "outputFile" property`):(s.has(c.outputFile)&&e.push(`source_defs[${i}]: outputFile "${c.outputFile}" is not unique across source_defs`),s.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))e.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?e.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){e.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?e.push(`view.elements[${o}].kind: required, must be a string`):K.has(s.kind)||e.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...K].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&e.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&e.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function wt(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.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 L(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function _t(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return t.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]=V(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var q={run:ht,runSync:kt,eval:yt,resolve:vt,validate:bt,enrichSources:wt,enrichSourcesSync:_t};var G={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function O(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function j(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function X(t){return t.tasks??{}}function P(t){return t?t.status===G.FAILED||t.status===G.INACTIVATED:false}function Y(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function W(t){return t.maxExecutions}function z(t,e){let r=new Set;for(let[n,s]of Object.entries(e))if(s.status===G.COMPLETED){let o=t.tasks[n];o&&O(o).forEach(c=>r.add(c));}return Array.from(r)}function Q(t,e){let r={};return t.forEach(n=>{let s=e[n];if(!s)return;O(s).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function Z(t,e,r){let n=t.tasks[e]??N(),s={};if(r){let i=r.tasks[e],c=j(i);for(let p of c)for(let[b,C]of Object.entries(r.tasks))if(O(C).includes(p)){let w=t.tasks[b];w?.lastDataHash&&(s[p]=w.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...t,tasks:{...t.tasks,[e]:o},lastUpdated:new Date().toISOString()}}function tt(t,e,r,n,s,o){let i=t.tasks[r]??N(),c=e.tasks[r];if(!c)throw new Error(`Task "${r}" not found in graph`);let p;n&&c.on&&c.on[n]?p=c.on[n]:p=O(c);let b=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let f=c.requires??[];for(let m of f)for(let[k,S]of Object.entries(e.tasks))if(O(S).includes(m)){let y=t.tasks[k];y?.lastDataHash&&(b[m]=y.lastDataHash);break}}let C={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:b,error:void 0},w=[...new Set([...t.availableOutputs,...p])];return {...t,tasks:{...t.tasks,[r]:C},availableOutputs:w,lastUpdated:new Date().toISOString()}}function et(t,e,r,n){let s=t.tasks[r]??N(),o=e.tasks[r];if(o?.retry){let p=s.retryCount+1;if(p<=o.retry.max_attempts){let b={...s,status:"not-started",retryCount:p,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:b},lastUpdated:new Date().toISOString()}}}let i={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},c=t.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(c=[...new Set([...t.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&i.executionCount>=o.circuit_breaker.max_executions){let p=o.circuit_breaker.on_break;c=[...new Set([...c,...p])];}return {...t,tasks:{...t.tasks,[r]:i},availableOutputs:c,lastUpdated:new Date().toISOString()}}function rt(t,e,r,n){let s=t.tasks[e]??N(),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 {...t,tasks:{...t.tasks,[e]:o},lastUpdated:new Date().toISOString()}}function nt(t,e){let r=t.tasks[e];if(!r)return t;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 {...t,tasks:{...t.tasks,[e]:n},lastUpdated:new Date().toISOString()}}function N(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function st(t,e){let r=e??`live-${Date.now()}`,n={};for(let o of Object.keys(t.tasks))n[o]=it();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:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:s}}function Ct(t,e){let{config:r,state:n}=t;if("executionId"in e&&e.executionId&&e.executionId!==n.executionId)return t;switch(e.type){case "task-started":return {config:r,state:Z(n,e.taskName,r)};case "task-completed":return {config:r,state:tt(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:et(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:rt(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:nt(n,e.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Gt(n,e.action)};case "task-upsert":return Rt(t,e.taskName,e.taskConfig);case "task-removal":return Tt(t,e.taskName);case "node-requires-add":return At(t,e.nodeName,e.tokens);case "node-requires-remove":return Et(t,e.nodeName,e.tokens);case "node-provides-add":return xt(t,e.nodeName,e.tokens);case "node-provides-remove":return Ot(t,e.nodeName,e.tokens);default:return t}}function ot(t,e){return e.reduce((r,n)=>Ct(r,n),t)}function Rt(t,e,r){let n=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:r}},state:{...t.state,tasks:{...t.state.tasks,[e]:n?t.state.tasks[e]:it()},lastUpdated:new Date().toISOString()}}}function Tt(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:s,...o}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:o,lastUpdated:new Date().toISOString()}}}function At(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=j(n),o=r.filter(i=>!s.includes(i));return o.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...s,...o]}}},state:t.state}}function Et(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=j(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:o}}},state:t.state}}function xt(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=O(n),o=r.filter(i=>!s.includes(i));return o.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...s,...o]}}},state:t.state}}function Ot(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=O(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:o}}},state:t.state}}function at(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function it(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Gt(t,e){let r=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:r};case "pause":return {...t,status:"paused",lastUpdated:r};case "resume":return {...t,status:"running",lastUpdated:r};default:return t}}function U(t){let{config:e,state:r}=t,n=X(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=jt(n),i=z(e,r.tasks),c=new Set([...i,...r.availableOutputs]),p=[],b=[],C=[],w=[];for(let[m,k]of Object.entries(n)){let S=r.tasks[m],y=Y(k,e.settings),E=y!=="once";if(S?.status===G.RUNNING||P(S))continue;let u=W(k);if(u!==void 0&&S&&S.executionCount>=u||k.circuit_breaker&&S&&S.executionCount>=k.circuit_breaker.max_executions||!E&&S?.status===G.COMPLETED)continue;if(E&&S?.status===G.COMPLETED){let d=j(k),g=false;switch(y){case "data-changed":{d.length>0&&d.some(R=>{for(let[T,A]of Object.entries(n))if(O(A).includes(R)){let _=r.tasks[T];if(!_)continue;let pt=S.lastConsumedHashes?.[R];return _.lastDataHash==null?_.executionCount>S.lastEpoch:_.lastDataHash!==pt}return false})||(g=true);break}case "epoch-changed":{d.length>0&&d.some(R=>{for(let[T,A]of Object.entries(n))if(O(A).includes(R)){let _=r.tasks[T];if(_&&_.executionCount>S.lastEpoch)return true}return false})||(g=true);break}case "time-based":{let x=k.refreshInterval??0;if(x<=0){g=true;break}let R=S.completedAt;if(!R){g=true;break}(Date.now()-Date.parse(R))/1e3<x&&(g=true);break}case "manual":g=true;break}if(g)continue}let a=j(k);if(a.length===0){p.push(m);continue}let h=[],l=[],v=[];for(let d of a){if(c.has(d))continue;let g=o[d]||[];g.length===0?h.push(d):g.every(R=>P(r.tasks[R]))?v.push({token:d,failedProducer:g[0]}):l.push(d);}h.length>0?C.push({taskName:m,missingTokens:h}):v.length>0?w.push({taskName:m,failedTokens:v.map(d=>d.token),failedProducers:[...new Set(v.map(d=>d.failedProducer))]}):l.length>0?b.push({taskName:m,waitingOn:l}):p.push(m);}let f={};if(p.length>1){let m=Q(p,n);for(let[k,S]of Object.entries(m))S.length>1&&(f[k]=S);}return {eligible:p,pending:b,unresolved:C,blocked:w,conflicts:f}}function jt(t){let e={};for(let[r,n]of Object.entries(t)){for(let s of O(n))e[s]||(e[s]=[]),e[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)e[o]||(e[o]=[]),e[o].includes(r)||e[o].push(r);if(n.on_failure)for(let s of n.on_failure)e[s]||(e[s]=[]),e[s].includes(r)||e[s].push(r);}return e}var I=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function B(t){let e=F(t);return Dt(e)}function F(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(F).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+F(e[n])).join(",")+"}"}function Dt(t){let e=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<t.length;s++)e^=BigInt(t.charCodeAt(s)),e=e*r&n;return e.toString(16).padStart(16,"0")}function It(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),r="";for(let n of e)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Lt(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.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 ut(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return It(e)}function Nt(t){try{let e=JSON.parse(Lt(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function ct(t,e,r){let{handlers:n,onDrain:s}=e,o=new I,i="state"in t&&"config"in t?t:st(t,r),c=false,p=new Set,b=new Map(Object.entries(n)),C=new I,w=false,f=false;function m(){if(!c){if(w){f=true;return}w=true;try{do f=!1,k();while(f)}finally{w=false;}}}function k(){let u=C.drain(),a=o.drain(),h=[...u,...a];h.length>0&&(i=ot(i,h));let l=U(i);h.length>0&&s?.(h,i,l);for(let v of l.eligible)E(v);for(let v of h)if(v.type==="task-progress"){let{taskName:d,update:g}=v;if(!i.config.tasks[d])continue;let R=i.state.tasks[d];if(!R||R.status!=="running")continue;let T=ut(d),A=y(d,T,g).catch(_=>{c||(C.append({type:"task-failed",taskName:d,error:_.message??String(_),timestamp:new Date().toISOString()}),m());}).finally(()=>{p.delete(A);});p.add(A);}}function S(u){let h=i.config.tasks[u].requires??[],l=new Map;for(let[d,g]of Object.entries(i.config.tasks))for(let x of g.provides??[])l.set(x,d);let v={};for(let d of h){let g=l.get(d);g?v[d]=i.state.tasks[g]?.data:v[d]=void 0;}return v}async function y(u,a,h){let l=i.config.tasks[u],v=l.taskHandlers??[],d=S(u);for(let g of v){let x=b.get(g);if(!x)throw new Error(`Handler '${g}' not found in registry (task '${u}')`);let R={nodeId:u,state:d,taskState:i.state.tasks[u],config:l,callbackToken:a,update:h};if(await x(R)==="task-initiate-failure")throw new Error(`Handler '${g}' returned task-initiate-failure (task '${u}')`)}}function E(u){let h=i.config.tasks[u]?.taskHandlers;if(!h||h.length===0)return;C.append({type:"task-started",taskName:u,timestamp:new Date().toISOString()}),m();let l=ut(u),v=y(u,l).catch(d=>{c||(C.append({type:"task-failed",taskName:u,error:d.message??String(d),timestamp:new Date().toISOString()}),m());}).finally(()=>{p.delete(v);});p.add(v);}return {push(u){c||(u.type==="task-completed"&&u.data&&!u.dataHash&&(u={...u,dataHash:B(u.data)}),o.append(u),m());},pushAll(u){if(!c){for(let a of u)a.type==="task-completed"&&a.data&&!a.dataHash?o.append({...a,dataHash:B(a.data)}):o.append(a);m();}},resolveCallback(u,a,h){if(c)return;let l=Nt(u);if(!l)return;let{taskName:v}=l;if(i.config.tasks[v]){if(h&&h.length>0)o.append({type:"task-failed",taskName:v,error:h.join("; "),timestamp:new Date().toISOString()});else {let d=a&&Object.keys(a).length>0?B(a):void 0;o.append({type:"task-completed",taskName:v,data:a,dataHash:d,timestamp:new Date().toISOString()});}m();}},addNode(u,a){c||(o.append({type:"task-upsert",taskName:u,taskConfig:a,timestamp:new Date().toISOString()}),m());},removeNode(u){c||(o.append({type:"task-removal",taskName:u,timestamp:new Date().toISOString()}),m());},addRequires(u,a){c||(o.append({type:"node-requires-add",nodeName:u,tokens:a,timestamp:new Date().toISOString()}),m());},removeRequires(u,a){c||(o.append({type:"node-requires-remove",nodeName:u,tokens:a,timestamp:new Date().toISOString()}),m());},addProvides(u,a){c||(o.append({type:"node-provides-add",nodeName:u,tokens:a,timestamp:new Date().toISOString()}),m());},removeProvides(u,a){c||(o.append({type:"node-provides-remove",nodeName:u,tokens:a,timestamp:new Date().toISOString()}),m());},registerHandler(u,a){b.set(u,a);},unregisterHandler(u){b.delete(u);},retrigger(u){c||i.config.tasks[u]&&(o.append({type:"task-restart",taskName:u,timestamp:new Date().toISOString()}),m());},retriggerAll(u){if(!c){for(let a of u)i.config.tasks[a]&&o.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()});m();}},snapshot(){return at(i)},getState(){return i},getSchedule(){return U(i)},async waitForHandlers(){p.size>0&&await Promise.allSettled([...p]);},async dispose(u){u?.wait&&p.size>0&&await Promise.allSettled([...p]),c=true;}}}function D(t){return JSON.parse(JSON.stringify(t))}function $(t){let e=t.provides&&t.provides.length>0?t.provides.map(r=>r.bindTo):[t.id];return {requires:t.requires&&t.requires.length>0?[...t.requires]:void 0,provides:e,taskHandlers:[t.id],description:t.meta?.title??t.id}}function qt(t){let e=new Map;for(let[r,n]of t.entries()){let s=n.provides&&n.provides.length>0?n.provides:[{bindTo:r,ref:"card_data"}];for(let o of s)e.set(o.bindTo,r);}return e}function M(t,e){let r=qt(t),n=t.get(e);if(n){for(let s of n.requires??[])if(!r.has(s))throw new Error(`Card "${e}" requires token "${s}" but no card provides it`)}}var ke={CARD_PREFIX:"yf:cards:",RUNTIME_OUT_PREFIX:"yf:runtime-out:cards:",STATUS_KEY:"yf:runtime-out:status",writeCard(t,e){try{localStorage.setItem(this.CARD_PREFIX+t,JSON.stringify(e));}catch(r){console.warn(`Failed to write card ${t} to localStorage:`,r);}},readCard(t){try{let e=localStorage.getItem(this.CARD_PREFIX+t);return e?JSON.parse(e):null}catch(e){return console.warn(`Failed to read card ${t} from localStorage:`,e),null}},readAllCards(t){let e={};for(let r of t){let n=this.readCard(r);n&&(e[r]=n);}return e},writeComputedArtifact(t){if(!(!t||!t.card_id))try{localStorage.setItem(this.RUNTIME_OUT_PREFIX+String(t.card_id),JSON.stringify(t));}catch(e){console.warn(`Failed to write computed artifact ${t.card_id}:`,e);}},readComputedArtifact(t){try{let e=localStorage.getItem(this.RUNTIME_OUT_PREFIX+t);return e?JSON.parse(e):null}catch(e){return console.warn(`Failed to read computed artifact ${t}:`,e),null}},readAllComputedArtifacts(t){let e={};for(let r of t){let n=this.readComputedArtifact(r);n&&(e[r]=n);}return e},writeStatusSnapshot(t){try{localStorage.setItem(this.STATUS_KEY,JSON.stringify(t));}catch(e){console.warn("Failed to write status snapshot to localStorage:",e);}},readStatusSnapshot(){try{let t=localStorage.getItem(this.STATUS_KEY);return t?JSON.parse(t):null}catch(t){return console.warn("Failed to read status snapshot from localStorage:",t),null}},clear(){let t=[];for(let e=0;e<localStorage.length;e++){let r=localStorage.key(e);r&&(r.startsWith(this.CARD_PREFIX)||r.startsWith(this.RUNTIME_OUT_PREFIX)||r===this.STATUS_KEY)&&t.push(r);}for(let e of t)localStorage.removeItem(e);}};function ye(t,e={}){let r=Array.isArray(t)?{}:{id:t.id,title:t.title,mode:t.mode,positions:t.positions,settings:t.settings},n=Array.isArray(t)?t:t.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,D(a));}let o=new Set,i=e.taskExecutor,c=e.sourceAdapters??{},p=e.defaultSourceAdapter,b=null,C=(a,h)=>{let l={events:a,graph:h,nodes:E()};for(let v of o)v(l);},w=a=>async h=>{let l=s.get(a);if(!l)return "task-initiate-failure";let v={};for(let T of l.requires??[]){let A=h.state[T];if(!A||typeof A!="object")continue;let _=A.provides_data;!_||typeof _!="object"||Object.prototype.hasOwnProperty.call(_,T)&&(v[T]=_[T]);}let d={};if(l.source_defs&&l.source_defs.length>0){let T=c[a]??p,A=i?await i({card:l,input:h}):T?await T({card:l,input:h}):void 0;if(A&&typeof A=="object")for(let _ of l.source_defs)Object.prototype.hasOwnProperty.call(A,_.bindTo)?d[_.bindTo]=A[_.bindTo]:l.source_defs.length===1&&(d[_.bindTo]=A);}let g={id:l.id,card_data:D(l.card_data??{}),requires:v,source_defs:l.source_defs,compute:l.compute};g._sourcesData=d,g.compute&&g.compute.length>0&&await q.run(g,{sourcesData:d});let x={};if(l.provides&&l.provides.length>0)for(let{bindTo:T,ref:A}of l.provides)x[T]=q.resolve(g,A);else x[l.id]={...g.card_data??{},...g.computed_values??{},...g._sourcesData??{}};let R={provides_data:x,card_data:g.card_data??{},computed_values:g.computed_values??{},fetched_sources:d,requires:v};return b?.resolveCallback(h.callbackToken,R),"task-initiated"},f={},m={};for(let[a,h]of s.entries())M(s,a),f[a]=$(h),m[a]=w(a);let k={id:r.id??`browser-board-${Date.now()}`,settings:{completion:"manual",execution_mode:"eligibility-mode",...r.settings??{},...e.graphSettings??{}},tasks:f},S=e.reactiveOptions?.onDrain,y=ct(k,{...e.reactiveOptions??{},handlers:m,onDrain:(a,h,l)=>{S?.(a,h,l),C(a,h);}},e.executionId);b=y;function E(){let a=y.getState(),h=[];for(let[l,v]of s.entries()){let d=a.state.tasks[l]?.data,g=a.state.tasks[l],x={...v.card_data??{},...d&&typeof d.card_data=="object"?d.card_data:{}},R=g?.status==="running"?"loading":g?.status,T={...x,...R?{status:R}:{},...g?.lastUpdated?{lastRun:g.lastUpdated}:{},...g?.status==="failed"&&g.error?{error:g.error}:{}};h.push({id:l,card:D(v),card_data:T,requires:d&&typeof d.requires=="object"?D(d.requires):{},computed_values:d&&typeof d.computed_values=="object"?D(d.computed_values):{},runtime_state:g?D(g):{}});}return h}return {getGraph:()=>y,getState:()=>y.getState(),getSchedule:()=>y.getSchedule(),getNodes:()=>E(),getBoard:()=>({...r,nodes:E()}),subscribe(a){return o.add(a),a({events:[],graph:y.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,D(a)),M(s,a.id),y.registerHandler(a.id,w(a.id)),y.addNode(a.id,$(a));},upsertCard(a){s.set(a.id,D(a)),M(s,a.id),y.registerHandler(a.id,w(a.id)),y.addNode(a.id,$(a));},removeCard(a){s.delete(a),y.unregisterHandler(a),y.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},y.retrigger(a);},retrigger(a){y.retrigger(a);},retriggerAll(){y.retriggerAll(Array.from(s.keys()));},push(a){y.push(a);},pushAll(a){y.pushAll(a);},dispose(){o.clear(),y.dispose();}}}function dt(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function Pt(t){return t==="loading"?"in-progress":t==="error"?"failed":t==="stale"?"pending":t==="fresh"?"completed":"pending"}function Ut(t,e){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:t,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 Bt(t,e){if(!t||typeof t!="object")throw new Error("payload must be an object");if(!e)throw new Error("cardId is required");let n=(Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).find(a=>a.id===e);if(!n)throw new Error(`cardDefinitions has no entry with id ${e}`);let s=t.statusSnapshot&&typeof t.statusSnapshot=="object"?t.statusSnapshot:{},o=t.cardRuntimeById&&typeof t.cardRuntimeById=="object"?t.cardRuntimeById:{},i=t.dataObjectsByToken&&typeof t.dataObjectsByToken=="object"?t.dataObjectsByToken:{},p=(Array.isArray(s.cards)?s.cards:[]).find(a=>a.name===e),b=structuredClone(n),C=Ut(e,o[e]),f={...b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},...C.card_data||{},status:dt(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:dt(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:[]},k=Array.isArray(b.requires)?b.requires:[],S={};for(let[a,h]of Object.entries(i))S[a]=structuredClone(h);for(let a of k)Object.prototype.hasOwnProperty.call(S,a)||(S[a]=null);let E=(t.cardChatsByCardId&&typeof t.cardChatsByCardId=="object"?t.cardChatsByCardId:{})[e],u=E?{messages:Array.isArray(E.messages)?E.messages:[],receiving:!!E.receiving,processing:!!E.processing}:null;return {id:e,card:b,card_data:f,requires:S,computed_values:C.computed_values,runtime_state:m,card_chats:u}}function ve(t){if(!t||typeof t!="object")throw new Error("payload must be an object");return (Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).map(r=>Bt(t,r.id))}function Se({boardPath:t,cardDefinitions:e,runtimeModels:r,graphState:n}){let s=Array.isArray(e)?e:[],o=Array.isArray(r)?r:[],i=new Map(o.map(f=>[f.id,f])),p=n.state?.tasks??{},b={};for(let f of o)f?.id&&(b[f.id]={schema_version:"v1",card_id:f.id,card_data:structuredClone(f.card_data??{}),computed_values:structuredClone(f.computed_values??{})});let C={};for(let f of Object.keys(p)){let m=p[f]?.data?.provides_data;if(m&&typeof m=="object")for(let k of Object.keys(m))C[k]=structuredClone(m[k]);}let w=s.map(f=>{let m=i.get(f.id)??{},k=p[f.id],S=typeof k?.status=="string"?k.status:Pt(m.card_data?.status),y=typeof k?.error=="string"?k.error:typeof m.card_data?.error=="string"?m.card_data.error:null;return {name:f.id,status:S,...y?{error:{message:y,code:"TASK_FAILED",at:k?.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(E=>E.bindTo):[f.id],provides_runtime:Object.keys(k?.data?.provides_data??{}).sort(),blocked_by:[],unblocks:[],runtime:{attempt_count:k?.executionCount??0,restart_count:k?.retryCount??0,in_progress_since:S==="in-progress"?k?.startedAt??null:null,last_transition_at:k?.lastUpdated??m.card_data?.lastRun??null,last_completed_at:k?.completedAt??null,last_restarted_at:k?.startedAt??null,status_age_ms:null}}});return {cardDefinitions:structuredClone(s),cardRuntimeById:b,dataObjectsByToken:C,statusSnapshot:{schema_version:"v1",meta:{board:{path:t??"browser-runtime"}},summary:{card_count:w.length,completed:w.filter(f=>f.status==="completed").length,eligible:0,pending:w.filter(f=>f.status==="pending").length,blocked:0,unresolved:0,failed:w.filter(f=>f.status==="failed").length,in_progress:w.filter(f=>f.status==="in-progress").length,orphan_cards:0,topology:{edge_count:0,max_fan_out_card:null,max_fan_out:0}},cards:w}}}
2
+ export{ke as LocalStorageService,Se as buildBrowserArtifactsFromRuntime,ye as createBoardLiveGraphRuntime,ve as selectAllLiveCardModels,Bt as selectLiveCardModel};//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
- import { C as CommandInput, a as CommandResult, L as LiveCard, b as CardAdminStore } from './board-live-cards-public-BF9FP0mL.cjs';
2
- import './storage-interface-BhAON-gW.cjs';
1
+ import { C as CommandInput, a as CommandResult, L as LiveCard, b as CardAdminStore } from './board-live-cards-public-BLXbcBNk.cjs';
2
+ import './storage-interface-B6ecOulj.cjs';
3
3
  import './execution-refs.cjs';
4
4
  import './types-BBhqYGhE.cjs';
5
5
 
@@ -1,5 +1,5 @@
1
- import { C as CommandInput, a as CommandResult, L as LiveCard, b as CardAdminStore } from './board-live-cards-public-dJAl5IL-.js';
2
- import './storage-interface-BhAON-gW.js';
1
+ import { C as CommandInput, a as CommandResult, L as LiveCard, b as CardAdminStore } from './board-live-cards-public-BZaNb2mi.js';
2
+ import './storage-interface-B6ecOulj.js';
3
3
  import './execution-refs.js';
4
4
  import './types-BBhqYGhE.js';
5
5
 
@@ -1,3 +1,3 @@
1
- 'use strict';var s="b64:";function l(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let a of t)o+=String.fromCharCode(a);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function i(e){return `${s}${l(JSON.stringify(e))}`}function c(e,t){let r;return /\.m?js$/i.test(e)?r="local-node":/\.py$/i.test(e)?r="local-python":r="local-process",{meta:"task-executor",howToRun:r,whatToRun:i({kind:"fs-path",value:e}),...t?{extra:t}:{}}}function f(e){return JSON.stringify(e)}function d(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}
1
+ 'use strict';var s="b64:";function l(e){let r=new TextEncoder().encode(e),t=globalThis.Buffer,n;if(t)n=t.from(r).toString("base64");else if(typeof btoa=="function"){let o="";for(let a of r)o+=String.fromCharCode(a);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function i(e){return `${s}${l(JSON.stringify(e))}`}function c(e,r){let t;return /\.m?js$/i.test(e)?t="local-node":/\.py$/i.test(e)?t="local-python":t="local-process",{meta:"task-executor",howToRun:t,whatToRun:i({kind:"fs-path",value:e}),...r?{extra:r}:{}}}function f(e){return JSON.stringify(e)}function d(e){let r;try{r=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof r!="object"||r===null||typeof r.howToRun!="string"||typeof r.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return r}
2
2
  exports.executionRefFromScriptPath=c;exports.parseExecutionRef=d;exports.serializeExecutionRef=f;//# sourceMappingURL=execution-refs.cjs.map
3
3
  //# sourceMappingURL=execution-refs.cjs.map
@@ -1,3 +1,3 @@
1
- var s="b64:";function l(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let a of t)o+=String.fromCharCode(a);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function i(e){return `${s}${l(JSON.stringify(e))}`}function c(e,t){let r;return /\.m?js$/i.test(e)?r="local-node":/\.py$/i.test(e)?r="local-python":r="local-process",{meta:"task-executor",howToRun:r,whatToRun:i({kind:"fs-path",value:e}),...t?{extra:t}:{}}}function f(e){return JSON.stringify(e)}function d(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}
1
+ var s="b64:";function l(e){let r=new TextEncoder().encode(e),t=globalThis.Buffer,n;if(t)n=t.from(r).toString("base64");else if(typeof btoa=="function"){let o="";for(let a of r)o+=String.fromCharCode(a);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function i(e){return `${s}${l(JSON.stringify(e))}`}function c(e,r){let t;return /\.m?js$/i.test(e)?t="local-node":/\.py$/i.test(e)?t="local-python":t="local-process",{meta:"task-executor",howToRun:t,whatToRun:i({kind:"fs-path",value:e}),...r?{extra:r}:{}}}function f(e){return JSON.stringify(e)}function d(e){let r;try{r=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof r!="object"||r===null||typeof r.howToRun!="string"||typeof r.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return r}
2
2
  export{c as executionRefFromScriptPath,d as parseExecutionRef,f as serializeExecutionRef};//# sourceMappingURL=execution-refs.js.map
3
3
  //# sourceMappingURL=execution-refs.js.map