yaml-flow 8.4.16 → 8.4.18

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 (56) 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 +6 -6
  4. package/cli/browser-api/board-live-cards-browser-adapter.d.ts +1 -1
  5. package/cli/bundled/board-live-cards-cli.mjs +18 -18
  6. package/cli/bundled/card-store-cli.mjs +78 -78
  7. package/cli/bundled/chat-store-cli.mjs +10 -10
  8. package/cli/{types-YNCagczT.d.ts → types-juH2nFpz.d.ts} +12 -0
  9. package/examples/board/demo-shell-with-server.html +2 -2
  10. package/examples/board/doc.html +2 -2
  11. package/examples/board-local/demo-shell-localstorage.html +3 -3
  12. package/lib/artifacts-store-public.d.cts +1 -1
  13. package/lib/artifacts-store-public.d.ts +1 -1
  14. package/lib/board-live-cards-node.cjs +12 -12
  15. package/lib/board-live-cards-node.d.cts +4 -4
  16. package/lib/board-live-cards-node.d.ts +4 -4
  17. package/lib/board-live-cards-node.js +12 -12
  18. package/lib/{board-live-cards-public-CQ82CDdS.d.cts → board-live-cards-public-B4RcYPC_.d.cts} +12 -0
  19. package/lib/{board-live-cards-public-CtlVp0L3.d.ts → board-live-cards-public-ydXuA4zh.d.ts} +12 -0
  20. package/lib/board-live-cards-public.cjs +2 -2
  21. package/lib/board-live-cards-public.d.cts +1 -1
  22. package/lib/board-live-cards-public.d.ts +1 -1
  23. package/lib/board-live-cards-public.js +2 -2
  24. package/lib/board-live-cards-server-runtime.cjs +4 -4
  25. package/lib/board-live-cards-server-runtime.d.cts +2 -2
  26. package/lib/board-live-cards-server-runtime.d.ts +2 -2
  27. package/lib/board-live-cards-server-runtime.js +4 -4
  28. package/lib/board-livegraph-runtime/index.cjs +1 -1
  29. package/lib/board-livegraph-runtime/index.d.cts +1 -1
  30. package/lib/board-livegraph-runtime/index.d.ts +1 -1
  31. package/lib/board-livegraph-runtime/index.js +1 -1
  32. package/lib/card-store-public.cjs +1 -1
  33. package/lib/card-store-public.d.cts +12 -1
  34. package/lib/card-store-public.d.ts +12 -1
  35. package/lib/card-store-public.js +1 -1
  36. package/lib/chat-store-public.cjs +1 -1
  37. package/lib/chat-store-public.d.cts +5 -2
  38. package/lib/chat-store-public.d.ts +5 -2
  39. package/lib/chat-store-public.js +1 -1
  40. package/lib/continuous-event-graph/index.cjs +2 -2
  41. package/lib/continuous-event-graph/index.d.cts +2 -2
  42. package/lib/continuous-event-graph/index.d.ts +2 -2
  43. package/lib/continuous-event-graph/index.js +2 -2
  44. package/lib/index.cjs +12 -12
  45. package/lib/index.d.cts +1 -1
  46. package/lib/index.d.ts +1 -1
  47. package/lib/index.js +12 -12
  48. package/lib/{live-cards-bridge-b25aAVvE.d.cts → live-cards-bridge-Bwi-lbBT.d.cts} +2 -0
  49. package/lib/{live-cards-bridge-DC_ZU0eS.d.ts → live-cards-bridge-YL6AWawT.d.ts} +2 -0
  50. package/lib/server-runtime/index.cjs +4 -4
  51. package/lib/server-runtime/index.d.cts +3 -3
  52. package/lib/server-runtime/index.d.ts +3 -3
  53. package/lib/server-runtime/index.js +4 -4
  54. package/lib/{types-vTfV-Zkn.d.ts → types-1L1D33mr.d.ts} +1 -1
  55. package/lib/{types-D1R0JHIs.d.cts → types-D501gMQt.d.cts} +1 -1
  56. package/package.json +1 -1
