yaml-flow 8.0.0 → 8.0.3

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 (52) hide show
  1. package/browser/asset-integrity.json +2 -2
  2. package/browser/board-livecards-localstorage.js +5 -5
  3. package/cli/browser-api/board-live-cards-browser-adapter.d.ts +2 -2
  4. package/cli/{execution-interface-C_A6WCiK.d.ts → execution-interface-ftO1W7Po.d.ts} +4 -2
  5. package/cli/node/board-live-cards-cli.js +7 -7
  6. package/cli/node/card-store-cli.js +1 -1
  7. package/cli/node/execution-adapter.d.ts +47 -2
  8. package/cli/node/execution-adapter.js +2 -2
  9. package/cli/node/fs-board-adapter.d.ts +4 -4
  10. package/cli/node/fs-board-adapter.js +7 -7
  11. package/cli/node/step-machine-cli.js +4 -4
  12. package/cli/{types-CziUxkiv.d.ts → types-C2YQXFwo.d.ts} +1 -1
  13. package/examples/ARCHITECTURE.md +188 -0
  14. package/examples/board/demo-shell-with-server.html +2 -2
  15. package/examples/board-local/demo-shell-localstorage.html +3 -3
  16. package/examples/step-machine-cli/json/double-handler.js +20 -0
  17. package/examples/step-machine-cli/json/mixed-handlers.flow.json +118 -0
  18. package/examples/step-machine-cli/json/mixed-handlers.input.json +5 -0
  19. package/examples/step-machine-cli/json/scale-handler.js +13 -0
  20. package/examples/step-machine-cli/yaml/double-handler.js +20 -0
  21. package/examples/step-machine-cli/yaml/mixed-handlers.flow.yaml +94 -0
  22. package/examples/step-machine-cli/yaml/mixed-handlers.input.json +5 -0
  23. package/examples/step-machine-cli/yaml/scale-handler.js +13 -0
  24. package/lib/board-live-cards-node.cjs +7 -7
  25. package/lib/board-live-cards-node.d.cts +46 -2
  26. package/lib/board-live-cards-node.d.ts +46 -2
  27. package/lib/board-live-cards-node.js +7 -7
  28. package/lib/board-live-cards-public.cjs +1 -1
  29. package/lib/board-live-cards-public.js +1 -1
  30. package/lib/board-live-cards-server-runtime.cjs +2 -2
  31. package/lib/board-live-cards-server-runtime.js +2 -2
  32. package/lib/execution-refs.cjs +1 -1
  33. package/lib/execution-refs.d.cts +4 -2
  34. package/lib/execution-refs.d.ts +4 -2
  35. package/lib/execution-refs.js +1 -1
  36. package/lib/server-runtime/index.cjs +2 -2
  37. package/lib/server-runtime/index.js +2 -2
  38. package/package.json +4 -4
  39. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/card-store-ref.json +0 -1
  40. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/chat-handler.json +0 -1
  41. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/outputs-store-ref.json +0 -1
  42. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/task-executor.json +0 -1
  43. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.state-snapshot/board/graph.json +0 -29
  44. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.state-snapshot/board/lastJournalProcessedId.json +0 -1
  45. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime-out/.outputs/status.json +0 -25
  46. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-market-prices/computed_values.json +0 -67
  47. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-portfolio/computed_values.json +0 -1
  48. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-portfolio-value/computed_values.json +0 -52
  49. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/holdings.json +0 -22
  50. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/positions.json +0 -46
  51. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/quotes.json +0 -35
  52. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/status.json +0 -113