@@ -1,3 +1,3 @@
1
- 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var lt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));lt("./jsonata-sync.cjs");var mt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),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}}}
1
+ 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var lt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));lt("./jsonata-sync.cjs");var mt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),N=mt("./jsonata-sync.cjs"),J=N;function K(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 X(t,e,r){let n=e.split("."),s=t;for(let a=0;a<n.length-1;a++)(s[n[a]]==null||typeof s[n[a]]!="object")&&(s[n[a]]={}),s=s[n[a]];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 a=await N(s.expr).evaluate(n);X(t.computed_values,s.bindTo,a),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 a of t.compute)try{let i=J(a.expr).evaluate(n);X(t.computed_values,a.bindTo,i),n.computed_values=t.computed_values;}catch(i){let c=i instanceof Error?i.message:String(i);s.push({bindTo:a.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 N(t).evaluate(n)}function vt(t,e){return e.startsWith("fetched_sources.")?K(t._sourcesData??{},e.slice(16)):K(t,e)}var V=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 a=n;(typeof a.bindTo!="string"||!a.bindTo)&&e.push(`provides[${s}]: missing required "bindTo" string`),(typeof a.ref!="string"||!a.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 a=n;(typeof a.bindTo!="string"||!a.bindTo)&&e.push(`compute[${s}]: missing required "bindTo" property`),(typeof a.expr!="string"||!a.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((a,i)=>{if(!a||typeof a!="object"||Array.isArray(a))e.push(`source_defs[${i}]: must be an object`);else {let c=a;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,a)=>{if(!s||typeof s!="object"){e.push(`view.elements[${a}]: must be an object`);return}!s.kind||typeof s.kind!="string"?e.push(`view.elements[${a}].kind: required, must be a string`):V.has(s.kind)||e.push(`view.elements[${a}].kind: unknown kind "${s.kind}". Valid: ${[...V].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&e.push(`view.elements[${a}].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[a,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[a]=await N(i).evaluate(r);}catch{s[a]=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[a,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[a]=J(i).evaluate(r);}catch{s[a]=void 0;}}return {...n,_projections:s}})}var P={run:ht,runSync:kt,eval:yt,resolve:vt,validate:bt,enrichSources:wt,enrichSourcesSync:_t};var O={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function x(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function G(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function Y(t){return t.tasks??{}}function U(t){return t?t.status===O.FAILED||t.status===O.INACTIVATED:false}function W(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function z(t){return t.maxExecutions}function Q(t,e){let r=new Set;for(let[n,s]of Object.entries(e))if(s.status===O.COMPLETED){let a=t.tasks[n];a&&x(a).forEach(c=>r.add(c));}return Array.from(r)}function Z(t,e){let r={};return t.forEach(n=>{let s=e[n];if(!s)return;x(s).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function tt(t,e,r){let n=t.tasks[e]??q(),s={};if(r){let i=r.tasks[e],c=G(i);for(let p of c)for(let[h,T]of Object.entries(r.tasks))if(x(T).includes(p)){let b=t.tasks[h];b?.lastDataHash&&(s[p]=b.lastDataHash);break}}let a={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...t,tasks:{...t.tasks,[e]:a},lastUpdated:new Date().toISOString()}}function et(t,e,r,n,s,a){let i=t.tasks[r]??q(),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=x(c);let h=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let g=c.requires??[];for(let k of g)for(let[m,v]of Object.entries(e.tasks))if(x(v).includes(k)){let y=t.tasks[m];y?.lastDataHash&&(h[k]=y.lastDataHash);break}}let T={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:s,data:a,lastConsumedHashes:h,error:void 0},b=[...new Set([...t.availableOutputs,...p])];return {...t,tasks:{...t.tasks,[r]:T},availableOutputs:b,lastUpdated:new Date().toISOString()}}function rt(t,e,r,n){let s=t.tasks[r]??q(),a=e.tasks[r];if(a?.retry){let p=s.retryCount+1;if(p<=a.retry.max_attempts){let h={...s,status:"not-started",retryCount:p,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:h},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(a?.on_failure&&a.on_failure.length>0&&(c=[...new Set([...t.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&i.executionCount>=a.circuit_breaker.max_executions){let p=a.circuit_breaker.on_break;c=[...new Set([...c,...p])];}return {...t,tasks:{...t.tasks,[r]:i},availableOutputs:c,lastUpdated:new Date().toISOString()}}function nt(t,e,r,n){let s=t.tasks[e]??q(),a={...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]:a},lastUpdated:new Date().toISOString()}}function st(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 q(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function ot(t,e){let r=e??`live-${Date.now()}`,n={};for(let a of Object.keys(t.tasks))n[a]=ut();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:tt(n,e.taskName,r)};case "task-completed":return {config:r,state:et(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:rt(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:nt(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:st(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 at(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]:ut()},lastUpdated:new Date().toISOString()}}}function Tt(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:s,...a}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:a,lastUpdated:new Date().toISOString()}}}function At(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=G(n),a=r.filter(i=>!s.includes(i));return a.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...s,...a]}}},state:t.state}}function Et(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=G(n),a=s.filter(i=>!r.includes(i));return a.length===s.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:a}}},state:t.state}}function xt(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=x(n),a=r.filter(i=>!s.includes(i));return a.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...s,...a]}}},state:t.state}}function Ot(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=x(n),a=s.filter(i=>!r.includes(i));return a.length===s.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:a}}},state:t.state}}function it(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function ut(){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 B(t){let{config:e,state:r}=t,n=Y(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=jt(n),i=Q(e,r.tasks),c=new Set([...i,...r.availableOutputs]),p=[],h=[],T=[],b=[];for(let[k,m]of Object.entries(n)){let v=r.tasks[k],y=W(m,e.settings),A=y!=="once";if(v?.status===O.RUNNING||U(v))continue;let D=z(m);if(D!==void 0&&v&&v.executionCount>=D||m.circuit_breaker&&v&&v.executionCount>=m.circuit_breaker.max_executions||!A&&v?.status===O.COMPLETED)continue;if(A&&v?.status===O.COMPLETED){let f=G(m),u=false;switch(y){case "data-changed":{f.length>0&&f.some(C=>{for(let[_,E]of Object.entries(n))if(x(E).includes(C)){let R=r.tasks[_];if(!R)continue;let L=v.lastConsumedHashes?.[C];return R.lastDataHash==null?R.executionCount>v.lastEpoch:R.lastDataHash!==L}return false})||(u=true);break}case "epoch-changed":{f.length>0&&f.some(C=>{for(let[_,E]of Object.entries(n))if(x(E).includes(C)){let R=r.tasks[_];if(R&&R.executionCount>v.lastEpoch)return true}return false})||(u=true);break}case "time-based":{let w=m.refreshInterval??0;if(w<=0){u=true;break}let C=v.completedAt;if(!C){u=true;break}(Date.now()-Date.parse(C))/1e3<w&&(u=true);break}case "manual":u=true;break}if(u)continue}let o=G(m);if(o.length===0){p.push(k);continue}let d=[],l=[],S=[];for(let f of o){if(c.has(f))continue;let u=a[f]||[];u.length===0?d.push(f):u.every(C=>U(r.tasks[C]))?S.push({token:f,failedProducer:u[0]}):l.push(f);}d.length>0?T.push({taskName:k,missingTokens:d}):S.length>0?b.push({taskName:k,failedTokens:S.map(f=>f.token),failedProducers:[...new Set(S.map(f=>f.failedProducer))]}):l.length>0?h.push({taskName:k,waitingOn:l}):p.push(k);}let g={};if(p.length>1){let k=Z(p,n);for(let[m,v]of Object.entries(k))v.length>1&&(g[m]=v);}return {eligible:p,pending:h,unresolved:T,blocked:b,conflicts:g}}function jt(t){let e={};for(let[r,n]of Object.entries(t)){for(let s of x(n))e[s]||(e[s]=[]),e[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let a of s)e[a]||(e[a]=[]),e[a].includes(r)||e[a].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 F(t){let e=$(t);return Dt(e)}function $(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map($).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+$(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 a=0;a<n.length;a++)s[a]=n.charCodeAt(a);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function ct(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 dt(t,e,r){let{handlers:n,onNodeRemoved:s,onDrain:a}=e,i=new I,c="state"in t&&"config"in t?t:ot(t,r),p=false,h=new Set,T=new Map(Object.entries(n)),b=new I,g=false,k=false;function m(){if(!p){if(g){k=true;return}g=true;try{do k=!1,v();while(k)}finally{g=false;}}}function v(){let o=b.drain(),d=i.drain(),l=[...o,...d];if(l.length>0&&(c=at(c,l),s)){for(let f of l)if(f.type==="task-removal")try{s(f.taskName);}catch(u){console.warn("[reactive] onNodeRemoved failed:",u instanceof Error?u.message:String(u));}}let S=B(c);l.length>0&&a?.(l,c,S);for(let f of S.eligible)D(f);for(let f of l)if(f.type==="task-progress"){let{taskName:u,update:w}=f;if(!c.config.tasks[u])continue;let _=c.state.tasks[u];if(!_||_.status!=="running")continue;let E=ct(u),R=A(u,E,w).catch(L=>{p||(b.append({type:"task-failed",taskName:u,error:L.message??String(L),timestamp:new Date().toISOString()}),m());}).finally(()=>{h.delete(R);});h.add(R);}}function y(o){let l=c.config.tasks[o].requires??[],S=new Map;for(let[u,w]of Object.entries(c.config.tasks))for(let C of w.provides??[])S.set(C,u);let f={};for(let u of l){let w=S.get(u);w?f[u]=c.state.tasks[w]?.data:f[u]=void 0;}return f}async function A(o,d,l){let S=c.config.tasks[o],f=S.taskHandlers??[],u=y(o);for(let w of f){let C=T.get(w);if(!C)throw new Error(`Handler '${w}' not found in registry (task '${o}')`);let _={nodeId:o,state:u,taskState:c.state.tasks[o],config:S,callbackToken:d,update:l};if(await C(_)==="task-initiate-failure")throw new Error(`Handler '${w}' returned task-initiate-failure (task '${o}')`)}}function D(o){let l=c.config.tasks[o]?.taskHandlers;if(!l||l.length===0)return;b.append({type:"task-started",taskName:o,timestamp:new Date().toISOString()}),m();let S=ct(o),f=A(o,S).catch(u=>{p||(b.append({type:"task-failed",taskName:o,error:u.message??String(u),timestamp:new Date().toISOString()}),m());}).finally(()=>{h.delete(f);});h.add(f);}return {push(o){p||(o.type==="task-completed"&&o.data&&!o.dataHash&&(o={...o,dataHash:F(o.data)}),i.append(o),m());},pushAll(o){if(!p){for(let d of o)d.type==="task-completed"&&d.data&&!d.dataHash?i.append({...d,dataHash:F(d.data)}):i.append(d);m();}},resolveCallback(o,d,l){if(p)return;let S=Nt(o);if(!S)return;let{taskName:f}=S;if(c.config.tasks[f]){if(l&&l.length>0)i.append({type:"task-failed",taskName:f,error:l.join("; "),timestamp:new Date().toISOString()});else {let u=d&&Object.keys(d).length>0?F(d):void 0;i.append({type:"task-completed",taskName:f,data:d,dataHash:u,timestamp:new Date().toISOString()});}m();}},addNode(o,d){p||(i.append({type:"task-upsert",taskName:o,taskConfig:d,timestamp:new Date().toISOString()}),m());},removeNode(o){p||(i.append({type:"task-removal",taskName:o,timestamp:new Date().toISOString()}),m());},addRequires(o,d){p||(i.append({type:"node-requires-add",nodeName:o,tokens:d,timestamp:new Date().toISOString()}),m());},removeRequires(o,d){p||(i.append({type:"node-requires-remove",nodeName:o,tokens:d,timestamp:new Date().toISOString()}),m());},addProvides(o,d){p||(i.append({type:"node-provides-add",nodeName:o,tokens:d,timestamp:new Date().toISOString()}),m());},removeProvides(o,d){p||(i.append({type:"node-provides-remove",nodeName:o,tokens:d,timestamp:new Date().toISOString()}),m());},registerHandler(o,d){T.set(o,d);},unregisterHandler(o){T.delete(o);},retrigger(o){p||c.config.tasks[o]&&(i.append({type:"task-restart",taskName:o,timestamp:new Date().toISOString()}),m());},retriggerAll(o){if(!p){for(let d of o)c.config.tasks[d]&&i.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});m();}},snapshot(){return it(c)},getState(){return c},getSchedule(){return B(c)},async waitForHandlers(){h.size>0&&await Promise.allSettled([...h]);},async dispose(o){o?.wait&&h.size>0&&await Promise.allSettled([...h]),p=true;}}}function j(t){return JSON.parse(JSON.stringify(t))}function M(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 a of s)e.set(a.bindTo,r);}return e}function H(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 o of n){if(s.has(o.id))throw new Error(`Duplicate card ID: "${o.id}"`);s.set(o.id,j(o));}let a=new Set,i=e.taskExecutor,c=e.sourceAdapters??{},p=e.defaultSourceAdapter,h=null,T=(o,d)=>{let l={events:o,graph:d,nodes:A()};for(let S of a)S(l);},b=o=>async d=>{let l=s.get(o);if(!l)return "task-initiate-failure";let S={};for(let _ of l.requires??[]){let E=d.state[_];if(!E||typeof E!="object")continue;let R=E.provides_data;!R||typeof R!="object"||Object.prototype.hasOwnProperty.call(R,_)&&(S[_]=R[_]);}let f={};if(l.source_defs&&l.source_defs.length>0){let _=c[o]??p,E=i?await i({card:l,input:d}):_?await _({card:l,input:d}):void 0;if(E&&typeof E=="object")for(let R of l.source_defs)Object.prototype.hasOwnProperty.call(E,R.bindTo)?f[R.bindTo]=E[R.bindTo]:l.source_defs.length===1&&(f[R.bindTo]=E);}let u={id:l.id,card_data:j(l.card_data??{}),requires:S,source_defs:l.source_defs,compute:l.compute};u._sourcesData=f,u.compute&&u.compute.length>0&&await P.run(u,{sourcesData:f});let w={};if(l.provides&&l.provides.length>0)for(let{bindTo:_,ref:E}of l.provides)w[_]=P.resolve(u,E);else w[l.id]={...u.card_data??{},...u.computed_values??{},...u._sourcesData??{}};let C={provides_data:w,card_data:u.card_data??{},computed_values:u.computed_values??{},fetched_sources:f,requires:S};return h?.resolveCallback(d.callbackToken,C),"task-initiated"},g={},k={};for(let[o,d]of s.entries())H(s,o),g[o]=M(d),k[o]=b(o);let m={id:r.id??`browser-board-${Date.now()}`,settings:{completion:"manual",execution_mode:"eligibility-mode",...r.settings??{},...e.graphSettings??{}},tasks:g},v=e.reactiveOptions?.onDrain,y=dt(m,{...e.reactiveOptions??{},handlers:k,onDrain:(o,d,l)=>{v?.(o,d,l),T(o,d);}},e.executionId);h=y;function A(){let o=y.getState(),d=[];for(let[l,S]of s.entries()){let f=o.state.tasks[l]?.data,u=o.state.tasks[l],w={...S.card_data??{},...f&&typeof f.card_data=="object"?f.card_data:{}},C=u?.status==="running"?"loading":u?.status,_={...w,...C?{status:C}:{},...u?.lastUpdated?{lastRun:u.lastUpdated}:{},...u?.status==="failed"&&u.error?{error:u.error}:{}};d.push({id:l,card:j(S),card_data:_,requires:f&&typeof f.requires=="object"?j(f.requires):{},computed_values:f&&typeof f.computed_values=="object"?j(f.computed_values):{},runtime_state:u?j(u):{}});}return d}return {getGraph:()=>y,getState:()=>y.getState(),getSchedule:()=>y.getSchedule(),getNodes:()=>A(),getBoard:()=>({...r,nodes:A()}),subscribe(o){return a.add(o),o({events:[],graph:y.getState(),nodes:A()}),()=>a.delete(o)},addCard(o){if(s.has(o.id))throw new Error(`Card "${o.id}" already exists`);s.set(o.id,j(o)),H(s,o.id),y.registerHandler(o.id,b(o.id)),y.addNode(o.id,M(o));},upsertCard(o){s.set(o.id,j(o)),H(s,o.id),y.registerHandler(o.id,b(o.id)),y.addNode(o.id,M(o));},removeCard(o){s.delete(o),y.unregisterHandler(o),y.removeNode(o);},patchCardState(o,d){let l=s.get(o);if(!l)throw new Error(`Card "${o}" not found`);l.card_data={...l.card_data??{},...d},y.retrigger(o);},retrigger(o){y.retrigger(o);},retriggerAll(){y.retriggerAll(Array.from(s.keys()));},push(o){y.push(o);},pushAll(o){y.pushAll(o);},dispose(){a.clear(),y.dispose();}}}function pt(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(o=>o.id===e);if(!n)throw new Error(`cardDefinitions has no entry with id ${e}`);let s=t.statusSnapshot&&typeof t.statusSnapshot=="object"?t.statusSnapshot:{},a=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(o=>o.name===e),h=structuredClone(n),T=Ut(e,a[e]),g={...h.card_data&&typeof h.card_data=="object"&&!Array.isArray(h.card_data)?h.card_data:{},...T.card_data||{},status:pt(p?.status),lastRun:p?.runtime?.last_transition_at??null};p?.error?.message&&(g.error=p.error.message);let k=p?{task_status:p.status??null,card_status:pt(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:g.status??"fresh",runtime:{last_transition_at:g.lastRun??null},error:g.error?{message:g.error}:null,blocked_by:[],requires_missing:[]},m=Array.isArray(h.requires)?h.requires:[],v={};for(let[o,d]of Object.entries(i))v[o]=structuredClone(d);for(let o of m)Object.prototype.hasOwnProperty.call(v,o)||(v[o]=null);let A=(t.cardChatsByCardId&&typeof t.cardChatsByCardId=="object"?t.cardChatsByCardId:{})[e],D=A?{messages:Array.isArray(A.messages)?A.messages:[],receiving:!!A.receiving,processing:!!A.processing}:null;return {id:e,card:h,card_data:g,requires:v,computed_values:T.computed_values,runtime_state:k,card_chats:D}}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:[],a=Array.isArray(r)?r:[],i=new Map(a.map(g=>[g.id,g])),p=n.state?.tasks??{},h={};for(let g of a)g?.id&&(h[g.id]={schema_version:"v1",card_id:g.id,card_data:structuredClone(g.card_data??{}),computed_values:structuredClone(g.computed_values??{})});let T={};for(let g of Object.keys(p)){let k=p[g]?.data?.provides_data;if(k&&typeof k=="object")for(let m of Object.keys(k))T[m]=structuredClone(k[m]);}let b=s.map(g=>{let k=i.get(g.id)??{},m=p[g.id],v=typeof m?.status=="string"?m.status:Pt(k.card_data?.status),y=typeof m?.error=="string"?m.error:typeof k.card_data?.error=="string"?k.card_data.error:null;return {name:g.id,status:v,...y?{error:{message:y,code:"TASK_FAILED",at:m?.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(A=>A.bindTo):[g.id],provides_runtime:Object.keys(m?.data?.provides_data??{}).sort(),blocked_by:[],unblocks:[],runtime:{attempt_count:m?.executionCount??0,restart_count:m?.retryCount??0,in_progress_since:v==="in-progress"?m?.startedAt??null:null,last_transition_at:m?.lastUpdated??k.card_data?.lastRun??null,last_completed_at:m?.completedAt??null,last_restarted_at:m?.startedAt??null,status_age_ms:null}}});return {cardDefinitions:structuredClone(s),cardRuntimeById:h,dataObjectsByToken:T,statusSnapshot:{schema_version:"v1",meta:{board:{path:t??"browser-runtime"}},summary:{card_count:b.length,completed:b.filter(g=>g.status==="completed").length,eligible:0,pending:b.filter(g=>g.status==="pending").length,blocked:0,unresolved:0,failed:b.filter(g=>g.status==="failed").length,in_progress:b.filter(g=>g.status==="in-progress").length,orphan_cards:0,topology:{edge_count:0,max_fan_out_card:null,max_fan_out:0}},cards:b}}}
2
2
  exports.LocalStorageService=ke;exports.buildBrowserArtifactsFromRuntime=Se;exports.createBoardLiveGraphRuntime=ye;exports.selectAllLiveCardModels=ve;exports.selectLiveCardModel=Bt;//# sourceMappingURL=index.cjs.map
3
3
  //# sourceMappingURL=index.cjs.map
@@ -1,5 +1,5 @@
1
1
  import { G as GraphConfig, f as GraphEvent } from '../types-BBhqYGhE.cjs';
2
- import { R as ReactiveGraph, d as LiveGraph, a as LiveCard, s as schedule, h as TaskHandlerInput, g as ReactiveGraphOptions, L as LiveBoard } from '../live-cards-bridge-b25aAVvE.cjs';
2
+ import { R as ReactiveGraph, d as LiveGraph, a as LiveCard, s as schedule, h as TaskHandlerInput, g as ReactiveGraphOptions, L as LiveBoard } from '../live-cards-bridge-Bwi-lbBT.cjs';
3
3
 
4
4
  interface BrowserSourceAdapterContext {
5
5
  card: LiveCard;
@@ -1,5 +1,5 @@
1
1
  import { G as GraphConfig, f as GraphEvent } from '../types-BBhqYGhE.js';
2
- import { R as ReactiveGraph, d as LiveGraph, a as LiveCard, s as schedule, h as TaskHandlerInput, g as ReactiveGraphOptions, L as LiveBoard } from '../live-cards-bridge-DC_ZU0eS.js';
2
+ import { R as ReactiveGraph, d as LiveGraph, a as LiveCard, s as schedule, h as TaskHandlerInput, g as ReactiveGraphOptions, L as LiveBoard } from '../live-cards-bridge-YL6AWawT.js';
3
3
 
4
4
  interface BrowserSourceAdapterContext {
5
5
  card: LiveCard;
@@ -1,3 +1,3 @@
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}}}
1
+ import {createRequire}from'module';import'ajv-formats';var lt=createRequire(import.meta.url);lt("./jsonata-sync.cjs");var mt=createRequire(import.meta.url),N=mt("./jsonata-sync.cjs"),J=N;function K(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 X(t,e,r){let n=e.split("."),s=t;for(let a=0;a<n.length-1;a++)(s[n[a]]==null||typeof s[n[a]]!="object")&&(s[n[a]]={}),s=s[n[a]];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 a=await N(s.expr).evaluate(n);X(t.computed_values,s.bindTo,a),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 a of t.compute)try{let i=J(a.expr).evaluate(n);X(t.computed_values,a.bindTo,i),n.computed_values=t.computed_values;}catch(i){let c=i instanceof Error?i.message:String(i);s.push({bindTo:a.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 N(t).evaluate(n)}function vt(t,e){return e.startsWith("fetched_sources.")?K(t._sourcesData??{},e.slice(16)):K(t,e)}var V=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 a=n;(typeof a.bindTo!="string"||!a.bindTo)&&e.push(`provides[${s}]: missing required "bindTo" string`),(typeof a.ref!="string"||!a.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 a=n;(typeof a.bindTo!="string"||!a.bindTo)&&e.push(`compute[${s}]: missing required "bindTo" property`),(typeof a.expr!="string"||!a.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((a,i)=>{if(!a||typeof a!="object"||Array.isArray(a))e.push(`source_defs[${i}]: must be an object`);else {let c=a;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,a)=>{if(!s||typeof s!="object"){e.push(`view.elements[${a}]: must be an object`);return}!s.kind||typeof s.kind!="string"?e.push(`view.elements[${a}].kind: required, must be a string`):V.has(s.kind)||e.push(`view.elements[${a}].kind: unknown kind "${s.kind}". Valid: ${[...V].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&e.push(`view.elements[${a}].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[a,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[a]=await N(i).evaluate(r);}catch{s[a]=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[a,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[a]=J(i).evaluate(r);}catch{s[a]=void 0;}}return {...n,_projections:s}})}var P={run:ht,runSync:kt,eval:yt,resolve:vt,validate:bt,enrichSources:wt,enrichSourcesSync:_t};var O={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function x(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function G(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function Y(t){return t.tasks??{}}function U(t){return t?t.status===O.FAILED||t.status===O.INACTIVATED:false}function W(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function z(t){return t.maxExecutions}function Q(t,e){let r=new Set;for(let[n,s]of Object.entries(e))if(s.status===O.COMPLETED){let a=t.tasks[n];a&&x(a).forEach(c=>r.add(c));}return Array.from(r)}function Z(t,e){let r={};return t.forEach(n=>{let s=e[n];if(!s)return;x(s).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function tt(t,e,r){let n=t.tasks[e]??q(),s={};if(r){let i=r.tasks[e],c=G(i);for(let p of c)for(let[h,T]of Object.entries(r.tasks))if(x(T).includes(p)){let b=t.tasks[h];b?.lastDataHash&&(s[p]=b.lastDataHash);break}}let a={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...t,tasks:{...t.tasks,[e]:a},lastUpdated:new Date().toISOString()}}function et(t,e,r,n,s,a){let i=t.tasks[r]??q(),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=x(c);let h=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let g=c.requires??[];for(let k of g)for(let[m,v]of Object.entries(e.tasks))if(x(v).includes(k)){let y=t.tasks[m];y?.lastDataHash&&(h[k]=y.lastDataHash);break}}let T={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:s,data:a,lastConsumedHashes:h,error:void 0},b=[...new Set([...t.availableOutputs,...p])];return {...t,tasks:{...t.tasks,[r]:T},availableOutputs:b,lastUpdated:new Date().toISOString()}}function rt(t,e,r,n){let s=t.tasks[r]??q(),a=e.tasks[r];if(a?.retry){let p=s.retryCount+1;if(p<=a.retry.max_attempts){let h={...s,status:"not-started",retryCount:p,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:h},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(a?.on_failure&&a.on_failure.length>0&&(c=[...new Set([...t.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&i.executionCount>=a.circuit_breaker.max_executions){let p=a.circuit_breaker.on_break;c=[...new Set([...c,...p])];}return {...t,tasks:{...t.tasks,[r]:i},availableOutputs:c,lastUpdated:new Date().toISOString()}}function nt(t,e,r,n){let s=t.tasks[e]??q(),a={...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]:a},lastUpdated:new Date().toISOString()}}function st(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 q(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function ot(t,e){let r=e??`live-${Date.now()}`,n={};for(let a of Object.keys(t.tasks))n[a]=ut();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:tt(n,e.taskName,r)};case "task-completed":return {config:r,state:et(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:rt(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:nt(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:st(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 at(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]:ut()},lastUpdated:new Date().toISOString()}}}function Tt(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:s,...a}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:a,lastUpdated:new Date().toISOString()}}}function At(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=G(n),a=r.filter(i=>!s.includes(i));return a.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...s,...a]}}},state:t.state}}function Et(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=G(n),a=s.filter(i=>!r.includes(i));return a.length===s.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:a}}},state:t.state}}function xt(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=x(n),a=r.filter(i=>!s.includes(i));return a.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...s,...a]}}},state:t.state}}function Ot(t,e,r){let n=t.config.tasks[e];if(!n)return t;let s=x(n),a=s.filter(i=>!r.includes(i));return a.length===s.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:a}}},state:t.state}}function it(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function ut(){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 B(t){let{config:e,state:r}=t,n=Y(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=jt(n),i=Q(e,r.tasks),c=new Set([...i,...r.availableOutputs]),p=[],h=[],T=[],b=[];for(let[k,m]of Object.entries(n)){let v=r.tasks[k],y=W(m,e.settings),A=y!=="once";if(v?.status===O.RUNNING||U(v))continue;let D=z(m);if(D!==void 0&&v&&v.executionCount>=D||m.circuit_breaker&&v&&v.executionCount>=m.circuit_breaker.max_executions||!A&&v?.status===O.COMPLETED)continue;if(A&&v?.status===O.COMPLETED){let f=G(m),u=false;switch(y){case "data-changed":{f.length>0&&f.some(C=>{for(let[_,E]of Object.entries(n))if(x(E).includes(C)){let R=r.tasks[_];if(!R)continue;let L=v.lastConsumedHashes?.[C];return R.lastDataHash==null?R.executionCount>v.lastEpoch:R.lastDataHash!==L}return false})||(u=true);break}case "epoch-changed":{f.length>0&&f.some(C=>{for(let[_,E]of Object.entries(n))if(x(E).includes(C)){let R=r.tasks[_];if(R&&R.executionCount>v.lastEpoch)return true}return false})||(u=true);break}case "time-based":{let w=m.refreshInterval??0;if(w<=0){u=true;break}let C=v.completedAt;if(!C){u=true;break}(Date.now()-Date.parse(C))/1e3<w&&(u=true);break}case "manual":u=true;break}if(u)continue}let o=G(m);if(o.length===0){p.push(k);continue}let d=[],l=[],S=[];for(let f of o){if(c.has(f))continue;let u=a[f]||[];u.length===0?d.push(f):u.every(C=>U(r.tasks[C]))?S.push({token:f,failedProducer:u[0]}):l.push(f);}d.length>0?T.push({taskName:k,missingTokens:d}):S.length>0?b.push({taskName:k,failedTokens:S.map(f=>f.token),failedProducers:[...new Set(S.map(f=>f.failedProducer))]}):l.length>0?h.push({taskName:k,waitingOn:l}):p.push(k);}let g={};if(p.length>1){let k=Z(p,n);for(let[m,v]of Object.entries(k))v.length>1&&(g[m]=v);}return {eligible:p,pending:h,unresolved:T,blocked:b,conflicts:g}}function jt(t){let e={};for(let[r,n]of Object.entries(t)){for(let s of x(n))e[s]||(e[s]=[]),e[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let a of s)e[a]||(e[a]=[]),e[a].includes(r)||e[a].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 F(t){let e=$(t);return Dt(e)}function $(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map($).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+$(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 a=0;a<n.length;a++)s[a]=n.charCodeAt(a);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function ct(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 dt(t,e,r){let{handlers:n,onNodeRemoved:s,onDrain:a}=e,i=new I,c="state"in t&&"config"in t?t:ot(t,r),p=false,h=new Set,T=new Map(Object.entries(n)),b=new I,g=false,k=false;function m(){if(!p){if(g){k=true;return}g=true;try{do k=!1,v();while(k)}finally{g=false;}}}function v(){let o=b.drain(),d=i.drain(),l=[...o,...d];if(l.length>0&&(c=at(c,l),s)){for(let f of l)if(f.type==="task-removal")try{s(f.taskName);}catch(u){console.warn("[reactive] onNodeRemoved failed:",u instanceof Error?u.message:String(u));}}let S=B(c);l.length>0&&a?.(l,c,S);for(let f of S.eligible)D(f);for(let f of l)if(f.type==="task-progress"){let{taskName:u,update:w}=f;if(!c.config.tasks[u])continue;let _=c.state.tasks[u];if(!_||_.status!=="running")continue;let E=ct(u),R=A(u,E,w).catch(L=>{p||(b.append({type:"task-failed",taskName:u,error:L.message??String(L),timestamp:new Date().toISOString()}),m());}).finally(()=>{h.delete(R);});h.add(R);}}function y(o){let l=c.config.tasks[o].requires??[],S=new Map;for(let[u,w]of Object.entries(c.config.tasks))for(let C of w.provides??[])S.set(C,u);let f={};for(let u of l){let w=S.get(u);w?f[u]=c.state.tasks[w]?.data:f[u]=void 0;}return f}async function A(o,d,l){let S=c.config.tasks[o],f=S.taskHandlers??[],u=y(o);for(let w of f){let C=T.get(w);if(!C)throw new Error(`Handler '${w}' not found in registry (task '${o}')`);let _={nodeId:o,state:u,taskState:c.state.tasks[o],config:S,callbackToken:d,update:l};if(await C(_)==="task-initiate-failure")throw new Error(`Handler '${w}' returned task-initiate-failure (task '${o}')`)}}function D(o){let l=c.config.tasks[o]?.taskHandlers;if(!l||l.length===0)return;b.append({type:"task-started",taskName:o,timestamp:new Date().toISOString()}),m();let S=ct(o),f=A(o,S).catch(u=>{p||(b.append({type:"task-failed",taskName:o,error:u.message??String(u),timestamp:new Date().toISOString()}),m());}).finally(()=>{h.delete(f);});h.add(f);}return {push(o){p||(o.type==="task-completed"&&o.data&&!o.dataHash&&(o={...o,dataHash:F(o.data)}),i.append(o),m());},pushAll(o){if(!p){for(let d of o)d.type==="task-completed"&&d.data&&!d.dataHash?i.append({...d,dataHash:F(d.data)}):i.append(d);m();}},resolveCallback(o,d,l){if(p)return;let S=Nt(o);if(!S)return;let{taskName:f}=S;if(c.config.tasks[f]){if(l&&l.length>0)i.append({type:"task-failed",taskName:f,error:l.join("; "),timestamp:new Date().toISOString()});else {let u=d&&Object.keys(d).length>0?F(d):void 0;i.append({type:"task-completed",taskName:f,data:d,dataHash:u,timestamp:new Date().toISOString()});}m();}},addNode(o,d){p||(i.append({type:"task-upsert",taskName:o,taskConfig:d,timestamp:new Date().toISOString()}),m());},removeNode(o){p||(i.append({type:"task-removal",taskName:o,timestamp:new Date().toISOString()}),m());},addRequires(o,d){p||(i.append({type:"node-requires-add",nodeName:o,tokens:d,timestamp:new Date().toISOString()}),m());},removeRequires(o,d){p||(i.append({type:"node-requires-remove",nodeName:o,tokens:d,timestamp:new Date().toISOString()}),m());},addProvides(o,d){p||(i.append({type:"node-provides-add",nodeName:o,tokens:d,timestamp:new Date().toISOString()}),m());},removeProvides(o,d){p||(i.append({type:"node-provides-remove",nodeName:o,tokens:d,timestamp:new Date().toISOString()}),m());},registerHandler(o,d){T.set(o,d);},unregisterHandler(o){T.delete(o);},retrigger(o){p||c.config.tasks[o]&&(i.append({type:"task-restart",taskName:o,timestamp:new Date().toISOString()}),m());},retriggerAll(o){if(!p){for(let d of o)c.config.tasks[d]&&i.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});m();}},snapshot(){return it(c)},getState(){return c},getSchedule(){return B(c)},async waitForHandlers(){h.size>0&&await Promise.allSettled([...h]);},async dispose(o){o?.wait&&h.size>0&&await Promise.allSettled([...h]),p=true;}}}function j(t){return JSON.parse(JSON.stringify(t))}function M(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 a of s)e.set(a.bindTo,r);}return e}function H(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 o of n){if(s.has(o.id))throw new Error(`Duplicate card ID: "${o.id}"`);s.set(o.id,j(o));}let a=new Set,i=e.taskExecutor,c=e.sourceAdapters??{},p=e.defaultSourceAdapter,h=null,T=(o,d)=>{let l={events:o,graph:d,nodes:A()};for(let S of a)S(l);},b=o=>async d=>{let l=s.get(o);if(!l)return "task-initiate-failure";let S={};for(let _ of l.requires??[]){let E=d.state[_];if(!E||typeof E!="object")continue;let R=E.provides_data;!R||typeof R!="object"||Object.prototype.hasOwnProperty.call(R,_)&&(S[_]=R[_]);}let f={};if(l.source_defs&&l.source_defs.length>0){let _=c[o]??p,E=i?await i({card:l,input:d}):_?await _({card:l,input:d}):void 0;if(E&&typeof E=="object")for(let R of l.source_defs)Object.prototype.hasOwnProperty.call(E,R.bindTo)?f[R.bindTo]=E[R.bindTo]:l.source_defs.length===1&&(f[R.bindTo]=E);}let u={id:l.id,card_data:j(l.card_data??{}),requires:S,source_defs:l.source_defs,compute:l.compute};u._sourcesData=f,u.compute&&u.compute.length>0&&await P.run(u,{sourcesData:f});let w={};if(l.provides&&l.provides.length>0)for(let{bindTo:_,ref:E}of l.provides)w[_]=P.resolve(u,E);else w[l.id]={...u.card_data??{},...u.computed_values??{},...u._sourcesData??{}};let C={provides_data:w,card_data:u.card_data??{},computed_values:u.computed_values??{},fetched_sources:f,requires:S};return h?.resolveCallback(d.callbackToken,C),"task-initiated"},g={},k={};for(let[o,d]of s.entries())H(s,o),g[o]=M(d),k[o]=b(o);let m={id:r.id??`browser-board-${Date.now()}`,settings:{completion:"manual",execution_mode:"eligibility-mode",...r.settings??{},...e.graphSettings??{}},tasks:g},v=e.reactiveOptions?.onDrain,y=dt(m,{...e.reactiveOptions??{},handlers:k,onDrain:(o,d,l)=>{v?.(o,d,l),T(o,d);}},e.executionId);h=y;function A(){let o=y.getState(),d=[];for(let[l,S]of s.entries()){let f=o.state.tasks[l]?.data,u=o.state.tasks[l],w={...S.card_data??{},...f&&typeof f.card_data=="object"?f.card_data:{}},C=u?.status==="running"?"loading":u?.status,_={...w,...C?{status:C}:{},...u?.lastUpdated?{lastRun:u.lastUpdated}:{},...u?.status==="failed"&&u.error?{error:u.error}:{}};d.push({id:l,card:j(S),card_data:_,requires:f&&typeof f.requires=="object"?j(f.requires):{},computed_values:f&&typeof f.computed_values=="object"?j(f.computed_values):{},runtime_state:u?j(u):{}});}return d}return {getGraph:()=>y,getState:()=>y.getState(),getSchedule:()=>y.getSchedule(),getNodes:()=>A(),getBoard:()=>({...r,nodes:A()}),subscribe(o){return a.add(o),o({events:[],graph:y.getState(),nodes:A()}),()=>a.delete(o)},addCard(o){if(s.has(o.id))throw new Error(`Card "${o.id}" already exists`);s.set(o.id,j(o)),H(s,o.id),y.registerHandler(o.id,b(o.id)),y.addNode(o.id,M(o));},upsertCard(o){s.set(o.id,j(o)),H(s,o.id),y.registerHandler(o.id,b(o.id)),y.addNode(o.id,M(o));},removeCard(o){s.delete(o),y.unregisterHandler(o),y.removeNode(o);},patchCardState(o,d){let l=s.get(o);if(!l)throw new Error(`Card "${o}" not found`);l.card_data={...l.card_data??{},...d},y.retrigger(o);},retrigger(o){y.retrigger(o);},retriggerAll(){y.retriggerAll(Array.from(s.keys()));},push(o){y.push(o);},pushAll(o){y.pushAll(o);},dispose(){a.clear(),y.dispose();}}}function pt(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(o=>o.id===e);if(!n)throw new Error(`cardDefinitions has no entry with id ${e}`);let s=t.statusSnapshot&&typeof t.statusSnapshot=="object"?t.statusSnapshot:{},a=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(o=>o.name===e),h=structuredClone(n),T=Ut(e,a[e]),g={...h.card_data&&typeof h.card_data=="object"&&!Array.isArray(h.card_data)?h.card_data:{},...T.card_data||{},status:pt(p?.status),lastRun:p?.runtime?.last_transition_at??null};p?.error?.message&&(g.error=p.error.message);let k=p?{task_status:p.status??null,card_status:pt(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:g.status??"fresh",runtime:{last_transition_at:g.lastRun??null},error:g.error?{message:g.error}:null,blocked_by:[],requires_missing:[]},m=Array.isArray(h.requires)?h.requires:[],v={};for(let[o,d]of Object.entries(i))v[o]=structuredClone(d);for(let o of m)Object.prototype.hasOwnProperty.call(v,o)||(v[o]=null);let A=(t.cardChatsByCardId&&typeof t.cardChatsByCardId=="object"?t.cardChatsByCardId:{})[e],D=A?{messages:Array.isArray(A.messages)?A.messages:[],receiving:!!A.receiving,processing:!!A.processing}:null;return {id:e,card:h,card_data:g,requires:v,computed_values:T.computed_values,runtime_state:k,card_chats:D}}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:[],a=Array.isArray(r)?r:[],i=new Map(a.map(g=>[g.id,g])),p=n.state?.tasks??{},h={};for(let g of a)g?.id&&(h[g.id]={schema_version:"v1",card_id:g.id,card_data:structuredClone(g.card_data??{}),computed_values:structuredClone(g.computed_values??{})});let T={};for(let g of Object.keys(p)){let k=p[g]?.data?.provides_data;if(k&&typeof k=="object")for(let m of Object.keys(k))T[m]=structuredClone(k[m]);}let b=s.map(g=>{let k=i.get(g.id)??{},m=p[g.id],v=typeof m?.status=="string"?m.status:Pt(k.card_data?.status),y=typeof m?.error=="string"?m.error:typeof k.card_data?.error=="string"?k.card_data.error:null;return {name:g.id,status:v,...y?{error:{message:y,code:"TASK_FAILED",at:m?.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(A=>A.bindTo):[g.id],provides_runtime:Object.keys(m?.data?.provides_data??{}).sort(),blocked_by:[],unblocks:[],runtime:{attempt_count:m?.executionCount??0,restart_count:m?.retryCount??0,in_progress_since:v==="in-progress"?m?.startedAt??null:null,last_transition_at:m?.lastUpdated??k.card_data?.lastRun??null,last_completed_at:m?.completedAt??null,last_restarted_at:m?.startedAt??null,status_age_ms:null}}});return {cardDefinitions:structuredClone(s),cardRuntimeById:h,dataObjectsByToken:T,statusSnapshot:{schema_version:"v1",meta:{board:{path:t??"browser-runtime"}},summary:{card_count:b.length,completed:b.filter(g=>g.status==="completed").length,eligible:0,pending:b.filter(g=>g.status==="pending").length,blocked:0,unresolved:0,failed:b.filter(g=>g.status==="failed").length,in_progress:b.filter(g=>g.status==="in-progress").length,orphan_cards:0,topology:{edge_count:0,max_fan_out_card:null,max_fan_out:0}},cards:b}}}
2
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,2 +1,2 @@
1
- 'use strict';function m(d){function o(n){return {status:"success",data:n}}function e(n){return {status:"fail",error:n}}function s(n){return {status:"error",error:n instanceof Error?n.message:String(n)}}return {get(n){try{let r=n.params?.id;if(r){let t=d.readCard(r);return t?o({cards:[t]}):e(`card "${r}" not found`)}return o({cards:d.readAllCards()})}catch(r){return s(r)}},set(n){try{let r=n.body;if(r==null)return e("set requires a body (card object or array of cards)");let t=Array.isArray(r)?r:[r];for(let a of t){if(typeof a.id!="string")return e("each card must have a string `id` field");d.writeCard(a.id,a);}return o({count:t.length})}catch(r){return s(r)}},del(n){try{let r=n.body?.ids??[],t=n.params?.id,a=t?[...r,t]:r;if(a.length===0)return e("del requires body.ids (string[]) or params.id");for(let u of a)d.removeCard(u);return o({count:a.length})}catch(r){return s(r)}},patch(n){try{let r=n.params?.id,t=n.params?.path;if(!r)return e("patch requires params.id");if(!t)return e("patch requires params.path");let a=n.body,u=a&&Object.prototype.hasOwnProperty.call(a,"value")?a.value:n.body;return d.patchCard(r,t,u),o({count:1})}catch(r){return s(r)}}}}exports.createCardStorePublic=m;//# sourceMappingURL=card-store-public.cjs.map
1
+ 'use strict';function y(d){function s(a){return {status:"success",data:a}}function t(a){return {status:"fail",error:a}}function o(a){return {status:"error",error:a instanceof Error?a.message:String(a)}}function m(a){if(Array.isArray(a))return a;if(a&&typeof a=="object"){let r=a;return Array.isArray(r.files)?r.files:[a]}return null}return {get(a){try{let r=a.params?.id;if(r){let n=d.readCard(r);return n?s({cards:[n]}):t(`card "${r}" not found`)}return s({cards:d.readAllCards()})}catch(r){return o(r)}},set(a){try{let r=a.body;if(r==null)return t("set requires a body (card object or array of cards)");let n=Array.isArray(r)?r:[r];for(let e of n){if(typeof e.id!="string")return t("each card must have a string `id` field");d.writeCard(e.id,e);}return s({count:n.length})}catch(r){return o(r)}},del(a){try{let r=a.body?.ids??[],n=a.params?.id,e=n?[...r,n]:r;if(e.length===0)return t("del requires body.ids (string[]) or params.id");for(let i of e)d.removeCard(i);return s({count:e.length})}catch(r){return o(r)}},patch(a){try{let r=a.params?.id,n=a.params?.path;if(!r)return t("patch requires params.id");if(!n)return t("patch requires params.path");let e=a.body,i=e&&Object.prototype.hasOwnProperty.call(e,"value")?e.value:a.body;return d.patchCard(r,n,i),s({count:1})}catch(r){return o(r)}},appendFiles(a){try{let r=a.params?.id;if(!r)return t("appendFiles requires params.id");let n=d.readCard(r);if(!n)return t(`card "${r}" not found`);let e=m(a.body);if(!e||e.length===0)return t("appendFiles requires a file metadata object, array, or body.files array");let i=n.card_data&&typeof n.card_data=="object"&&!Array.isArray(n.card_data)?n.card_data:{},u=Array.isArray(i.files)?i.files:[],l=[...u,...e],f=e.map((p,C)=>({idx:u.length+C,entry:p})),c=this.patch({params:{id:r,path:"card_data.files"},body:{value:l}});return c.status!=="success"?c:s({files_added:f})}catch(r){return o(r)}}}}exports.createCardStorePublic=y;//# sourceMappingURL=card-store-public.cjs.map
2
2
  //# sourceMappingURL=card-store-public.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as CommandInput, a as CommandResult, L as LiveCard, b as CardAdminStore } from './board-live-cards-public-CQ82CDdS.cjs';
1
+ import { C as CommandInput, a as CommandResult, L as LiveCard, b as CardAdminStore } from './board-live-cards-public-B4RcYPC_.cjs';
2
2
  import './storage-interface-B2WD9D5n.cjs';
3
3
  import './execution-refs.cjs';
4
4
  import './types-BBhqYGhE.cjs';
@@ -55,6 +55,17 @@ interface CardStorePublic {
55
55
  patch(input: CommandInput): CommandResult<{
56
56
  count: number;
57
57
  }>;
58
+ /**
59
+ * Append one or more file metadata objects to card_data.files.
60
+ * params.id: string
61
+ * body: file metadata object, array of file metadata objects, or { files: [...] }
62
+ */
63
+ appendFiles(input: CommandInput): CommandResult<{
64
+ files_added: Array<{
65
+ idx: number;
66
+ entry: unknown;
67
+ }>;
68
+ }>;
58
69
  }
59
70
  declare function createCardStorePublic(store: CardAdminStore): CardStorePublic;
60
71
 
@@ -1,4 +1,4 @@
1
- import { C as CommandInput, a as CommandResult, L as LiveCard, b as CardAdminStore } from './board-live-cards-public-CtlVp0L3.js';
1
+ import { C as CommandInput, a as CommandResult, L as LiveCard, b as CardAdminStore } from './board-live-cards-public-ydXuA4zh.js';
2
2
  import './storage-interface-B2WD9D5n.js';
3
3
  import './execution-refs.js';
4
4
  import './types-BBhqYGhE.js';
@@ -55,6 +55,17 @@ interface CardStorePublic {
55
55
  patch(input: CommandInput): CommandResult<{
56
56
  count: number;
57
57
  }>;
58
+ /**
59
+ * Append one or more file metadata objects to card_data.files.
60
+ * params.id: string
61
+ * body: file metadata object, array of file metadata objects, or { files: [...] }
62
+ */
63
+ appendFiles(input: CommandInput): CommandResult<{
64
+ files_added: Array<{
65
+ idx: number;
66
+ entry: unknown;
67
+ }>;
68
+ }>;
58
69
  }
59
70
  declare function createCardStorePublic(store: CardAdminStore): CardStorePublic;
60
71
 
@@ -1,2 +1,2 @@
1
- function m(d){function o(n){return {status:"success",data:n}}function e(n){return {status:"fail",error:n}}function s(n){return {status:"error",error:n instanceof Error?n.message:String(n)}}return {get(n){try{let r=n.params?.id;if(r){let t=d.readCard(r);return t?o({cards:[t]}):e(`card "${r}" not found`)}return o({cards:d.readAllCards()})}catch(r){return s(r)}},set(n){try{let r=n.body;if(r==null)return e("set requires a body (card object or array of cards)");let t=Array.isArray(r)?r:[r];for(let a of t){if(typeof a.id!="string")return e("each card must have a string `id` field");d.writeCard(a.id,a);}return o({count:t.length})}catch(r){return s(r)}},del(n){try{let r=n.body?.ids??[],t=n.params?.id,a=t?[...r,t]:r;if(a.length===0)return e("del requires body.ids (string[]) or params.id");for(let u of a)d.removeCard(u);return o({count:a.length})}catch(r){return s(r)}},patch(n){try{let r=n.params?.id,t=n.params?.path;if(!r)return e("patch requires params.id");if(!t)return e("patch requires params.path");let a=n.body,u=a&&Object.prototype.hasOwnProperty.call(a,"value")?a.value:n.body;return d.patchCard(r,t,u),o({count:1})}catch(r){return s(r)}}}}export{m as createCardStorePublic};//# sourceMappingURL=card-store-public.js.map
1
+ function y(d){function s(a){return {status:"success",data:a}}function t(a){return {status:"fail",error:a}}function o(a){return {status:"error",error:a instanceof Error?a.message:String(a)}}function m(a){if(Array.isArray(a))return a;if(a&&typeof a=="object"){let r=a;return Array.isArray(r.files)?r.files:[a]}return null}return {get(a){try{let r=a.params?.id;if(r){let n=d.readCard(r);return n?s({cards:[n]}):t(`card "${r}" not found`)}return s({cards:d.readAllCards()})}catch(r){return o(r)}},set(a){try{let r=a.body;if(r==null)return t("set requires a body (card object or array of cards)");let n=Array.isArray(r)?r:[r];for(let e of n){if(typeof e.id!="string")return t("each card must have a string `id` field");d.writeCard(e.id,e);}return s({count:n.length})}catch(r){return o(r)}},del(a){try{let r=a.body?.ids??[],n=a.params?.id,e=n?[...r,n]:r;if(e.length===0)return t("del requires body.ids (string[]) or params.id");for(let i of e)d.removeCard(i);return s({count:e.length})}catch(r){return o(r)}},patch(a){try{let r=a.params?.id,n=a.params?.path;if(!r)return t("patch requires params.id");if(!n)return t("patch requires params.path");let e=a.body,i=e&&Object.prototype.hasOwnProperty.call(e,"value")?e.value:a.body;return d.patchCard(r,n,i),s({count:1})}catch(r){return o(r)}},appendFiles(a){try{let r=a.params?.id;if(!r)return t("appendFiles requires params.id");let n=d.readCard(r);if(!n)return t(`card "${r}" not found`);let e=m(a.body);if(!e||e.length===0)return t("appendFiles requires a file metadata object, array, or body.files array");let i=n.card_data&&typeof n.card_data=="object"&&!Array.isArray(n.card_data)?n.card_data:{},u=Array.isArray(i.files)?i.files:[],l=[...u,...e],f=e.map((p,C)=>({idx:u.length+C,entry:p})),c=this.patch({params:{id:r,path:"card_data.files"},body:{value:l}});return c.status!=="success"?c:s({files_added:f})}catch(r){return o(r)}}}}export{y as createCardStorePublic};//# sourceMappingURL=card-store-public.js.map
2
2
  //# sourceMappingURL=card-store-public.js.map
@@ -1,2 +1,2 @@
1
- 'use strict';function f(d){function o(r){return {status:"success",data:r}}function a(r){return {status:"fail",error:r}}function m(r){return {status:"error",error:r instanceof Error?r.message:String(r)}}function i(r,t="command envelope"){let n=typeof r.cardId=="string"?r.cardId:void 0;if(!r.command)return a(`chat-store: ${t} missing "command"`);if(!n)return a(`chat-store: ${t} missing "cardId"`);if(r.command==="append")return s.append({params:{cardId:n},body:{role:r.role,text:r.text,files:r.files}});if(r.command==="read-all")return s.readAll({params:{cardId:n}});if(r.command==="read-after")return s.readAfter({params:{cardId:n},body:{cursor:r.cursor??null}});if(r.command==="clear")return s.clear({params:{cardId:n}});if(r.command==="set-processing")return s.setProcessing({params:{cardId:n},body:{active:r.active}});if(r.command==="is-processing")return s.isProcessing({params:{cardId:n}});if(r.command==="get-config")return s.getConfig({params:{cardId:n}});if(r.command==="set-config"){let{command:e,cardId:u,...c}=r;return s.setConfig({params:{cardId:n},body:c})}return a(`chat-store: unknown command "${String(r.command)}"`)}function C(r){if(!Array.isArray(r.commands)||r.commands.length===0)return a('chat-store: command envelope must include a non-empty "commands" array');let t=[];for(let n=0;n<r.commands.length;n+=1){let e=r.commands[n];if(!e||typeof e!="object"||Array.isArray(e))return a(`chat-store: command envelope entry ${n} must be an object`);let u={cardId:r.cardId,...e},c=i(u,`command envelope entry ${n}`);if(c.status!=="success")return c;t.push({index:n,command:String(u.command),data:c.data});}return o({results:t})}let s={append(r){try{let t=r.params?.cardId;if(!t)return a("append requires params.cardId");let n=r.body??{},e=typeof n.role=="string"?n.role:"",u=typeof n.text=="string"?n.text:"",c=Array.isArray(n.files)?n.files:[];if(!e)return a("append requires body.role");let l=d.append(t,e,u,c);return o({id:l})}catch(t){return m(t)}},readAll(r){try{let t=r.params?.cardId;return t?o({records:d.readAll(t)}):a("readAll requires params.cardId")}catch(t){return m(t)}},readAfter(r){try{let t=r.params?.cardId;if(!t)return a("readAfter requires params.cardId");let e=(r.body??{}).cursor??null;return o(d.readAfter(t,e))}catch(t){return m(t)}},clear(r){try{let t=r.params?.cardId;return t?(d.clear(t),o({ok:!0})):a("clear requires params.cardId")}catch(t){return m(t)}},setProcessing(r){try{let t=r.params?.cardId;if(!t)return a("setProcessing requires params.cardId");let n=r.body??{};return typeof n.active!="boolean"?a("setProcessing requires body.active (boolean)"):(d.setProcessing(t,n.active),o({ok:!0}))}catch(t){return m(t)}},isProcessing(r){try{let t=r.params?.cardId;return t?o({active:d.isProcessing(t)}):a("isProcessing requires params.cardId")}catch(t){return m(t)}},getConfig(r){try{let t=r.params?.cardId;return t?o({config:d.getConfig(t)}):a("getConfig requires params.cardId")}catch(t){return m(t)}},setConfig(r){try{let t=r.params?.cardId;if(!t)return a("setConfig requires params.cardId");let n=r.body??{};return d.setConfig(t,n),o({ok:!0})}catch(t){return m(t)}},run:i,runBatch:C};return s}exports.createChatStorePublic=f;//# sourceMappingURL=chat-store-public.cjs.map
1
+ 'use strict';function g(d){function l(r){let t=typeof r=="number"?r:Number(r);return Number.isInteger(t)&&t>0?t:null}function C(r,t){let n=t;for(let e=r.length-1;e>=0;e-=1)if(r[e]?.role==="user"&&(n-=1,n===0))return r.slice(e);return r}function s(r){return {status:"success",data:r}}function a(r){return {status:"fail",error:r}}function u(r){return {status:"error",error:r instanceof Error?r.message:String(r)}}function i(r,t="command envelope"){let n=typeof r.cardId=="string"?r.cardId:void 0;if(!r.command)return a(`chat-store: ${t} missing "command"`);if(!n)return a(`chat-store: ${t} missing "cardId"`);if(r.command==="append")return o.append({params:{cardId:n},body:{role:r.role,text:r.text,files:r.files}});if(r.command==="read-all")return o.readAll({params:{cardId:n},body:{lastUserTurns:r.lastUserTurns}});if(r.command==="read-after")return o.readAfter({params:{cardId:n},body:{cursor:r.cursor??null}});if(r.command==="clear")return o.clear({params:{cardId:n}});if(r.command==="set-processing")return o.setProcessing({params:{cardId:n},body:{active:r.active}});if(r.command==="is-processing")return o.isProcessing({params:{cardId:n}});if(r.command==="get-config")return o.getConfig({params:{cardId:n}});if(r.command==="set-config"){let{command:e,cardId:m,...c}=r;return o.setConfig({params:{cardId:n},body:c})}return a(`chat-store: unknown command "${String(r.command)}"`)}function f(r){if(!Array.isArray(r.commands)||r.commands.length===0)return a('chat-store: command envelope must include a non-empty "commands" array');let t=[];for(let n=0;n<r.commands.length;n+=1){let e=r.commands[n];if(!e||typeof e!="object"||Array.isArray(e))return a(`chat-store: command envelope entry ${n} must be an object`);let m={cardId:r.cardId,...e},c=i(m,`command envelope entry ${n}`);if(c.status!=="success")return c;t.push({index:n,command:String(m.command),data:c.data});}return s({results:t})}let o={append(r){try{let t=r.params?.cardId;if(!t)return a("append requires params.cardId");let n=r.body??{},e=typeof n.role=="string"?n.role:"",m=typeof n.text=="string"?n.text:"",c=Array.isArray(n.files)?n.files:[];if(!e)return a("append requires body.role");let p=d.append(t,e,m,c);return s({id:p})}catch(t){return u(t)}},readAll(r){try{let t=r.params?.cardId;if(!t)return a("readAll requires params.cardId");let n=r.body??{},e=d.readAll(t);if(n.lastUserTurns===void 0)return s({records:e});let m=l(n.lastUserTurns);return m===null?a("readAll requires body.lastUserTurns (positive integer)"):s({records:C(e,m)})}catch(t){return u(t)}},readAfter(r){try{let t=r.params?.cardId;if(!t)return a("readAfter requires params.cardId");let e=(r.body??{}).cursor??null;return s(d.readAfter(t,e))}catch(t){return u(t)}},clear(r){try{let t=r.params?.cardId;return t?(d.clear(t),s({ok:!0})):a("clear requires params.cardId")}catch(t){return u(t)}},setProcessing(r){try{let t=r.params?.cardId;if(!t)return a("setProcessing requires params.cardId");let n=r.body??{};return typeof n.active!="boolean"?a("setProcessing requires body.active (boolean)"):(d.setProcessing(t,n.active),s({ok:!0}))}catch(t){return u(t)}},isProcessing(r){try{let t=r.params?.cardId;return t?s({active:d.isProcessing(t)}):a("isProcessing requires params.cardId")}catch(t){return u(t)}},getConfig(r){try{let t=r.params?.cardId;return t?s({config:d.getConfig(t)}):a("getConfig requires params.cardId")}catch(t){return u(t)}},setConfig(r){try{let t=r.params?.cardId;if(!t)return a("setConfig requires params.cardId");let n=r.body??{};return d.setConfig(t,n),s({ok:!0})}catch(t){return u(t)}},run:i,runBatch:f};return o}exports.createChatStorePublic=g;//# sourceMappingURL=chat-store-public.cjs.map
2
2
  //# sourceMappingURL=chat-store-public.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as CommandInput, a as CommandResult } from './board-live-cards-public-CQ82CDdS.cjs';
1
+ import { C as CommandInput, a as CommandResult } from './board-live-cards-public-B4RcYPC_.cjs';
2
2
  import { C as ChatRecord, a as ChatReadAfterResult, b as ChatConfig, c as ChatStorage } from './chat-storage-lib-B1wU27y3.cjs';
3
3
  import './storage-interface-B2WD9D5n.cjs';
4
4
  import './execution-refs.cjs';
@@ -20,6 +20,7 @@ import './types-BBhqYGhE.cjs';
20
20
  * const store = createChatStorePublic(createFsBoardChatStorage(parseRef(storeRef).value));
21
21
  * const result = store.append({ params: { cardId: 'c1' }, body: { role: 'user', text: 'hello' } });
22
22
  * const result = store.readAll({ params: { cardId: 'c1' } });
23
+ * const result = store.readAll({ params: { cardId: 'c1' }, body: { lastUserTurns: 5 } });
23
24
  * const result = store.readAfter({ params: { cardId: 'c1', cursor: '<id>' } });
24
25
  * const result = store.clear({ params: { cardId: 'c1' } });
25
26
  * const result = store.setProcessing({ params: { cardId: 'c1' }, body: { active: true } });
@@ -35,6 +36,7 @@ type ChatStoreCommandEnvelope = {
35
36
  role?: unknown;
36
37
  text?: unknown;
37
38
  files?: unknown;
39
+ lastUserTurns?: unknown;
38
40
  cursor?: unknown;
39
41
  active?: unknown;
40
42
  [key: string]: unknown;
@@ -62,8 +64,9 @@ interface ChatStorePublic {
62
64
  id: string;
63
65
  }>;
64
66
  /**
65
- * Read all messages for a card in insertion order.
67
+ * Read all messages for a card in insertion order.
66
68
  * params.cardId: string
69
+ * body.lastUserTurns?: positive integer
67
70
  */
68
71
  readAll(input: CommandInput): CommandResult<{
69
72
  records: ChatRecord[];
@@ -1,4 +1,4 @@
1
- import { C as CommandInput, a as CommandResult } from './board-live-cards-public-CtlVp0L3.js';
1
+ import { C as CommandInput, a as CommandResult } from './board-live-cards-public-ydXuA4zh.js';
2
2
  import { C as ChatRecord, a as ChatReadAfterResult, b as ChatConfig, c as ChatStorage } from './chat-storage-lib-DsF4kPon.js';
3
3
  import './storage-interface-B2WD9D5n.js';
4
4
  import './execution-refs.js';
@@ -20,6 +20,7 @@ import './types-BBhqYGhE.js';
20
20
  * const store = createChatStorePublic(createFsBoardChatStorage(parseRef(storeRef).value));
21
21
  * const result = store.append({ params: { cardId: 'c1' }, body: { role: 'user', text: 'hello' } });
22
22
  * const result = store.readAll({ params: { cardId: 'c1' } });
23
+ * const result = store.readAll({ params: { cardId: 'c1' }, body: { lastUserTurns: 5 } });
23
24
  * const result = store.readAfter({ params: { cardId: 'c1', cursor: '<id>' } });
24
25
  * const result = store.clear({ params: { cardId: 'c1' } });
25
26
  * const result = store.setProcessing({ params: { cardId: 'c1' }, body: { active: true } });
@@ -35,6 +36,7 @@ type ChatStoreCommandEnvelope = {
35
36
  role?: unknown;
36
37
  text?: unknown;
37
38
  files?: unknown;
39
+ lastUserTurns?: unknown;
38
40
  cursor?: unknown;
39
41
  active?: unknown;
40
42
  [key: string]: unknown;
@@ -62,8 +64,9 @@ interface ChatStorePublic {
62
64
  id: string;
63
65
  }>;
64
66
  /**
65
- * Read all messages for a card in insertion order.
67
+ * Read all messages for a card in insertion order.
66
68
  * params.cardId: string
69
+ * body.lastUserTurns?: positive integer
67
70
  */
68
71
  readAll(input: CommandInput): CommandResult<{
69
72
  records: ChatRecord[];
@@ -1,2 +1,2 @@
1
- function f(d){function o(r){return {status:"success",data:r}}function a(r){return {status:"fail",error:r}}function m(r){return {status:"error",error:r instanceof Error?r.message:String(r)}}function i(r,t="command envelope"){let n=typeof r.cardId=="string"?r.cardId:void 0;if(!r.command)return a(`chat-store: ${t} missing "command"`);if(!n)return a(`chat-store: ${t} missing "cardId"`);if(r.command==="append")return s.append({params:{cardId:n},body:{role:r.role,text:r.text,files:r.files}});if(r.command==="read-all")return s.readAll({params:{cardId:n}});if(r.command==="read-after")return s.readAfter({params:{cardId:n},body:{cursor:r.cursor??null}});if(r.command==="clear")return s.clear({params:{cardId:n}});if(r.command==="set-processing")return s.setProcessing({params:{cardId:n},body:{active:r.active}});if(r.command==="is-processing")return s.isProcessing({params:{cardId:n}});if(r.command==="get-config")return s.getConfig({params:{cardId:n}});if(r.command==="set-config"){let{command:e,cardId:u,...c}=r;return s.setConfig({params:{cardId:n},body:c})}return a(`chat-store: unknown command "${String(r.command)}"`)}function C(r){if(!Array.isArray(r.commands)||r.commands.length===0)return a('chat-store: command envelope must include a non-empty "commands" array');let t=[];for(let n=0;n<r.commands.length;n+=1){let e=r.commands[n];if(!e||typeof e!="object"||Array.isArray(e))return a(`chat-store: command envelope entry ${n} must be an object`);let u={cardId:r.cardId,...e},c=i(u,`command envelope entry ${n}`);if(c.status!=="success")return c;t.push({index:n,command:String(u.command),data:c.data});}return o({results:t})}let s={append(r){try{let t=r.params?.cardId;if(!t)return a("append requires params.cardId");let n=r.body??{},e=typeof n.role=="string"?n.role:"",u=typeof n.text=="string"?n.text:"",c=Array.isArray(n.files)?n.files:[];if(!e)return a("append requires body.role");let l=d.append(t,e,u,c);return o({id:l})}catch(t){return m(t)}},readAll(r){try{let t=r.params?.cardId;return t?o({records:d.readAll(t)}):a("readAll requires params.cardId")}catch(t){return m(t)}},readAfter(r){try{let t=r.params?.cardId;if(!t)return a("readAfter requires params.cardId");let e=(r.body??{}).cursor??null;return o(d.readAfter(t,e))}catch(t){return m(t)}},clear(r){try{let t=r.params?.cardId;return t?(d.clear(t),o({ok:!0})):a("clear requires params.cardId")}catch(t){return m(t)}},setProcessing(r){try{let t=r.params?.cardId;if(!t)return a("setProcessing requires params.cardId");let n=r.body??{};return typeof n.active!="boolean"?a("setProcessing requires body.active (boolean)"):(d.setProcessing(t,n.active),o({ok:!0}))}catch(t){return m(t)}},isProcessing(r){try{let t=r.params?.cardId;return t?o({active:d.isProcessing(t)}):a("isProcessing requires params.cardId")}catch(t){return m(t)}},getConfig(r){try{let t=r.params?.cardId;return t?o({config:d.getConfig(t)}):a("getConfig requires params.cardId")}catch(t){return m(t)}},setConfig(r){try{let t=r.params?.cardId;if(!t)return a("setConfig requires params.cardId");let n=r.body??{};return d.setConfig(t,n),o({ok:!0})}catch(t){return m(t)}},run:i,runBatch:C};return s}export{f as createChatStorePublic};//# sourceMappingURL=chat-store-public.js.map
1
+ function g(d){function l(r){let t=typeof r=="number"?r:Number(r);return Number.isInteger(t)&&t>0?t:null}function C(r,t){let n=t;for(let e=r.length-1;e>=0;e-=1)if(r[e]?.role==="user"&&(n-=1,n===0))return r.slice(e);return r}function s(r){return {status:"success",data:r}}function a(r){return {status:"fail",error:r}}function u(r){return {status:"error",error:r instanceof Error?r.message:String(r)}}function i(r,t="command envelope"){let n=typeof r.cardId=="string"?r.cardId:void 0;if(!r.command)return a(`chat-store: ${t} missing "command"`);if(!n)return a(`chat-store: ${t} missing "cardId"`);if(r.command==="append")return o.append({params:{cardId:n},body:{role:r.role,text:r.text,files:r.files}});if(r.command==="read-all")return o.readAll({params:{cardId:n},body:{lastUserTurns:r.lastUserTurns}});if(r.command==="read-after")return o.readAfter({params:{cardId:n},body:{cursor:r.cursor??null}});if(r.command==="clear")return o.clear({params:{cardId:n}});if(r.command==="set-processing")return o.setProcessing({params:{cardId:n},body:{active:r.active}});if(r.command==="is-processing")return o.isProcessing({params:{cardId:n}});if(r.command==="get-config")return o.getConfig({params:{cardId:n}});if(r.command==="set-config"){let{command:e,cardId:m,...c}=r;return o.setConfig({params:{cardId:n},body:c})}return a(`chat-store: unknown command "${String(r.command)}"`)}function f(r){if(!Array.isArray(r.commands)||r.commands.length===0)return a('chat-store: command envelope must include a non-empty "commands" array');let t=[];for(let n=0;n<r.commands.length;n+=1){let e=r.commands[n];if(!e||typeof e!="object"||Array.isArray(e))return a(`chat-store: command envelope entry ${n} must be an object`);let m={cardId:r.cardId,...e},c=i(m,`command envelope entry ${n}`);if(c.status!=="success")return c;t.push({index:n,command:String(m.command),data:c.data});}return s({results:t})}let o={append(r){try{let t=r.params?.cardId;if(!t)return a("append requires params.cardId");let n=r.body??{},e=typeof n.role=="string"?n.role:"",m=typeof n.text=="string"?n.text:"",c=Array.isArray(n.files)?n.files:[];if(!e)return a("append requires body.role");let p=d.append(t,e,m,c);return s({id:p})}catch(t){return u(t)}},readAll(r){try{let t=r.params?.cardId;if(!t)return a("readAll requires params.cardId");let n=r.body??{},e=d.readAll(t);if(n.lastUserTurns===void 0)return s({records:e});let m=l(n.lastUserTurns);return m===null?a("readAll requires body.lastUserTurns (positive integer)"):s({records:C(e,m)})}catch(t){return u(t)}},readAfter(r){try{let t=r.params?.cardId;if(!t)return a("readAfter requires params.cardId");let e=(r.body??{}).cursor??null;return s(d.readAfter(t,e))}catch(t){return u(t)}},clear(r){try{let t=r.params?.cardId;return t?(d.clear(t),s({ok:!0})):a("clear requires params.cardId")}catch(t){return u(t)}},setProcessing(r){try{let t=r.params?.cardId;if(!t)return a("setProcessing requires params.cardId");let n=r.body??{};return typeof n.active!="boolean"?a("setProcessing requires body.active (boolean)"):(d.setProcessing(t,n.active),s({ok:!0}))}catch(t){return u(t)}},isProcessing(r){try{let t=r.params?.cardId;return t?s({active:d.isProcessing(t)}):a("isProcessing requires params.cardId")}catch(t){return u(t)}},getConfig(r){try{let t=r.params?.cardId;return t?s({config:d.getConfig(t)}):a("getConfig requires params.cardId")}catch(t){return u(t)}},setConfig(r){try{let t=r.params?.cardId;if(!t)return a("setConfig requires params.cardId");let n=r.body??{};return d.setConfig(t,n),s({ok:!0})}catch(t){return u(t)}},run:i,runBatch:f};return o}export{g as createChatStorePublic};//# sourceMappingURL=chat-store-public.js.map
2
2
  //# sourceMappingURL=chat-store-public.js.map