@@ -1,3 +1,3 @@
1
- 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Se="b64:";function xt(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let s="";for(let o of t)s+=String.fromCharCode(o);n=btoa(s);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Et(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),s=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function Y(e){return `${Se}${xt(JSON.stringify(e))}`}function _e(e){if(!e.startsWith(Se))throw new Error(`Invalid ref format (expected ${Se}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Et(e.slice(Se.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Ke(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var ee={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function M(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function te(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function He(e){return e.tasks??{}}function Ie(e){return e?e.status===ee.FAILED||e.status===ee.INACTIVATED:false}function Ue(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Je(e){return e.maxExecutions}function Me(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===ee.COMPLETED){let o=e.tasks[n];o&&M(o).forEach(c=>r.add(c));}return Array.from(r)}function ze(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;M(s).forEach(u=>{r[u]||(r[u]=[]),r[u].push(n);});}),r}function Ye(e,t,r){let n=e.tasks[t]??Ce(),s={};if(r){let u=r.tasks[t],c=te(u);for(let S of c)for(let[w,N]of Object.entries(r.tasks))if(M(N).includes(S)){let D=e.tasks[w];D?.lastDataHash&&(s[S]=D.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function Xe(e,t,r,n,s,o){let u=e.tasks[r]??Ce(),c=t.tasks[r];if(!c)throw new Error(`Task "${r}" not found in graph`);let S;n&&c.on&&c.on[n]?S=c.on[n]:S=M(c);let w=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let L=c.requires??[];for(let A of L)for(let[v,k]of Object.entries(t.tasks))if(M(k).includes(A)){let V=e.tasks[v];V?.lastDataHash&&(w[A]=V.lastDataHash);break}}let N={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:w,error:void 0},D=[...new Set([...e.availableOutputs,...S])];return {...e,tasks:{...e.tasks,[r]:N},availableOutputs:D,lastUpdated:new Date().toISOString()}}function We(e,t,r,n){let s=e.tasks[r]??Ce(),o=t.tasks[r];if(o?.retry){let S=s.retryCount+1;if(S<=o.retry.max_attempts){let w={...s,status:"not-started",retryCount:S,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:w},lastUpdated:new Date().toISOString()}}}let u={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},c=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(c=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&u.executionCount>=o.circuit_breaker.max_executions){let S=o.circuit_breaker.on_break;c=[...new Set([...c,...S])];}return {...e,tasks:{...e.tasks,[r]:u},availableOutputs:c,lastUpdated:new Date().toISOString()}}function Qe(e,t,r,n){let s=e.tasks[t]??Ce(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function Ze(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Ce(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function be(e,t){let r=`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=tt();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function At(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:Ye(n,t.taskName,r)};case "task-completed":return {config:r,state:Xe(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:We(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Qe(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Ze(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Dt(n,t.action)};case "task-upsert":return Tt(e,t.taskName,t.taskConfig);case "task-removal":return _t(e,t.taskName);case "node-requires-add":return It(e,t.nodeName,t.tokens);case "node-requires-remove":return Ot(e,t.nodeName,t.tokens);case "node-provides-add":return jt(e,t.nodeName,t.tokens);case "node-provides-remove":return Nt(e,t.nodeName,t.tokens);default:return e}}function et(e,t){return t.reduce((r,n)=>At(r,n),e)}function Tt(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:tt()},lastUpdated:new Date().toISOString()}}}function _t(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function It(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=te(n),o=r.filter(u=>!s.includes(u));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function Ot(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=te(n),o=s.filter(u=>!r.includes(u));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function jt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=M(n),o=r.filter(u=>!s.includes(u));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function Nt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=M(n),o=s.filter(u=>!r.includes(u));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function pe(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Re(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function tt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Dt(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function ge(e){let{config:t,state:r}=e,n=He(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=qt(n),u=Me(t,r.tasks),c=new Set([...u,...r.availableOutputs]),S=[],w=[],N=[],D=[];for(let[A,v]of Object.entries(n)){let k=r.tasks[A],V=Ue(v,t.settings),p=V!=="once";if(k?.status===ee.RUNNING||Ie(k))continue;let a=Je(v);if(a!==void 0&&k&&k.executionCount>=a||v.circuit_breaker&&k&&k.executionCount>=v.circuit_breaker.max_executions||!p&&k?.status===ee.COMPLETED)continue;if(p&&k?.status===ee.COMPLETED){let f=te(v),h=false;switch(V){case "data-changed":{f.length>0&&f.some(O=>{for(let[j,B]of Object.entries(n))if(M(B).includes(O)){let q=r.tasks[j];if(!q)continue;let H=k.lastConsumedHashes?.[O];return q.lastDataHash==null?q.executionCount>k.lastEpoch:q.lastDataHash!==H}return false})||(h=true);break}case "epoch-changed":{f.length>0&&f.some(O=>{for(let[j,B]of Object.entries(n))if(M(B).includes(O)){let q=r.tasks[j];if(q&&q.executionCount>k.lastEpoch)return true}return false})||(h=true);break}case "time-based":{let T=v.refreshInterval??0;if(T<=0){h=true;break}let O=k.completedAt;if(!O){h=true;break}(Date.now()-Date.parse(O))/1e3<T&&(h=true);break}case "manual":h=true;break}if(h)continue}let d=te(v);if(d.length===0){S.push(A);continue}let m=[],C=[],y=[];for(let f of d){if(c.has(f))continue;let h=o[f]||[];h.length===0?m.push(f):h.every(O=>Ie(r.tasks[O]))?y.push({token:f,failedProducer:h[0]}):C.push(f);}m.length>0?N.push({taskName:A,missingTokens:m}):y.length>0?D.push({taskName:A,failedTokens:y.map(f=>f.token),failedProducers:[...new Set(y.map(f=>f.failedProducer))]}):C.length>0?w.push({taskName:A,waitingOn:C}):S.push(A);}let L={};if(S.length>1){let A=ze(S,n);for(let[v,k]of Object.entries(A))k.length>1&&(L[v]=k);}return {eligible:S,pending:w,unresolved:N,blocked:D,conflicts:L}}function qt(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of M(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var me=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Oe(e){let t=je(e);return Ft(t)}function je(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(je).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+je(t[n])).join(",")+"}"}function Ft(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Pt(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Gt(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function rt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Pt(t)}function $t(e){try{let t=JSON.parse(Gt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function nt(e,t,r){let{handlers:n,onDrain:s}=t,o=new me,u="state"in e&&"config"in e?e:be(e),c=false,S=new Set,w=new Map(Object.entries(n)),N=new me,D=false,L=false;function A(){if(!c){if(D){L=true;return}D=true;try{do L=!1,v();while(L)}finally{D=false;}}}function v(){let a=N.drain(),d=o.drain(),m=[...a,...d];m.length>0&&(u=et(u,m));let C=ge(u);m.length>0&&s?.(m,u,C);for(let y of C.eligible)p(y);for(let y of m)if(y.type==="task-progress"){let{taskName:f,update:h}=y;if(!u.config.tasks[f])continue;let O=u.state.tasks[f];if(!O||O.status!=="running")continue;let j=rt(f),B=V(f,j,h).catch(q=>{c||(N.append({type:"task-failed",taskName:f,error:q.message??String(q),timestamp:new Date().toISOString()}),A());}).finally(()=>{S.delete(B);});S.add(B);}}function k(a){let m=u.config.tasks[a].requires??[],C=new Map;for(let[f,h]of Object.entries(u.config.tasks))for(let T of h.provides??[])C.set(T,f);let y={};for(let f of m){let h=C.get(f);h?y[f]=u.state.tasks[h]?.data:y[f]=void 0;}return y}async function V(a,d,m){let C=u.config.tasks[a],y=C.taskHandlers??[],f=k(a);for(let h of y){let T=w.get(h);if(!T)throw new Error(`Handler '${h}' not found in registry (task '${a}')`);let O={nodeId:a,state:f,taskState:u.state.tasks[a],config:C,callbackToken:d,update:m};if(await T(O)==="task-initiate-failure")throw new Error(`Handler '${h}' returned task-initiate-failure (task '${a}')`)}}function p(a){let m=u.config.tasks[a]?.taskHandlers;if(!m||m.length===0)return;N.append({type:"task-started",taskName:a,timestamp:new Date().toISOString()}),A();let C=rt(a),y=V(a,C).catch(f=>{c||(N.append({type:"task-failed",taskName:a,error:f.message??String(f),timestamp:new Date().toISOString()}),A());}).finally(()=>{S.delete(y);});S.add(y);}return {push(a){c||(a.type==="task-completed"&&a.data&&!a.dataHash&&(a={...a,dataHash:Oe(a.data)}),o.append(a),A());},pushAll(a){if(!c){for(let d of a)d.type==="task-completed"&&d.data&&!d.dataHash?o.append({...d,dataHash:Oe(d.data)}):o.append(d);A();}},resolveCallback(a,d,m){if(c)return;let C=$t(a);if(!C)return;let{taskName:y}=C;if(u.config.tasks[y]){if(m&&m.length>0)o.append({type:"task-failed",taskName:y,error:m.join("; "),timestamp:new Date().toISOString()});else {let f=d&&Object.keys(d).length>0?Oe(d):void 0;o.append({type:"task-completed",taskName:y,data:d,dataHash:f,timestamp:new Date().toISOString()});}A();}},addNode(a,d){c||(o.append({type:"task-upsert",taskName:a,taskConfig:d,timestamp:new Date().toISOString()}),A());},removeNode(a){c||(o.append({type:"task-removal",taskName:a,timestamp:new Date().toISOString()}),A());},addRequires(a,d){c||(o.append({type:"node-requires-add",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},removeRequires(a,d){c||(o.append({type:"node-requires-remove",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},addProvides(a,d){c||(o.append({type:"node-provides-add",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},removeProvides(a,d){c||(o.append({type:"node-provides-remove",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},registerHandler(a,d){w.set(a,d);},unregisterHandler(a){w.delete(a);},retrigger(a){c||u.config.tasks[a]&&(o.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()}),A());},retriggerAll(a){if(!c){for(let d of a)u.config.tasks[d]&&o.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});A();}},snapshot(){return pe(u)},getState(){return u},getSchedule(){return ge(u)},async waitForHandlers(){S.size>0&&await Promise.allSettled([...S]);},async dispose(a){a?.wait&&S.size>0&&await Promise.allSettled([...S]),c=true;}}}var Vt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-public.cjs', document.baseURI).href)));Vt("./jsonata-sync.cjs");var Kt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-public.cjs', document.baseURI).href))),ve=Kt("./jsonata-sync.cjs"),at=ve;function st(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function it(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Ht(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await ve(s.expr).evaluate(n);it(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function Ut(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let u=at(o.expr).evaluate(n);it(e.computed_values,o.bindTo,u),n.computed_values=e.computed_values;}catch(u){let c=u instanceof Error?u.message:String(u);s.push({bindTo:o.bindTo,error:c});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Jt(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return ve(e).evaluate(n)}function Mt(e,t){return t.startsWith("fetched_sources.")?st(e._sourcesData??{},t.slice(16)):st(e,t)}var ot=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),zt=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Yt(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))zt.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,u)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${u}]: must be an object`);else {let c=o;typeof c.bindTo!="string"||!c.bindTo?t.push(`source_defs[${u}]: missing required "bindTo" property`):(n.has(c.bindTo)&&t.push(`source_defs[${u}]: bindTo "${c.bindTo}" is not unique across source_defs`),n.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?t.push(`source_defs[${u}]: missing required "outputFile" property`):(s.has(c.outputFile)&&t.push(`source_defs[${u}]: outputFile "${c.outputFile}" is not unique across source_defs`),s.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${u}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):ot.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...ot].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Xt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{s[o]=await ve(u).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Wt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{s[o]=at(u).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var re={run:Ht,runSync:Ut,eval:Jt,resolve:Mt,validate:Yt,enrichSources:Xt,enrichSourcesSync:Wt};function Ne(e){return JSON.stringify(e)}function De(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function qe(e,t){function r(){return e.readIndex()??{}}function n(s,o,u){let c=String(o||"").split(".").filter(Boolean);if(c.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let S={...s},w=S;for(let N=0;N<c.length-1;N++){let D=c[N],L=w[D],A=L&&typeof L=="object"&&!Array.isArray(L)?{...L}:{};w[D]=A,w=A;}return w[c[c.length-1]]=u,S}return {readCard(s){let o=r()[s];return !o||!e.cardExists(o.key)?null:e.readCard(o.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[o,u]of Object.entries(r())){if(!e.cardExists(u.key))continue;let c=e.readCard(u.key);c?s.push(c):t?.(`[card-store] could not read card "${o}" at key "${u.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,u]of Object.entries(r()))s[o]=u.checksum;return s},changedSince(s){let o=r(),u=[];for(let[c,S]of Object.entries(o))s[c]!==S.checksum&&u.push(c);for(let c of Object.keys(s))o[c]||u.push(c);return u},validateUpsert(s,o){let u=r(),c=u[s],S=Object.entries(u).find(([,w])=>w.key===o);return c&&c.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${c.key}", cannot remap to "${o}"`}:S&&S[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${S[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,u){let c=r(),S=u??c[s]?.key??e.defaultCardKey(s),w=e.writeCard(S,o);c[s]={key:S,checksum:w,updatedAt:new Date().toISOString()},e.writeIndex(c);},patchCard(s,o,u){let c=r(),S=c[s];if(!S||!e.cardExists(S.key))throw new Error(`card "${s}" not found`);let w=e.readCard(S.key);if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`card "${s}" is not patchable`);let N=n(w,o,u),D=e.writeCard(S.key,N);c[s]={key:S.key,checksum:D,updatedAt:new Date().toISOString()},e.writeIndex(c);},removeCard(s){let o=r();o[s]&&(delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function Fe(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let o=s.trim();if(!o)return null;try{return JSON.parse(o)}catch{return o}},ingestSourceDataStaged(r,n,s,o){let u=t(s);e.write(`${r}/.staged/${o}/${n}`,u);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,u=e.read(o);return u==null?false:(e.write(`${r}/${n}`,u),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function dt(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(o=>o.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function lt(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let o of s)try{n(o);}catch(u){let c=u instanceof Error?u.message:String(u);try{t(o,c);}catch{}}e.delete(r);}}}}var we="v1",ie="board/graph",ft="board/lastJournalProcessedId";function ut(e){return `cards/${e}/runtime`}function pt(e){return {readRuntime(t){return e.read(ut(t))??{_sources:{}}},writeRuntime(t,r){e.write(ut(t),r);}}}function Qt(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function gt(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==we)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=Qt(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function Pe(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return De(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Ne(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return De(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",Ne(r));},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function mt(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Zt(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function er(e,t){return e?.lastRequestedAt?Zt(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function tr(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function ct(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function xe(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=ge(t),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},c=new Map;for(let v of o.pending)c.set(v.taskName,v.waitingOn);for(let v of o.unresolved)c.set(v.taskName,v.missingTokens);for(let v of o.blocked)c.set(v.taskName,v.failedTokens);let S=new Map;for(let[v,k]of Object.entries(n))for(let V of k.requires??[]){let p=S.get(V)??[];p.push(v),S.set(V,p);}let w=s.sort().map(v=>{let k=r[v],V=n[v]??{requires:[],provides:[]};k.status==="completed"?u.completed+=1:k.status==="failed"?u.failed+=1:k.status==="in-progress"&&(u.in_progress+=1);let p=V.requires??[],a=V.provides??[],d=Object.keys(k.data??{}).sort(),m=p.filter(O=>t.state.availableOutputs.includes(O)),C=p.filter(O=>!t.state.availableOutputs.includes(O)),y=c.get(v)??C,f=new Set;for(let O of a)for(let j of S.get(O)??[])j!==v&&f.add(j);let h=k.failedAt,T=k.error?{message:k.error,code:"TASK_FAILED",at:h,source:"task-runtime"}:void 0;return {name:v,status:k.status,error:T,requires:p,requires_satisfied:m,requires_missing:C,provides_declared:a,provides_runtime:d,blocked_by:y,unblocks:Array.from(f).sort(),runtime:{attempt_count:k.executionCount??0,restart_count:k.retryCount??0,in_progress_since:k.status==="in-progress"?k.startedAt??null:null,last_transition_at:k.lastUpdated??null,last_completed_at:k.completedAt??null,last_restarted_at:k.startedAt??null,status_age_ms:k.lastUpdated?0:null}}});u.pending=o.pending.length,u.blocked=o.blocked.length,u.unresolved=o.unresolved.length;let N=w.map(v=>({name:v.name,fanOut:v.unblocks.length})).sort((v,k)=>k.fanOut-v.fanOut||v.name.localeCompare(k.name)),D=N.length>0?N[0]:{name:null,fanOut:0},L=new Set;for(let v of Object.values(n))for(let k of v.requires??[])L.add(k);let A=0;for(let[v,k]of Object.entries(n)){let V=(k.requires??[]).length===0,a=(k.provides??[]).some(d=>(S.get(d)??[]).some(m=>m!==v));V&&!a&&(A+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:u.completed,eligible:o.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:A,topology:{edge_count:Array.from(L).length,max_fan_out_card:D.name,max_fan_out:D.fanOut}},cards:w}}function rr(){return new Date().toISOString()}function ht(e,t,r,n,s,o,u){return async c=>{let S=[],w=r.cardStore.readCard(c.nodeId);if(!w)return "task-initiate-failure";let N=w.id,D=w.card_data??{},L=w.source_defs??[],A=L.filter(_=>_.optionalForCompletionGating!==true),v=r.cardRuntimeStore.readRuntime(N),k=false,V=()=>{k&&(r.cardRuntimeStore.writeRuntime(N,v),k=false);},p=_=>({...v._sources[_]??{}}),a=(_,I)=>{v._sources[_]=I,k=true;},d=c.taskState?.executionCount??0,m=v._lastExecutionCount;if(typeof m=="number"&&m!==d&&(v._sources={},k=true),m!==d&&(v._lastExecutionCount=d,k=true),c.update){let _=c.update,I=_.outputFile;if(I){let l=p(I);if(_.failure)a(I,ct(l,_.reason??"unknown"));else {let i=_.rqt;if(!l.lastFetchedAt||i>l.lastFetchedAt){let g=typeof _.deliveryToken=="string"?_.deliveryToken:void 0,b=false;g&&(b=r.fetchedSourcesStore.commitSourceData(N,I,g)),b?a(I,tr(l,i)):a(I,ct(l,`source delivery commit failed for ${I} token=${String(g)}`));}}V();}}let C={};for(let _ of L)if(_.outputFile){let I=r.fetchedSourcesStore.readSourceData(N,_.outputFile);I!==null&&(C[_.bindTo]=I);}let y={};for(let[_,I]of Object.entries(c.state??{}))if(I!==null&&typeof I=="object"&&!Array.isArray(I)){let l=I[_];y[_]=l!==void 0?l:I;}else y[_]=I;let f={id:N,card_data:{...D},requires:y,source_defs:L,compute:w.compute};f._sourcesData=C,w.compute&&re.runSync(f,{sourcesData:C}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(N,f.computed_values??{});let h={...w},T=re.enrichSourcesSync(Array.isArray(w.source_defs)?w.source_defs:void 0,{card_data:w.card_data,requires:y}),O=e.value;h.source_defs=Array.isArray(T)?T.map(_=>({..._,boardDir:typeof _.boardDir=="string"&&_.boardDir?_.boardDir:O})):T;let j=rr(),B=c.update?void 0:j,q=A.filter(_=>{let I=_.outputFile;if(typeof I!="string"||!I)return true;let l=p(I);B&&(l={...l,queueRequestedAt:B},a(I,l));let i=l.queueRequestedAt??l.lastRequestedAt??j,g=er(l,i);return g==="in-flight"?false:g==="dispatch"});if(V(),q.length>0){let _=false,I=j;for(let l of q){let i=l.outputFile;if(typeof i!="string"||!i)continue;let g=p(i),b=g.queueRequestedAt??j;a(i,{...g,lastRequestedAt:b}),I=b,_=true;}return _&&V(),_&&(S.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:I}}),r.executionRequestStore.appendEntries(t,S)),"task-initiated"}let H=w.provides??[],X={};for(let{bindTo:_,ref:I}of H)X[_]=re.resolve(f,I);return (u??r.outputStore.writeDataObjects.bind(r.outputStore))(X),L.filter(_=>{if(_.optionalForCompletionGating!==true)return false;let I=p(_.outputFile);return !I.lastRequestedAt||!I.lastFetchedAt?true:I.lastFetchedAt<=I.lastRequestedAt}).length>0&&S.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:j}}),n(c.nodeId,X),S.length>0&&r.executionRequestStore.appendEntries(t,S),"task-initiated"}}var Ge={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function kt(e){return {[ie]:e.graph,[ft]:e.lastDrainedJournalId}}function yt(e){let t=e[ie],r=e[ft];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ie}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function St(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function P(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function x(e){return {status:"fail",error:e}}function G(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function nr(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function bt(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(s)}function Ee(e){try{let t=JSON.parse(bt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function sr(e){return nr(JSON.stringify(e))}function Ct(e){try{let t=JSON.parse(bt(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function z(){return new Date().toISOString()}function zr(e,t){let r=t.onWarn??(()=>{}),n=Y(e);function s(l){if(l.length!==0)try{let i=t.publishBoardChangeNotifications?.(l);i&&typeof i.catch=="function"&&i.catch(g=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${g instanceof Error?g.message:String(g)}`));}catch(i){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${i instanceof Error?i.message:String(i)}`);}}function o(){let l=c().readCardStoreRef();if(!l)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let i=t.kvStorageForRef(l);return {readIndex(){return i.read("_index")},writeIndex(g){i.write("_index",g);},readCard(g){return i.read(g)},writeCard(g,b){return i.write(g,b),t.hashFn(b)},cardExists(g){return i.read(g)!==null},defaultCardKey(g){return g}}}let u={readValues(l){let i=t.kvStorage("state-snapshot"),g=i.listKeys().sort();if(g.length===0)return {version:null,values:{}};let b={};for(let F of g)b[F]=i.read(F);return {version:t.hashFn(b),values:b}},writeValues(l,i,g){let b=t.kvStorage("state-snapshot");for(let F of g)b.delete(F);for(let[F,$]of Object.entries(i))b.write(F,$);return t.hashFn(i)}},c=()=>Pe(t.kvStorage("config")),S=()=>gt(u),w=()=>dt(t.journalAdapter()),N=()=>qe(o(),r),D=()=>{let l=c().readOutputsStoreRef();if(!l)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return mt(t.kvStorageForRef(l))};function L(){return !!S().readSnapshot(e.value).values[ie]}function A(){let l=S().readSnapshot(e.value);if(!l.values[ie])throw new Error(`Board not initialized at ${e.value}`);return yt(l.values)}function v(l,i){let g=S().commitSnapshot(e.value,{schemaVersion:we,expectedVersion:i,commitId:t.genId(),committedAt:z(),deleteKeys:[],shallowMerge:kt(l)});if(!g.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${i??"null"} current=${g.currentVersion??"null"}`)}function k(l){w().appendEvent(l);}async function V(){let l=(R,E)=>{let K=R.payload,Z=(K?.enrichedCard??{}).id??K?.cardId??"unknown";k({type:"task-failed",taskName:Z,error:E,timestamp:z()});},i=lt(t.kvStorage("execution-requests"),l),g=pt(t.kvStorage("card-runtime")),b=Fe(t.blobStorage("sources"),R=>t.resolveBlob(R)),F=new Map,$={readRuntime(R){return F.get(R)??g.readRuntime(R)},writeRuntime(R,E){F.set(R,E);}},U=[],J=new Map,Q={readSourceData(R,E){let K=`${R}/${E}`;return J.has(K)?J.get(K):b.readSourceData(R,E)},ingestSourceDataStaged(R,E,K,de){b.ingestSourceDataStaged(R,E,K,de);},commitSourceData(R,E,K){let de=`${R}/.staged/${K}/${E}`,ye=t.blobStorage("sources").read(de);if(ye==null)return false;let le=`${R}/${E}`,Be=ye.trim();try{J.set(le,JSON.parse(Be));}catch{J.set(le,Be);}return U.push({cardId:R,outputFile:E,deliveryToken:K}),true},hasSource(R,E){let K=`${R}/${E}`;return J.has(K)?true:b.hasSource(R,E)}},W={cardStore:N(),cardRuntimeStore:$,fetchedSourcesStore:Q,outputStore:D(),executionRequestStore:i},se=A(),oe=Re(se.graph),{events:ue,newCursor:ce}=w().readEntriesAfterCursor(se.lastDrainedJournalId),ae=[],Ae=[],Te=[],$e=new Map,Rt=(R,E)=>{ae.push({type:"task-completed",taskName:R,data:E,timestamp:z()});},Le=(R,E)=>k({type:"task-failed",taskName:R,error:E,timestamp:z()}),he=nt(oe,{handlers:{"card-handler":ht(e,ce,W,Rt,Le,(R,E)=>{Ae.push({cardId:R,values:E});},R=>{Te.push(R);})}});for(ae=ue;ae.length>0;){let R=ae;ae=[];for(let E of R)if(E.type==="task-restart"){let K=W.cardStore.readCard(E.taskName);K&&$e.set(E.taskName,K);}he.pushAll(R),await he.waitForHandlers();}let Ve=he.getState();await he.dispose({wait:true});let vt=S().readSnapshot(e.value).version;v({lastDrainedJournalId:ce,graph:pe(Ve)},vt);for(let{cardId:R,values:E}of Ae)W.outputStore.writeComputedValues(R,E);for(let R of Te)W.outputStore.writeDataObjects(R);for(let[R,E]of F)g.writeRuntime(R,E);for(let{cardId:R,outputFile:E,deliveryToken:K}of U)b.commitSourceData(R,E,K);let ke;try{ke=xe(n,Ve),W.outputStore.writeStatusSnapshot(ke);}catch(R){r(`[board-live-cards-public] status publish failed: ${R instanceof Error?R.message:String(R)}`);}let fe=[];for(let{cardId:R,values:E}of Ae)fe.push({kind:"computed_values",cardId:R,values:E});for(let R of Te)for(let[E,K]of Object.entries(R))E&&fe.push({kind:"data_object",key:E,payload:K});for(let[R,E]of $e)fe.push({kind:"card_refreshed",cardId:R,card:E});ke!==void 0&&fe.push({kind:"status",status:ke}),s(fe);let wt=c().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:Y({kind:"built-in",value:"source-cli-task-executor"})};i.dispatchEntriesForJournalId(ce,R=>{if(R.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${R.taskKind}" \u2014 skipping`);return}let E=R.payload,K=E.enrichedCard?.id??"unknown",de=E.enrichedCard?.source_defs??[];for(let Z of de){if(!Z.outputFile){r(`[dispatch] source "${Z.bindTo}" has no outputFile \u2014 skipping`);continue}let ye=sr({cbk:E.callbackToken,rg:e.value,br:Y(e),cid:K,b:Z.bindTo,d:Z.outputFile,cs:void 0,rqt:E.rqt});t.dispatchExecution(wt,{source_def:Z,base_ref:Y(e),callback:{token:ye,via:t.selfRef}}).catch(le=>Le(K,le instanceof Error?le.message:String(le)));}});}async function p(){try{let l=()=>{let g=A(),{events:b}=w().readEntriesAfterCursor(g.lastDrainedJournalId);b.length<=0||(p(),t.requestProcessAccumulated?.());},i=await Ke(t.lock,V,l);return P({ran:i!==!1})}catch(l){return G(l)}}function a(l){try{let i=l.params?.cardStoreRef;if(!i)return x("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!L()){let $=be(Ge);v({lastDrainedJournalId:"",graph:pe($)},null);}let g=l.params?.outputsStoreRef;if(!g)return x("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let b=c();b.writeCardStoreRef(i),b.writeOutputsStoreRef(g);let F=l.body??{};F["task-executor-ref"]&&b.writeTaskExecutorRef(F["task-executor-ref"]),F["chat-handler-ref"]&&b.writeChatHandlerRef(F["chat-handler-ref"]);try{D().writeStatusSnapshot(xe(n,Re(A().graph)));}catch{}return P()}catch(i){return G(i)}}function d(l){try{let i=D().readStatusSnapshot();if(!i){i=xe(n,Re(A().graph));try{D().writeStatusSnapshot(i);}catch{}}return P(i)}catch(i){return G(i)}}function m(l){try{let i=l.params?.id;return i?(k({type:"task-removal",taskName:i,timestamp:z()}),p(),P()):x("removeCard requires params.id")}catch(i){return G(i)}}function C(l){try{let i=l.params?.id;return i?(k({type:"task-restart",taskName:i,timestamp:z()}),p(),P()):x("retrigger requires params.id")}catch(i){return G(i)}}async function y(l){return p()}function f(l){try{let i=l.params?.cardId,g=l.params?.all,b=!!l.params?.restart;if(!i&&!g)return x("upsertCard requires --card-id <id> or --all");let F=g?N().readAllCards().map($=>$.id):[i];for(let $ of F)if(!N().readCard($))return x(`Card "${$}" not found in board at ${e.value}`);for(let $ of F){let U=N().readCard($),J=St(U),Q=t.hashFn(J),W=t.kvStorage("card-upsert"),se=W.read($),oe=se?.taskConfigHash!==Q;if(!(!oe&&!b)){if(oe){let ue=se?.blobRef??N().readCardKey($)??$;k({type:"task-upsert",taskName:$,taskConfig:J,timestamp:z()}),W.write($,{blobRef:ue,taskConfigHash:Q,updatedAt:z()});}b&&k({type:"task-restart",taskName:$,timestamp:z()});}}return p(),P()}catch(i){return G(i)}}function h(l){try{let i=l.params?.token;if(!i)return x("taskFailed requires params.token");let g=l.params?.error??"unknown error",b=Ee(i);return b?(k({type:"task-failed",taskName:b.taskName,error:g,timestamp:z()}),p(),P()):x("Invalid callback token")}catch(i){return G(i)}}function T(l){try{let i=l.params?.token;if(!i)return x("taskProgress requires params.token");let b=(l.body??{}).update??{},F=Ee(i);return F?(k({type:"task-progress",taskName:F.taskName,update:b,timestamp:z()}),p(),P()):x("Invalid callback token")}catch(i){return G(i)}}function O(l){try{let i=l.params?.token,g=l.params?.ref;if(!i)return x("sourceDataFetched requires params.token");if(!g)return x("sourceDataFetched requires params.ref");let b=Ct(i);if(!b)return x("Invalid source token");let{cbk:F,cid:$,b:U,d:J,cs:Q,rqt:W}=b,se=Fe(t.blobStorage("sources"),ae=>t.resolveBlob(ae)),oe=t.genId();se.ingestSourceDataStaged($,J,_e(g),oe);let ue=Ee(F);if(!ue)return x("Invalid callback token embedded in source token");let ce=z();return k({type:"task-progress",taskName:ue.taskName,update:{bindTo:U,outputFile:J,fetchedAt:ce,deliveryToken:oe,sourceChecksum:Q,rqt:W},timestamp:ce}),p(),P()}catch(i){return G(i)}}function j(l){try{let i=l.params?.token,g=l.params?.reason??"unknown";if(!i)return x("sourceDataFetchFailure requires params.token");let b=Ct(i);if(!b)return x("Invalid source token");let{cbk:F,b:$,d:U,cs:J}=b,Q=Ee(F);return Q?(k({type:"task-progress",taskName:Q.taskName,update:{bindTo:$,outputFile:U,failure:!0,reason:g,sourceChecksum:J},timestamp:z()}),p(),P()):x("Invalid callback token embedded in source token")}catch(i){return G(i)}}function B(l){try{let i=c().readCardStoreRef();return i?P({storeRef:i}):x(`Board at ${e.value} has no card store configured`)}catch(i){return G(i)}}function q(l){try{let i=c().readOutputsStoreRef();return i?P({storeRef:i}):x(`Board at ${e.value} has no outputs store configured`)}catch(i){return G(i)}}function H(l){try{let i=l.params?.key;if(!i)return x("getConfig requires params.key");let g=c(),b;switch(i){case "task-executor":b=g.readTaskExecutorRef()??null;break;case "chat-handler":b=g.readChatHandlerRef()??null;break;case "card-store-ref":b=g.readCardStoreRef();break;case "outputs-store-ref":b=g.readOutputsStoreRef();break;default:return x(`getConfig: unknown key "${i}"`)}return P({value:b})}catch(i){return G(i)}}function X(l){try{let i=l.params?.key;if(!i)return x("getOutputsDataObject requires params.key");let g=D().readDataObject(i);return P(g)}catch(i){return G(i)}}function ne(l){try{return P(D().readAllDataObjects())}catch(i){return G(i)}}function _(l){try{let i=l.params?.key;if(!i)return x("getOutputsComputedValues requires params.key");let g=D().readComputedValues(i);return P(g)}catch(i){return G(i)}}function I(l){try{return P(D().readAllComputedValues())}catch(i){return G(i)}}return {init:a,status:d,getCardStoreRef:B,getOutputsStoreRef:q,getConfig:H,getOutputsDataObject:X,getAllOutputsDataObjects:ne,getOutputsComputedValues:_,getAllOutputsComputedValues:I,removeCard:m,retrigger:C,processAccumulatedEvents:y,upsertCard:f,taskFailed:h,taskProgress:T,sourceDataFetched:O,sourceDataFetchFailure:j}}function Yr(e,t){let r=()=>Pe(t.kvStorage("config"));function n(){let p=r().readCardStoreRef();if(!p)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let a=t.kvStorageForRef(p);return {readIndex(){return a.read("_index")},writeIndex(d){a.write("_index",d);},readCard(d){return a.read(d)},writeCard(d,m){return a.write(d,m),t.hashFn(m)},cardExists(d){return a.read(d)!==null},defaultCardKey(d){return d}}}let s=()=>qe(n(),t.onWarn??(()=>{}));function o(p,a){let d=t.validateSchema(a),m=[],C=r().readTaskExecutorRef();if(C&&Array.isArray(a.source_defs))for(let f of a.source_defs){let h=typeof f.bindTo=="string"?f.bindTo:"(unknown)";try{let T;try{T=t.invokeExecutorSync(C,"validate-source-def",[],{timeout:1e4,input:JSON.stringify(f)});}catch(j){let B=j;if(T=typeof B?.stdout=="string"?B.stdout:"",!T.trim()){m.push(`source "${h}": executor validate-source-def failed \u2014 ${j instanceof Error?j.message:String(j)}`);continue}}let O=JSON.parse(T.trim());if(!O.ok&&Array.isArray(O.errors))for(let j of O.errors)m.push(`source "${h}": ${j}`);}catch(T){m.push(`source "${h}": executor validate-source-def failed \u2014 ${T instanceof Error?T.message:String(T)}`);}}let y=[...d.errors,...m];return P({cardId:p,isValid:y.length===0,issues:y})}function u(p,a,d){let m=r().readTaskExecutorRef();if(!m)return x("No task-executor registered for this board");let C=typeof p.bindTo=="string"?p.bindTo:"source",y=t.makeTempFilePath(`probe-in-${C}`),f=t.makeTempFilePath(`probe-out-${C}`),h=t.makeTempFilePath(`probe-err-${C}`,".txt"),T={...p,boardDir:e.value,_projections:a},O=Y({kind:"fs-path",value:y}),j=Y({kind:"fs-path",value:f}),B=Y({kind:"fs-path",value:h});t.absoluteBlob.write(y,JSON.stringify(T,null,2));let q=null;try{if(t.invokeExecutorSync(m,"run-source-fetch",["--in-ref",O,"--out-ref",j,"--err-ref",B],{timeout:p.timeout??3e4}),q=t.absoluteBlob.read(f),q===null)return x("Executor produced no output file")}catch(H){let X=t.absoluteBlob.read(h)?.trim()??(H instanceof Error?H.message:String(H));return x(`Probe failed: ${X}`)}finally{try{t.absoluteBlob.remove(y);}catch{}try{t.absoluteBlob.remove(h);}catch{}}if(d){let H=_e(d);t.absoluteBlob.write(H.value,q);}else try{t.absoluteBlob.remove(f);}catch{}return P({bindTo:C,resultSizeBytes:q.length})}function c(p){try{let a=p.params?.cardId,d=p.params?.all;if(!a&&!d)return x("validateCard requires --card-id <id> or --all");let m=d?s().readAllCards().map(y=>y.id):[a],C=[];for(let y of m){let f=s().readCard(y);if(!f){C.push({cardId:y,isValid:!1,issues:[`Card "${y}" not found`]});continue}let h=o(y,f);if(h.status!=="success")return h;C.push(h.data);}return P(C)}catch(a){return G(a)}}function S(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("validateCardPreflight requires card JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=o(m,d),y=r().readTaskExecutorRef();if(y)try{let f=t.invokeExecutorSync(y,"validate-card-preflight",[],{timeout:1e4,input:JSON.stringify(d)}),h=JSON.parse(f.trim());if(!h.ok&&Array.isArray(h.errors)&&h.errors.length>0){let T=[...C.status==="success"?C.data.issues:[],...h.errors];return P({cardId:m,isValid:!1,issues:T})}}catch{}return C}catch(a){return G(a)}}function w(p){try{let a=p.params?.cardId,d=p.params?.sourceIdx,m=p.params?.outRef;if(!a)return x("probeSource requires params.cardId");if(d===void 0)return x("probeSource requires params.sourceIdx");let y=(p.body??{})["mock-projections"]??{},f=s().readCard(a);if(!f)return x(`Card "${a}" not found`);let h=f.source_defs??[];return d<0||d>=h.length?x(`sourceIdx ${d} out of range (card has ${h.length} source(s))`):u(h[d],y,m)}catch(a){return G(a)}}function N(p){try{let a=p.params?.outRef,d=p.body;if(!d)return x('probeTmpSource requires body with "source-def" and "mock-projections"');let m=d["source-def"],C=d["mock-projections"]??{};return m?u(m,C,a):x('probeTmpSource body requires "source-def"')}catch(a){return G(a)}}function D(p){try{let a=p.params?.sourceIdx,d=p.params?.outRef;if(a===void 0)return x("probeSourcePreflight requires params.sourceIdx");if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("probeSourcePreflight requires card JSON object in body");let m=p.body,C=m["card-content"]??m,y=m["mock-projections"]??{},f=C.source_defs??[];if(a<0||a>=f.length)return x(`sourceIdx ${a} out of range (card has ${f.length} source(s))`);let h=f[a],T=r().readTaskExecutorRef();if(T){let O=typeof h.bindTo=="string"?h.bindTo:"source";try{let j={...h,_projections:y},B=t.invokeExecutorSync(T,"probe-source-preflight",[],{timeout:h.timeout??1e4,input:JSON.stringify(j)}),q=JSON.parse(B.trim());return q.ok?P({bindTo:O,reachable:q.reachable,latencyMs:q.latencyMs,note:q.note}):x(q.error??"Preflight probe failed")}catch{}}return u(h,y,d)}catch(a){return G(a)}}function L(p){try{let a=r().readTaskExecutorRef();if(!a)return x("No task-executor registered for this board");let d=t.invokeExecutorSync(a,"describe-capabilities",[],{timeout:1e4});return P(JSON.parse(d.trim()))}catch(a){return G(a)}}function A(p){try{let a=p.body;if(!a||!Array.isArray(a.ops))return x("updatesInCardStore requires body.ops array");let d=a.ops,m=s();for(let C of d){let y=C.op,f=C.id;if(!f)return x('op is missing "id"');if(y==="update"){let h=C["card-content"];if(!h)return x(`update op for "${f}" is missing "card-content"`);m.writeCard(f,h);}else return x(`Unknown op type: "${y??"(none)"}"`)}return P()}catch(a){return G(a)}}function v(p){try{let a=p.body;if(!a||!Array.isArray(a.ids))return x("readFromCardStore requires body.ids array");let d=a.ids,m=s(),C=d.map(y=>({id:y,"card-content":m.readCard(y)}));return P({cards:C})}catch(a){return G(a)}}function k(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("evalCardCompute requires a JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=a["mock-fetched-sources"]??{},y=a["mock-requires"]??{},f=d.compute;if(!f||!Array.isArray(f)||f.length===0)return P({cardId:m,ok:!0,computed_values:{},errors:[]});let h={id:m,card_data:d.card_data??{},requires:y,source_defs:d.source_defs,compute:f},T=re.runSync(h,{sourcesData:C}),O=T.node.computed_values??{},j=T.errors??[];return P({cardId:m,ok:j.length===0,computed_values:O,errors:j})}catch(a){return G(a)}}function V(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("simulateCardCycle requires a JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=a["mock-fetched-sources"]??{},y=a["mock-requires"]??{},f=o(m,d),h=f.status==="success"?{isValid:f.data.isValid,issues:f.data.issues}:{isValid:!1,issues:[f.status==="fail"?f.error:"internal error"]},T=d.source_defs??[],O=d.card_data??{},j=[],B=[];if(T.length>0){j=re.enrichSourcesSync(T,{card_data:O,requires:y});for(let i of j){let g=i.projections,b=i._projections;if(g&&b){for(let F of Object.keys(g))if(b[F]===void 0){let $=typeof i.bindTo=="string"?i.bindTo:"(unknown)";B.push({bindTo:$,key:F,error:`Projection "${F}" resolved to undefined`});}}}}let q=[],H=a["task-executor-ref"],X=(H?.howToRun&&H?.whatToRun?H:void 0)??r().readTaskExecutorRef();for(let i=0;i<j.length;i++){let g=j[i],b=typeof g.bindTo=="string"?g.bindTo:`source_${i}`;if(!X){q.push({bindTo:b,skipped:!0,error:"No task executor configured"});continue}try{let F={...g},$=t.invokeExecutorSync(X,"probe-source-preflight",[],{timeout:g.timeout??1e4,input:JSON.stringify(F)}),U=JSON.parse($.trim());q.push({bindTo:b,reachable:U.reachable,latencyMs:U.latencyMs,error:U.ok?void 0:U.error});}catch{q.push({bindTo:b,skipped:!0,error:"Executor does not support probe-source-preflight"});}}let ne=d.compute,_={},I=[];if(ne&&Array.isArray(ne)&&ne.length>0){let i={id:m,card_data:O,requires:y,source_defs:d.source_defs,compute:ne},g=re.runSync(i,{sourcesData:C});_=g.node.computed_values??{},I=g.errors??[];}let l=h.isValid&&B.length===0&&I.length===0&&q.every(i=>i.reachable!==!1);return P({cardId:m,ok:l,validation:h,source_probes:q,projection_errors:B,computed_values:_,compute_errors:I})}catch(a){return G(a)}}return {validateCard:c,validateCardPreflight:S,probeSource:w,probeTmpSource:N,probeSourcePreflight:D,evalCardCompute:k,simulateCardCycle:V,describeTaskExecutorCapabilities:L,updatesInCardStore:A,readFromCardStore:v}}
1
+ 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Se="b64:";function xt(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Et(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Y(e){return `${Se}${xt(JSON.stringify(e))}`}function _e(e){if(!e.startsWith(Se))throw new Error(`Invalid ref format (expected ${Se}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Et(e.slice(Se.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Ke(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var ee={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function M(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function te(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function He(e){return e.tasks??{}}function Ie(e){return e?e.status===ee.FAILED||e.status===ee.INACTIVATED:false}function Ue(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Je(e){return e.maxExecutions}function Me(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===ee.COMPLETED){let s=e.tasks[n];s&&M(s).forEach(c=>r.add(c));}return Array.from(r)}function ze(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;M(o).forEach(u=>{r[u]||(r[u]=[]),r[u].push(n);});}),r}function Ye(e,t,r){let n=e.tasks[t]??Ce(),o={};if(r){let u=r.tasks[t],c=te(u);for(let S of c)for(let[w,N]of Object.entries(r.tasks))if(M(N).includes(S)){let D=e.tasks[w];D?.lastDataHash&&(o[S]=D.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Xe(e,t,r,n,o,s){let u=e.tasks[r]??Ce(),c=t.tasks[r];if(!c)throw new Error(`Task "${r}" not found in graph`);let S;n&&c.on&&c.on[n]?S=c.on[n]:S=M(c);let w=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let L=c.requires??[];for(let A of L)for(let[v,k]of Object.entries(t.tasks))if(M(k).includes(A)){let V=e.tasks[v];V?.lastDataHash&&(w[A]=V.lastDataHash);break}}let N={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:w,error:void 0},D=[...new Set([...e.availableOutputs,...S])];return {...e,tasks:{...e.tasks,[r]:N},availableOutputs:D,lastUpdated:new Date().toISOString()}}function We(e,t,r,n){let o=e.tasks[r]??Ce(),s=t.tasks[r];if(s?.retry){let S=o.retryCount+1;if(S<=s.retry.max_attempts){let w={...o,status:"not-started",retryCount:S,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:w},lastUpdated:new Date().toISOString()}}}let u={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},c=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(c=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&u.executionCount>=s.circuit_breaker.max_executions){let S=s.circuit_breaker.on_break;c=[...new Set([...c,...S])];}return {...e,tasks:{...e.tasks,[r]:u},availableOutputs:c,lastUpdated:new Date().toISOString()}}function Qe(e,t,r,n){let o=e.tasks[t]??Ce(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Ze(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Ce(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function be(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=tt();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function At(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:Ye(n,t.taskName,r)};case "task-completed":return {config:r,state:Xe(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:We(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Qe(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Ze(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Dt(n,t.action)};case "task-upsert":return Tt(e,t.taskName,t.taskConfig);case "task-removal":return _t(e,t.taskName);case "node-requires-add":return It(e,t.nodeName,t.tokens);case "node-requires-remove":return Ot(e,t.nodeName,t.tokens);case "node-provides-add":return jt(e,t.nodeName,t.tokens);case "node-provides-remove":return Nt(e,t.nodeName,t.tokens);default:return e}}function et(e,t){return t.reduce((r,n)=>At(r,n),e)}function Tt(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:tt()},lastUpdated:new Date().toISOString()}}}function _t(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function It(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=te(n),s=r.filter(u=>!o.includes(u));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function Ot(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=te(n),s=o.filter(u=>!r.includes(u));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function jt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=M(n),s=r.filter(u=>!o.includes(u));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function Nt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=M(n),s=o.filter(u=>!r.includes(u));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function pe(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Re(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function tt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Dt(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function ge(e){let{config:t,state:r}=e,n=He(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=qt(n),u=Me(t,r.tasks),c=new Set([...u,...r.availableOutputs]),S=[],w=[],N=[],D=[];for(let[A,v]of Object.entries(n)){let k=r.tasks[A],V=Ue(v,t.settings),p=V!=="once";if(k?.status===ee.RUNNING||Ie(k))continue;let a=Je(v);if(a!==void 0&&k&&k.executionCount>=a||v.circuit_breaker&&k&&k.executionCount>=v.circuit_breaker.max_executions||!p&&k?.status===ee.COMPLETED)continue;if(p&&k?.status===ee.COMPLETED){let f=te(v),h=false;switch(V){case "data-changed":{f.length>0&&f.some(O=>{for(let[j,B]of Object.entries(n))if(M(B).includes(O)){let q=r.tasks[j];if(!q)continue;let H=k.lastConsumedHashes?.[O];return q.lastDataHash==null?q.executionCount>k.lastEpoch:q.lastDataHash!==H}return false})||(h=true);break}case "epoch-changed":{f.length>0&&f.some(O=>{for(let[j,B]of Object.entries(n))if(M(B).includes(O)){let q=r.tasks[j];if(q&&q.executionCount>k.lastEpoch)return true}return false})||(h=true);break}case "time-based":{let T=v.refreshInterval??0;if(T<=0){h=true;break}let O=k.completedAt;if(!O){h=true;break}(Date.now()-Date.parse(O))/1e3<T&&(h=true);break}case "manual":h=true;break}if(h)continue}let d=te(v);if(d.length===0){S.push(A);continue}let m=[],C=[],y=[];for(let f of d){if(c.has(f))continue;let h=s[f]||[];h.length===0?m.push(f):h.every(O=>Ie(r.tasks[O]))?y.push({token:f,failedProducer:h[0]}):C.push(f);}m.length>0?N.push({taskName:A,missingTokens:m}):y.length>0?D.push({taskName:A,failedTokens:y.map(f=>f.token),failedProducers:[...new Set(y.map(f=>f.failedProducer))]}):C.length>0?w.push({taskName:A,waitingOn:C}):S.push(A);}let L={};if(S.length>1){let A=ze(S,n);for(let[v,k]of Object.entries(A))k.length>1&&(L[v]=k);}return {eligible:S,pending:w,unresolved:N,blocked:D,conflicts:L}}function qt(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of M(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var me=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Oe(e){let t=je(e);return Ft(t)}function je(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(je).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+je(t[n])).join(",")+"}"}function Ft(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Pt(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Gt(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function rt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Pt(t)}function $t(e){try{let t=JSON.parse(Gt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function nt(e,t,r){let{handlers:n,onDrain:o}=t,s=new me,u="state"in e&&"config"in e?e:be(e),c=false,S=new Set,w=new Map(Object.entries(n)),N=new me,D=false,L=false;function A(){if(!c){if(D){L=true;return}D=true;try{do L=!1,v();while(L)}finally{D=false;}}}function v(){let a=N.drain(),d=s.drain(),m=[...a,...d];m.length>0&&(u=et(u,m));let C=ge(u);m.length>0&&o?.(m,u,C);for(let y of C.eligible)p(y);for(let y of m)if(y.type==="task-progress"){let{taskName:f,update:h}=y;if(!u.config.tasks[f])continue;let O=u.state.tasks[f];if(!O||O.status!=="running")continue;let j=rt(f),B=V(f,j,h).catch(q=>{c||(N.append({type:"task-failed",taskName:f,error:q.message??String(q),timestamp:new Date().toISOString()}),A());}).finally(()=>{S.delete(B);});S.add(B);}}function k(a){let m=u.config.tasks[a].requires??[],C=new Map;for(let[f,h]of Object.entries(u.config.tasks))for(let T of h.provides??[])C.set(T,f);let y={};for(let f of m){let h=C.get(f);h?y[f]=u.state.tasks[h]?.data:y[f]=void 0;}return y}async function V(a,d,m){let C=u.config.tasks[a],y=C.taskHandlers??[],f=k(a);for(let h of y){let T=w.get(h);if(!T)throw new Error(`Handler '${h}' not found in registry (task '${a}')`);let O={nodeId:a,state:f,taskState:u.state.tasks[a],config:C,callbackToken:d,update:m};if(await T(O)==="task-initiate-failure")throw new Error(`Handler '${h}' returned task-initiate-failure (task '${a}')`)}}function p(a){let m=u.config.tasks[a]?.taskHandlers;if(!m||m.length===0)return;N.append({type:"task-started",taskName:a,timestamp:new Date().toISOString()}),A();let C=rt(a),y=V(a,C).catch(f=>{c||(N.append({type:"task-failed",taskName:a,error:f.message??String(f),timestamp:new Date().toISOString()}),A());}).finally(()=>{S.delete(y);});S.add(y);}return {push(a){c||(a.type==="task-completed"&&a.data&&!a.dataHash&&(a={...a,dataHash:Oe(a.data)}),s.append(a),A());},pushAll(a){if(!c){for(let d of a)d.type==="task-completed"&&d.data&&!d.dataHash?s.append({...d,dataHash:Oe(d.data)}):s.append(d);A();}},resolveCallback(a,d,m){if(c)return;let C=$t(a);if(!C)return;let{taskName:y}=C;if(u.config.tasks[y]){if(m&&m.length>0)s.append({type:"task-failed",taskName:y,error:m.join("; "),timestamp:new Date().toISOString()});else {let f=d&&Object.keys(d).length>0?Oe(d):void 0;s.append({type:"task-completed",taskName:y,data:d,dataHash:f,timestamp:new Date().toISOString()});}A();}},addNode(a,d){c||(s.append({type:"task-upsert",taskName:a,taskConfig:d,timestamp:new Date().toISOString()}),A());},removeNode(a){c||(s.append({type:"task-removal",taskName:a,timestamp:new Date().toISOString()}),A());},addRequires(a,d){c||(s.append({type:"node-requires-add",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},removeRequires(a,d){c||(s.append({type:"node-requires-remove",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},addProvides(a,d){c||(s.append({type:"node-provides-add",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},removeProvides(a,d){c||(s.append({type:"node-provides-remove",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},registerHandler(a,d){w.set(a,d);},unregisterHandler(a){w.delete(a);},retrigger(a){c||u.config.tasks[a]&&(s.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()}),A());},retriggerAll(a){if(!c){for(let d of a)u.config.tasks[d]&&s.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});A();}},snapshot(){return pe(u)},getState(){return u},getSchedule(){return ge(u)},async waitForHandlers(){S.size>0&&await Promise.allSettled([...S]);},async dispose(a){a?.wait&&S.size>0&&await Promise.allSettled([...S]),c=true;}}}var Vt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-public.cjs', document.baseURI).href)));Vt("./jsonata-sync.cjs");var Kt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-public.cjs', document.baseURI).href))),ve=Kt("./jsonata-sync.cjs"),at=ve;function ot(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function it(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Ht(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await ve(o.expr).evaluate(n);it(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Ut(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let u=at(s.expr).evaluate(n);it(e.computed_values,s.bindTo,u),n.computed_values=e.computed_values;}catch(u){let c=u instanceof Error?u.message:String(u);o.push({bindTo:s.bindTo,error:c});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Jt(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return ve(e).evaluate(n)}function Mt(e,t){return t.startsWith("fetched_sources.")?ot(e._sourcesData??{},t.slice(16)):ot(e,t)}var st=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),zt=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Yt(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))zt.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,u)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${u}]: must be an object`);else {let c=s;typeof c.bindTo!="string"||!c.bindTo?t.push(`source_defs[${u}]: missing required "bindTo" property`):(n.has(c.bindTo)&&t.push(`source_defs[${u}]: bindTo "${c.bindTo}" is not unique across source_defs`),n.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?t.push(`source_defs[${u}]: missing required "outputFile" property`):(o.has(c.outputFile)&&t.push(`source_defs[${u}]: outputFile "${c.outputFile}" is not unique across source_defs`),o.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${u}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):st.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...st].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Xt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=await ve(u).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Wt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=at(u).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var re={run:Ht,runSync:Ut,eval:Jt,resolve:Mt,validate:Yt,enrichSources:Xt,enrichSourcesSync:Wt};function Ne(e){return JSON.stringify(e)}function De(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function qe(e,t){function r(){return e.readIndex()??{}}function n(o,s,u){let c=String(s||"").split(".").filter(Boolean);if(c.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let S={...o},w=S;for(let N=0;N<c.length-1;N++){let D=c[N],L=w[D],A=L&&typeof L=="object"&&!Array.isArray(L)?{...L}:{};w[D]=A,w=A;}return w[c[c.length-1]]=u,S}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,u]of Object.entries(r())){if(!e.cardExists(u.key))continue;let c=e.readCard(u.key);c?o.push(c):t?.(`[card-store] could not read card "${s}" at key "${u.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,u]of Object.entries(r()))o[s]=u.checksum;return o},changedSince(o){let s=r(),u=[];for(let[c,S]of Object.entries(s))o[c]!==S.checksum&&u.push(c);for(let c of Object.keys(o))s[c]||u.push(c);return u},validateUpsert(o,s){let u=r(),c=u[o],S=Object.entries(u).find(([,w])=>w.key===s);return c&&c.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${c.key}", cannot remap to "${s}"`}:S&&S[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${S[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,u){let c=r(),S=u??c[o]?.key??e.defaultCardKey(o),w=e.writeCard(S,s);c[o]={key:S,checksum:w,updatedAt:new Date().toISOString()},e.writeIndex(c);},patchCard(o,s,u){let c=r(),S=c[o];if(!S||!e.cardExists(S.key))throw new Error(`card "${o}" not found`);let w=e.readCard(S.key);if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`card "${o}" is not patchable`);let N=n(w,s,u),D=e.writeCard(S.key,N);c[o]={key:S.key,checksum:D,updatedAt:new Date().toISOString()},e.writeIndex(c);},removeCard(o){let s=r();s[o]&&(delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function Fe(e,t){return {readSourceData(r,n){let o=e.read(`${r}/${n}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,n,o,s){let u=t(o);e.write(`${r}/.staged/${s}/${n}`,u);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,u=e.read(s);return u==null?false:(e.write(`${r}/${n}`,u),e.remove(s),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function dt(e){function t(r){let n=e.readAllEntries();if(!r)return n;let o=n.findIndex(s=>s.id===r);return o===-1?n:n.slice(o+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function lt(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let o=e.read(r)??[];e.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=e.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(u){let c=u instanceof Error?u.message:String(u);try{t(s,c);}catch{}}e.delete(r);}}}}var we="v1",ie="board/graph",ft="board/lastJournalProcessedId";function ut(e){return `cards/${e}/runtime`}function pt(e){return {readRuntime(t){return e.read(ut(t))??{_sources:{}}},writeRuntime(t,r){e.write(ut(t),r);}}}function Qt(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function gt(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==we)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let o=Qt(n.values,r);return {ok:true,newVersion:e.writeValues(t,o,r.deleteKeys)}}}}function Pe(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return De(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Ne(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return De(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",Ne(r));},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function mt(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Zt(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function er(e,t){return e?.lastRequestedAt?Zt(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function tr(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function ct(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function xe(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=ge(t),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},c=new Map;for(let v of s.pending)c.set(v.taskName,v.waitingOn);for(let v of s.unresolved)c.set(v.taskName,v.missingTokens);for(let v of s.blocked)c.set(v.taskName,v.failedTokens);let S=new Map;for(let[v,k]of Object.entries(n))for(let V of k.requires??[]){let p=S.get(V)??[];p.push(v),S.set(V,p);}let w=o.sort().map(v=>{let k=r[v],V=n[v]??{requires:[],provides:[]};k.status==="completed"?u.completed+=1:k.status==="failed"?u.failed+=1:k.status==="in-progress"&&(u.in_progress+=1);let p=V.requires??[],a=V.provides??[],d=Object.keys(k.data??{}).sort(),m=p.filter(O=>t.state.availableOutputs.includes(O)),C=p.filter(O=>!t.state.availableOutputs.includes(O)),y=c.get(v)??C,f=new Set;for(let O of a)for(let j of S.get(O)??[])j!==v&&f.add(j);let h=k.failedAt,T=k.error?{message:k.error,code:"TASK_FAILED",at:h,source:"task-runtime"}:void 0;return {name:v,status:k.status,error:T,requires:p,requires_satisfied:m,requires_missing:C,provides_declared:a,provides_runtime:d,blocked_by:y,unblocks:Array.from(f).sort(),runtime:{attempt_count:k.executionCount??0,restart_count:k.retryCount??0,in_progress_since:k.status==="in-progress"?k.startedAt??null:null,last_transition_at:k.lastUpdated??null,last_completed_at:k.completedAt??null,last_restarted_at:k.startedAt??null,status_age_ms:k.lastUpdated?0:null}}});u.pending=s.pending.length,u.blocked=s.blocked.length,u.unresolved=s.unresolved.length;let N=w.map(v=>({name:v.name,fanOut:v.unblocks.length})).sort((v,k)=>k.fanOut-v.fanOut||v.name.localeCompare(k.name)),D=N.length>0?N[0]:{name:null,fanOut:0},L=new Set;for(let v of Object.values(n))for(let k of v.requires??[])L.add(k);let A=0;for(let[v,k]of Object.entries(n)){let V=(k.requires??[]).length===0,a=(k.provides??[]).some(d=>(S.get(d)??[]).some(m=>m!==v));V&&!a&&(A+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:u.completed,eligible:s.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:A,topology:{edge_count:Array.from(L).length,max_fan_out_card:D.name,max_fan_out:D.fanOut}},cards:w}}function rr(){return new Date().toISOString()}function ht(e,t,r,n,o,s,u){return async c=>{let S=[],w=r.cardStore.readCard(c.nodeId);if(!w)return "task-initiate-failure";let N=w.id,D=w.card_data??{},L=w.source_defs??[],A=L.filter(_=>_.optionalForCompletionGating!==true),v=r.cardRuntimeStore.readRuntime(N),k=false,V=()=>{k&&(r.cardRuntimeStore.writeRuntime(N,v),k=false);},p=_=>({...v._sources[_]??{}}),a=(_,I)=>{v._sources[_]=I,k=true;},d=c.taskState?.executionCount??0,m=v._lastExecutionCount;if(typeof m=="number"&&m!==d&&(v._sources={},k=true),m!==d&&(v._lastExecutionCount=d,k=true),c.update){let _=c.update,I=_.outputFile;if(I){let l=p(I);if(_.failure)a(I,ct(l,_.reason??"unknown"));else {let i=_.rqt;if(!l.lastFetchedAt||i>l.lastFetchedAt){let g=typeof _.deliveryToken=="string"?_.deliveryToken:void 0,b=false;g&&(b=r.fetchedSourcesStore.commitSourceData(N,I,g)),b?a(I,tr(l,i)):a(I,ct(l,`source delivery commit failed for ${I} token=${String(g)}`));}}V();}}let C={};for(let _ of L)if(_.outputFile){let I=r.fetchedSourcesStore.readSourceData(N,_.outputFile);I!==null&&(C[_.bindTo]=I);}let y={};for(let[_,I]of Object.entries(c.state??{}))if(I!==null&&typeof I=="object"&&!Array.isArray(I)){let l=I[_];y[_]=l!==void 0?l:I;}else y[_]=I;let f={id:N,card_data:{...D},requires:y,source_defs:L,compute:w.compute};f._sourcesData=C,w.compute&&re.runSync(f,{sourcesData:C}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(N,f.computed_values??{});let h={...w},T=re.enrichSourcesSync(Array.isArray(w.source_defs)?w.source_defs:void 0,{card_data:w.card_data,requires:y}),O=e.value;h.source_defs=Array.isArray(T)?T.map(_=>({..._,boardDir:typeof _.boardDir=="string"&&_.boardDir?_.boardDir:O})):T;let j=rr(),B=c.update?void 0:j,q=A.filter(_=>{let I=_.outputFile;if(typeof I!="string"||!I)return true;let l=p(I);B&&(l={...l,queueRequestedAt:B},a(I,l));let i=l.queueRequestedAt??l.lastRequestedAt??j,g=er(l,i);return g==="in-flight"?false:g==="dispatch"});if(V(),q.length>0){let _=false,I=j;for(let l of q){let i=l.outputFile;if(typeof i!="string"||!i)continue;let g=p(i),b=g.queueRequestedAt??j;a(i,{...g,lastRequestedAt:b}),I=b,_=true;}return _&&V(),_&&(S.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:I}}),r.executionRequestStore.appendEntries(t,S)),"task-initiated"}let H=w.provides??[],X={};for(let{bindTo:_,ref:I}of H)X[_]=re.resolve(f,I);return (u??r.outputStore.writeDataObjects.bind(r.outputStore))(X),L.filter(_=>{if(_.optionalForCompletionGating!==true)return false;let I=p(_.outputFile);return !I.lastRequestedAt||!I.lastFetchedAt?true:I.lastFetchedAt<=I.lastRequestedAt}).length>0&&S.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:j}}),n(c.nodeId,X),S.length>0&&r.executionRequestStore.appendEntries(t,S),"task-initiated"}}var Ge={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function kt(e){return {[ie]:e.graph,[ft]:e.lastDrainedJournalId}}function yt(e){let t=e[ie],r=e[ft];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ie}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function St(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function P(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function x(e){return {status:"fail",error:e}}function G(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function nr(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function bt(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function Ee(e){try{let t=JSON.parse(bt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function or(e){return nr(JSON.stringify(e))}function Ct(e){try{let t=JSON.parse(bt(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function z(){return new Date().toISOString()}function zr(e,t){let r=t.onWarn??(()=>{}),n=Y(e);function o(l){if(l.length!==0)try{let i=t.publishBoardChangeNotifications?.(l);i&&typeof i.catch=="function"&&i.catch(g=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${g instanceof Error?g.message:String(g)}`));}catch(i){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${i instanceof Error?i.message:String(i)}`);}}function s(){let l=c().readCardStoreRef();if(!l)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let i=t.kvStorageForRef(l);return {readIndex(){return i.read("_index")},writeIndex(g){i.write("_index",g);},readCard(g){return i.read(g)},writeCard(g,b){return i.write(g,b),t.hashFn(b)},cardExists(g){return i.read(g)!==null},defaultCardKey(g){return g}}}let u={readValues(l){let i=t.kvStorage("state-snapshot"),g=i.listKeys().sort();if(g.length===0)return {version:null,values:{}};let b={};for(let F of g)b[F]=i.read(F);return {version:t.hashFn(b),values:b}},writeValues(l,i,g){let b=t.kvStorage("state-snapshot");for(let F of g)b.delete(F);for(let[F,$]of Object.entries(i))b.write(F,$);return t.hashFn(i)}},c=()=>Pe(t.kvStorage("config")),S=()=>gt(u),w=()=>dt(t.journalAdapter()),N=()=>qe(s(),r),D=()=>{let l=c().readOutputsStoreRef();if(!l)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return mt(t.kvStorageForRef(l))};function L(){return !!S().readSnapshot(e.value).values[ie]}function A(){let l=S().readSnapshot(e.value);if(!l.values[ie])throw new Error(`Board not initialized at ${e.value}`);return yt(l.values)}function v(l,i){let g=S().commitSnapshot(e.value,{schemaVersion:we,expectedVersion:i,commitId:t.genId(),committedAt:z(),deleteKeys:[],shallowMerge:kt(l)});if(!g.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${i??"null"} current=${g.currentVersion??"null"}`)}function k(l){w().appendEvent(l);}async function V(){let l=(R,E)=>{let K=R.payload,Z=(K?.enrichedCard??{}).id??K?.cardId??"unknown";k({type:"task-failed",taskName:Z,error:E,timestamp:z()});},i=lt(t.kvStorage("execution-requests"),l),g=pt(t.kvStorage("card-runtime")),b=Fe(t.blobStorage("sources"),R=>t.resolveBlob(R)),F=new Map,$={readRuntime(R){return F.get(R)??g.readRuntime(R)},writeRuntime(R,E){F.set(R,E);}},U=[],J=new Map,Q={readSourceData(R,E){let K=`${R}/${E}`;return J.has(K)?J.get(K):b.readSourceData(R,E)},ingestSourceDataStaged(R,E,K,de){b.ingestSourceDataStaged(R,E,K,de);},commitSourceData(R,E,K){let de=`${R}/.staged/${K}/${E}`,ye=t.blobStorage("sources").read(de);if(ye==null)return false;let le=`${R}/${E}`,Be=ye.trim();try{J.set(le,JSON.parse(Be));}catch{J.set(le,Be);}return U.push({cardId:R,outputFile:E,deliveryToken:K}),true},hasSource(R,E){let K=`${R}/${E}`;return J.has(K)?true:b.hasSource(R,E)}},W={cardStore:N(),cardRuntimeStore:$,fetchedSourcesStore:Q,outputStore:D(),executionRequestStore:i},oe=A(),se=Re(oe.graph),{events:ue,newCursor:ce}=w().readEntriesAfterCursor(oe.lastDrainedJournalId),ae=[],Ae=[],Te=[],$e=new Map,Rt=(R,E)=>{ae.push({type:"task-completed",taskName:R,data:E,timestamp:z()});},Le=(R,E)=>k({type:"task-failed",taskName:R,error:E,timestamp:z()}),he=nt(se,{handlers:{"card-handler":ht(e,ce,W,Rt,Le,(R,E)=>{Ae.push({cardId:R,values:E});},R=>{Te.push(R);})}});for(ae=ue;ae.length>0;){let R=ae;ae=[];for(let E of R)if(E.type==="task-restart"){let K=W.cardStore.readCard(E.taskName);K&&$e.set(E.taskName,K);}he.pushAll(R),await he.waitForHandlers();}let Ve=he.getState();await he.dispose({wait:true});let vt=S().readSnapshot(e.value).version;v({lastDrainedJournalId:ce,graph:pe(Ve)},vt);for(let{cardId:R,values:E}of Ae)W.outputStore.writeComputedValues(R,E);for(let R of Te)W.outputStore.writeDataObjects(R);for(let[R,E]of F)g.writeRuntime(R,E);for(let{cardId:R,outputFile:E,deliveryToken:K}of U)b.commitSourceData(R,E,K);let ke;try{ke=xe(n,Ve),W.outputStore.writeStatusSnapshot(ke);}catch(R){r(`[board-live-cards-public] status publish failed: ${R instanceof Error?R.message:String(R)}`);}let fe=[];for(let{cardId:R,values:E}of Ae)fe.push({kind:"computed_values",cardId:R,values:E});for(let R of Te)for(let[E,K]of Object.entries(R))E&&fe.push({kind:"data_object",key:E,payload:K});for(let[R,E]of $e)fe.push({kind:"card_refreshed",cardId:R,card:E});ke!==void 0&&fe.push({kind:"status",status:ke}),o(fe);let wt=c().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:Y({kind:"built-in",value:"source-cli-task-executor"})};i.dispatchEntriesForJournalId(ce,R=>{if(R.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${R.taskKind}" \u2014 skipping`);return}let E=R.payload,K=E.enrichedCard?.id??"unknown",de=E.enrichedCard?.source_defs??[];for(let Z of de){if(!Z.outputFile){r(`[dispatch] source "${Z.bindTo}" has no outputFile \u2014 skipping`);continue}let ye=or({cbk:E.callbackToken,rg:e.value,br:Y(e),cid:K,b:Z.bindTo,d:Z.outputFile,cs:void 0,rqt:E.rqt});t.dispatchExecution(wt,{source_def:Z,base_ref:Y(e),callback:{token:ye,via:t.selfRef}}).catch(le=>Le(K,le instanceof Error?le.message:String(le)));}});}async function p(){try{let l=()=>{let g=A(),{events:b}=w().readEntriesAfterCursor(g.lastDrainedJournalId);b.length<=0||(p(),t.requestProcessAccumulated?.());},i=await Ke(t.lock,V,l);return P({ran:i!==!1})}catch(l){return G(l)}}function a(l){try{let i=l.params?.cardStoreRef;if(!i)return x("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!L()){let $=be(Ge);v({lastDrainedJournalId:"",graph:pe($)},null);}let g=l.params?.outputsStoreRef;if(!g)return x("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let b=c();b.writeCardStoreRef(i),b.writeOutputsStoreRef(g);let F=l.body??{};F["task-executor-ref"]&&b.writeTaskExecutorRef(F["task-executor-ref"]),F["chat-handler-ref"]&&b.writeChatHandlerRef(F["chat-handler-ref"]);try{D().writeStatusSnapshot(xe(n,Re(A().graph)));}catch{}return P()}catch(i){return G(i)}}function d(l){try{let i=D().readStatusSnapshot();if(!i){i=xe(n,Re(A().graph));try{D().writeStatusSnapshot(i);}catch{}}return P(i)}catch(i){return G(i)}}function m(l){try{let i=l.params?.id;return i?(k({type:"task-removal",taskName:i,timestamp:z()}),p(),P()):x("removeCard requires params.id")}catch(i){return G(i)}}function C(l){try{let i=l.params?.id;return i?(k({type:"task-restart",taskName:i,timestamp:z()}),p(),P()):x("retrigger requires params.id")}catch(i){return G(i)}}async function y(l){return p()}function f(l){try{let i=l.params?.cardId,g=l.params?.all,b=!!l.params?.restart;if(!i&&!g)return x("upsertCard requires --card-id <id> or --all");let F=g?N().readAllCards().map($=>$.id):[i];for(let $ of F)if(!N().readCard($))return x(`Card "${$}" not found in board at ${e.value}`);for(let $ of F){let U=N().readCard($),J=St(U),Q=t.hashFn(J),W=t.kvStorage("card-upsert"),oe=W.read($),se=oe?.taskConfigHash!==Q;if(!(!se&&!b)){if(se){let ue=oe?.blobRef??N().readCardKey($)??$;k({type:"task-upsert",taskName:$,taskConfig:J,timestamp:z()}),W.write($,{blobRef:ue,taskConfigHash:Q,updatedAt:z()});}b&&k({type:"task-restart",taskName:$,timestamp:z()});}}return p(),P()}catch(i){return G(i)}}function h(l){try{let i=l.params?.token;if(!i)return x("taskFailed requires params.token");let g=l.params?.error??"unknown error",b=Ee(i);return b?(k({type:"task-failed",taskName:b.taskName,error:g,timestamp:z()}),p(),P()):x("Invalid callback token")}catch(i){return G(i)}}function T(l){try{let i=l.params?.token;if(!i)return x("taskProgress requires params.token");let b=(l.body??{}).update??{},F=Ee(i);return F?(k({type:"task-progress",taskName:F.taskName,update:b,timestamp:z()}),p(),P()):x("Invalid callback token")}catch(i){return G(i)}}function O(l){try{let i=l.params?.token,g=l.params?.ref;if(!i)return x("sourceDataFetched requires params.token");if(!g)return x("sourceDataFetched requires params.ref");let b=Ct(i);if(!b)return x("Invalid source token");let{cbk:F,cid:$,b:U,d:J,cs:Q,rqt:W}=b,oe=Fe(t.blobStorage("sources"),ae=>t.resolveBlob(ae)),se=t.genId();oe.ingestSourceDataStaged($,J,_e(g),se);let ue=Ee(F);if(!ue)return x("Invalid callback token embedded in source token");let ce=z();return k({type:"task-progress",taskName:ue.taskName,update:{bindTo:U,outputFile:J,fetchedAt:ce,deliveryToken:se,sourceChecksum:Q,rqt:W},timestamp:ce}),p(),P()}catch(i){return G(i)}}function j(l){try{let i=l.params?.token,g=l.params?.reason??"unknown";if(!i)return x("sourceDataFetchFailure requires params.token");let b=Ct(i);if(!b)return x("Invalid source token");let{cbk:F,b:$,d:U,cs:J}=b,Q=Ee(F);return Q?(k({type:"task-progress",taskName:Q.taskName,update:{bindTo:$,outputFile:U,failure:!0,reason:g,sourceChecksum:J},timestamp:z()}),p(),P()):x("Invalid callback token embedded in source token")}catch(i){return G(i)}}function B(l){try{let i=c().readCardStoreRef();return i?P({storeRef:i}):x(`Board at ${e.value} has no card store configured`)}catch(i){return G(i)}}function q(l){try{let i=c().readOutputsStoreRef();return i?P({storeRef:i}):x(`Board at ${e.value} has no outputs store configured`)}catch(i){return G(i)}}function H(l){try{let i=l.params?.key;if(!i)return x("getConfig requires params.key");let g=c(),b;switch(i){case "task-executor":b=g.readTaskExecutorRef()??null;break;case "chat-handler":b=g.readChatHandlerRef()??null;break;case "card-store-ref":b=g.readCardStoreRef();break;case "outputs-store-ref":b=g.readOutputsStoreRef();break;default:return x(`getConfig: unknown key "${i}"`)}return P({value:b})}catch(i){return G(i)}}function X(l){try{let i=l.params?.key;if(!i)return x("getOutputsDataObject requires params.key");let g=D().readDataObject(i);return P(g)}catch(i){return G(i)}}function ne(l){try{return P(D().readAllDataObjects())}catch(i){return G(i)}}function _(l){try{let i=l.params?.key;if(!i)return x("getOutputsComputedValues requires params.key");let g=D().readComputedValues(i);return P(g)}catch(i){return G(i)}}function I(l){try{return P(D().readAllComputedValues())}catch(i){return G(i)}}return {init:a,status:d,getCardStoreRef:B,getOutputsStoreRef:q,getConfig:H,getOutputsDataObject:X,getAllOutputsDataObjects:ne,getOutputsComputedValues:_,getAllOutputsComputedValues:I,removeCard:m,retrigger:C,processAccumulatedEvents:y,upsertCard:f,taskFailed:h,taskProgress:T,sourceDataFetched:O,sourceDataFetchFailure:j}}function Yr(e,t){let r=()=>Pe(t.kvStorage("config"));function n(){let p=r().readCardStoreRef();if(!p)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let a=t.kvStorageForRef(p);return {readIndex(){return a.read("_index")},writeIndex(d){a.write("_index",d);},readCard(d){return a.read(d)},writeCard(d,m){return a.write(d,m),t.hashFn(m)},cardExists(d){return a.read(d)!==null},defaultCardKey(d){return d}}}let o=()=>qe(n(),t.onWarn??(()=>{}));function s(p,a){let d=t.validateSchema(a),m=[],C=r().readTaskExecutorRef();if(C&&Array.isArray(a.source_defs))for(let f of a.source_defs){let h=typeof f.bindTo=="string"?f.bindTo:"(unknown)";try{let T;try{T=t.invokeExecutorSync(C,"validate-source-def",[],{timeout:1e4,input:JSON.stringify(f)});}catch(j){let B=j;if(T=typeof B?.stdout=="string"?B.stdout:"",!T.trim()){m.push(`source "${h}": executor validate-source-def failed \u2014 ${j instanceof Error?j.message:String(j)}`);continue}}let O=JSON.parse(T.trim());if(!O.ok&&Array.isArray(O.errors))for(let j of O.errors)m.push(`source "${h}": ${j}`);}catch(T){m.push(`source "${h}": executor validate-source-def failed \u2014 ${T instanceof Error?T.message:String(T)}`);}}let y=[...d.errors,...m];return P({cardId:p,isValid:y.length===0,issues:y})}function u(p,a,d){let m=r().readTaskExecutorRef();if(!m)return x("No task-executor registered for this board");let C=typeof p.bindTo=="string"?p.bindTo:"source",y=t.makeTempFilePath(`probe-in-${C}`),f=t.makeTempFilePath(`probe-out-${C}`),h=t.makeTempFilePath(`probe-err-${C}`,".txt"),T={...p,boardDir:e.value,_projections:a},O=Y({kind:"fs-path",value:y}),j=Y({kind:"fs-path",value:f}),B=Y({kind:"fs-path",value:h});t.absoluteBlob.write(y,JSON.stringify(T,null,2));let q=null;try{if(t.invokeExecutorSync(m,"run-source-fetch",["--in-ref",O,"--out-ref",j,"--err-ref",B],{timeout:p.timeout??3e4}),q=t.absoluteBlob.read(f),q===null)return x("Executor produced no output file")}catch(H){let X=t.absoluteBlob.read(h)?.trim()??(H instanceof Error?H.message:String(H));return x(`Probe failed: ${X}`)}finally{try{t.absoluteBlob.remove(y);}catch{}try{t.absoluteBlob.remove(h);}catch{}}if(d){let H=_e(d);t.absoluteBlob.write(H.value,q);}else try{t.absoluteBlob.remove(f);}catch{}return P({bindTo:C,resultSizeBytes:q.length})}function c(p){try{let a=p.params?.cardId,d=p.params?.all;if(!a&&!d)return x("validateCard requires --card-id <id> or --all");let m=d?o().readAllCards().map(y=>y.id):[a],C=[];for(let y of m){let f=o().readCard(y);if(!f){C.push({cardId:y,isValid:!1,issues:[`Card "${y}" not found`]});continue}let h=s(y,f);if(h.status!=="success")return h;C.push(h.data);}return P(C)}catch(a){return G(a)}}function S(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("validateCardPreflight requires card JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=s(m,d),y=r().readTaskExecutorRef();if(y)try{let f=t.invokeExecutorSync(y,"validate-card-preflight",[],{timeout:1e4,input:JSON.stringify(d)}),h=JSON.parse(f.trim());if(!h.ok&&Array.isArray(h.errors)&&h.errors.length>0){let T=[...C.status==="success"?C.data.issues:[],...h.errors];return P({cardId:m,isValid:!1,issues:T})}}catch{}return C}catch(a){return G(a)}}function w(p){try{let a=p.params?.cardId,d=p.params?.sourceIdx,m=p.params?.outRef;if(!a)return x("probeSource requires params.cardId");if(d===void 0)return x("probeSource requires params.sourceIdx");let y=(p.body??{})["mock-projections"]??{},f=o().readCard(a);if(!f)return x(`Card "${a}" not found`);let h=f.source_defs??[];return d<0||d>=h.length?x(`sourceIdx ${d} out of range (card has ${h.length} source(s))`):u(h[d],y,m)}catch(a){return G(a)}}function N(p){try{let a=p.params?.outRef,d=p.body;if(!d)return x('probeTmpSource requires body with "source-def" and "mock-projections"');let m=d["source-def"],C=d["mock-projections"]??{};return m?u(m,C,a):x('probeTmpSource body requires "source-def"')}catch(a){return G(a)}}function D(p){try{let a=p.params?.sourceIdx,d=p.params?.outRef;if(a===void 0)return x("probeSourcePreflight requires params.sourceIdx");if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("probeSourcePreflight requires card JSON object in body");let m=p.body,C=m["card-content"]??m,y=m["mock-projections"]??{},f=C.source_defs??[];if(a<0||a>=f.length)return x(`sourceIdx ${a} out of range (card has ${f.length} source(s))`);let h=f[a],T=r().readTaskExecutorRef();if(T){let O=typeof h.bindTo=="string"?h.bindTo:"source";try{let j={...h,_projections:y},B=t.invokeExecutorSync(T,"probe-source-preflight",[],{timeout:h.timeout??1e4,input:JSON.stringify(j)}),q=JSON.parse(B.trim());return q.ok?P({bindTo:O,reachable:q.reachable,latencyMs:q.latencyMs,note:q.note}):x(q.error??"Preflight probe failed")}catch{}}return u(h,y,d)}catch(a){return G(a)}}function L(p){try{let a=r().readTaskExecutorRef();if(!a)return x("No task-executor registered for this board");let d=t.invokeExecutorSync(a,"describe-capabilities",[],{timeout:1e4});return P(JSON.parse(d.trim()))}catch(a){return G(a)}}function A(p){try{let a=p.body;if(!a||!Array.isArray(a.ops))return x("updatesInCardStore requires body.ops array");let d=a.ops,m=o();for(let C of d){let y=C.op,f=C.id;if(!f)return x('op is missing "id"');if(y==="update"){let h=C["card-content"];if(!h)return x(`update op for "${f}" is missing "card-content"`);m.writeCard(f,h);}else return x(`Unknown op type: "${y??"(none)"}"`)}return P()}catch(a){return G(a)}}function v(p){try{let a=p.body;if(!a||!Array.isArray(a.ids))return x("readFromCardStore requires body.ids array");let d=a.ids,m=o(),C=d.map(y=>({id:y,"card-content":m.readCard(y)}));return P({cards:C})}catch(a){return G(a)}}function k(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("evalCardCompute requires a JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=a["mock-fetched-sources"]??{},y=a["mock-requires"]??{},f=d.compute;if(!f||!Array.isArray(f)||f.length===0)return P({cardId:m,ok:!0,computed_values:{},errors:[]});let h={id:m,card_data:d.card_data??{},requires:y,source_defs:d.source_defs,compute:f},T=re.runSync(h,{sourcesData:C}),O=T.node.computed_values??{},j=T.errors??[];return P({cardId:m,ok:j.length===0,computed_values:O,errors:j})}catch(a){return G(a)}}function V(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("simulateCardCycle requires a JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=a["mock-fetched-sources"]??{},y=a["mock-requires"]??{},f=s(m,d),h=f.status==="success"?{isValid:f.data.isValid,issues:f.data.issues}:{isValid:!1,issues:[f.status==="fail"?f.error:"internal error"]},T=d.source_defs??[],O=d.card_data??{},j=[],B=[];if(T.length>0){j=re.enrichSourcesSync(T,{card_data:O,requires:y});for(let i of j){let g=i.projections,b=i._projections;if(g&&b){for(let F of Object.keys(g))if(b[F]===void 0){let $=typeof i.bindTo=="string"?i.bindTo:"(unknown)";B.push({bindTo:$,key:F,error:`Projection "${F}" resolved to undefined`});}}}}let q=[],H=a["task-executor-ref"],X=(H?.howToRun&&H?.whatToRun?H:void 0)??r().readTaskExecutorRef();for(let i=0;i<j.length;i++){let g=j[i],b=typeof g.bindTo=="string"?g.bindTo:`source_${i}`;if(!X){q.push({bindTo:b,skipped:!0,error:"No task executor configured"});continue}try{let F={...g},$=t.invokeExecutorSync(X,"probe-source-preflight",[],{timeout:g.timeout??1e4,input:JSON.stringify(F)}),U=JSON.parse($.trim());q.push({bindTo:b,reachable:U.reachable,latencyMs:U.latencyMs,error:U.ok?void 0:U.error});}catch{q.push({bindTo:b,skipped:!0,error:"Executor does not support probe-source-preflight"});}}let ne=d.compute,_={},I=[];if(ne&&Array.isArray(ne)&&ne.length>0){let i={id:m,card_data:O,requires:y,source_defs:d.source_defs,compute:ne},g=re.runSync(i,{sourcesData:C});_=g.node.computed_values??{},I=g.errors??[];}let l=h.isValid&&B.length===0&&I.length===0&&q.every(i=>i.reachable!==!1);return P({cardId:m,ok:l,validation:h,source_probes:q,projection_errors:B,computed_values:_,compute_errors:I})}catch(a){return G(a)}}return {validateCard:c,validateCardPreflight:S,probeSource:w,probeTmpSource:N,probeSourcePreflight:D,evalCardCompute:k,simulateCardCycle:V,describeTaskExecutorCapabilities:L,updatesInCardStore:A,readFromCardStore:v}}
2
2
  exports.BOARD_GRAPH_KEY=ie;exports.EMPTY_CONFIG=Ge;exports.SNAPSHOT_SCHEMA_VERSION_V1=we;exports.createBoardLiveCardsNonCorePublic=Yr;exports.createBoardLiveCardsPublic=zr;//# sourceMappingURL=board-live-cards-public.cjs.map
3
3
  //# sourceMappingURL=board-live-cards-public.cjs.map
@@ -1,3 +1,3 @@
1
- import {createRequire}from'module';import'ajv-formats';var Se="b64:";function xt(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let s="";for(let o of t)s+=String.fromCharCode(o);n=btoa(s);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Et(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),s=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function Y(e){return `${Se}${xt(JSON.stringify(e))}`}function _e(e){if(!e.startsWith(Se))throw new Error(`Invalid ref format (expected ${Se}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Et(e.slice(Se.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Ke(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var ee={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function M(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function te(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function He(e){return e.tasks??{}}function Ie(e){return e?e.status===ee.FAILED||e.status===ee.INACTIVATED:false}function Ue(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Je(e){return e.maxExecutions}function Me(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===ee.COMPLETED){let o=e.tasks[n];o&&M(o).forEach(c=>r.add(c));}return Array.from(r)}function ze(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;M(s).forEach(u=>{r[u]||(r[u]=[]),r[u].push(n);});}),r}function Ye(e,t,r){let n=e.tasks[t]??Ce(),s={};if(r){let u=r.tasks[t],c=te(u);for(let S of c)for(let[w,N]of Object.entries(r.tasks))if(M(N).includes(S)){let D=e.tasks[w];D?.lastDataHash&&(s[S]=D.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function Xe(e,t,r,n,s,o){let u=e.tasks[r]??Ce(),c=t.tasks[r];if(!c)throw new Error(`Task "${r}" not found in graph`);let S;n&&c.on&&c.on[n]?S=c.on[n]:S=M(c);let w=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let L=c.requires??[];for(let A of L)for(let[v,k]of Object.entries(t.tasks))if(M(k).includes(A)){let V=e.tasks[v];V?.lastDataHash&&(w[A]=V.lastDataHash);break}}let N={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:w,error:void 0},D=[...new Set([...e.availableOutputs,...S])];return {...e,tasks:{...e.tasks,[r]:N},availableOutputs:D,lastUpdated:new Date().toISOString()}}function We(e,t,r,n){let s=e.tasks[r]??Ce(),o=t.tasks[r];if(o?.retry){let S=s.retryCount+1;if(S<=o.retry.max_attempts){let w={...s,status:"not-started",retryCount:S,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:w},lastUpdated:new Date().toISOString()}}}let u={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},c=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(c=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&u.executionCount>=o.circuit_breaker.max_executions){let S=o.circuit_breaker.on_break;c=[...new Set([...c,...S])];}return {...e,tasks:{...e.tasks,[r]:u},availableOutputs:c,lastUpdated:new Date().toISOString()}}function Qe(e,t,r,n){let s=e.tasks[t]??Ce(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function Ze(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Ce(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function be(e,t){let r=`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=tt();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function At(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:Ye(n,t.taskName,r)};case "task-completed":return {config:r,state:Xe(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:We(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Qe(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Ze(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Dt(n,t.action)};case "task-upsert":return Tt(e,t.taskName,t.taskConfig);case "task-removal":return _t(e,t.taskName);case "node-requires-add":return It(e,t.nodeName,t.tokens);case "node-requires-remove":return Ot(e,t.nodeName,t.tokens);case "node-provides-add":return jt(e,t.nodeName,t.tokens);case "node-provides-remove":return Nt(e,t.nodeName,t.tokens);default:return e}}function et(e,t){return t.reduce((r,n)=>At(r,n),e)}function Tt(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:tt()},lastUpdated:new Date().toISOString()}}}function _t(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function It(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=te(n),o=r.filter(u=>!s.includes(u));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function Ot(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=te(n),o=s.filter(u=>!r.includes(u));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function jt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=M(n),o=r.filter(u=>!s.includes(u));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function Nt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=M(n),o=s.filter(u=>!r.includes(u));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function pe(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Re(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function tt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Dt(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function ge(e){let{config:t,state:r}=e,n=He(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=qt(n),u=Me(t,r.tasks),c=new Set([...u,...r.availableOutputs]),S=[],w=[],N=[],D=[];for(let[A,v]of Object.entries(n)){let k=r.tasks[A],V=Ue(v,t.settings),p=V!=="once";if(k?.status===ee.RUNNING||Ie(k))continue;let a=Je(v);if(a!==void 0&&k&&k.executionCount>=a||v.circuit_breaker&&k&&k.executionCount>=v.circuit_breaker.max_executions||!p&&k?.status===ee.COMPLETED)continue;if(p&&k?.status===ee.COMPLETED){let f=te(v),h=false;switch(V){case "data-changed":{f.length>0&&f.some(O=>{for(let[j,B]of Object.entries(n))if(M(B).includes(O)){let q=r.tasks[j];if(!q)continue;let H=k.lastConsumedHashes?.[O];return q.lastDataHash==null?q.executionCount>k.lastEpoch:q.lastDataHash!==H}return false})||(h=true);break}case "epoch-changed":{f.length>0&&f.some(O=>{for(let[j,B]of Object.entries(n))if(M(B).includes(O)){let q=r.tasks[j];if(q&&q.executionCount>k.lastEpoch)return true}return false})||(h=true);break}case "time-based":{let T=v.refreshInterval??0;if(T<=0){h=true;break}let O=k.completedAt;if(!O){h=true;break}(Date.now()-Date.parse(O))/1e3<T&&(h=true);break}case "manual":h=true;break}if(h)continue}let d=te(v);if(d.length===0){S.push(A);continue}let m=[],C=[],y=[];for(let f of d){if(c.has(f))continue;let h=o[f]||[];h.length===0?m.push(f):h.every(O=>Ie(r.tasks[O]))?y.push({token:f,failedProducer:h[0]}):C.push(f);}m.length>0?N.push({taskName:A,missingTokens:m}):y.length>0?D.push({taskName:A,failedTokens:y.map(f=>f.token),failedProducers:[...new Set(y.map(f=>f.failedProducer))]}):C.length>0?w.push({taskName:A,waitingOn:C}):S.push(A);}let L={};if(S.length>1){let A=ze(S,n);for(let[v,k]of Object.entries(A))k.length>1&&(L[v]=k);}return {eligible:S,pending:w,unresolved:N,blocked:D,conflicts:L}}function qt(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of M(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var me=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Oe(e){let t=je(e);return Ft(t)}function je(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(je).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+je(t[n])).join(",")+"}"}function Ft(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Pt(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Gt(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function rt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Pt(t)}function $t(e){try{let t=JSON.parse(Gt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function nt(e,t,r){let{handlers:n,onDrain:s}=t,o=new me,u="state"in e&&"config"in e?e:be(e),c=false,S=new Set,w=new Map(Object.entries(n)),N=new me,D=false,L=false;function A(){if(!c){if(D){L=true;return}D=true;try{do L=!1,v();while(L)}finally{D=false;}}}function v(){let a=N.drain(),d=o.drain(),m=[...a,...d];m.length>0&&(u=et(u,m));let C=ge(u);m.length>0&&s?.(m,u,C);for(let y of C.eligible)p(y);for(let y of m)if(y.type==="task-progress"){let{taskName:f,update:h}=y;if(!u.config.tasks[f])continue;let O=u.state.tasks[f];if(!O||O.status!=="running")continue;let j=rt(f),B=V(f,j,h).catch(q=>{c||(N.append({type:"task-failed",taskName:f,error:q.message??String(q),timestamp:new Date().toISOString()}),A());}).finally(()=>{S.delete(B);});S.add(B);}}function k(a){let m=u.config.tasks[a].requires??[],C=new Map;for(let[f,h]of Object.entries(u.config.tasks))for(let T of h.provides??[])C.set(T,f);let y={};for(let f of m){let h=C.get(f);h?y[f]=u.state.tasks[h]?.data:y[f]=void 0;}return y}async function V(a,d,m){let C=u.config.tasks[a],y=C.taskHandlers??[],f=k(a);for(let h of y){let T=w.get(h);if(!T)throw new Error(`Handler '${h}' not found in registry (task '${a}')`);let O={nodeId:a,state:f,taskState:u.state.tasks[a],config:C,callbackToken:d,update:m};if(await T(O)==="task-initiate-failure")throw new Error(`Handler '${h}' returned task-initiate-failure (task '${a}')`)}}function p(a){let m=u.config.tasks[a]?.taskHandlers;if(!m||m.length===0)return;N.append({type:"task-started",taskName:a,timestamp:new Date().toISOString()}),A();let C=rt(a),y=V(a,C).catch(f=>{c||(N.append({type:"task-failed",taskName:a,error:f.message??String(f),timestamp:new Date().toISOString()}),A());}).finally(()=>{S.delete(y);});S.add(y);}return {push(a){c||(a.type==="task-completed"&&a.data&&!a.dataHash&&(a={...a,dataHash:Oe(a.data)}),o.append(a),A());},pushAll(a){if(!c){for(let d of a)d.type==="task-completed"&&d.data&&!d.dataHash?o.append({...d,dataHash:Oe(d.data)}):o.append(d);A();}},resolveCallback(a,d,m){if(c)return;let C=$t(a);if(!C)return;let{taskName:y}=C;if(u.config.tasks[y]){if(m&&m.length>0)o.append({type:"task-failed",taskName:y,error:m.join("; "),timestamp:new Date().toISOString()});else {let f=d&&Object.keys(d).length>0?Oe(d):void 0;o.append({type:"task-completed",taskName:y,data:d,dataHash:f,timestamp:new Date().toISOString()});}A();}},addNode(a,d){c||(o.append({type:"task-upsert",taskName:a,taskConfig:d,timestamp:new Date().toISOString()}),A());},removeNode(a){c||(o.append({type:"task-removal",taskName:a,timestamp:new Date().toISOString()}),A());},addRequires(a,d){c||(o.append({type:"node-requires-add",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},removeRequires(a,d){c||(o.append({type:"node-requires-remove",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},addProvides(a,d){c||(o.append({type:"node-provides-add",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},removeProvides(a,d){c||(o.append({type:"node-provides-remove",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},registerHandler(a,d){w.set(a,d);},unregisterHandler(a){w.delete(a);},retrigger(a){c||u.config.tasks[a]&&(o.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()}),A());},retriggerAll(a){if(!c){for(let d of a)u.config.tasks[d]&&o.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});A();}},snapshot(){return pe(u)},getState(){return u},getSchedule(){return ge(u)},async waitForHandlers(){S.size>0&&await Promise.allSettled([...S]);},async dispose(a){a?.wait&&S.size>0&&await Promise.allSettled([...S]),c=true;}}}var Vt=createRequire(import.meta.url);Vt("./jsonata-sync.cjs");var Kt=createRequire(import.meta.url),ve=Kt("./jsonata-sync.cjs"),at=ve;function st(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function it(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Ht(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await ve(s.expr).evaluate(n);it(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function Ut(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let u=at(o.expr).evaluate(n);it(e.computed_values,o.bindTo,u),n.computed_values=e.computed_values;}catch(u){let c=u instanceof Error?u.message:String(u);s.push({bindTo:o.bindTo,error:c});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Jt(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return ve(e).evaluate(n)}function Mt(e,t){return t.startsWith("fetched_sources.")?st(e._sourcesData??{},t.slice(16)):st(e,t)}var ot=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),zt=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Yt(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))zt.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,u)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${u}]: must be an object`);else {let c=o;typeof c.bindTo!="string"||!c.bindTo?t.push(`source_defs[${u}]: missing required "bindTo" property`):(n.has(c.bindTo)&&t.push(`source_defs[${u}]: bindTo "${c.bindTo}" is not unique across source_defs`),n.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?t.push(`source_defs[${u}]: missing required "outputFile" property`):(s.has(c.outputFile)&&t.push(`source_defs[${u}]: outputFile "${c.outputFile}" is not unique across source_defs`),s.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${u}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):ot.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...ot].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Xt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{s[o]=await ve(u).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Wt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{s[o]=at(u).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var re={run:Ht,runSync:Ut,eval:Jt,resolve:Mt,validate:Yt,enrichSources:Xt,enrichSourcesSync:Wt};function Ne(e){return JSON.stringify(e)}function De(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function qe(e,t){function r(){return e.readIndex()??{}}function n(s,o,u){let c=String(o||"").split(".").filter(Boolean);if(c.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let S={...s},w=S;for(let N=0;N<c.length-1;N++){let D=c[N],L=w[D],A=L&&typeof L=="object"&&!Array.isArray(L)?{...L}:{};w[D]=A,w=A;}return w[c[c.length-1]]=u,S}return {readCard(s){let o=r()[s];return !o||!e.cardExists(o.key)?null:e.readCard(o.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[o,u]of Object.entries(r())){if(!e.cardExists(u.key))continue;let c=e.readCard(u.key);c?s.push(c):t?.(`[card-store] could not read card "${o}" at key "${u.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,u]of Object.entries(r()))s[o]=u.checksum;return s},changedSince(s){let o=r(),u=[];for(let[c,S]of Object.entries(o))s[c]!==S.checksum&&u.push(c);for(let c of Object.keys(s))o[c]||u.push(c);return u},validateUpsert(s,o){let u=r(),c=u[s],S=Object.entries(u).find(([,w])=>w.key===o);return c&&c.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${c.key}", cannot remap to "${o}"`}:S&&S[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${S[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,u){let c=r(),S=u??c[s]?.key??e.defaultCardKey(s),w=e.writeCard(S,o);c[s]={key:S,checksum:w,updatedAt:new Date().toISOString()},e.writeIndex(c);},patchCard(s,o,u){let c=r(),S=c[s];if(!S||!e.cardExists(S.key))throw new Error(`card "${s}" not found`);let w=e.readCard(S.key);if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`card "${s}" is not patchable`);let N=n(w,o,u),D=e.writeCard(S.key,N);c[s]={key:S.key,checksum:D,updatedAt:new Date().toISOString()},e.writeIndex(c);},removeCard(s){let o=r();o[s]&&(delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function Fe(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let o=s.trim();if(!o)return null;try{return JSON.parse(o)}catch{return o}},ingestSourceDataStaged(r,n,s,o){let u=t(s);e.write(`${r}/.staged/${o}/${n}`,u);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,u=e.read(o);return u==null?false:(e.write(`${r}/${n}`,u),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function dt(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(o=>o.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function lt(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let o of s)try{n(o);}catch(u){let c=u instanceof Error?u.message:String(u);try{t(o,c);}catch{}}e.delete(r);}}}}var we="v1",ie="board/graph",ft="board/lastJournalProcessedId";function ut(e){return `cards/${e}/runtime`}function pt(e){return {readRuntime(t){return e.read(ut(t))??{_sources:{}}},writeRuntime(t,r){e.write(ut(t),r);}}}function Qt(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function gt(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==we)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=Qt(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function Pe(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return De(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Ne(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return De(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",Ne(r));},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function mt(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Zt(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function er(e,t){return e?.lastRequestedAt?Zt(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function tr(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function ct(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function xe(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=ge(t),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},c=new Map;for(let v of o.pending)c.set(v.taskName,v.waitingOn);for(let v of o.unresolved)c.set(v.taskName,v.missingTokens);for(let v of o.blocked)c.set(v.taskName,v.failedTokens);let S=new Map;for(let[v,k]of Object.entries(n))for(let V of k.requires??[]){let p=S.get(V)??[];p.push(v),S.set(V,p);}let w=s.sort().map(v=>{let k=r[v],V=n[v]??{requires:[],provides:[]};k.status==="completed"?u.completed+=1:k.status==="failed"?u.failed+=1:k.status==="in-progress"&&(u.in_progress+=1);let p=V.requires??[],a=V.provides??[],d=Object.keys(k.data??{}).sort(),m=p.filter(O=>t.state.availableOutputs.includes(O)),C=p.filter(O=>!t.state.availableOutputs.includes(O)),y=c.get(v)??C,f=new Set;for(let O of a)for(let j of S.get(O)??[])j!==v&&f.add(j);let h=k.failedAt,T=k.error?{message:k.error,code:"TASK_FAILED",at:h,source:"task-runtime"}:void 0;return {name:v,status:k.status,error:T,requires:p,requires_satisfied:m,requires_missing:C,provides_declared:a,provides_runtime:d,blocked_by:y,unblocks:Array.from(f).sort(),runtime:{attempt_count:k.executionCount??0,restart_count:k.retryCount??0,in_progress_since:k.status==="in-progress"?k.startedAt??null:null,last_transition_at:k.lastUpdated??null,last_completed_at:k.completedAt??null,last_restarted_at:k.startedAt??null,status_age_ms:k.lastUpdated?0:null}}});u.pending=o.pending.length,u.blocked=o.blocked.length,u.unresolved=o.unresolved.length;let N=w.map(v=>({name:v.name,fanOut:v.unblocks.length})).sort((v,k)=>k.fanOut-v.fanOut||v.name.localeCompare(k.name)),D=N.length>0?N[0]:{name:null,fanOut:0},L=new Set;for(let v of Object.values(n))for(let k of v.requires??[])L.add(k);let A=0;for(let[v,k]of Object.entries(n)){let V=(k.requires??[]).length===0,a=(k.provides??[]).some(d=>(S.get(d)??[]).some(m=>m!==v));V&&!a&&(A+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:u.completed,eligible:o.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:A,topology:{edge_count:Array.from(L).length,max_fan_out_card:D.name,max_fan_out:D.fanOut}},cards:w}}function rr(){return new Date().toISOString()}function ht(e,t,r,n,s,o,u){return async c=>{let S=[],w=r.cardStore.readCard(c.nodeId);if(!w)return "task-initiate-failure";let N=w.id,D=w.card_data??{},L=w.source_defs??[],A=L.filter(_=>_.optionalForCompletionGating!==true),v=r.cardRuntimeStore.readRuntime(N),k=false,V=()=>{k&&(r.cardRuntimeStore.writeRuntime(N,v),k=false);},p=_=>({...v._sources[_]??{}}),a=(_,I)=>{v._sources[_]=I,k=true;},d=c.taskState?.executionCount??0,m=v._lastExecutionCount;if(typeof m=="number"&&m!==d&&(v._sources={},k=true),m!==d&&(v._lastExecutionCount=d,k=true),c.update){let _=c.update,I=_.outputFile;if(I){let l=p(I);if(_.failure)a(I,ct(l,_.reason??"unknown"));else {let i=_.rqt;if(!l.lastFetchedAt||i>l.lastFetchedAt){let g=typeof _.deliveryToken=="string"?_.deliveryToken:void 0,b=false;g&&(b=r.fetchedSourcesStore.commitSourceData(N,I,g)),b?a(I,tr(l,i)):a(I,ct(l,`source delivery commit failed for ${I} token=${String(g)}`));}}V();}}let C={};for(let _ of L)if(_.outputFile){let I=r.fetchedSourcesStore.readSourceData(N,_.outputFile);I!==null&&(C[_.bindTo]=I);}let y={};for(let[_,I]of Object.entries(c.state??{}))if(I!==null&&typeof I=="object"&&!Array.isArray(I)){let l=I[_];y[_]=l!==void 0?l:I;}else y[_]=I;let f={id:N,card_data:{...D},requires:y,source_defs:L,compute:w.compute};f._sourcesData=C,w.compute&&re.runSync(f,{sourcesData:C}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(N,f.computed_values??{});let h={...w},T=re.enrichSourcesSync(Array.isArray(w.source_defs)?w.source_defs:void 0,{card_data:w.card_data,requires:y}),O=e.value;h.source_defs=Array.isArray(T)?T.map(_=>({..._,boardDir:typeof _.boardDir=="string"&&_.boardDir?_.boardDir:O})):T;let j=rr(),B=c.update?void 0:j,q=A.filter(_=>{let I=_.outputFile;if(typeof I!="string"||!I)return true;let l=p(I);B&&(l={...l,queueRequestedAt:B},a(I,l));let i=l.queueRequestedAt??l.lastRequestedAt??j,g=er(l,i);return g==="in-flight"?false:g==="dispatch"});if(V(),q.length>0){let _=false,I=j;for(let l of q){let i=l.outputFile;if(typeof i!="string"||!i)continue;let g=p(i),b=g.queueRequestedAt??j;a(i,{...g,lastRequestedAt:b}),I=b,_=true;}return _&&V(),_&&(S.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:I}}),r.executionRequestStore.appendEntries(t,S)),"task-initiated"}let H=w.provides??[],X={};for(let{bindTo:_,ref:I}of H)X[_]=re.resolve(f,I);return (u??r.outputStore.writeDataObjects.bind(r.outputStore))(X),L.filter(_=>{if(_.optionalForCompletionGating!==true)return false;let I=p(_.outputFile);return !I.lastRequestedAt||!I.lastFetchedAt?true:I.lastFetchedAt<=I.lastRequestedAt}).length>0&&S.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:j}}),n(c.nodeId,X),S.length>0&&r.executionRequestStore.appendEntries(t,S),"task-initiated"}}var Ge={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function kt(e){return {[ie]:e.graph,[ft]:e.lastDrainedJournalId}}function yt(e){let t=e[ie],r=e[ft];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ie}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function St(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function P(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function x(e){return {status:"fail",error:e}}function G(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function nr(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function bt(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(s)}function Ee(e){try{let t=JSON.parse(bt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function sr(e){return nr(JSON.stringify(e))}function Ct(e){try{let t=JSON.parse(bt(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function z(){return new Date().toISOString()}function zr(e,t){let r=t.onWarn??(()=>{}),n=Y(e);function s(l){if(l.length!==0)try{let i=t.publishBoardChangeNotifications?.(l);i&&typeof i.catch=="function"&&i.catch(g=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${g instanceof Error?g.message:String(g)}`));}catch(i){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${i instanceof Error?i.message:String(i)}`);}}function o(){let l=c().readCardStoreRef();if(!l)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let i=t.kvStorageForRef(l);return {readIndex(){return i.read("_index")},writeIndex(g){i.write("_index",g);},readCard(g){return i.read(g)},writeCard(g,b){return i.write(g,b),t.hashFn(b)},cardExists(g){return i.read(g)!==null},defaultCardKey(g){return g}}}let u={readValues(l){let i=t.kvStorage("state-snapshot"),g=i.listKeys().sort();if(g.length===0)return {version:null,values:{}};let b={};for(let F of g)b[F]=i.read(F);return {version:t.hashFn(b),values:b}},writeValues(l,i,g){let b=t.kvStorage("state-snapshot");for(let F of g)b.delete(F);for(let[F,$]of Object.entries(i))b.write(F,$);return t.hashFn(i)}},c=()=>Pe(t.kvStorage("config")),S=()=>gt(u),w=()=>dt(t.journalAdapter()),N=()=>qe(o(),r),D=()=>{let l=c().readOutputsStoreRef();if(!l)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return mt(t.kvStorageForRef(l))};function L(){return !!S().readSnapshot(e.value).values[ie]}function A(){let l=S().readSnapshot(e.value);if(!l.values[ie])throw new Error(`Board not initialized at ${e.value}`);return yt(l.values)}function v(l,i){let g=S().commitSnapshot(e.value,{schemaVersion:we,expectedVersion:i,commitId:t.genId(),committedAt:z(),deleteKeys:[],shallowMerge:kt(l)});if(!g.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${i??"null"} current=${g.currentVersion??"null"}`)}function k(l){w().appendEvent(l);}async function V(){let l=(R,E)=>{let K=R.payload,Z=(K?.enrichedCard??{}).id??K?.cardId??"unknown";k({type:"task-failed",taskName:Z,error:E,timestamp:z()});},i=lt(t.kvStorage("execution-requests"),l),g=pt(t.kvStorage("card-runtime")),b=Fe(t.blobStorage("sources"),R=>t.resolveBlob(R)),F=new Map,$={readRuntime(R){return F.get(R)??g.readRuntime(R)},writeRuntime(R,E){F.set(R,E);}},U=[],J=new Map,Q={readSourceData(R,E){let K=`${R}/${E}`;return J.has(K)?J.get(K):b.readSourceData(R,E)},ingestSourceDataStaged(R,E,K,de){b.ingestSourceDataStaged(R,E,K,de);},commitSourceData(R,E,K){let de=`${R}/.staged/${K}/${E}`,ye=t.blobStorage("sources").read(de);if(ye==null)return false;let le=`${R}/${E}`,Be=ye.trim();try{J.set(le,JSON.parse(Be));}catch{J.set(le,Be);}return U.push({cardId:R,outputFile:E,deliveryToken:K}),true},hasSource(R,E){let K=`${R}/${E}`;return J.has(K)?true:b.hasSource(R,E)}},W={cardStore:N(),cardRuntimeStore:$,fetchedSourcesStore:Q,outputStore:D(),executionRequestStore:i},se=A(),oe=Re(se.graph),{events:ue,newCursor:ce}=w().readEntriesAfterCursor(se.lastDrainedJournalId),ae=[],Ae=[],Te=[],$e=new Map,Rt=(R,E)=>{ae.push({type:"task-completed",taskName:R,data:E,timestamp:z()});},Le=(R,E)=>k({type:"task-failed",taskName:R,error:E,timestamp:z()}),he=nt(oe,{handlers:{"card-handler":ht(e,ce,W,Rt,Le,(R,E)=>{Ae.push({cardId:R,values:E});},R=>{Te.push(R);})}});for(ae=ue;ae.length>0;){let R=ae;ae=[];for(let E of R)if(E.type==="task-restart"){let K=W.cardStore.readCard(E.taskName);K&&$e.set(E.taskName,K);}he.pushAll(R),await he.waitForHandlers();}let Ve=he.getState();await he.dispose({wait:true});let vt=S().readSnapshot(e.value).version;v({lastDrainedJournalId:ce,graph:pe(Ve)},vt);for(let{cardId:R,values:E}of Ae)W.outputStore.writeComputedValues(R,E);for(let R of Te)W.outputStore.writeDataObjects(R);for(let[R,E]of F)g.writeRuntime(R,E);for(let{cardId:R,outputFile:E,deliveryToken:K}of U)b.commitSourceData(R,E,K);let ke;try{ke=xe(n,Ve),W.outputStore.writeStatusSnapshot(ke);}catch(R){r(`[board-live-cards-public] status publish failed: ${R instanceof Error?R.message:String(R)}`);}let fe=[];for(let{cardId:R,values:E}of Ae)fe.push({kind:"computed_values",cardId:R,values:E});for(let R of Te)for(let[E,K]of Object.entries(R))E&&fe.push({kind:"data_object",key:E,payload:K});for(let[R,E]of $e)fe.push({kind:"card_refreshed",cardId:R,card:E});ke!==void 0&&fe.push({kind:"status",status:ke}),s(fe);let wt=c().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:Y({kind:"built-in",value:"source-cli-task-executor"})};i.dispatchEntriesForJournalId(ce,R=>{if(R.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${R.taskKind}" \u2014 skipping`);return}let E=R.payload,K=E.enrichedCard?.id??"unknown",de=E.enrichedCard?.source_defs??[];for(let Z of de){if(!Z.outputFile){r(`[dispatch] source "${Z.bindTo}" has no outputFile \u2014 skipping`);continue}let ye=sr({cbk:E.callbackToken,rg:e.value,br:Y(e),cid:K,b:Z.bindTo,d:Z.outputFile,cs:void 0,rqt:E.rqt});t.dispatchExecution(wt,{source_def:Z,base_ref:Y(e),callback:{token:ye,via:t.selfRef}}).catch(le=>Le(K,le instanceof Error?le.message:String(le)));}});}async function p(){try{let l=()=>{let g=A(),{events:b}=w().readEntriesAfterCursor(g.lastDrainedJournalId);b.length<=0||(p(),t.requestProcessAccumulated?.());},i=await Ke(t.lock,V,l);return P({ran:i!==!1})}catch(l){return G(l)}}function a(l){try{let i=l.params?.cardStoreRef;if(!i)return x("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!L()){let $=be(Ge);v({lastDrainedJournalId:"",graph:pe($)},null);}let g=l.params?.outputsStoreRef;if(!g)return x("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let b=c();b.writeCardStoreRef(i),b.writeOutputsStoreRef(g);let F=l.body??{};F["task-executor-ref"]&&b.writeTaskExecutorRef(F["task-executor-ref"]),F["chat-handler-ref"]&&b.writeChatHandlerRef(F["chat-handler-ref"]);try{D().writeStatusSnapshot(xe(n,Re(A().graph)));}catch{}return P()}catch(i){return G(i)}}function d(l){try{let i=D().readStatusSnapshot();if(!i){i=xe(n,Re(A().graph));try{D().writeStatusSnapshot(i);}catch{}}return P(i)}catch(i){return G(i)}}function m(l){try{let i=l.params?.id;return i?(k({type:"task-removal",taskName:i,timestamp:z()}),p(),P()):x("removeCard requires params.id")}catch(i){return G(i)}}function C(l){try{let i=l.params?.id;return i?(k({type:"task-restart",taskName:i,timestamp:z()}),p(),P()):x("retrigger requires params.id")}catch(i){return G(i)}}async function y(l){return p()}function f(l){try{let i=l.params?.cardId,g=l.params?.all,b=!!l.params?.restart;if(!i&&!g)return x("upsertCard requires --card-id <id> or --all");let F=g?N().readAllCards().map($=>$.id):[i];for(let $ of F)if(!N().readCard($))return x(`Card "${$}" not found in board at ${e.value}`);for(let $ of F){let U=N().readCard($),J=St(U),Q=t.hashFn(J),W=t.kvStorage("card-upsert"),se=W.read($),oe=se?.taskConfigHash!==Q;if(!(!oe&&!b)){if(oe){let ue=se?.blobRef??N().readCardKey($)??$;k({type:"task-upsert",taskName:$,taskConfig:J,timestamp:z()}),W.write($,{blobRef:ue,taskConfigHash:Q,updatedAt:z()});}b&&k({type:"task-restart",taskName:$,timestamp:z()});}}return p(),P()}catch(i){return G(i)}}function h(l){try{let i=l.params?.token;if(!i)return x("taskFailed requires params.token");let g=l.params?.error??"unknown error",b=Ee(i);return b?(k({type:"task-failed",taskName:b.taskName,error:g,timestamp:z()}),p(),P()):x("Invalid callback token")}catch(i){return G(i)}}function T(l){try{let i=l.params?.token;if(!i)return x("taskProgress requires params.token");let b=(l.body??{}).update??{},F=Ee(i);return F?(k({type:"task-progress",taskName:F.taskName,update:b,timestamp:z()}),p(),P()):x("Invalid callback token")}catch(i){return G(i)}}function O(l){try{let i=l.params?.token,g=l.params?.ref;if(!i)return x("sourceDataFetched requires params.token");if(!g)return x("sourceDataFetched requires params.ref");let b=Ct(i);if(!b)return x("Invalid source token");let{cbk:F,cid:$,b:U,d:J,cs:Q,rqt:W}=b,se=Fe(t.blobStorage("sources"),ae=>t.resolveBlob(ae)),oe=t.genId();se.ingestSourceDataStaged($,J,_e(g),oe);let ue=Ee(F);if(!ue)return x("Invalid callback token embedded in source token");let ce=z();return k({type:"task-progress",taskName:ue.taskName,update:{bindTo:U,outputFile:J,fetchedAt:ce,deliveryToken:oe,sourceChecksum:Q,rqt:W},timestamp:ce}),p(),P()}catch(i){return G(i)}}function j(l){try{let i=l.params?.token,g=l.params?.reason??"unknown";if(!i)return x("sourceDataFetchFailure requires params.token");let b=Ct(i);if(!b)return x("Invalid source token");let{cbk:F,b:$,d:U,cs:J}=b,Q=Ee(F);return Q?(k({type:"task-progress",taskName:Q.taskName,update:{bindTo:$,outputFile:U,failure:!0,reason:g,sourceChecksum:J},timestamp:z()}),p(),P()):x("Invalid callback token embedded in source token")}catch(i){return G(i)}}function B(l){try{let i=c().readCardStoreRef();return i?P({storeRef:i}):x(`Board at ${e.value} has no card store configured`)}catch(i){return G(i)}}function q(l){try{let i=c().readOutputsStoreRef();return i?P({storeRef:i}):x(`Board at ${e.value} has no outputs store configured`)}catch(i){return G(i)}}function H(l){try{let i=l.params?.key;if(!i)return x("getConfig requires params.key");let g=c(),b;switch(i){case "task-executor":b=g.readTaskExecutorRef()??null;break;case "chat-handler":b=g.readChatHandlerRef()??null;break;case "card-store-ref":b=g.readCardStoreRef();break;case "outputs-store-ref":b=g.readOutputsStoreRef();break;default:return x(`getConfig: unknown key "${i}"`)}return P({value:b})}catch(i){return G(i)}}function X(l){try{let i=l.params?.key;if(!i)return x("getOutputsDataObject requires params.key");let g=D().readDataObject(i);return P(g)}catch(i){return G(i)}}function ne(l){try{return P(D().readAllDataObjects())}catch(i){return G(i)}}function _(l){try{let i=l.params?.key;if(!i)return x("getOutputsComputedValues requires params.key");let g=D().readComputedValues(i);return P(g)}catch(i){return G(i)}}function I(l){try{return P(D().readAllComputedValues())}catch(i){return G(i)}}return {init:a,status:d,getCardStoreRef:B,getOutputsStoreRef:q,getConfig:H,getOutputsDataObject:X,getAllOutputsDataObjects:ne,getOutputsComputedValues:_,getAllOutputsComputedValues:I,removeCard:m,retrigger:C,processAccumulatedEvents:y,upsertCard:f,taskFailed:h,taskProgress:T,sourceDataFetched:O,sourceDataFetchFailure:j}}function Yr(e,t){let r=()=>Pe(t.kvStorage("config"));function n(){let p=r().readCardStoreRef();if(!p)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let a=t.kvStorageForRef(p);return {readIndex(){return a.read("_index")},writeIndex(d){a.write("_index",d);},readCard(d){return a.read(d)},writeCard(d,m){return a.write(d,m),t.hashFn(m)},cardExists(d){return a.read(d)!==null},defaultCardKey(d){return d}}}let s=()=>qe(n(),t.onWarn??(()=>{}));function o(p,a){let d=t.validateSchema(a),m=[],C=r().readTaskExecutorRef();if(C&&Array.isArray(a.source_defs))for(let f of a.source_defs){let h=typeof f.bindTo=="string"?f.bindTo:"(unknown)";try{let T;try{T=t.invokeExecutorSync(C,"validate-source-def",[],{timeout:1e4,input:JSON.stringify(f)});}catch(j){let B=j;if(T=typeof B?.stdout=="string"?B.stdout:"",!T.trim()){m.push(`source "${h}": executor validate-source-def failed \u2014 ${j instanceof Error?j.message:String(j)}`);continue}}let O=JSON.parse(T.trim());if(!O.ok&&Array.isArray(O.errors))for(let j of O.errors)m.push(`source "${h}": ${j}`);}catch(T){m.push(`source "${h}": executor validate-source-def failed \u2014 ${T instanceof Error?T.message:String(T)}`);}}let y=[...d.errors,...m];return P({cardId:p,isValid:y.length===0,issues:y})}function u(p,a,d){let m=r().readTaskExecutorRef();if(!m)return x("No task-executor registered for this board");let C=typeof p.bindTo=="string"?p.bindTo:"source",y=t.makeTempFilePath(`probe-in-${C}`),f=t.makeTempFilePath(`probe-out-${C}`),h=t.makeTempFilePath(`probe-err-${C}`,".txt"),T={...p,boardDir:e.value,_projections:a},O=Y({kind:"fs-path",value:y}),j=Y({kind:"fs-path",value:f}),B=Y({kind:"fs-path",value:h});t.absoluteBlob.write(y,JSON.stringify(T,null,2));let q=null;try{if(t.invokeExecutorSync(m,"run-source-fetch",["--in-ref",O,"--out-ref",j,"--err-ref",B],{timeout:p.timeout??3e4}),q=t.absoluteBlob.read(f),q===null)return x("Executor produced no output file")}catch(H){let X=t.absoluteBlob.read(h)?.trim()??(H instanceof Error?H.message:String(H));return x(`Probe failed: ${X}`)}finally{try{t.absoluteBlob.remove(y);}catch{}try{t.absoluteBlob.remove(h);}catch{}}if(d){let H=_e(d);t.absoluteBlob.write(H.value,q);}else try{t.absoluteBlob.remove(f);}catch{}return P({bindTo:C,resultSizeBytes:q.length})}function c(p){try{let a=p.params?.cardId,d=p.params?.all;if(!a&&!d)return x("validateCard requires --card-id <id> or --all");let m=d?s().readAllCards().map(y=>y.id):[a],C=[];for(let y of m){let f=s().readCard(y);if(!f){C.push({cardId:y,isValid:!1,issues:[`Card "${y}" not found`]});continue}let h=o(y,f);if(h.status!=="success")return h;C.push(h.data);}return P(C)}catch(a){return G(a)}}function S(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("validateCardPreflight requires card JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=o(m,d),y=r().readTaskExecutorRef();if(y)try{let f=t.invokeExecutorSync(y,"validate-card-preflight",[],{timeout:1e4,input:JSON.stringify(d)}),h=JSON.parse(f.trim());if(!h.ok&&Array.isArray(h.errors)&&h.errors.length>0){let T=[...C.status==="success"?C.data.issues:[],...h.errors];return P({cardId:m,isValid:!1,issues:T})}}catch{}return C}catch(a){return G(a)}}function w(p){try{let a=p.params?.cardId,d=p.params?.sourceIdx,m=p.params?.outRef;if(!a)return x("probeSource requires params.cardId");if(d===void 0)return x("probeSource requires params.sourceIdx");let y=(p.body??{})["mock-projections"]??{},f=s().readCard(a);if(!f)return x(`Card "${a}" not found`);let h=f.source_defs??[];return d<0||d>=h.length?x(`sourceIdx ${d} out of range (card has ${h.length} source(s))`):u(h[d],y,m)}catch(a){return G(a)}}function N(p){try{let a=p.params?.outRef,d=p.body;if(!d)return x('probeTmpSource requires body with "source-def" and "mock-projections"');let m=d["source-def"],C=d["mock-projections"]??{};return m?u(m,C,a):x('probeTmpSource body requires "source-def"')}catch(a){return G(a)}}function D(p){try{let a=p.params?.sourceIdx,d=p.params?.outRef;if(a===void 0)return x("probeSourcePreflight requires params.sourceIdx");if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("probeSourcePreflight requires card JSON object in body");let m=p.body,C=m["card-content"]??m,y=m["mock-projections"]??{},f=C.source_defs??[];if(a<0||a>=f.length)return x(`sourceIdx ${a} out of range (card has ${f.length} source(s))`);let h=f[a],T=r().readTaskExecutorRef();if(T){let O=typeof h.bindTo=="string"?h.bindTo:"source";try{let j={...h,_projections:y},B=t.invokeExecutorSync(T,"probe-source-preflight",[],{timeout:h.timeout??1e4,input:JSON.stringify(j)}),q=JSON.parse(B.trim());return q.ok?P({bindTo:O,reachable:q.reachable,latencyMs:q.latencyMs,note:q.note}):x(q.error??"Preflight probe failed")}catch{}}return u(h,y,d)}catch(a){return G(a)}}function L(p){try{let a=r().readTaskExecutorRef();if(!a)return x("No task-executor registered for this board");let d=t.invokeExecutorSync(a,"describe-capabilities",[],{timeout:1e4});return P(JSON.parse(d.trim()))}catch(a){return G(a)}}function A(p){try{let a=p.body;if(!a||!Array.isArray(a.ops))return x("updatesInCardStore requires body.ops array");let d=a.ops,m=s();for(let C of d){let y=C.op,f=C.id;if(!f)return x('op is missing "id"');if(y==="update"){let h=C["card-content"];if(!h)return x(`update op for "${f}" is missing "card-content"`);m.writeCard(f,h);}else return x(`Unknown op type: "${y??"(none)"}"`)}return P()}catch(a){return G(a)}}function v(p){try{let a=p.body;if(!a||!Array.isArray(a.ids))return x("readFromCardStore requires body.ids array");let d=a.ids,m=s(),C=d.map(y=>({id:y,"card-content":m.readCard(y)}));return P({cards:C})}catch(a){return G(a)}}function k(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("evalCardCompute requires a JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=a["mock-fetched-sources"]??{},y=a["mock-requires"]??{},f=d.compute;if(!f||!Array.isArray(f)||f.length===0)return P({cardId:m,ok:!0,computed_values:{},errors:[]});let h={id:m,card_data:d.card_data??{},requires:y,source_defs:d.source_defs,compute:f},T=re.runSync(h,{sourcesData:C}),O=T.node.computed_values??{},j=T.errors??[];return P({cardId:m,ok:j.length===0,computed_values:O,errors:j})}catch(a){return G(a)}}function V(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("simulateCardCycle requires a JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=a["mock-fetched-sources"]??{},y=a["mock-requires"]??{},f=o(m,d),h=f.status==="success"?{isValid:f.data.isValid,issues:f.data.issues}:{isValid:!1,issues:[f.status==="fail"?f.error:"internal error"]},T=d.source_defs??[],O=d.card_data??{},j=[],B=[];if(T.length>0){j=re.enrichSourcesSync(T,{card_data:O,requires:y});for(let i of j){let g=i.projections,b=i._projections;if(g&&b){for(let F of Object.keys(g))if(b[F]===void 0){let $=typeof i.bindTo=="string"?i.bindTo:"(unknown)";B.push({bindTo:$,key:F,error:`Projection "${F}" resolved to undefined`});}}}}let q=[],H=a["task-executor-ref"],X=(H?.howToRun&&H?.whatToRun?H:void 0)??r().readTaskExecutorRef();for(let i=0;i<j.length;i++){let g=j[i],b=typeof g.bindTo=="string"?g.bindTo:`source_${i}`;if(!X){q.push({bindTo:b,skipped:!0,error:"No task executor configured"});continue}try{let F={...g},$=t.invokeExecutorSync(X,"probe-source-preflight",[],{timeout:g.timeout??1e4,input:JSON.stringify(F)}),U=JSON.parse($.trim());q.push({bindTo:b,reachable:U.reachable,latencyMs:U.latencyMs,error:U.ok?void 0:U.error});}catch{q.push({bindTo:b,skipped:!0,error:"Executor does not support probe-source-preflight"});}}let ne=d.compute,_={},I=[];if(ne&&Array.isArray(ne)&&ne.length>0){let i={id:m,card_data:O,requires:y,source_defs:d.source_defs,compute:ne},g=re.runSync(i,{sourcesData:C});_=g.node.computed_values??{},I=g.errors??[];}let l=h.isValid&&B.length===0&&I.length===0&&q.every(i=>i.reachable!==!1);return P({cardId:m,ok:l,validation:h,source_probes:q,projection_errors:B,computed_values:_,compute_errors:I})}catch(a){return G(a)}}return {validateCard:c,validateCardPreflight:S,probeSource:w,probeTmpSource:N,probeSourcePreflight:D,evalCardCompute:k,simulateCardCycle:V,describeTaskExecutorCapabilities:L,updatesInCardStore:A,readFromCardStore:v}}
1
+ import {createRequire}from'module';import'ajv-formats';var Se="b64:";function xt(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Et(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Y(e){return `${Se}${xt(JSON.stringify(e))}`}function _e(e){if(!e.startsWith(Se))throw new Error(`Invalid ref format (expected ${Se}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Et(e.slice(Se.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Ke(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var ee={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function M(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function te(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function He(e){return e.tasks??{}}function Ie(e){return e?e.status===ee.FAILED||e.status===ee.INACTIVATED:false}function Ue(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Je(e){return e.maxExecutions}function Me(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===ee.COMPLETED){let s=e.tasks[n];s&&M(s).forEach(c=>r.add(c));}return Array.from(r)}function ze(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;M(o).forEach(u=>{r[u]||(r[u]=[]),r[u].push(n);});}),r}function Ye(e,t,r){let n=e.tasks[t]??Ce(),o={};if(r){let u=r.tasks[t],c=te(u);for(let S of c)for(let[w,N]of Object.entries(r.tasks))if(M(N).includes(S)){let D=e.tasks[w];D?.lastDataHash&&(o[S]=D.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Xe(e,t,r,n,o,s){let u=e.tasks[r]??Ce(),c=t.tasks[r];if(!c)throw new Error(`Task "${r}" not found in graph`);let S;n&&c.on&&c.on[n]?S=c.on[n]:S=M(c);let w=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let L=c.requires??[];for(let A of L)for(let[v,k]of Object.entries(t.tasks))if(M(k).includes(A)){let V=e.tasks[v];V?.lastDataHash&&(w[A]=V.lastDataHash);break}}let N={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:w,error:void 0},D=[...new Set([...e.availableOutputs,...S])];return {...e,tasks:{...e.tasks,[r]:N},availableOutputs:D,lastUpdated:new Date().toISOString()}}function We(e,t,r,n){let o=e.tasks[r]??Ce(),s=t.tasks[r];if(s?.retry){let S=o.retryCount+1;if(S<=s.retry.max_attempts){let w={...o,status:"not-started",retryCount:S,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:w},lastUpdated:new Date().toISOString()}}}let u={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},c=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(c=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&u.executionCount>=s.circuit_breaker.max_executions){let S=s.circuit_breaker.on_break;c=[...new Set([...c,...S])];}return {...e,tasks:{...e.tasks,[r]:u},availableOutputs:c,lastUpdated:new Date().toISOString()}}function Qe(e,t,r,n){let o=e.tasks[t]??Ce(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Ze(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Ce(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function be(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=tt();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function At(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:Ye(n,t.taskName,r)};case "task-completed":return {config:r,state:Xe(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:We(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Qe(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Ze(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Dt(n,t.action)};case "task-upsert":return Tt(e,t.taskName,t.taskConfig);case "task-removal":return _t(e,t.taskName);case "node-requires-add":return It(e,t.nodeName,t.tokens);case "node-requires-remove":return Ot(e,t.nodeName,t.tokens);case "node-provides-add":return jt(e,t.nodeName,t.tokens);case "node-provides-remove":return Nt(e,t.nodeName,t.tokens);default:return e}}function et(e,t){return t.reduce((r,n)=>At(r,n),e)}function Tt(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:tt()},lastUpdated:new Date().toISOString()}}}function _t(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function It(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=te(n),s=r.filter(u=>!o.includes(u));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function Ot(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=te(n),s=o.filter(u=>!r.includes(u));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function jt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=M(n),s=r.filter(u=>!o.includes(u));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function Nt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=M(n),s=o.filter(u=>!r.includes(u));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function pe(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Re(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function tt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Dt(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function ge(e){let{config:t,state:r}=e,n=He(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=qt(n),u=Me(t,r.tasks),c=new Set([...u,...r.availableOutputs]),S=[],w=[],N=[],D=[];for(let[A,v]of Object.entries(n)){let k=r.tasks[A],V=Ue(v,t.settings),p=V!=="once";if(k?.status===ee.RUNNING||Ie(k))continue;let a=Je(v);if(a!==void 0&&k&&k.executionCount>=a||v.circuit_breaker&&k&&k.executionCount>=v.circuit_breaker.max_executions||!p&&k?.status===ee.COMPLETED)continue;if(p&&k?.status===ee.COMPLETED){let f=te(v),h=false;switch(V){case "data-changed":{f.length>0&&f.some(O=>{for(let[j,B]of Object.entries(n))if(M(B).includes(O)){let q=r.tasks[j];if(!q)continue;let H=k.lastConsumedHashes?.[O];return q.lastDataHash==null?q.executionCount>k.lastEpoch:q.lastDataHash!==H}return false})||(h=true);break}case "epoch-changed":{f.length>0&&f.some(O=>{for(let[j,B]of Object.entries(n))if(M(B).includes(O)){let q=r.tasks[j];if(q&&q.executionCount>k.lastEpoch)return true}return false})||(h=true);break}case "time-based":{let T=v.refreshInterval??0;if(T<=0){h=true;break}let O=k.completedAt;if(!O){h=true;break}(Date.now()-Date.parse(O))/1e3<T&&(h=true);break}case "manual":h=true;break}if(h)continue}let d=te(v);if(d.length===0){S.push(A);continue}let m=[],C=[],y=[];for(let f of d){if(c.has(f))continue;let h=s[f]||[];h.length===0?m.push(f):h.every(O=>Ie(r.tasks[O]))?y.push({token:f,failedProducer:h[0]}):C.push(f);}m.length>0?N.push({taskName:A,missingTokens:m}):y.length>0?D.push({taskName:A,failedTokens:y.map(f=>f.token),failedProducers:[...new Set(y.map(f=>f.failedProducer))]}):C.length>0?w.push({taskName:A,waitingOn:C}):S.push(A);}let L={};if(S.length>1){let A=ze(S,n);for(let[v,k]of Object.entries(A))k.length>1&&(L[v]=k);}return {eligible:S,pending:w,unresolved:N,blocked:D,conflicts:L}}function qt(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of M(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var me=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Oe(e){let t=je(e);return Ft(t)}function je(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(je).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+je(t[n])).join(",")+"}"}function Ft(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Pt(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Gt(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function rt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Pt(t)}function $t(e){try{let t=JSON.parse(Gt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function nt(e,t,r){let{handlers:n,onDrain:o}=t,s=new me,u="state"in e&&"config"in e?e:be(e),c=false,S=new Set,w=new Map(Object.entries(n)),N=new me,D=false,L=false;function A(){if(!c){if(D){L=true;return}D=true;try{do L=!1,v();while(L)}finally{D=false;}}}function v(){let a=N.drain(),d=s.drain(),m=[...a,...d];m.length>0&&(u=et(u,m));let C=ge(u);m.length>0&&o?.(m,u,C);for(let y of C.eligible)p(y);for(let y of m)if(y.type==="task-progress"){let{taskName:f,update:h}=y;if(!u.config.tasks[f])continue;let O=u.state.tasks[f];if(!O||O.status!=="running")continue;let j=rt(f),B=V(f,j,h).catch(q=>{c||(N.append({type:"task-failed",taskName:f,error:q.message??String(q),timestamp:new Date().toISOString()}),A());}).finally(()=>{S.delete(B);});S.add(B);}}function k(a){let m=u.config.tasks[a].requires??[],C=new Map;for(let[f,h]of Object.entries(u.config.tasks))for(let T of h.provides??[])C.set(T,f);let y={};for(let f of m){let h=C.get(f);h?y[f]=u.state.tasks[h]?.data:y[f]=void 0;}return y}async function V(a,d,m){let C=u.config.tasks[a],y=C.taskHandlers??[],f=k(a);for(let h of y){let T=w.get(h);if(!T)throw new Error(`Handler '${h}' not found in registry (task '${a}')`);let O={nodeId:a,state:f,taskState:u.state.tasks[a],config:C,callbackToken:d,update:m};if(await T(O)==="task-initiate-failure")throw new Error(`Handler '${h}' returned task-initiate-failure (task '${a}')`)}}function p(a){let m=u.config.tasks[a]?.taskHandlers;if(!m||m.length===0)return;N.append({type:"task-started",taskName:a,timestamp:new Date().toISOString()}),A();let C=rt(a),y=V(a,C).catch(f=>{c||(N.append({type:"task-failed",taskName:a,error:f.message??String(f),timestamp:new Date().toISOString()}),A());}).finally(()=>{S.delete(y);});S.add(y);}return {push(a){c||(a.type==="task-completed"&&a.data&&!a.dataHash&&(a={...a,dataHash:Oe(a.data)}),s.append(a),A());},pushAll(a){if(!c){for(let d of a)d.type==="task-completed"&&d.data&&!d.dataHash?s.append({...d,dataHash:Oe(d.data)}):s.append(d);A();}},resolveCallback(a,d,m){if(c)return;let C=$t(a);if(!C)return;let{taskName:y}=C;if(u.config.tasks[y]){if(m&&m.length>0)s.append({type:"task-failed",taskName:y,error:m.join("; "),timestamp:new Date().toISOString()});else {let f=d&&Object.keys(d).length>0?Oe(d):void 0;s.append({type:"task-completed",taskName:y,data:d,dataHash:f,timestamp:new Date().toISOString()});}A();}},addNode(a,d){c||(s.append({type:"task-upsert",taskName:a,taskConfig:d,timestamp:new Date().toISOString()}),A());},removeNode(a){c||(s.append({type:"task-removal",taskName:a,timestamp:new Date().toISOString()}),A());},addRequires(a,d){c||(s.append({type:"node-requires-add",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},removeRequires(a,d){c||(s.append({type:"node-requires-remove",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},addProvides(a,d){c||(s.append({type:"node-provides-add",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},removeProvides(a,d){c||(s.append({type:"node-provides-remove",nodeName:a,tokens:d,timestamp:new Date().toISOString()}),A());},registerHandler(a,d){w.set(a,d);},unregisterHandler(a){w.delete(a);},retrigger(a){c||u.config.tasks[a]&&(s.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()}),A());},retriggerAll(a){if(!c){for(let d of a)u.config.tasks[d]&&s.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});A();}},snapshot(){return pe(u)},getState(){return u},getSchedule(){return ge(u)},async waitForHandlers(){S.size>0&&await Promise.allSettled([...S]);},async dispose(a){a?.wait&&S.size>0&&await Promise.allSettled([...S]),c=true;}}}var Vt=createRequire(import.meta.url);Vt("./jsonata-sync.cjs");var Kt=createRequire(import.meta.url),ve=Kt("./jsonata-sync.cjs"),at=ve;function ot(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function it(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Ht(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await ve(o.expr).evaluate(n);it(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Ut(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let u=at(s.expr).evaluate(n);it(e.computed_values,s.bindTo,u),n.computed_values=e.computed_values;}catch(u){let c=u instanceof Error?u.message:String(u);o.push({bindTo:s.bindTo,error:c});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Jt(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return ve(e).evaluate(n)}function Mt(e,t){return t.startsWith("fetched_sources.")?ot(e._sourcesData??{},t.slice(16)):ot(e,t)}var st=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),zt=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Yt(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))zt.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,u)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${u}]: must be an object`);else {let c=s;typeof c.bindTo!="string"||!c.bindTo?t.push(`source_defs[${u}]: missing required "bindTo" property`):(n.has(c.bindTo)&&t.push(`source_defs[${u}]: bindTo "${c.bindTo}" is not unique across source_defs`),n.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?t.push(`source_defs[${u}]: missing required "outputFile" property`):(o.has(c.outputFile)&&t.push(`source_defs[${u}]: outputFile "${c.outputFile}" is not unique across source_defs`),o.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${u}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):st.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...st].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Xt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=await ve(u).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Wt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=at(u).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var re={run:Ht,runSync:Ut,eval:Jt,resolve:Mt,validate:Yt,enrichSources:Xt,enrichSourcesSync:Wt};function Ne(e){return JSON.stringify(e)}function De(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function qe(e,t){function r(){return e.readIndex()??{}}function n(o,s,u){let c=String(s||"").split(".").filter(Boolean);if(c.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let S={...o},w=S;for(let N=0;N<c.length-1;N++){let D=c[N],L=w[D],A=L&&typeof L=="object"&&!Array.isArray(L)?{...L}:{};w[D]=A,w=A;}return w[c[c.length-1]]=u,S}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,u]of Object.entries(r())){if(!e.cardExists(u.key))continue;let c=e.readCard(u.key);c?o.push(c):t?.(`[card-store] could not read card "${s}" at key "${u.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,u]of Object.entries(r()))o[s]=u.checksum;return o},changedSince(o){let s=r(),u=[];for(let[c,S]of Object.entries(s))o[c]!==S.checksum&&u.push(c);for(let c of Object.keys(o))s[c]||u.push(c);return u},validateUpsert(o,s){let u=r(),c=u[o],S=Object.entries(u).find(([,w])=>w.key===s);return c&&c.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${c.key}", cannot remap to "${s}"`}:S&&S[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${S[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,u){let c=r(),S=u??c[o]?.key??e.defaultCardKey(o),w=e.writeCard(S,s);c[o]={key:S,checksum:w,updatedAt:new Date().toISOString()},e.writeIndex(c);},patchCard(o,s,u){let c=r(),S=c[o];if(!S||!e.cardExists(S.key))throw new Error(`card "${o}" not found`);let w=e.readCard(S.key);if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`card "${o}" is not patchable`);let N=n(w,s,u),D=e.writeCard(S.key,N);c[o]={key:S.key,checksum:D,updatedAt:new Date().toISOString()},e.writeIndex(c);},removeCard(o){let s=r();s[o]&&(delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function Fe(e,t){return {readSourceData(r,n){let o=e.read(`${r}/${n}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,n,o,s){let u=t(o);e.write(`${r}/.staged/${s}/${n}`,u);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,u=e.read(s);return u==null?false:(e.write(`${r}/${n}`,u),e.remove(s),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function dt(e){function t(r){let n=e.readAllEntries();if(!r)return n;let o=n.findIndex(s=>s.id===r);return o===-1?n:n.slice(o+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function lt(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let o=e.read(r)??[];e.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=e.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(u){let c=u instanceof Error?u.message:String(u);try{t(s,c);}catch{}}e.delete(r);}}}}var we="v1",ie="board/graph",ft="board/lastJournalProcessedId";function ut(e){return `cards/${e}/runtime`}function pt(e){return {readRuntime(t){return e.read(ut(t))??{_sources:{}}},writeRuntime(t,r){e.write(ut(t),r);}}}function Qt(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function gt(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==we)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let o=Qt(n.values,r);return {ok:true,newVersion:e.writeValues(t,o,r.deleteKeys)}}}}function Pe(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return De(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Ne(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return De(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",Ne(r));},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function mt(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Zt(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function er(e,t){return e?.lastRequestedAt?Zt(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function tr(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function ct(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function xe(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=ge(t),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},c=new Map;for(let v of s.pending)c.set(v.taskName,v.waitingOn);for(let v of s.unresolved)c.set(v.taskName,v.missingTokens);for(let v of s.blocked)c.set(v.taskName,v.failedTokens);let S=new Map;for(let[v,k]of Object.entries(n))for(let V of k.requires??[]){let p=S.get(V)??[];p.push(v),S.set(V,p);}let w=o.sort().map(v=>{let k=r[v],V=n[v]??{requires:[],provides:[]};k.status==="completed"?u.completed+=1:k.status==="failed"?u.failed+=1:k.status==="in-progress"&&(u.in_progress+=1);let p=V.requires??[],a=V.provides??[],d=Object.keys(k.data??{}).sort(),m=p.filter(O=>t.state.availableOutputs.includes(O)),C=p.filter(O=>!t.state.availableOutputs.includes(O)),y=c.get(v)??C,f=new Set;for(let O of a)for(let j of S.get(O)??[])j!==v&&f.add(j);let h=k.failedAt,T=k.error?{message:k.error,code:"TASK_FAILED",at:h,source:"task-runtime"}:void 0;return {name:v,status:k.status,error:T,requires:p,requires_satisfied:m,requires_missing:C,provides_declared:a,provides_runtime:d,blocked_by:y,unblocks:Array.from(f).sort(),runtime:{attempt_count:k.executionCount??0,restart_count:k.retryCount??0,in_progress_since:k.status==="in-progress"?k.startedAt??null:null,last_transition_at:k.lastUpdated??null,last_completed_at:k.completedAt??null,last_restarted_at:k.startedAt??null,status_age_ms:k.lastUpdated?0:null}}});u.pending=s.pending.length,u.blocked=s.blocked.length,u.unresolved=s.unresolved.length;let N=w.map(v=>({name:v.name,fanOut:v.unblocks.length})).sort((v,k)=>k.fanOut-v.fanOut||v.name.localeCompare(k.name)),D=N.length>0?N[0]:{name:null,fanOut:0},L=new Set;for(let v of Object.values(n))for(let k of v.requires??[])L.add(k);let A=0;for(let[v,k]of Object.entries(n)){let V=(k.requires??[]).length===0,a=(k.provides??[]).some(d=>(S.get(d)??[]).some(m=>m!==v));V&&!a&&(A+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:u.completed,eligible:s.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:A,topology:{edge_count:Array.from(L).length,max_fan_out_card:D.name,max_fan_out:D.fanOut}},cards:w}}function rr(){return new Date().toISOString()}function ht(e,t,r,n,o,s,u){return async c=>{let S=[],w=r.cardStore.readCard(c.nodeId);if(!w)return "task-initiate-failure";let N=w.id,D=w.card_data??{},L=w.source_defs??[],A=L.filter(_=>_.optionalForCompletionGating!==true),v=r.cardRuntimeStore.readRuntime(N),k=false,V=()=>{k&&(r.cardRuntimeStore.writeRuntime(N,v),k=false);},p=_=>({...v._sources[_]??{}}),a=(_,I)=>{v._sources[_]=I,k=true;},d=c.taskState?.executionCount??0,m=v._lastExecutionCount;if(typeof m=="number"&&m!==d&&(v._sources={},k=true),m!==d&&(v._lastExecutionCount=d,k=true),c.update){let _=c.update,I=_.outputFile;if(I){let l=p(I);if(_.failure)a(I,ct(l,_.reason??"unknown"));else {let i=_.rqt;if(!l.lastFetchedAt||i>l.lastFetchedAt){let g=typeof _.deliveryToken=="string"?_.deliveryToken:void 0,b=false;g&&(b=r.fetchedSourcesStore.commitSourceData(N,I,g)),b?a(I,tr(l,i)):a(I,ct(l,`source delivery commit failed for ${I} token=${String(g)}`));}}V();}}let C={};for(let _ of L)if(_.outputFile){let I=r.fetchedSourcesStore.readSourceData(N,_.outputFile);I!==null&&(C[_.bindTo]=I);}let y={};for(let[_,I]of Object.entries(c.state??{}))if(I!==null&&typeof I=="object"&&!Array.isArray(I)){let l=I[_];y[_]=l!==void 0?l:I;}else y[_]=I;let f={id:N,card_data:{...D},requires:y,source_defs:L,compute:w.compute};f._sourcesData=C,w.compute&&re.runSync(f,{sourcesData:C}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(N,f.computed_values??{});let h={...w},T=re.enrichSourcesSync(Array.isArray(w.source_defs)?w.source_defs:void 0,{card_data:w.card_data,requires:y}),O=e.value;h.source_defs=Array.isArray(T)?T.map(_=>({..._,boardDir:typeof _.boardDir=="string"&&_.boardDir?_.boardDir:O})):T;let j=rr(),B=c.update?void 0:j,q=A.filter(_=>{let I=_.outputFile;if(typeof I!="string"||!I)return true;let l=p(I);B&&(l={...l,queueRequestedAt:B},a(I,l));let i=l.queueRequestedAt??l.lastRequestedAt??j,g=er(l,i);return g==="in-flight"?false:g==="dispatch"});if(V(),q.length>0){let _=false,I=j;for(let l of q){let i=l.outputFile;if(typeof i!="string"||!i)continue;let g=p(i),b=g.queueRequestedAt??j;a(i,{...g,lastRequestedAt:b}),I=b,_=true;}return _&&V(),_&&(S.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:I}}),r.executionRequestStore.appendEntries(t,S)),"task-initiated"}let H=w.provides??[],X={};for(let{bindTo:_,ref:I}of H)X[_]=re.resolve(f,I);return (u??r.outputStore.writeDataObjects.bind(r.outputStore))(X),L.filter(_=>{if(_.optionalForCompletionGating!==true)return false;let I=p(_.outputFile);return !I.lastRequestedAt||!I.lastFetchedAt?true:I.lastFetchedAt<=I.lastRequestedAt}).length>0&&S.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:j}}),n(c.nodeId,X),S.length>0&&r.executionRequestStore.appendEntries(t,S),"task-initiated"}}var Ge={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function kt(e){return {[ie]:e.graph,[ft]:e.lastDrainedJournalId}}function yt(e){let t=e[ie],r=e[ft];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ie}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function St(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function P(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function x(e){return {status:"fail",error:e}}function G(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function nr(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function bt(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function Ee(e){try{let t=JSON.parse(bt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function or(e){return nr(JSON.stringify(e))}function Ct(e){try{let t=JSON.parse(bt(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function z(){return new Date().toISOString()}function zr(e,t){let r=t.onWarn??(()=>{}),n=Y(e);function o(l){if(l.length!==0)try{let i=t.publishBoardChangeNotifications?.(l);i&&typeof i.catch=="function"&&i.catch(g=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${g instanceof Error?g.message:String(g)}`));}catch(i){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${i instanceof Error?i.message:String(i)}`);}}function s(){let l=c().readCardStoreRef();if(!l)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let i=t.kvStorageForRef(l);return {readIndex(){return i.read("_index")},writeIndex(g){i.write("_index",g);},readCard(g){return i.read(g)},writeCard(g,b){return i.write(g,b),t.hashFn(b)},cardExists(g){return i.read(g)!==null},defaultCardKey(g){return g}}}let u={readValues(l){let i=t.kvStorage("state-snapshot"),g=i.listKeys().sort();if(g.length===0)return {version:null,values:{}};let b={};for(let F of g)b[F]=i.read(F);return {version:t.hashFn(b),values:b}},writeValues(l,i,g){let b=t.kvStorage("state-snapshot");for(let F of g)b.delete(F);for(let[F,$]of Object.entries(i))b.write(F,$);return t.hashFn(i)}},c=()=>Pe(t.kvStorage("config")),S=()=>gt(u),w=()=>dt(t.journalAdapter()),N=()=>qe(s(),r),D=()=>{let l=c().readOutputsStoreRef();if(!l)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return mt(t.kvStorageForRef(l))};function L(){return !!S().readSnapshot(e.value).values[ie]}function A(){let l=S().readSnapshot(e.value);if(!l.values[ie])throw new Error(`Board not initialized at ${e.value}`);return yt(l.values)}function v(l,i){let g=S().commitSnapshot(e.value,{schemaVersion:we,expectedVersion:i,commitId:t.genId(),committedAt:z(),deleteKeys:[],shallowMerge:kt(l)});if(!g.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${i??"null"} current=${g.currentVersion??"null"}`)}function k(l){w().appendEvent(l);}async function V(){let l=(R,E)=>{let K=R.payload,Z=(K?.enrichedCard??{}).id??K?.cardId??"unknown";k({type:"task-failed",taskName:Z,error:E,timestamp:z()});},i=lt(t.kvStorage("execution-requests"),l),g=pt(t.kvStorage("card-runtime")),b=Fe(t.blobStorage("sources"),R=>t.resolveBlob(R)),F=new Map,$={readRuntime(R){return F.get(R)??g.readRuntime(R)},writeRuntime(R,E){F.set(R,E);}},U=[],J=new Map,Q={readSourceData(R,E){let K=`${R}/${E}`;return J.has(K)?J.get(K):b.readSourceData(R,E)},ingestSourceDataStaged(R,E,K,de){b.ingestSourceDataStaged(R,E,K,de);},commitSourceData(R,E,K){let de=`${R}/.staged/${K}/${E}`,ye=t.blobStorage("sources").read(de);if(ye==null)return false;let le=`${R}/${E}`,Be=ye.trim();try{J.set(le,JSON.parse(Be));}catch{J.set(le,Be);}return U.push({cardId:R,outputFile:E,deliveryToken:K}),true},hasSource(R,E){let K=`${R}/${E}`;return J.has(K)?true:b.hasSource(R,E)}},W={cardStore:N(),cardRuntimeStore:$,fetchedSourcesStore:Q,outputStore:D(),executionRequestStore:i},oe=A(),se=Re(oe.graph),{events:ue,newCursor:ce}=w().readEntriesAfterCursor(oe.lastDrainedJournalId),ae=[],Ae=[],Te=[],$e=new Map,Rt=(R,E)=>{ae.push({type:"task-completed",taskName:R,data:E,timestamp:z()});},Le=(R,E)=>k({type:"task-failed",taskName:R,error:E,timestamp:z()}),he=nt(se,{handlers:{"card-handler":ht(e,ce,W,Rt,Le,(R,E)=>{Ae.push({cardId:R,values:E});},R=>{Te.push(R);})}});for(ae=ue;ae.length>0;){let R=ae;ae=[];for(let E of R)if(E.type==="task-restart"){let K=W.cardStore.readCard(E.taskName);K&&$e.set(E.taskName,K);}he.pushAll(R),await he.waitForHandlers();}let Ve=he.getState();await he.dispose({wait:true});let vt=S().readSnapshot(e.value).version;v({lastDrainedJournalId:ce,graph:pe(Ve)},vt);for(let{cardId:R,values:E}of Ae)W.outputStore.writeComputedValues(R,E);for(let R of Te)W.outputStore.writeDataObjects(R);for(let[R,E]of F)g.writeRuntime(R,E);for(let{cardId:R,outputFile:E,deliveryToken:K}of U)b.commitSourceData(R,E,K);let ke;try{ke=xe(n,Ve),W.outputStore.writeStatusSnapshot(ke);}catch(R){r(`[board-live-cards-public] status publish failed: ${R instanceof Error?R.message:String(R)}`);}let fe=[];for(let{cardId:R,values:E}of Ae)fe.push({kind:"computed_values",cardId:R,values:E});for(let R of Te)for(let[E,K]of Object.entries(R))E&&fe.push({kind:"data_object",key:E,payload:K});for(let[R,E]of $e)fe.push({kind:"card_refreshed",cardId:R,card:E});ke!==void 0&&fe.push({kind:"status",status:ke}),o(fe);let wt=c().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:Y({kind:"built-in",value:"source-cli-task-executor"})};i.dispatchEntriesForJournalId(ce,R=>{if(R.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${R.taskKind}" \u2014 skipping`);return}let E=R.payload,K=E.enrichedCard?.id??"unknown",de=E.enrichedCard?.source_defs??[];for(let Z of de){if(!Z.outputFile){r(`[dispatch] source "${Z.bindTo}" has no outputFile \u2014 skipping`);continue}let ye=or({cbk:E.callbackToken,rg:e.value,br:Y(e),cid:K,b:Z.bindTo,d:Z.outputFile,cs:void 0,rqt:E.rqt});t.dispatchExecution(wt,{source_def:Z,base_ref:Y(e),callback:{token:ye,via:t.selfRef}}).catch(le=>Le(K,le instanceof Error?le.message:String(le)));}});}async function p(){try{let l=()=>{let g=A(),{events:b}=w().readEntriesAfterCursor(g.lastDrainedJournalId);b.length<=0||(p(),t.requestProcessAccumulated?.());},i=await Ke(t.lock,V,l);return P({ran:i!==!1})}catch(l){return G(l)}}function a(l){try{let i=l.params?.cardStoreRef;if(!i)return x("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!L()){let $=be(Ge);v({lastDrainedJournalId:"",graph:pe($)},null);}let g=l.params?.outputsStoreRef;if(!g)return x("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let b=c();b.writeCardStoreRef(i),b.writeOutputsStoreRef(g);let F=l.body??{};F["task-executor-ref"]&&b.writeTaskExecutorRef(F["task-executor-ref"]),F["chat-handler-ref"]&&b.writeChatHandlerRef(F["chat-handler-ref"]);try{D().writeStatusSnapshot(xe(n,Re(A().graph)));}catch{}return P()}catch(i){return G(i)}}function d(l){try{let i=D().readStatusSnapshot();if(!i){i=xe(n,Re(A().graph));try{D().writeStatusSnapshot(i);}catch{}}return P(i)}catch(i){return G(i)}}function m(l){try{let i=l.params?.id;return i?(k({type:"task-removal",taskName:i,timestamp:z()}),p(),P()):x("removeCard requires params.id")}catch(i){return G(i)}}function C(l){try{let i=l.params?.id;return i?(k({type:"task-restart",taskName:i,timestamp:z()}),p(),P()):x("retrigger requires params.id")}catch(i){return G(i)}}async function y(l){return p()}function f(l){try{let i=l.params?.cardId,g=l.params?.all,b=!!l.params?.restart;if(!i&&!g)return x("upsertCard requires --card-id <id> or --all");let F=g?N().readAllCards().map($=>$.id):[i];for(let $ of F)if(!N().readCard($))return x(`Card "${$}" not found in board at ${e.value}`);for(let $ of F){let U=N().readCard($),J=St(U),Q=t.hashFn(J),W=t.kvStorage("card-upsert"),oe=W.read($),se=oe?.taskConfigHash!==Q;if(!(!se&&!b)){if(se){let ue=oe?.blobRef??N().readCardKey($)??$;k({type:"task-upsert",taskName:$,taskConfig:J,timestamp:z()}),W.write($,{blobRef:ue,taskConfigHash:Q,updatedAt:z()});}b&&k({type:"task-restart",taskName:$,timestamp:z()});}}return p(),P()}catch(i){return G(i)}}function h(l){try{let i=l.params?.token;if(!i)return x("taskFailed requires params.token");let g=l.params?.error??"unknown error",b=Ee(i);return b?(k({type:"task-failed",taskName:b.taskName,error:g,timestamp:z()}),p(),P()):x("Invalid callback token")}catch(i){return G(i)}}function T(l){try{let i=l.params?.token;if(!i)return x("taskProgress requires params.token");let b=(l.body??{}).update??{},F=Ee(i);return F?(k({type:"task-progress",taskName:F.taskName,update:b,timestamp:z()}),p(),P()):x("Invalid callback token")}catch(i){return G(i)}}function O(l){try{let i=l.params?.token,g=l.params?.ref;if(!i)return x("sourceDataFetched requires params.token");if(!g)return x("sourceDataFetched requires params.ref");let b=Ct(i);if(!b)return x("Invalid source token");let{cbk:F,cid:$,b:U,d:J,cs:Q,rqt:W}=b,oe=Fe(t.blobStorage("sources"),ae=>t.resolveBlob(ae)),se=t.genId();oe.ingestSourceDataStaged($,J,_e(g),se);let ue=Ee(F);if(!ue)return x("Invalid callback token embedded in source token");let ce=z();return k({type:"task-progress",taskName:ue.taskName,update:{bindTo:U,outputFile:J,fetchedAt:ce,deliveryToken:se,sourceChecksum:Q,rqt:W},timestamp:ce}),p(),P()}catch(i){return G(i)}}function j(l){try{let i=l.params?.token,g=l.params?.reason??"unknown";if(!i)return x("sourceDataFetchFailure requires params.token");let b=Ct(i);if(!b)return x("Invalid source token");let{cbk:F,b:$,d:U,cs:J}=b,Q=Ee(F);return Q?(k({type:"task-progress",taskName:Q.taskName,update:{bindTo:$,outputFile:U,failure:!0,reason:g,sourceChecksum:J},timestamp:z()}),p(),P()):x("Invalid callback token embedded in source token")}catch(i){return G(i)}}function B(l){try{let i=c().readCardStoreRef();return i?P({storeRef:i}):x(`Board at ${e.value} has no card store configured`)}catch(i){return G(i)}}function q(l){try{let i=c().readOutputsStoreRef();return i?P({storeRef:i}):x(`Board at ${e.value} has no outputs store configured`)}catch(i){return G(i)}}function H(l){try{let i=l.params?.key;if(!i)return x("getConfig requires params.key");let g=c(),b;switch(i){case "task-executor":b=g.readTaskExecutorRef()??null;break;case "chat-handler":b=g.readChatHandlerRef()??null;break;case "card-store-ref":b=g.readCardStoreRef();break;case "outputs-store-ref":b=g.readOutputsStoreRef();break;default:return x(`getConfig: unknown key "${i}"`)}return P({value:b})}catch(i){return G(i)}}function X(l){try{let i=l.params?.key;if(!i)return x("getOutputsDataObject requires params.key");let g=D().readDataObject(i);return P(g)}catch(i){return G(i)}}function ne(l){try{return P(D().readAllDataObjects())}catch(i){return G(i)}}function _(l){try{let i=l.params?.key;if(!i)return x("getOutputsComputedValues requires params.key");let g=D().readComputedValues(i);return P(g)}catch(i){return G(i)}}function I(l){try{return P(D().readAllComputedValues())}catch(i){return G(i)}}return {init:a,status:d,getCardStoreRef:B,getOutputsStoreRef:q,getConfig:H,getOutputsDataObject:X,getAllOutputsDataObjects:ne,getOutputsComputedValues:_,getAllOutputsComputedValues:I,removeCard:m,retrigger:C,processAccumulatedEvents:y,upsertCard:f,taskFailed:h,taskProgress:T,sourceDataFetched:O,sourceDataFetchFailure:j}}function Yr(e,t){let r=()=>Pe(t.kvStorage("config"));function n(){let p=r().readCardStoreRef();if(!p)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let a=t.kvStorageForRef(p);return {readIndex(){return a.read("_index")},writeIndex(d){a.write("_index",d);},readCard(d){return a.read(d)},writeCard(d,m){return a.write(d,m),t.hashFn(m)},cardExists(d){return a.read(d)!==null},defaultCardKey(d){return d}}}let o=()=>qe(n(),t.onWarn??(()=>{}));function s(p,a){let d=t.validateSchema(a),m=[],C=r().readTaskExecutorRef();if(C&&Array.isArray(a.source_defs))for(let f of a.source_defs){let h=typeof f.bindTo=="string"?f.bindTo:"(unknown)";try{let T;try{T=t.invokeExecutorSync(C,"validate-source-def",[],{timeout:1e4,input:JSON.stringify(f)});}catch(j){let B=j;if(T=typeof B?.stdout=="string"?B.stdout:"",!T.trim()){m.push(`source "${h}": executor validate-source-def failed \u2014 ${j instanceof Error?j.message:String(j)}`);continue}}let O=JSON.parse(T.trim());if(!O.ok&&Array.isArray(O.errors))for(let j of O.errors)m.push(`source "${h}": ${j}`);}catch(T){m.push(`source "${h}": executor validate-source-def failed \u2014 ${T instanceof Error?T.message:String(T)}`);}}let y=[...d.errors,...m];return P({cardId:p,isValid:y.length===0,issues:y})}function u(p,a,d){let m=r().readTaskExecutorRef();if(!m)return x("No task-executor registered for this board");let C=typeof p.bindTo=="string"?p.bindTo:"source",y=t.makeTempFilePath(`probe-in-${C}`),f=t.makeTempFilePath(`probe-out-${C}`),h=t.makeTempFilePath(`probe-err-${C}`,".txt"),T={...p,boardDir:e.value,_projections:a},O=Y({kind:"fs-path",value:y}),j=Y({kind:"fs-path",value:f}),B=Y({kind:"fs-path",value:h});t.absoluteBlob.write(y,JSON.stringify(T,null,2));let q=null;try{if(t.invokeExecutorSync(m,"run-source-fetch",["--in-ref",O,"--out-ref",j,"--err-ref",B],{timeout:p.timeout??3e4}),q=t.absoluteBlob.read(f),q===null)return x("Executor produced no output file")}catch(H){let X=t.absoluteBlob.read(h)?.trim()??(H instanceof Error?H.message:String(H));return x(`Probe failed: ${X}`)}finally{try{t.absoluteBlob.remove(y);}catch{}try{t.absoluteBlob.remove(h);}catch{}}if(d){let H=_e(d);t.absoluteBlob.write(H.value,q);}else try{t.absoluteBlob.remove(f);}catch{}return P({bindTo:C,resultSizeBytes:q.length})}function c(p){try{let a=p.params?.cardId,d=p.params?.all;if(!a&&!d)return x("validateCard requires --card-id <id> or --all");let m=d?o().readAllCards().map(y=>y.id):[a],C=[];for(let y of m){let f=o().readCard(y);if(!f){C.push({cardId:y,isValid:!1,issues:[`Card "${y}" not found`]});continue}let h=s(y,f);if(h.status!=="success")return h;C.push(h.data);}return P(C)}catch(a){return G(a)}}function S(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("validateCardPreflight requires card JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=s(m,d),y=r().readTaskExecutorRef();if(y)try{let f=t.invokeExecutorSync(y,"validate-card-preflight",[],{timeout:1e4,input:JSON.stringify(d)}),h=JSON.parse(f.trim());if(!h.ok&&Array.isArray(h.errors)&&h.errors.length>0){let T=[...C.status==="success"?C.data.issues:[],...h.errors];return P({cardId:m,isValid:!1,issues:T})}}catch{}return C}catch(a){return G(a)}}function w(p){try{let a=p.params?.cardId,d=p.params?.sourceIdx,m=p.params?.outRef;if(!a)return x("probeSource requires params.cardId");if(d===void 0)return x("probeSource requires params.sourceIdx");let y=(p.body??{})["mock-projections"]??{},f=o().readCard(a);if(!f)return x(`Card "${a}" not found`);let h=f.source_defs??[];return d<0||d>=h.length?x(`sourceIdx ${d} out of range (card has ${h.length} source(s))`):u(h[d],y,m)}catch(a){return G(a)}}function N(p){try{let a=p.params?.outRef,d=p.body;if(!d)return x('probeTmpSource requires body with "source-def" and "mock-projections"');let m=d["source-def"],C=d["mock-projections"]??{};return m?u(m,C,a):x('probeTmpSource body requires "source-def"')}catch(a){return G(a)}}function D(p){try{let a=p.params?.sourceIdx,d=p.params?.outRef;if(a===void 0)return x("probeSourcePreflight requires params.sourceIdx");if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("probeSourcePreflight requires card JSON object in body");let m=p.body,C=m["card-content"]??m,y=m["mock-projections"]??{},f=C.source_defs??[];if(a<0||a>=f.length)return x(`sourceIdx ${a} out of range (card has ${f.length} source(s))`);let h=f[a],T=r().readTaskExecutorRef();if(T){let O=typeof h.bindTo=="string"?h.bindTo:"source";try{let j={...h,_projections:y},B=t.invokeExecutorSync(T,"probe-source-preflight",[],{timeout:h.timeout??1e4,input:JSON.stringify(j)}),q=JSON.parse(B.trim());return q.ok?P({bindTo:O,reachable:q.reachable,latencyMs:q.latencyMs,note:q.note}):x(q.error??"Preflight probe failed")}catch{}}return u(h,y,d)}catch(a){return G(a)}}function L(p){try{let a=r().readTaskExecutorRef();if(!a)return x("No task-executor registered for this board");let d=t.invokeExecutorSync(a,"describe-capabilities",[],{timeout:1e4});return P(JSON.parse(d.trim()))}catch(a){return G(a)}}function A(p){try{let a=p.body;if(!a||!Array.isArray(a.ops))return x("updatesInCardStore requires body.ops array");let d=a.ops,m=o();for(let C of d){let y=C.op,f=C.id;if(!f)return x('op is missing "id"');if(y==="update"){let h=C["card-content"];if(!h)return x(`update op for "${f}" is missing "card-content"`);m.writeCard(f,h);}else return x(`Unknown op type: "${y??"(none)"}"`)}return P()}catch(a){return G(a)}}function v(p){try{let a=p.body;if(!a||!Array.isArray(a.ids))return x("readFromCardStore requires body.ids array");let d=a.ids,m=o(),C=d.map(y=>({id:y,"card-content":m.readCard(y)}));return P({cards:C})}catch(a){return G(a)}}function k(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("evalCardCompute requires a JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=a["mock-fetched-sources"]??{},y=a["mock-requires"]??{},f=d.compute;if(!f||!Array.isArray(f)||f.length===0)return P({cardId:m,ok:!0,computed_values:{},errors:[]});let h={id:m,card_data:d.card_data??{},requires:y,source_defs:d.source_defs,compute:f},T=re.runSync(h,{sourcesData:C}),O=T.node.computed_values??{},j=T.errors??[];return P({cardId:m,ok:j.length===0,computed_values:O,errors:j})}catch(a){return G(a)}}function V(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("simulateCardCycle requires a JSON object in body");let a=p.body,d=a["card-content"]??a,m=typeof d.id=="string"?d.id:"(unknown)",C=a["mock-fetched-sources"]??{},y=a["mock-requires"]??{},f=s(m,d),h=f.status==="success"?{isValid:f.data.isValid,issues:f.data.issues}:{isValid:!1,issues:[f.status==="fail"?f.error:"internal error"]},T=d.source_defs??[],O=d.card_data??{},j=[],B=[];if(T.length>0){j=re.enrichSourcesSync(T,{card_data:O,requires:y});for(let i of j){let g=i.projections,b=i._projections;if(g&&b){for(let F of Object.keys(g))if(b[F]===void 0){let $=typeof i.bindTo=="string"?i.bindTo:"(unknown)";B.push({bindTo:$,key:F,error:`Projection "${F}" resolved to undefined`});}}}}let q=[],H=a["task-executor-ref"],X=(H?.howToRun&&H?.whatToRun?H:void 0)??r().readTaskExecutorRef();for(let i=0;i<j.length;i++){let g=j[i],b=typeof g.bindTo=="string"?g.bindTo:`source_${i}`;if(!X){q.push({bindTo:b,skipped:!0,error:"No task executor configured"});continue}try{let F={...g},$=t.invokeExecutorSync(X,"probe-source-preflight",[],{timeout:g.timeout??1e4,input:JSON.stringify(F)}),U=JSON.parse($.trim());q.push({bindTo:b,reachable:U.reachable,latencyMs:U.latencyMs,error:U.ok?void 0:U.error});}catch{q.push({bindTo:b,skipped:!0,error:"Executor does not support probe-source-preflight"});}}let ne=d.compute,_={},I=[];if(ne&&Array.isArray(ne)&&ne.length>0){let i={id:m,card_data:O,requires:y,source_defs:d.source_defs,compute:ne},g=re.runSync(i,{sourcesData:C});_=g.node.computed_values??{},I=g.errors??[];}let l=h.isValid&&B.length===0&&I.length===0&&q.every(i=>i.reachable!==!1);return P({cardId:m,ok:l,validation:h,source_probes:q,projection_errors:B,computed_values:_,compute_errors:I})}catch(a){return G(a)}}return {validateCard:c,validateCardPreflight:S,probeSource:w,probeTmpSource:N,probeSourcePreflight:D,evalCardCompute:k,simulateCardCycle:V,describeTaskExecutorCapabilities:L,updatesInCardStore:A,readFromCardStore:v}}
2
2
  export{ie as BOARD_GRAPH_KEY,Ge as EMPTY_CONFIG,we as SNAPSHOT_SCHEMA_VERSION_V1,Yr as createBoardLiveCardsNonCorePublic,zr as createBoardLiveCardsPublic};//# sourceMappingURL=board-live-cards-public.js.map
3
3
  //# sourceMappingURL=board-live-cards-public.js.map