yaml-flow 8.0.3 → 8.0.4

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 (37) hide show
  1. package/browser/asset-integrity.json +2 -2
  2. package/browser/board-livecards-localstorage.js +3 -3
  3. package/cli/browser-api/board-live-cards-browser-adapter.d.ts +1 -1
  4. package/cli/node/board-live-cards-cli.js +6 -6
  5. package/cli/node/fs-board-adapter.d.ts +2 -2
  6. package/cli/node/fs-board-adapter.js +6 -6
  7. package/cli/{types-C2YQXFwo.d.ts → types-D2XnLbBj.d.ts} +15 -0
  8. package/examples/board/demo-shell-with-server.html +2 -2
  9. package/examples/board/demo-task-executor.js +29 -32
  10. package/examples/board-local/demo-shell-localstorage.html +3 -3
  11. package/lib/{artifacts-store-lib-public-BABrgFkV.d.ts → artifacts-store-lib-public-BWC3YuLa.d.ts} +1 -1
  12. package/lib/{artifacts-store-lib-public-DGa8BpJT.d.cts → artifacts-store-lib-public-DBICnGL6.d.cts} +1 -1
  13. package/lib/artifacts-store-public.d.cts +2 -2
  14. package/lib/artifacts-store-public.d.ts +2 -2
  15. package/lib/board-live-cards-node.cjs +6 -6
  16. package/lib/board-live-cards-node.d.cts +5 -5
  17. package/lib/board-live-cards-node.d.ts +5 -5
  18. package/lib/board-live-cards-node.js +6 -6
  19. package/lib/{board-live-cards-public-BnmRAbQV.d.cts → board-live-cards-public-BF9FP0mL.d.cts} +15 -0
  20. package/lib/{board-live-cards-public-CsmYrvpd.d.ts → board-live-cards-public-dJAl5IL-.d.ts} +15 -0
  21. package/lib/board-live-cards-public.cjs +1 -1
  22. package/lib/board-live-cards-public.d.cts +1 -1
  23. package/lib/board-live-cards-public.d.ts +1 -1
  24. package/lib/board-live-cards-public.js +1 -1
  25. package/lib/board-live-cards-server-runtime.cjs +4 -4
  26. package/lib/board-live-cards-server-runtime.d.cts +2 -2
  27. package/lib/board-live-cards-server-runtime.d.ts +2 -2
  28. package/lib/board-live-cards-server-runtime.js +4 -4
  29. package/lib/card-store-public.d.cts +1 -1
  30. package/lib/card-store-public.d.ts +1 -1
  31. package/lib/server-runtime/index.cjs +4 -4
  32. package/lib/server-runtime/index.d.cts +3 -3
  33. package/lib/server-runtime/index.d.ts +3 -3
  34. package/lib/server-runtime/index.js +4 -4
  35. package/lib/{types-DkFvgxwq.d.cts → types-CXBzvC0s.d.cts} +1 -1
  36. package/lib/{types-CBxkYuLY.d.ts → types-D48hpnTR.d.ts} +1 -1
  37. package/package.json +1 -1
@@ -1,9 +1,9 @@
1
1
  {
2
- "generatedAt": "2026-05-13T10:21:32.763Z",
2
+ "generatedAt": "2026-05-14T19:57:39.460Z",
3
3
  "algorithm": "sha256",
4
4
  "files": {
5
5
  "browser/board-livecards-localstorage.js": {
6
- "sha256": "sha256-GpD5S3+9zJ9m/KDpAFHi3YvO0VOzefOl3QcaTJSo9t0=",
6
+ "sha256": "sha256-o7UiwhO8HH2HdwJUmV3Bs7x4ph2ph/eqld3wvu16i/8=",
7
7
  "bytes": 83485
8
8
  },
9
9
  "browser/live-cards.schema.json": {
@@ -1,10 +1,10 @@
1
- var BoardLiveCardsLocalStorage=(function(exports){'use strict';var Cr=Object.defineProperty;var xr=(e,t,r)=>t in e?Cr(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var _t=(e,t,r)=>xr(e,t+"",r);var Ue="b64:";function _r(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 Ar(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 Q(e){return `${Ue}${_r(JSON.stringify(e))}`}function ye(e){if(!e.startsWith(Ue))throw new Error(`Invalid ref format (expected ${Ue}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Ar(e.slice(Ue.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 At(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var pe={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function oe(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function Re(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Ve(e){return e.tasks??{}}function Je(e){return e?e.status===pe.FAILED||e.status===pe.INACTIVATED:false}function Tt(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Et(e){return e.maxExecutions}function It(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===pe.COMPLETED){let o=e.tasks[n];o&&oe(o).forEach(i=>r.add(i));}return Array.from(r)}function Ot(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;oe(s).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function jt(e,t,r){let n=e.tasks[t]??Ke(),s={};if(r){let a=r.tasks[t],i=Re(a);for(let u of i)for(let[h,v]of Object.entries(r.tasks))if(oe(v).includes(u)){let m=e.tasks[h];m?.lastDataHash&&(s[u]=m.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 Nt(e,t,r,n,s,o){let a=e.tasks[r]??Ke(),i=t.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let u;n&&i.on&&i.on[n]?u=i.on[n]:u=oe(i);let h=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let y=i.requires??[];for(let k of y)for(let[g,f]of Object.entries(t.tasks))if(oe(f).includes(k)){let B=e.tasks[g];B?.lastDataHash&&(h[k]=B.lastDataHash);break}}let v={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:h,error:void 0},m=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:v},availableOutputs:m,lastUpdated:new Date().toISOString()}}function Bt(e,t,r,n){let s=e.tasks[r]??Ke(),o=t.tasks[r];if(o?.retry){let u=s.retryCount+1;if(u<=o.retry.max_attempts){let h={...s,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:h},lastUpdated:new Date().toISOString()}}}let a={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},i=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(i=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&a.executionCount>=o.circuit_breaker.max_executions){let u=o.circuit_breaker.on_break;i=[...new Set([...i,...u])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:i,lastUpdated:new Date().toISOString()}}function Lt(e,t,r,n){let s=e.tasks[t]??Ke(),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 $t(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 Ke(){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]=Pt();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 Ft(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:jt(n,t.taskName,r)};case "task-completed":return {config:r,state:Nt(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:Bt(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Lt(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:$t(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:Tr(n,t.action)};case "task-upsert":return ct(e,t.taskName,t.taskConfig);case "task-removal":return ut(e,t.taskName);case "node-requires-add":return dt(e,t.nodeName,t.tokens);case "node-requires-remove":return lt(e,t.nodeName,t.tokens);case "node-provides-add":return ft(e,t.nodeName,t.tokens);case "node-provides-remove":return pt(e,t.nodeName,t.tokens);default:return e}}function ze(e,t){return t.reduce((r,n)=>Ft(r,n),e)}function ct(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]:Pt()},lastUpdated:new Date().toISOString()}}}function ut(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 dt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Re(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function lt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Re(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function ft(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=oe(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function pt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=oe(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function Ie(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Le(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 Pt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Tr(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 Oe(e){let{config:t,state:r}=e,n=Ve(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=Er(n),a=It(t,r.tasks),i=new Set([...a,...r.availableOutputs]),u=[],h=[],v=[],m=[];for(let[k,g]of Object.entries(n)){let f=r.tasks[k],B=Tt(g,t.settings),j=B!=="once";if(f?.status===pe.RUNNING||Je(f))continue;let S=Et(g);if(S!==void 0&&f&&f.executionCount>=S||g.circuit_breaker&&f&&f.executionCount>=g.circuit_breaker.max_executions||!j&&f?.status===pe.COMPLETED)continue;if(j&&f?.status===pe.COMPLETED){let A=Re(g),E=false;switch(B){case "data-changed":{A.length>0&&A.some(H=>{for(let[J,se]of Object.entries(n))if(oe(se).includes(H)){let Z=r.tasks[J];if(!Z)continue;let Se=f.lastConsumedHashes?.[H];return Z.lastDataHash==null?Z.executionCount>f.lastEpoch:Z.lastDataHash!==Se}return false})||(E=true);break}case "epoch-changed":{A.length>0&&A.some(H=>{for(let[J,se]of Object.entries(n))if(oe(se).includes(H)){let Z=r.tasks[J];if(Z&&Z.executionCount>f.lastEpoch)return true}return false})||(E=true);break}case "time-based":{let M=g.refreshInterval??0;if(M<=0){E=true;break}let H=f.completedAt;if(!H){E=true;break}(Date.now()-Date.parse(H))/1e3<M&&(E=true);break}case "manual":E=true;break}if(E)continue}let N=Re(g);if(N.length===0){u.push(k);continue}let G=[],T=[],O=[];for(let A of N){if(i.has(A))continue;let E=o[A]||[];E.length===0?G.push(A):E.every(H=>Je(r.tasks[H]))?O.push({token:A,failedProducer:E[0]}):T.push(A);}G.length>0?v.push({taskName:k,missingTokens:G}):O.length>0?m.push({taskName:k,failedTokens:O.map(A=>A.token),failedProducers:[...new Set(O.map(A=>A.failedProducer))]}):T.length>0?h.push({taskName:k,waitingOn:T}):u.push(k);}let y={};if(u.length>1){let k=Ot(u,n);for(let[g,f]of Object.entries(k))f.length>1&&(y[g]=f);}return {eligible:u,pending:h,unresolved:v,blocked:m,conflicts:y}}function Er(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of oe(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 je=class{constructor(){_t(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function We(e){let t=gt(e);return Ir(t)}function gt(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(gt).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+gt(t[n])).join(",")+"}"}function Ir(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 Or(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 jr(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 Dt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Or(t)}function Nr(e){try{let t=JSON.parse(jr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function $e(e,t,r){let{handlers:n,onDrain:s}=t,o=new je,a="state"in e&&"config"in e?e:Be(e),i=false,u=new Set,h=new Map(Object.entries(n)),v=new je,m=false,y=false;function k(){if(!i){if(m){y=true;return}m=true;try{do y=!1,g();while(y)}finally{m=false;}}}function g(){let S=v.drain(),N=o.drain(),G=[...S,...N];G.length>0&&(a=ze(a,G));let T=Oe(a);G.length>0&&s?.(G,a,T);for(let O of T.eligible)j(O);for(let O of G)if(O.type==="task-progress"){let{taskName:A,update:E}=O;if(!a.config.tasks[A])continue;let H=a.state.tasks[A];if(!H||H.status!=="running")continue;let J=Dt(A),se=B(A,J,E).catch(Z=>{i||(v.append({type:"task-failed",taskName:A,error:Z.message??String(Z),timestamp:new Date().toISOString()}),k());}).finally(()=>{u.delete(se);});u.add(se);}}function f(S){let G=a.config.tasks[S].requires??[],T=new Map;for(let[A,E]of Object.entries(a.config.tasks))for(let M of E.provides??[])T.set(M,A);let O={};for(let A of G){let E=T.get(A);E?O[A]=a.state.tasks[E]?.data:O[A]=void 0;}return O}async function B(S,N,G){let T=a.config.tasks[S],O=T.taskHandlers??[],A=f(S);for(let E of O){let M=h.get(E);if(!M)throw new Error(`Handler '${E}' not found in registry (task '${S}')`);let H={nodeId:S,state:A,taskState:a.state.tasks[S],config:T,callbackToken:N,update:G};if(await M(H)==="task-initiate-failure")throw new Error(`Handler '${E}' returned task-initiate-failure (task '${S}')`)}}function j(S){let G=a.config.tasks[S]?.taskHandlers;if(!G||G.length===0)return;v.append({type:"task-started",taskName:S,timestamp:new Date().toISOString()}),k();let T=Dt(S),O=B(S,T).catch(A=>{i||(v.append({type:"task-failed",taskName:S,error:A.message??String(A),timestamp:new Date().toISOString()}),k());}).finally(()=>{u.delete(O);});u.add(O);}return {push(S){i||(S.type==="task-completed"&&S.data&&!S.dataHash&&(S={...S,dataHash:We(S.data)}),o.append(S),k());},pushAll(S){if(!i){for(let N of S)N.type==="task-completed"&&N.data&&!N.dataHash?o.append({...N,dataHash:We(N.data)}):o.append(N);k();}},resolveCallback(S,N,G){if(i)return;let T=Nr(S);if(!T)return;let{taskName:O}=T;if(a.config.tasks[O]){if(G&&G.length>0)o.append({type:"task-failed",taskName:O,error:G.join("; "),timestamp:new Date().toISOString()});else {let A=N&&Object.keys(N).length>0?We(N):void 0;o.append({type:"task-completed",taskName:O,data:N,dataHash:A,timestamp:new Date().toISOString()});}k();}},addNode(S,N){i||(o.append({type:"task-upsert",taskName:S,taskConfig:N,timestamp:new Date().toISOString()}),k());},removeNode(S){i||(o.append({type:"task-removal",taskName:S,timestamp:new Date().toISOString()}),k());},addRequires(S,N){i||(o.append({type:"node-requires-add",nodeName:S,tokens:N,timestamp:new Date().toISOString()}),k());},removeRequires(S,N){i||(o.append({type:"node-requires-remove",nodeName:S,tokens:N,timestamp:new Date().toISOString()}),k());},addProvides(S,N){i||(o.append({type:"node-provides-add",nodeName:S,tokens:N,timestamp:new Date().toISOString()}),k());},removeProvides(S,N){i||(o.append({type:"node-provides-remove",nodeName:S,tokens:N,timestamp:new Date().toISOString()}),k());},registerHandler(S,N){h.set(S,N);},unregisterHandler(S){h.delete(S);},retrigger(S){i||a.config.tasks[S]&&(o.append({type:"task-restart",taskName:S,timestamp:new Date().toISOString()}),k());},retriggerAll(S){if(!i){for(let N of S)a.config.tasks[N]&&o.append({type:"task-restart",taskName:N,timestamp:new Date().toISOString()});k();}},snapshot(){return Ie(a)},getState(){return a},getSchedule(){return Oe(a)},async waitForHandlers(){u.size>0&&await Promise.allSettled([...u]);},async dispose(S){S?.wait&&u.size>0&&await Promise.allSettled([...u]),i=true;}}}function Xe(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var Br=Xe();Br("./jsonata-sync.cjs");var Lr=Xe(),Ye=Lr("./jsonata-sync.cjs"),Ht=Ye;function qt(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 Mt(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 $r(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 Ye(s.expr).evaluate(n);Mt(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function Fr(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 a=Ht(o.expr).evaluate(n);Mt(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch(a){let i=a instanceof Error?a.message:String(a);s.push({bindTo:o.bindTo,error:i});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Pr(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Ye(e).evaluate(n)}function Dr(e,t){return t.startsWith("fetched_sources.")?qt(e._sourcesData??{},t.slice(16)):qt(e,t)}var Gt=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),qr=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Gr(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))qr.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,a)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${a}]: must be an object`);else {let i=o;typeof i.bindTo!="string"||!i.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(s.has(i.outputFile)&&t.push(`source_defs[${a}]: outputFile "${i.outputFile}" is not unique across source_defs`),s.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: 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`):Gt.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...Gt].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 Hr(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,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=await Ye(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Mr(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,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=Ht(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var xe={run:$r,runSync:Fr,eval:Pr,resolve:Dr,validate:Gr,enrichSources:Hr,enrichSourcesSync:Mr};function mt(e){return JSON.stringify(e)}function ht(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,a){let i=String(o||"").split(".").filter(Boolean);if(i.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let u={...s},h=u;for(let v=0;v<i.length-1;v++){let m=i[v],y=h[m],k=y&&typeof y=="object"&&!Array.isArray(y)?{...y}:{};h[m]=k,h=k;}return h[i[i.length-1]]=a,u}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,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let i=e.readCard(a.key);i?s.push(i):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,a]of Object.entries(r()))s[o]=a.checksum;return s},changedSince(s){let o=r(),a=[];for(let[i,u]of Object.entries(o))s[i]!==u.checksum&&a.push(i);for(let i of Object.keys(s))o[i]||a.push(i);return a},validateUpsert(s,o){let a=r(),i=a[s],u=Object.entries(a).find(([,h])=>h.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:u&&u[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,a){let i=r(),u=a??i[s]?.key??e.defaultCardKey(s),h=e.writeCard(u,o);i[s]={key:u,checksum:h,updatedAt:new Date().toISOString()},e.writeIndex(i);},patchCard(s,o,a){let i=r(),u=i[s];if(!u||!e.cardExists(u.key))throw new Error(`card "${s}" not found`);let h=e.readCard(u.key);if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`card "${s}" is not patchable`);let v=n(h,o,a),m=e.writeCard(u.key,v);i[s]={key:u.key,checksum:m,updatedAt:new Date().toISOString()},e.writeIndex(i);},removeCard(s){let o=r();o[s]&&(delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function kt(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 a=t(s);e.write(`${r}/.staged/${o}/${n}`,a);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,a=e.read(o);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function Jt(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 Kt(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(a){let i=a instanceof Error?a.message:String(a);try{t(o,i);}catch{}}e.delete(r);}}}}var Ze="v1",_e="board/graph",zt="board/lastJournalProcessedId";function Ut(e){return `cards/${e}/runtime`}function Wt(e){return {readRuntime(t){return e.read(Ut(t))??{_sources:{}}},writeRuntime(t,r){e.write(Ut(t),r);}}}function Ur(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Xt(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==Ze)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=Ur(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function Yt(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 ht(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",mt(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return ht(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",mt(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 Qt(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 Vr(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function Jr(e,t){return e?.lastRequestedAt?Vr(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function Kr(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function Vt(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function et(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=Oe(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let g of o.pending)i.set(g.taskName,g.waitingOn);for(let g of o.unresolved)i.set(g.taskName,g.missingTokens);for(let g of o.blocked)i.set(g.taskName,g.failedTokens);let u=new Map;for(let[g,f]of Object.entries(n))for(let B of f.requires??[]){let j=u.get(B)??[];j.push(g),u.set(B,j);}let h=s.sort().map(g=>{let f=r[g],B=n[g]??{requires:[],provides:[]};f.status==="completed"?a.completed+=1:f.status==="failed"?a.failed+=1:f.status==="in-progress"&&(a.in_progress+=1);let j=B.requires??[],S=B.provides??[],N=Object.keys(f.data??{}).sort(),G=j.filter(H=>t.state.availableOutputs.includes(H)),T=j.filter(H=>!t.state.availableOutputs.includes(H)),O=i.get(g)??T,A=new Set;for(let H of S)for(let J of u.get(H)??[])J!==g&&A.add(J);let E=f.failedAt,M=f.error?{message:f.error,code:"TASK_FAILED",at:E,source:"task-runtime"}:void 0;return {name:g,status:f.status,error:M,requires:j,requires_satisfied:G,requires_missing:T,provides_declared:S,provides_runtime:N,blocked_by:O,unblocks:Array.from(A).sort(),runtime:{attempt_count:f.executionCount??0,restart_count:f.retryCount??0,in_progress_since:f.status==="in-progress"?f.startedAt??null:null,last_transition_at:f.lastUpdated??null,last_completed_at:f.completedAt??null,last_restarted_at:f.startedAt??null,status_age_ms:f.lastUpdated?0:null}}});a.pending=o.pending.length,a.blocked=o.blocked.length,a.unresolved=o.unresolved.length;let v=h.map(g=>({name:g.name,fanOut:g.unblocks.length})).sort((g,f)=>f.fanOut-g.fanOut||g.name.localeCompare(f.name)),m=v.length>0?v[0]:{name:null,fanOut:0},y=new Set;for(let g of Object.values(n))for(let f of g.requires??[])y.add(f);let k=0;for(let[g,f]of Object.entries(n)){let B=(f.requires??[]).length===0,S=(f.provides??[]).some(N=>(u.get(N)??[]).some(G=>G!==g));B&&!S&&(k+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:a.completed,eligible:o.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:k,topology:{edge_count:Array.from(y).length,max_fan_out_card:m.name,max_fan_out:m.fanOut}},cards:h}}function zr(){return new Date().toISOString()}function Zt(e,t,r,n,s,o,a){return async i=>{let u=[],h=r.cardStore.readCard(i.nodeId);if(!h)return "task-initiate-failure";let v=h.id,m=h.card_data??{},y=h.source_defs??[],k=y.filter(D=>D.optionalForCompletionGating!==true),g=r.cardRuntimeStore.readRuntime(v),f=false,B=()=>{f&&(r.cardRuntimeStore.writeRuntime(v,g),f=false);},j=D=>({...g._sources[D]??{}}),S=(D,q)=>{g._sources[D]=q,f=true;},N=i.taskState?.executionCount??0,G=g._lastExecutionCount;if(typeof G=="number"&&G!==N&&(g._sources={},f=true),G!==N&&(g._lastExecutionCount=N,f=true),i.update){let D=i.update,q=D.outputFile;if(q){let C=j(q);if(D.failure)S(q,Vt(C,D.reason??"unknown"));else {let p=D.rqt;if(!C.lastFetchedAt||p>C.lastFetchedAt){let I=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,$=false;I&&($=r.fetchedSourcesStore.commitSourceData(v,q,I)),$?S(q,Kr(C,p)):S(q,Vt(C,`source delivery commit failed for ${q} token=${String(I)}`));}}B();}}let T={};for(let D of y)if(D.outputFile){let q=r.fetchedSourcesStore.readSourceData(v,D.outputFile);q!==null&&(T[D.bindTo]=q);}let O={};for(let[D,q]of Object.entries(i.state??{}))if(q!==null&&typeof q=="object"&&!Array.isArray(q)){let C=q[D];O[D]=C!==void 0?C:q;}else O[D]=q;let A={id:v,card_data:{...m},requires:O,source_defs:y,compute:h.compute};A._sourcesData=T,h.compute&&xe.runSync(A,{sourcesData:T}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(v,A.computed_values??{});let E={...h},M=xe.enrichSourcesSync(Array.isArray(h.source_defs)?h.source_defs:void 0,{card_data:h.card_data,requires:O}),H=e.value;E.source_defs=Array.isArray(M)?M.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:H})):M;let J=zr(),se=i.update?void 0:J,Z=k.filter(D=>{let q=D.outputFile;if(typeof q!="string"||!q)return true;let C=j(q);se&&(C={...C,queueRequestedAt:se},S(q,C));let p=C.queueRequestedAt??C.lastRequestedAt??J,I=Jr(C,p);return I==="in-flight"?false:I==="dispatch"});if(B(),Z.length>0){let D=false,q=J;for(let C of Z){let p=C.outputFile;if(typeof p!="string"||!p)continue;let I=j(p),$=I.queueRequestedAt??J;S(p,{...I,lastRequestedAt:$}),q=$,D=true;}return D&&B(),D&&(u.push({taskKind:"source-fetch",payload:{boardRef:Q(e),enrichedCard:E,callbackToken:i.callbackToken,rqt:q}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}let Se=h.provides??[],ve={};for(let{bindTo:D,ref:q}of Se)ve[D]=xe.resolve(A,q);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(ve),y.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let q=j(D.outputFile);return !q.lastRequestedAt||!q.lastFetchedAt?true:q.lastFetchedAt<=q.lastRequestedAt}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:Q(e),enrichedCard:E,callbackToken:i.callbackToken,rqt:J}}),n(i.nodeId,ve),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var yt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function er(e){return {[_e]:e.graph,[zt]:e.lastDrainedJournalId}}function tr(e){let t=e[_e],r=e[zt];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${_e}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function rr(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 te(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function W(e){return {status:"fail",error:e}}function re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Wr(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 or(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 tt(e){try{let t=JSON.parse(or(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Xr(e){return Wr(JSON.stringify(e))}function nr(e){try{let t=JSON.parse(or(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ae(){return new Date().toISOString()}function sr(e,t){let r=t.onWarn??(()=>{}),n=Q(e);function s(C){if(C.length!==0)try{let p=t.publishBoardChangeNotifications?.(C);p&&typeof p.catch=="function"&&p.catch(I=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${I instanceof Error?I.message:String(I)}`));}catch(p){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${p instanceof Error?p.message:String(p)}`);}}function o(){let C=i().readCardStoreRef();if(!C)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let p=t.kvStorageForRef(C);return {readIndex(){return p.read("_index")},writeIndex(I){p.write("_index",I);},readCard(I){return p.read(I)},writeCard(I,$){return p.write(I,$),t.hashFn($)},cardExists(I){return p.read(I)!==null},defaultCardKey(I){return I}}}let a={readValues(C){let p=t.kvStorage("state-snapshot"),I=p.listKeys().sort();if(I.length===0)return {version:null,values:{}};let $={};for(let V of I)$[V]=p.read(V);return {version:t.hashFn($),values:$}},writeValues(C,p,I){let $=t.kvStorage("state-snapshot");for(let V of I)$.delete(V);for(let[V,K]of Object.entries(p))$.write(V,K);return t.hashFn(p)}},i=()=>Yt(t.kvStorage("config")),u=()=>Xt(a),h=()=>Jt(t.journalAdapter()),v=()=>Qe(o(),r),m=()=>{let C=i().readOutputsStoreRef();if(!C)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Qt(t.kvStorageForRef(C))};function y(){return !!u().readSnapshot(e.value).values[_e]}function k(){let C=u().readSnapshot(e.value);if(!C.values[_e])throw new Error(`Board not initialized at ${e.value}`);return tr(C.values)}function g(C,p){let I=u().commitSnapshot(e.value,{schemaVersion:Ze,expectedVersion:p,commitId:t.genId(),committedAt:ae(),deleteKeys:[],shallowMerge:er(C)});if(!I.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${p??"null"} current=${I.currentVersion??"null"}`)}function f(C){h().appendEvent(C);}async function B(){let C=(R,b)=>{let F=R.payload,P=(F?.enrichedCard??{}).id??F?.cardId??"unknown";f({type:"task-failed",taskName:P,error:b,timestamp:ae()});},p=Kt(t.kvStorage("execution-requests"),C),I=Wt(t.kvStorage("card-runtime")),$=kt(t.blobStorage("sources"),R=>t.resolveBlob(R)),V=new Map,K={readRuntime(R){return V.get(R)??I.readRuntime(R)},writeRuntime(R,b){V.set(R,b);}},ie=[],ne=new Map,fe={readSourceData(R,b){let F=`${R}/${b}`;return ne.has(F)?ne.get(F):$.readSourceData(R,b)},ingestSourceDataStaged(R,b,F,U){$.ingestSourceDataStaged(R,b,F,U);},commitSourceData(R,b,F){let U=`${R}/.staged/${F}/${b}`,z=t.blobStorage("sources").read(U);if(z==null)return false;let ee=`${R}/${b}`,Y=z.trim();try{ne.set(ee,JSON.parse(Y));}catch{ne.set(ee,Y);}return ie.push({cardId:R,outputFile:b,deliveryToken:F}),true},hasSource(R,b){let F=`${R}/${b}`;return ne.has(F)?true:$.hasSource(R,b)}},ce={cardStore:v(),cardRuntimeStore:K,fetchedSourcesStore:fe,outputStore:m(),executionRequestStore:p},ge=k(),me=Le(ge.graph),{events:X,newCursor:he}=h().readEntriesAfterCursor(ge.lastDrainedJournalId),ke=[],Ae=[],Te=[],Ne=new Map,at=(R,b)=>{ke.push({type:"task-completed",taskName:R,data:b,timestamp:ae()});},Ge=(R,b)=>f({type:"task-failed",taskName:R,error:b,timestamp:ae()}),d=$e(me,{handlers:{"card-handler":Zt(e,he,ce,at,Ge,(R,b)=>{Ae.push({cardId:R,values:b});},R=>{Te.push(R);})}});for(ke=X;ke.length>0;){let R=ke;ke=[];for(let b of R)if(b.type==="task-restart"){let F=ce.cardStore.readCard(b.taskName);F&&Ne.set(b.taskName,F);}d.pushAll(R),await d.waitForHandlers();}let l=d.getState();await d.dispose({wait:true});let _=u().readSnapshot(e.value).version;g({lastDrainedJournalId:he,graph:Ie(l)},_);for(let{cardId:R,values:b}of Ae)ce.outputStore.writeComputedValues(R,b);for(let R of Te)ce.outputStore.writeDataObjects(R);for(let[R,b]of V)I.writeRuntime(R,b);for(let{cardId:R,outputFile:b,deliveryToken:F}of ie)$.commitSourceData(R,b,F);let w;try{w=et(n,l),ce.outputStore.writeStatusSnapshot(w);}catch(R){r(`[board-live-cards-public] status publish failed: ${R instanceof Error?R.message:String(R)}`);}let x=[];for(let{cardId:R,values:b}of Ae)x.push({kind:"computed_values",cardId:R,values:b});for(let R of Te)for(let[b,F]of Object.entries(R))b&&x.push({kind:"data_object",key:b,payload:F});for(let[R,b]of Ne)x.push({kind:"card_refreshed",cardId:R,card:b});w!==void 0&&x.push({kind:"status",status:w}),s(x);let L=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:Q({kind:"built-in",value:"source-cli-task-executor"})};p.dispatchEntriesForJournalId(he,R=>{if(R.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${R.taskKind}" \u2014 skipping`);return}let b=R.payload,F=b.enrichedCard?.id??"unknown",U=b.enrichedCard?.source_defs??[];for(let P of U){if(!P.outputFile){r(`[dispatch] source "${P.bindTo}" has no outputFile \u2014 skipping`);continue}let z=Xr({cbk:b.callbackToken,rg:e.value,br:Q(e),cid:F,b:P.bindTo,d:P.outputFile,cs:void 0,rqt:b.rqt});t.dispatchExecution(L,{source_def:P,base_ref:Q(e),callback:{token:z,via:t.selfRef}}).catch(ee=>Ge(F,ee instanceof Error?ee.message:String(ee)));}});}async function j(){try{let C=()=>{let I=k(),{events:$}=h().readEntriesAfterCursor(I.lastDrainedJournalId);$.length<=0||(j(),t.requestProcessAccumulated?.());},p=await At(t.lock,B,C);return te({ran:p!==!1})}catch(C){return re(C)}}function S(C){try{let p=C.params?.cardStoreRef;if(!p)return W("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!y()){let K=Be(yt);g({lastDrainedJournalId:"",graph:Ie(K)},null);}let I=C.params?.outputsStoreRef;if(!I)return W("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let $=i();$.writeCardStoreRef(p),$.writeOutputsStoreRef(I);let V=C.body??{};V["task-executor-ref"]&&$.writeTaskExecutorRef(V["task-executor-ref"]),V["chat-handler-ref"]&&$.writeChatHandlerRef(V["chat-handler-ref"]);try{m().writeStatusSnapshot(et(n,Le(k().graph)));}catch{}return te()}catch(p){return re(p)}}function N(C){try{let p=m().readStatusSnapshot();if(!p){p=et(n,Le(k().graph));try{m().writeStatusSnapshot(p);}catch{}}return te(p)}catch(p){return re(p)}}function G(C){try{let p=C.params?.id;return p?(f({type:"task-removal",taskName:p,timestamp:ae()}),j(),te()):W("removeCard requires params.id")}catch(p){return re(p)}}function T(C){try{let p=C.params?.id;return p?(f({type:"task-restart",taskName:p,timestamp:ae()}),j(),te()):W("retrigger requires params.id")}catch(p){return re(p)}}async function O(C){return j()}function A(C){try{let p=C.params?.cardId,I=C.params?.all,$=!!C.params?.restart;if(!p&&!I)return W("upsertCard requires --card-id <id> or --all");let V=I?v().readAllCards().map(K=>K.id):[p];for(let K of V)if(!v().readCard(K))return W(`Card "${K}" not found in board at ${e.value}`);for(let K of V){let ie=v().readCard(K),ne=rr(ie),fe=t.hashFn(ne),ce=t.kvStorage("card-upsert"),ge=ce.read(K),me=ge?.taskConfigHash!==fe;if(!(!me&&!$)){if(me){let X=ge?.blobRef??v().readCardKey(K)??K;f({type:"task-upsert",taskName:K,taskConfig:ne,timestamp:ae()}),ce.write(K,{blobRef:X,taskConfigHash:fe,updatedAt:ae()});}$&&f({type:"task-restart",taskName:K,timestamp:ae()});}}return j(),te()}catch(p){return re(p)}}function E(C){try{let p=C.params?.token;if(!p)return W("taskFailed requires params.token");let I=C.params?.error??"unknown error",$=tt(p);return $?(f({type:"task-failed",taskName:$.taskName,error:I,timestamp:ae()}),j(),te()):W("Invalid callback token")}catch(p){return re(p)}}function M(C){try{let p=C.params?.token;if(!p)return W("taskProgress requires params.token");let $=(C.body??{}).update??{},V=tt(p);return V?(f({type:"task-progress",taskName:V.taskName,update:$,timestamp:ae()}),j(),te()):W("Invalid callback token")}catch(p){return re(p)}}function H(C){try{let p=C.params?.token,I=C.params?.ref;if(!p)return W("sourceDataFetched requires params.token");if(!I)return W("sourceDataFetched requires params.ref");let $=nr(p);if(!$)return W("Invalid source token");let{cbk:V,cid:K,b:ie,d:ne,cs:fe,rqt:ce}=$,ge=kt(t.blobStorage("sources"),ke=>t.resolveBlob(ke)),me=t.genId();ge.ingestSourceDataStaged(K,ne,ye(I),me);let X=tt(V);if(!X)return W("Invalid callback token embedded in source token");let he=ae();return f({type:"task-progress",taskName:X.taskName,update:{bindTo:ie,outputFile:ne,fetchedAt:he,deliveryToken:me,sourceChecksum:fe,rqt:ce},timestamp:he}),j(),te()}catch(p){return re(p)}}function J(C){try{let p=C.params?.token,I=C.params?.reason??"unknown";if(!p)return W("sourceDataFetchFailure requires params.token");let $=nr(p);if(!$)return W("Invalid source token");let{cbk:V,b:K,d:ie,cs:ne}=$,fe=tt(V);return fe?(f({type:"task-progress",taskName:fe.taskName,update:{bindTo:K,outputFile:ie,failure:!0,reason:I,sourceChecksum:ne},timestamp:ae()}),j(),te()):W("Invalid callback token embedded in source token")}catch(p){return re(p)}}function se(C){try{let p=i().readCardStoreRef();return p?te({storeRef:p}):W(`Board at ${e.value} has no card store configured`)}catch(p){return re(p)}}function Z(C){try{let p=i().readOutputsStoreRef();return p?te({storeRef:p}):W(`Board at ${e.value} has no outputs store configured`)}catch(p){return re(p)}}function Se(C){try{let p=C.params?.key;if(!p)return W("getConfig requires params.key");let I=i(),$;switch(p){case "task-executor":$=I.readTaskExecutorRef()??null;break;case "chat-handler":$=I.readChatHandlerRef()??null;break;case "card-store-ref":$=I.readCardStoreRef();break;case "outputs-store-ref":$=I.readOutputsStoreRef();break;default:return W(`getConfig: unknown key "${p}"`)}return te({value:$})}catch(p){return re(p)}}function ve(C){try{let p=C.params?.key;if(!p)return W("getOutputsDataObject requires params.key");let I=m().readDataObject(p);return te(I)}catch(p){return re(p)}}function we(C){try{return te(m().readAllDataObjects())}catch(p){return re(p)}}function D(C){try{let p=C.params?.key;if(!p)return W("getOutputsComputedValues requires params.key");let I=m().readComputedValues(p);return te(I)}catch(p){return re(p)}}function q(C){try{return te(m().readAllComputedValues())}catch(p){return re(p)}}return {init:S,status:N,getCardStoreRef:se,getOutputsStoreRef:Z,getConfig:Se,getOutputsDataObject:ve,getAllOutputsDataObjects:we,getOutputsComputedValues:D,getAllOutputsComputedValues:q,removeCard:G,retrigger:T,processAccumulatedEvents:O,upsertCard:A,taskFailed:E,taskProgress:M,sourceDataFetched:H,sourceDataFetchFailure:J}}function ar(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {get(s){try{let o=s.params?.id;if(o){let a=e.readCard(o);return a?t({cards:[a]}):r(`card "${o}" not found`)}return t({cards:e.readAllCards()})}catch(o){return n(o)}},set(s){try{let o=s.body;if(o==null)return r("set requires a body (card object or array of cards)");let a=Array.isArray(o)?o:[o];for(let i of a){if(typeof i.id!="string")return r("each card must have a string `id` field");e.writeCard(i.id,i);}return t({count:a.length})}catch(o){return n(o)}},del(s){try{let o=s.body?.ids??[],a=s.params?.id,i=a?[...o,a]:o;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let u of i)e.removeCard(u);return t({count:i.length})}catch(o){return n(o)}},patch(s){try{let o=s.params?.id,a=s.params?.path;if(!o)return r("patch requires params.id");if(!a)return r("patch requires params.path");let i=s.body,u=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:s.body;return e.patchCard(o,a,u),t({count:1})}catch(o){return n(o)}}}}var rt=".artifacts-index.json";function ir(){return new Date().toISOString()}function cr(e){return new TextEncoder().encode(e).byteLength}function Fe(e){let t=e.read(rt);if(!t)return {entries:{}};try{let r=JSON.parse(t);if(r&&r.entries&&typeof r.entries=="object")return r}catch{}return {entries:{}}}function Rt(e,t){e.write(rt,JSON.stringify(t,null,2));}function Yr(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function ur(e,t,r){e.entries[t]={key:t,size:r.size,updatedAt:r.updatedAt,contentType:r.contentType};}function bt(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function Qr(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function Zr(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function en(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function tn(e){let t=Qr(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function rn(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function St(e){function t(r){let n=e.stat?Yr(e.stat(r)):null;if(n)return n;let o=Fe(e).entries[r];if(o)return {...o};if(!e.exists(r))return null;let a=e.read(r);return a===null?{key:r}:{key:r,size:cr(a)}}return {exists(r){return e.exists(r)},putText(r,n,s="text/plain; charset=utf-8"){e.write(r,n);let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??ir(),o.size=o.size??cr(n);let a=Fe(e);return ur(a,r,o),Rt(e,a),o},putBytes(r,n,s="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,i);}let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??ir(),o.size=o.size??n.byteLength;let a=Fe(e);return ur(a,r,o),Rt(e,a),o},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let s=e.readBytes(r);return s===null?null:Buffer.from(s).toString("utf-8")}try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new TextDecoder("utf-8").decode(new Uint8Array(s.data))}catch{}return n},getBytes(r){if(e.readBytes){let s=e.readBytes(r);if(s!==null)return s}let n=e.read(r);if(n===null)return null;try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new Uint8Array(s.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){let n=new Map;if(e.listKeys)for(let o of e.listKeys(r)){if(o===rt)continue;let a=t(o)??{key:o};n.set(o,a);}let s=Fe(e);for(let[o,a]of Object.entries(s.entries))o===rt||r&&!o.startsWith(r)||n.has(o)||n.set(o,{...a});return [...n.values()].sort((o,a)=>o.key.localeCompare(a.key))},remove(r){e.remove(r);let n=Fe(e);delete n.entries[r],Rt(e,n);}}}function dr(e,t){let r=t?.indexFileName;function n(m){return `${m}/${r}`}function s(m){let y=e.getText(n(m));if(!y)return [];try{let k=JSON.parse(y);return Array.isArray(k)?k.filter(g=>g&&typeof g.stored_name=="string").map(g=>({serial:Number(g.serial||bt(String(g.stored_name))||0),role:String(g.role||"system").toLowerCase(),stored_name:String(g.stored_name),path:typeof g.path=="string"?g.path:`${m}/chats/${String(g.stored_name)}`,updated_at:typeof g.updated_at=="string"?g.updated_at:null})):[]}catch{return []}}function o(m,y){e.putText(n(m),JSON.stringify(y,null,2),"application/json; charset=utf-8");}function a(m){let y=s(m),k=0;for(let g of y){let f=Number(g.serial||0);Number.isFinite(f)&&f>k&&(k=f);}return k+1}function i(m,y){let k=s(m);k.push(y),o(m,k);}function u(m){let y=s(m),k=[];for(let g of y){let f=`${m}/${g.stored_name}`,B=e.getText(f);B!==null&&k.push({serial:Number(g.serial||bt(g.stored_name)||0),role:String(g.role||"system").toLowerCase(),text:B,path:typeof g.path=="string"?g.path:`${m}/chats/${g.stored_name}`,stored_name:g.stored_name,updated_at:g.updated_at||null});}return k.sort((g,f)=>g.serial-f.serial||g.stored_name.localeCompare(f.stored_name)),k}function h(m){let y=`${m}/`;for(let k of e.list(y))e.remove(k.key);}function v(m){let y=`${m}/`,k=e.list(y),g=0,f=0,B=false;for(let j of k){let S=j.key.slice(y.length);if(S===".processing"){B=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(S))continue;g+=1;let N=j.updatedAt?Number(new Date(j.updatedAt).getTime()||0):0;N>f&&(f=N);}return {count:g,latest_mtime_ms:f,processing:B}}return {indexKey:n,loadIndex:s,saveIndex:o,nextSerial:a,appendIndexRecord:i,readRecords:u,clear:h,readSignal:v}}function lr(e){function t(s,o){let a=0,i=[];Array.isArray(o)&&i.push(...o);for(let u of e.list(`${s}/`))i.push(rn(u.key));for(let u of i){let h=bt(u);Number.isFinite(h)&&h>a&&(a=h);}return a+1}function r(s,o,a){let i=Number(a?.maxLen||32),{stem:u,ext:h}=tn(s),v=en(h),m=Zr(u),y=`${String(o).padStart(3,"0")}-`,k=v,g=i-y.length-k.length;g<1&&(k="",g=i-y.length);let f=m.slice(0,Math.max(1,g)),B=`${y}${f}${k}`;return B.length>i&&(B=B.slice(0,i).replace(/\.$/,"")),B}function n(s,o,a){let i=t(s,a?.seedNames),u=r(o,i,{maxLen:a?.maxLen});for(;e.exists(`${s}/${u}`);)i+=1,u=r(o,i,{maxLen:a?.maxLen});return u}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function fr(){function e(s,o){if(!Array.isArray(s))return [];let a=[];for(let i of s){if(!i||typeof i!="object")continue;let u=i;typeof u.stored_name=="string"&&a.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,path:typeof u.path=="string"?u.path:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:o||null});}return a}function t(s){return !s||typeof s!="object"?[]:e(s.files,void 0)}function r(s,o){let a=t(s);if(o.length===0)return s.files=a,a;let i=new Set(a.map(u=>u.stored_name));for(let u of o)i.has(u.stored_name)||(a.push(u),i.add(u.stored_name));return s.files=a,a}function n(s,o,a){let i=t(s);if(!Number.isInteger(o)||o<0||o>=i.length)return {ok:false,reason:"index_out_of_range"};let u=i[o];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}var nn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},on=32;function sn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function pr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function gr(e,t){if(!t||typeof t!="object")return;let r=t;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)gr(e,n);return}r.kind==="status"&&pr(r.status)&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card);}function mr(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...nn,...e.corsHeaders||{}},n=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},o=e.invocationAdapter,a=e.notificationTransport||null,i=e.serverUrl||null,u=e.executionExtra||{},h=new Set;function v(c){let d=sr(c.baseRef,c.boardAdapter),l=c.boardAdapter.kvStorageForRef(c.cardStoreRef),w=ar(Qe({readIndex:()=>l.read("_index"),writeIndex:b=>l.write("_index",b),readCard:b=>l.read(b),writeCard:(b,F)=>(l.write(b,F),b),cardExists:b=>l.read(b)!==null,defaultCardKey:b=>b},s.warn)),x=c.artifactsAdapter||c.boardAdapter,L=null,R=null;return {label:c.label,board:d,cardStore:w,get filesArtifacts(){return L??(L=St(x.blobStorage("files")))},get chatsArtifacts(){return R??(R=St(x.blobStorage("chats")))},boardAdapter:c.boardAdapter,cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef,notifyRef:c.notifyRef,taskExecutorRef:c.taskExecutorRef,chatHandlerRef:c.chatHandlerRef,inferenceAdapterRef:c.inferenceAdapterRef,notification:sn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let m=e.boards.map(v),y=new Map;function k(c){return y.get(c)??0}function g(c){let d=m[k(c)];return {files:d?d.filesArtifacts:null,chats:d?d.chatsArtifacts:null}}function f(c){let d=g(c);return d.chats?dr(d.chats,{indexFileName:".index.json"}):null}function B(c){let d=g(c);return d.files?lr(d.files):null}function j(){return fr()}function S(c){return String(c||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function N(c){if(!c||c.notificationTeardown||!a||!c.notifyRef)return;let d=await a.subscribe(c.notifyRef,l=>{gr(c.notification,l);let _=l.kind==="notification-batch"?l.notifications:[l];at(_);});c.notificationTeardown=d;}async function G(c){if(!c||c.initialized)return;let d={cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef},l={};c.taskExecutorRef&&(l["task-executor-ref"]=c.taskExecutorRef),c.chatHandlerRef&&(l["chat-handler-ref"]=c.chatHandlerRef),c.inferenceAdapterRef&&(l["inference-adapter-ref"]=c.inferenceAdapterRef);let _=c.board.init({params:d,body:l});if(_.status!=="success")throw Object.assign(new Error(_.error||`init failed for ${c.label}`),{statusCode:500});if(await N(c),c.chatHandlerRef&&o.describe)try{let w=await o.describe(c.chatHandlerRef);w&&w.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${w.kind}", expected "chat-handler" for ${c.label}`):w&&s.info(`[init] chat-handler validated: ${w.name} (protocol ${w.protocolVersion}) for ${c.label}`);}catch(w){s.warn(`[init] chat-handler describe failed for ${c.label}: ${w?.message||String(w)}`);}c.initialized=true;}function T(c){if(!c.boardAdapter.publishBoardChangeNotifications)return;let d=[],l=c.board.status({});l.status==="success"&&l.data!=null&&pr(l.data)&&d.push({kind:"status",status:l.data});let _=c.board.getAllOutputsDataObjects({});if(_.status==="success"&&_.data!=null)for(let[x,L]of Object.entries(_.data))x&&d.push({kind:"data_object",key:x,payload:L});let w=c.board.getAllOutputsComputedValues({});if(w.status==="success"&&w.data!=null)for(let[x,L]of Object.entries(w.data))x&&d.push({kind:"computed_values",cardId:x,values:L});d.length>0&&c.boardAdapter.publishBoardChangeNotifications(d);}function O(c,d){if(!c||c.cardsBootstrapped)return;let l=c.cardStore.get({}),_=l.status==="success"&&Array.isArray(l.data?.cards)?l.data.cards:[];for(let w of _)typeof w.id=="string"&&(y.set(w.id,d),c.board.upsertCard({params:{cardId:w.id}}));c.cardsBootstrapped=true;}async function A(){for(let c of m)await G(c);}async function E(){await A();for(let c=0;c<m.length;c++)T(m[c]),O(m[c],c);}function M(c){return m[k(c)]??null}function H(c){let d=M(c);if(!d)return null;let l=d.cardStore.get({params:{id:c}});if(l.status!=="success")return null;let _=Array.isArray(l.data?.cards)?l.data.cards:[];return _.length>0?_[0]:null}function J(){let c=l=>{if(!l||!l.cardStore)return [];let _=l.cardStore.get({});return _.status!=="success"||!Array.isArray(_.data?.cards)?[]:_.data.cards},d=[];for(let l of m)d.push(...c(l));return d}function se(){let c=m.map(x=>{try{let R=x.boardAdapter.kvStorageForRef(x.outputsStoreRef).read("status");if(R!=null)return R}catch{}return x.notification.status}).filter(Boolean);if(c.length===0)return null;if(c.length===1)return c[0];let d=[],l=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],_={};for(let x of l)_[x]=0;for(let x of c){let L=x,R=Array.isArray(L.cards)?L.cards:[];d.push(...R);for(let b of l)_[b]+=Number(L?.summary?.[b]||0);}let w=c[0];return {...w,cards:d,summary:{...w.summary||{},card_count:d.length,..._}}}function Z(){let c={},d=l=>{for(let[_,w]of Object.entries(l.notification.computedValues)){let x=l.notification.cards[_];c[_]={schema_version:"v1",card_id:_,card_data:x?.card_data??{},computed_values:w??{}};}};for(let l of m)d(l);return c}function Se(){let c={};for(let d of m)Object.assign(c,d.notification.dataObjects||{});return c}function ve(c){let d=S(c),l=f(c);return l?l.readSignal(d):{count:0,latest_mtime_ms:0,processing:false}}function we(){let c=J(),d=Z(),l=Se(),_={};for(let w of c){if(!w?.id)continue;let x=w.id,L=d[x]||{},R=ve(x),b={...L.card_data&&typeof L.card_data=="object"?L.card_data:w.card_data&&typeof w.card_data=="object"?w.card_data:{},__chat_signal:R};_[x]={schema_version:L.schema_version||"v1",card_id:L.card_id||x,card_data:b,computed_values:L.computed_values&&typeof L.computed_values=="object"?L.computed_values:{}};}return {boardId:n,cardDefinitions:c,statusSnapshot:se(),dataObjectsByToken:l,cardRuntimeById:_}}function D(c,d,l){let _=l?.syncBoard!==false,w=M(c);if(!w)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let x=H(c);if(!x)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let L=d(x)||x,R=w.cardStore.set({body:L});if(R.status!=="success")throw Object.assign(new Error(R.error||`Failed to persist card: ${c}`),{statusCode:500});if(_){let b=w.board.upsertCard({params:{cardId:c,restart:true}});if(b.status!=="success")throw Object.assign(new Error(b.error||`Failed to upsert card: ${c}`),{statusCode:500})}}function q(c,d){D(c,d,{syncBoard:true});}function C(c,d){D(c,d,{syncBoard:false});}function p(c,d){q(c,l=>{if(!d||typeof d!="object"||Object.keys(d).length===0)return l;function _(w,x,L){let R=String(x||"").split(".").filter(Boolean);if(!R.length)return;let b=w;for(let F=0;F<R.length-1;F++){let U=R[F];(!b[U]||typeof b[U]!="object")&&(b[U]={}),b=b[U];}b[R[R.length-1]]=L;}if(d.fieldValues!==void 0&&d.fieldValues!==null){let w=null,x=l.view;if(x&&Array.isArray(x.elements)){for(let L of x.elements)if(L?.data&&L.data.writeTo){w=L.data.writeTo;break}}w?_(l,w,d.fieldValues):typeof d.fieldValues=="object"&&!Array.isArray(d.fieldValues)&&(l.card_data={...l.card_data||{},...d.fieldValues});}else {if(Array.isArray(d._stagedFiles)&&d._stagedFiles.length>0)return l;for(let[w,x]of Object.entries(d))w!=="_stagedFiles"&&(x!==null&&typeof x=="object"&&!Array.isArray(x)&&l[w]!==null&&typeof l[w]=="object"&&!Array.isArray(l[w])?l[w]={...l[w],...x}:l[w]=x);}return l});}function I(c){let d=String(c||"").match(/^(\d+)[-_]/);return d?parseInt(d[1],10):0}function $(c){let d=String(c||"").trim();if(!d)return "upload.bin";let l=Math.max(d.lastIndexOf("/"),d.lastIndexOf("\\"));return (l>=0?d.slice(l+1):d)||"upload.bin"}function V(c){let d=S(c),l=f(c);l&&l.clear(d);}function K(c,d){let l=S(c),_=f(c),w=_?_.nextSerial(l):1,x=String(d||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(w).padStart(3,"0")}_${x}.txt`}function ie(c,d,l,_){let w=new Date().toISOString(),x=S(c),L=g(c),R=K(c,d||"system"),b=`${x}/${R}`,F=[],U=typeof l=="string"?l.trim():"";U&&F.push(U);let P=Array.isArray(_)?_:[];if(P.length){F.length&&F.push(""),F.push("files:");for(let Y of P){if(!Y||typeof Y!="object")continue;let ue=typeof Y.name=="string"?Y.name:"file",de=typeof Y.stored_name=="string"?Y.stored_name:"";F.push(de?`- ${ue} -> ${de}`:`- ${ue}`);}}L.chats&&L.chats.putText(b,`${F.join(`
1
+ var BoardLiveCardsLocalStorage=(function(exports){'use strict';var Cr=Object.defineProperty;var xr=(e,t,r)=>t in e?Cr(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var _t=(e,t,r)=>xr(e,t+"",r);var Ue="b64:";function _r(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 Ar(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 Q(e){return `${Ue}${_r(JSON.stringify(e))}`}function ye(e){if(!e.startsWith(Ue))throw new Error(`Invalid ref format (expected ${Ue}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Ar(e.slice(Ue.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 At(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var pe={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function oe(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function Re(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Ve(e){return e.tasks??{}}function Je(e){return e?e.status===pe.FAILED||e.status===pe.INACTIVATED:false}function Tt(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Et(e){return e.maxExecutions}function It(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===pe.COMPLETED){let o=e.tasks[n];o&&oe(o).forEach(i=>r.add(i));}return Array.from(r)}function Ot(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;oe(s).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function jt(e,t,r){let n=e.tasks[t]??Ke(),s={};if(r){let a=r.tasks[t],i=Re(a);for(let u of i)for(let[h,v]of Object.entries(r.tasks))if(oe(v).includes(u)){let m=e.tasks[h];m?.lastDataHash&&(s[u]=m.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 Nt(e,t,r,n,s,o){let a=e.tasks[r]??Ke(),i=t.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let u;n&&i.on&&i.on[n]?u=i.on[n]:u=oe(i);let h=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let y=i.requires??[];for(let k of y)for(let[g,f]of Object.entries(t.tasks))if(oe(f).includes(k)){let B=e.tasks[g];B?.lastDataHash&&(h[k]=B.lastDataHash);break}}let v={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:h,error:void 0},m=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:v},availableOutputs:m,lastUpdated:new Date().toISOString()}}function Bt(e,t,r,n){let s=e.tasks[r]??Ke(),o=t.tasks[r];if(o?.retry){let u=s.retryCount+1;if(u<=o.retry.max_attempts){let h={...s,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:h},lastUpdated:new Date().toISOString()}}}let a={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},i=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(i=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&a.executionCount>=o.circuit_breaker.max_executions){let u=o.circuit_breaker.on_break;i=[...new Set([...i,...u])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:i,lastUpdated:new Date().toISOString()}}function Lt(e,t,r,n){let s=e.tasks[t]??Ke(),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 $t(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 Ke(){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]=Pt();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 Ft(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:jt(n,t.taskName,r)};case "task-completed":return {config:r,state:Nt(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:Bt(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Lt(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:$t(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:Tr(n,t.action)};case "task-upsert":return ct(e,t.taskName,t.taskConfig);case "task-removal":return ut(e,t.taskName);case "node-requires-add":return dt(e,t.nodeName,t.tokens);case "node-requires-remove":return lt(e,t.nodeName,t.tokens);case "node-provides-add":return ft(e,t.nodeName,t.tokens);case "node-provides-remove":return pt(e,t.nodeName,t.tokens);default:return e}}function ze(e,t){return t.reduce((r,n)=>Ft(r,n),e)}function ct(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]:Pt()},lastUpdated:new Date().toISOString()}}}function ut(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 dt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Re(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function lt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Re(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function ft(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=oe(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function pt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=oe(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function Ie(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Le(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 Pt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Tr(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 Oe(e){let{config:t,state:r}=e,n=Ve(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=Er(n),a=It(t,r.tasks),i=new Set([...a,...r.availableOutputs]),u=[],h=[],v=[],m=[];for(let[k,g]of Object.entries(n)){let f=r.tasks[k],B=Tt(g,t.settings),j=B!=="once";if(f?.status===pe.RUNNING||Je(f))continue;let S=Et(g);if(S!==void 0&&f&&f.executionCount>=S||g.circuit_breaker&&f&&f.executionCount>=g.circuit_breaker.max_executions||!j&&f?.status===pe.COMPLETED)continue;if(j&&f?.status===pe.COMPLETED){let A=Re(g),E=false;switch(B){case "data-changed":{A.length>0&&A.some(M=>{for(let[J,se]of Object.entries(n))if(oe(se).includes(M)){let Z=r.tasks[J];if(!Z)continue;let Se=f.lastConsumedHashes?.[M];return Z.lastDataHash==null?Z.executionCount>f.lastEpoch:Z.lastDataHash!==Se}return false})||(E=true);break}case "epoch-changed":{A.length>0&&A.some(M=>{for(let[J,se]of Object.entries(n))if(oe(se).includes(M)){let Z=r.tasks[J];if(Z&&Z.executionCount>f.lastEpoch)return true}return false})||(E=true);break}case "time-based":{let H=g.refreshInterval??0;if(H<=0){E=true;break}let M=f.completedAt;if(!M){E=true;break}(Date.now()-Date.parse(M))/1e3<H&&(E=true);break}case "manual":E=true;break}if(E)continue}let N=Re(g);if(N.length===0){u.push(k);continue}let G=[],T=[],O=[];for(let A of N){if(i.has(A))continue;let E=o[A]||[];E.length===0?G.push(A):E.every(M=>Je(r.tasks[M]))?O.push({token:A,failedProducer:E[0]}):T.push(A);}G.length>0?v.push({taskName:k,missingTokens:G}):O.length>0?m.push({taskName:k,failedTokens:O.map(A=>A.token),failedProducers:[...new Set(O.map(A=>A.failedProducer))]}):T.length>0?h.push({taskName:k,waitingOn:T}):u.push(k);}let y={};if(u.length>1){let k=Ot(u,n);for(let[g,f]of Object.entries(k))f.length>1&&(y[g]=f);}return {eligible:u,pending:h,unresolved:v,blocked:m,conflicts:y}}function Er(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of oe(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 je=class{constructor(){_t(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function We(e){let t=gt(e);return Ir(t)}function gt(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(gt).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+gt(t[n])).join(",")+"}"}function Ir(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 Or(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 jr(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 Dt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Or(t)}function Nr(e){try{let t=JSON.parse(jr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function $e(e,t,r){let{handlers:n,onDrain:s}=t,o=new je,a="state"in e&&"config"in e?e:Be(e),i=false,u=new Set,h=new Map(Object.entries(n)),v=new je,m=false,y=false;function k(){if(!i){if(m){y=true;return}m=true;try{do y=!1,g();while(y)}finally{m=false;}}}function g(){let S=v.drain(),N=o.drain(),G=[...S,...N];G.length>0&&(a=ze(a,G));let T=Oe(a);G.length>0&&s?.(G,a,T);for(let O of T.eligible)j(O);for(let O of G)if(O.type==="task-progress"){let{taskName:A,update:E}=O;if(!a.config.tasks[A])continue;let M=a.state.tasks[A];if(!M||M.status!=="running")continue;let J=Dt(A),se=B(A,J,E).catch(Z=>{i||(v.append({type:"task-failed",taskName:A,error:Z.message??String(Z),timestamp:new Date().toISOString()}),k());}).finally(()=>{u.delete(se);});u.add(se);}}function f(S){let G=a.config.tasks[S].requires??[],T=new Map;for(let[A,E]of Object.entries(a.config.tasks))for(let H of E.provides??[])T.set(H,A);let O={};for(let A of G){let E=T.get(A);E?O[A]=a.state.tasks[E]?.data:O[A]=void 0;}return O}async function B(S,N,G){let T=a.config.tasks[S],O=T.taskHandlers??[],A=f(S);for(let E of O){let H=h.get(E);if(!H)throw new Error(`Handler '${E}' not found in registry (task '${S}')`);let M={nodeId:S,state:A,taskState:a.state.tasks[S],config:T,callbackToken:N,update:G};if(await H(M)==="task-initiate-failure")throw new Error(`Handler '${E}' returned task-initiate-failure (task '${S}')`)}}function j(S){let G=a.config.tasks[S]?.taskHandlers;if(!G||G.length===0)return;v.append({type:"task-started",taskName:S,timestamp:new Date().toISOString()}),k();let T=Dt(S),O=B(S,T).catch(A=>{i||(v.append({type:"task-failed",taskName:S,error:A.message??String(A),timestamp:new Date().toISOString()}),k());}).finally(()=>{u.delete(O);});u.add(O);}return {push(S){i||(S.type==="task-completed"&&S.data&&!S.dataHash&&(S={...S,dataHash:We(S.data)}),o.append(S),k());},pushAll(S){if(!i){for(let N of S)N.type==="task-completed"&&N.data&&!N.dataHash?o.append({...N,dataHash:We(N.data)}):o.append(N);k();}},resolveCallback(S,N,G){if(i)return;let T=Nr(S);if(!T)return;let{taskName:O}=T;if(a.config.tasks[O]){if(G&&G.length>0)o.append({type:"task-failed",taskName:O,error:G.join("; "),timestamp:new Date().toISOString()});else {let A=N&&Object.keys(N).length>0?We(N):void 0;o.append({type:"task-completed",taskName:O,data:N,dataHash:A,timestamp:new Date().toISOString()});}k();}},addNode(S,N){i||(o.append({type:"task-upsert",taskName:S,taskConfig:N,timestamp:new Date().toISOString()}),k());},removeNode(S){i||(o.append({type:"task-removal",taskName:S,timestamp:new Date().toISOString()}),k());},addRequires(S,N){i||(o.append({type:"node-requires-add",nodeName:S,tokens:N,timestamp:new Date().toISOString()}),k());},removeRequires(S,N){i||(o.append({type:"node-requires-remove",nodeName:S,tokens:N,timestamp:new Date().toISOString()}),k());},addProvides(S,N){i||(o.append({type:"node-provides-add",nodeName:S,tokens:N,timestamp:new Date().toISOString()}),k());},removeProvides(S,N){i||(o.append({type:"node-provides-remove",nodeName:S,tokens:N,timestamp:new Date().toISOString()}),k());},registerHandler(S,N){h.set(S,N);},unregisterHandler(S){h.delete(S);},retrigger(S){i||a.config.tasks[S]&&(o.append({type:"task-restart",taskName:S,timestamp:new Date().toISOString()}),k());},retriggerAll(S){if(!i){for(let N of S)a.config.tasks[N]&&o.append({type:"task-restart",taskName:N,timestamp:new Date().toISOString()});k();}},snapshot(){return Ie(a)},getState(){return a},getSchedule(){return Oe(a)},async waitForHandlers(){u.size>0&&await Promise.allSettled([...u]);},async dispose(S){S?.wait&&u.size>0&&await Promise.allSettled([...u]),i=true;}}}function Xe(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var Br=Xe();Br("./jsonata-sync.cjs");var Lr=Xe(),Ye=Lr("./jsonata-sync.cjs"),Mt=Ye;function qt(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 Ht(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 $r(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 Ye(s.expr).evaluate(n);Ht(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function Fr(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 a=Mt(o.expr).evaluate(n);Ht(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch(a){let i=a instanceof Error?a.message:String(a);s.push({bindTo:o.bindTo,error:i});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Pr(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Ye(e).evaluate(n)}function Dr(e,t){return t.startsWith("fetched_sources.")?qt(e._sourcesData??{},t.slice(16)):qt(e,t)}var Gt=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),qr=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Gr(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))qr.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,a)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${a}]: must be an object`);else {let i=o;typeof i.bindTo!="string"||!i.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(s.has(i.outputFile)&&t.push(`source_defs[${a}]: outputFile "${i.outputFile}" is not unique across source_defs`),s.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: 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`):Gt.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...Gt].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 Mr(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,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=await Ye(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Hr(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,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=Mt(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var xe={run:$r,runSync:Fr,eval:Pr,resolve:Dr,validate:Gr,enrichSources:Mr,enrichSourcesSync:Hr};function mt(e){return JSON.stringify(e)}function ht(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,a){let i=String(o||"").split(".").filter(Boolean);if(i.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let u={...s},h=u;for(let v=0;v<i.length-1;v++){let m=i[v],y=h[m],k=y&&typeof y=="object"&&!Array.isArray(y)?{...y}:{};h[m]=k,h=k;}return h[i[i.length-1]]=a,u}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,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let i=e.readCard(a.key);i?s.push(i):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,a]of Object.entries(r()))s[o]=a.checksum;return s},changedSince(s){let o=r(),a=[];for(let[i,u]of Object.entries(o))s[i]!==u.checksum&&a.push(i);for(let i of Object.keys(s))o[i]||a.push(i);return a},validateUpsert(s,o){let a=r(),i=a[s],u=Object.entries(a).find(([,h])=>h.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:u&&u[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,a){let i=r(),u=a??i[s]?.key??e.defaultCardKey(s),h=e.writeCard(u,o);i[s]={key:u,checksum:h,updatedAt:new Date().toISOString()},e.writeIndex(i);},patchCard(s,o,a){let i=r(),u=i[s];if(!u||!e.cardExists(u.key))throw new Error(`card "${s}" not found`);let h=e.readCard(u.key);if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`card "${s}" is not patchable`);let v=n(h,o,a),m=e.writeCard(u.key,v);i[s]={key:u.key,checksum:m,updatedAt:new Date().toISOString()},e.writeIndex(i);},removeCard(s){let o=r();o[s]&&(delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function kt(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 a=t(s);e.write(`${r}/.staged/${o}/${n}`,a);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,a=e.read(o);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function Jt(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 Kt(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(a){let i=a instanceof Error?a.message:String(a);try{t(o,i);}catch{}}e.delete(r);}}}}var Ze="v1",_e="board/graph",zt="board/lastJournalProcessedId";function Ut(e){return `cards/${e}/runtime`}function Wt(e){return {readRuntime(t){return e.read(Ut(t))??{_sources:{}}},writeRuntime(t,r){e.write(Ut(t),r);}}}function Ur(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Xt(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==Ze)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=Ur(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function Yt(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 ht(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",mt(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return ht(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",mt(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 Qt(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 Vr(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function Jr(e,t){return e?.lastRequestedAt?Vr(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function Kr(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function Vt(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function et(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=Oe(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let g of o.pending)i.set(g.taskName,g.waitingOn);for(let g of o.unresolved)i.set(g.taskName,g.missingTokens);for(let g of o.blocked)i.set(g.taskName,g.failedTokens);let u=new Map;for(let[g,f]of Object.entries(n))for(let B of f.requires??[]){let j=u.get(B)??[];j.push(g),u.set(B,j);}let h=s.sort().map(g=>{let f=r[g],B=n[g]??{requires:[],provides:[]};f.status==="completed"?a.completed+=1:f.status==="failed"?a.failed+=1:f.status==="in-progress"&&(a.in_progress+=1);let j=B.requires??[],S=B.provides??[],N=Object.keys(f.data??{}).sort(),G=j.filter(M=>t.state.availableOutputs.includes(M)),T=j.filter(M=>!t.state.availableOutputs.includes(M)),O=i.get(g)??T,A=new Set;for(let M of S)for(let J of u.get(M)??[])J!==g&&A.add(J);let E=f.failedAt,H=f.error?{message:f.error,code:"TASK_FAILED",at:E,source:"task-runtime"}:void 0;return {name:g,status:f.status,error:H,requires:j,requires_satisfied:G,requires_missing:T,provides_declared:S,provides_runtime:N,blocked_by:O,unblocks:Array.from(A).sort(),runtime:{attempt_count:f.executionCount??0,restart_count:f.retryCount??0,in_progress_since:f.status==="in-progress"?f.startedAt??null:null,last_transition_at:f.lastUpdated??null,last_completed_at:f.completedAt??null,last_restarted_at:f.startedAt??null,status_age_ms:f.lastUpdated?0:null}}});a.pending=o.pending.length,a.blocked=o.blocked.length,a.unresolved=o.unresolved.length;let v=h.map(g=>({name:g.name,fanOut:g.unblocks.length})).sort((g,f)=>f.fanOut-g.fanOut||g.name.localeCompare(f.name)),m=v.length>0?v[0]:{name:null,fanOut:0},y=new Set;for(let g of Object.values(n))for(let f of g.requires??[])y.add(f);let k=0;for(let[g,f]of Object.entries(n)){let B=(f.requires??[]).length===0,S=(f.provides??[]).some(N=>(u.get(N)??[]).some(G=>G!==g));B&&!S&&(k+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:a.completed,eligible:o.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:k,topology:{edge_count:Array.from(y).length,max_fan_out_card:m.name,max_fan_out:m.fanOut}},cards:h}}function zr(){return new Date().toISOString()}function Zt(e,t,r,n,s,o,a){return async i=>{let u=[],h=r.cardStore.readCard(i.nodeId);if(!h)return "task-initiate-failure";let v=h.id,m=h.card_data??{},y=h.source_defs??[],k=y.filter(D=>D.optionalForCompletionGating!==true),g=r.cardRuntimeStore.readRuntime(v),f=false,B=()=>{f&&(r.cardRuntimeStore.writeRuntime(v,g),f=false);},j=D=>({...g._sources[D]??{}}),S=(D,q)=>{g._sources[D]=q,f=true;},N=i.taskState?.executionCount??0,G=g._lastExecutionCount;if(typeof G=="number"&&G!==N&&(g._sources={},f=true),G!==N&&(g._lastExecutionCount=N,f=true),i.update){let D=i.update,q=D.outputFile;if(q){let C=j(q);if(D.failure)S(q,Vt(C,D.reason??"unknown"));else {let p=D.rqt;if(!C.lastFetchedAt||p>C.lastFetchedAt){let I=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,$=false;I&&($=r.fetchedSourcesStore.commitSourceData(v,q,I)),$?S(q,Kr(C,p)):S(q,Vt(C,`source delivery commit failed for ${q} token=${String(I)}`));}}B();}}let T={};for(let D of y)if(D.outputFile){let q=r.fetchedSourcesStore.readSourceData(v,D.outputFile);q!==null&&(T[D.bindTo]=q);}let O={};for(let[D,q]of Object.entries(i.state??{}))if(q!==null&&typeof q=="object"&&!Array.isArray(q)){let C=q[D];O[D]=C!==void 0?C:q;}else O[D]=q;let A={id:v,card_data:{...m},requires:O,source_defs:y,compute:h.compute};A._sourcesData=T,h.compute&&xe.runSync(A,{sourcesData:T}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(v,A.computed_values??{});let E={...h},H=xe.enrichSourcesSync(Array.isArray(h.source_defs)?h.source_defs:void 0,{card_data:h.card_data,requires:O}),M=e.value;E.source_defs=Array.isArray(H)?H.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:M})):H;let J=zr(),se=i.update?void 0:J,Z=k.filter(D=>{let q=D.outputFile;if(typeof q!="string"||!q)return true;let C=j(q);se&&(C={...C,queueRequestedAt:se},S(q,C));let p=C.queueRequestedAt??C.lastRequestedAt??J,I=Jr(C,p);return I==="in-flight"?false:I==="dispatch"});if(B(),Z.length>0){let D=false,q=J;for(let C of Z){let p=C.outputFile;if(typeof p!="string"||!p)continue;let I=j(p),$=I.queueRequestedAt??J;S(p,{...I,lastRequestedAt:$}),q=$,D=true;}return D&&B(),D&&(u.push({taskKind:"source-fetch",payload:{boardRef:Q(e),enrichedCard:E,callbackToken:i.callbackToken,rqt:q}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}let Se=h.provides??[],ve={};for(let{bindTo:D,ref:q}of Se)ve[D]=xe.resolve(A,q);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(ve),y.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let q=j(D.outputFile);return !q.lastRequestedAt||!q.lastFetchedAt?true:q.lastFetchedAt<=q.lastRequestedAt}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:Q(e),enrichedCard:E,callbackToken:i.callbackToken,rqt:J}}),n(i.nodeId,ve),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var yt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function er(e){return {[_e]:e.graph,[zt]:e.lastDrainedJournalId}}function tr(e){let t=e[_e],r=e[zt];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${_e}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function rr(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 te(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function W(e){return {status:"fail",error:e}}function re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Wr(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 or(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 tt(e){try{let t=JSON.parse(or(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Xr(e){return Wr(JSON.stringify(e))}function nr(e){try{let t=JSON.parse(or(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ae(){return new Date().toISOString()}function sr(e,t){let r=t.onWarn??(()=>{}),n=Q(e);function s(C){if(C.length!==0)try{let p=t.publishBoardChangeNotifications?.(C);p&&typeof p.catch=="function"&&p.catch(I=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${I instanceof Error?I.message:String(I)}`));}catch(p){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${p instanceof Error?p.message:String(p)}`);}}function o(){let C=i().readCardStoreRef();if(!C)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let p=t.kvStorageForRef(C);return {readIndex(){return p.read("_index")},writeIndex(I){p.write("_index",I);},readCard(I){return p.read(I)},writeCard(I,$){return p.write(I,$),t.hashFn($)},cardExists(I){return p.read(I)!==null},defaultCardKey(I){return I}}}let a={readValues(C){let p=t.kvStorage("state-snapshot"),I=p.listKeys().sort();if(I.length===0)return {version:null,values:{}};let $={};for(let V of I)$[V]=p.read(V);return {version:t.hashFn($),values:$}},writeValues(C,p,I){let $=t.kvStorage("state-snapshot");for(let V of I)$.delete(V);for(let[V,K]of Object.entries(p))$.write(V,K);return t.hashFn(p)}},i=()=>Yt(t.kvStorage("config")),u=()=>Xt(a),h=()=>Jt(t.journalAdapter()),v=()=>Qe(o(),r),m=()=>{let C=i().readOutputsStoreRef();if(!C)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Qt(t.kvStorageForRef(C))};function y(){return !!u().readSnapshot(e.value).values[_e]}function k(){let C=u().readSnapshot(e.value);if(!C.values[_e])throw new Error(`Board not initialized at ${e.value}`);return tr(C.values)}function g(C,p){let I=u().commitSnapshot(e.value,{schemaVersion:Ze,expectedVersion:p,commitId:t.genId(),committedAt:ae(),deleteKeys:[],shallowMerge:er(C)});if(!I.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${p??"null"} current=${I.currentVersion??"null"}`)}function f(C){h().appendEvent(C);}async function B(){let C=(R,b)=>{let F=R.payload,P=(F?.enrichedCard??{}).id??F?.cardId??"unknown";f({type:"task-failed",taskName:P,error:b,timestamp:ae()});},p=Kt(t.kvStorage("execution-requests"),C),I=Wt(t.kvStorage("card-runtime")),$=kt(t.blobStorage("sources"),R=>t.resolveBlob(R)),V=new Map,K={readRuntime(R){return V.get(R)??I.readRuntime(R)},writeRuntime(R,b){V.set(R,b);}},ie=[],ne=new Map,fe={readSourceData(R,b){let F=`${R}/${b}`;return ne.has(F)?ne.get(F):$.readSourceData(R,b)},ingestSourceDataStaged(R,b,F,U){$.ingestSourceDataStaged(R,b,F,U);},commitSourceData(R,b,F){let U=`${R}/.staged/${F}/${b}`,z=t.blobStorage("sources").read(U);if(z==null)return false;let ee=`${R}/${b}`,Y=z.trim();try{ne.set(ee,JSON.parse(Y));}catch{ne.set(ee,Y);}return ie.push({cardId:R,outputFile:b,deliveryToken:F}),true},hasSource(R,b){let F=`${R}/${b}`;return ne.has(F)?true:$.hasSource(R,b)}},ce={cardStore:v(),cardRuntimeStore:K,fetchedSourcesStore:fe,outputStore:m(),executionRequestStore:p},ge=k(),me=Le(ge.graph),{events:X,newCursor:he}=h().readEntriesAfterCursor(ge.lastDrainedJournalId),ke=[],Ae=[],Te=[],Ne=new Map,at=(R,b)=>{ke.push({type:"task-completed",taskName:R,data:b,timestamp:ae()});},Ge=(R,b)=>f({type:"task-failed",taskName:R,error:b,timestamp:ae()}),d=$e(me,{handlers:{"card-handler":Zt(e,he,ce,at,Ge,(R,b)=>{Ae.push({cardId:R,values:b});},R=>{Te.push(R);})}});for(ke=X;ke.length>0;){let R=ke;ke=[];for(let b of R)if(b.type==="task-restart"){let F=ce.cardStore.readCard(b.taskName);F&&Ne.set(b.taskName,F);}d.pushAll(R),await d.waitForHandlers();}let l=d.getState();await d.dispose({wait:true});let _=u().readSnapshot(e.value).version;g({lastDrainedJournalId:he,graph:Ie(l)},_);for(let{cardId:R,values:b}of Ae)ce.outputStore.writeComputedValues(R,b);for(let R of Te)ce.outputStore.writeDataObjects(R);for(let[R,b]of V)I.writeRuntime(R,b);for(let{cardId:R,outputFile:b,deliveryToken:F}of ie)$.commitSourceData(R,b,F);let w;try{w=et(n,l),ce.outputStore.writeStatusSnapshot(w);}catch(R){r(`[board-live-cards-public] status publish failed: ${R instanceof Error?R.message:String(R)}`);}let x=[];for(let{cardId:R,values:b}of Ae)x.push({kind:"computed_values",cardId:R,values:b});for(let R of Te)for(let[b,F]of Object.entries(R))b&&x.push({kind:"data_object",key:b,payload:F});for(let[R,b]of Ne)x.push({kind:"card_refreshed",cardId:R,card:b});w!==void 0&&x.push({kind:"status",status:w}),s(x);let L=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:Q({kind:"built-in",value:"source-cli-task-executor"})};p.dispatchEntriesForJournalId(he,R=>{if(R.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${R.taskKind}" \u2014 skipping`);return}let b=R.payload,F=b.enrichedCard?.id??"unknown",U=b.enrichedCard?.source_defs??[];for(let P of U){if(!P.outputFile){r(`[dispatch] source "${P.bindTo}" has no outputFile \u2014 skipping`);continue}let z=Xr({cbk:b.callbackToken,rg:e.value,br:Q(e),cid:F,b:P.bindTo,d:P.outputFile,cs:void 0,rqt:b.rqt});t.dispatchExecution(L,{source_def:P,base_ref:Q(e),callback:{token:z,via:t.selfRef}}).catch(ee=>Ge(F,ee instanceof Error?ee.message:String(ee)));}});}async function j(){try{let C=()=>{let I=k(),{events:$}=h().readEntriesAfterCursor(I.lastDrainedJournalId);$.length<=0||(j(),t.requestProcessAccumulated?.());},p=await At(t.lock,B,C);return te({ran:p!==!1})}catch(C){return re(C)}}function S(C){try{let p=C.params?.cardStoreRef;if(!p)return W("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!y()){let K=Be(yt);g({lastDrainedJournalId:"",graph:Ie(K)},null);}let I=C.params?.outputsStoreRef;if(!I)return W("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let $=i();$.writeCardStoreRef(p),$.writeOutputsStoreRef(I);let V=C.body??{};V["task-executor-ref"]&&$.writeTaskExecutorRef(V["task-executor-ref"]),V["chat-handler-ref"]&&$.writeChatHandlerRef(V["chat-handler-ref"]);try{m().writeStatusSnapshot(et(n,Le(k().graph)));}catch{}return te()}catch(p){return re(p)}}function N(C){try{let p=m().readStatusSnapshot();if(!p){p=et(n,Le(k().graph));try{m().writeStatusSnapshot(p);}catch{}}return te(p)}catch(p){return re(p)}}function G(C){try{let p=C.params?.id;return p?(f({type:"task-removal",taskName:p,timestamp:ae()}),j(),te()):W("removeCard requires params.id")}catch(p){return re(p)}}function T(C){try{let p=C.params?.id;return p?(f({type:"task-restart",taskName:p,timestamp:ae()}),j(),te()):W("retrigger requires params.id")}catch(p){return re(p)}}async function O(C){return j()}function A(C){try{let p=C.params?.cardId,I=C.params?.all,$=!!C.params?.restart;if(!p&&!I)return W("upsertCard requires --card-id <id> or --all");let V=I?v().readAllCards().map(K=>K.id):[p];for(let K of V)if(!v().readCard(K))return W(`Card "${K}" not found in board at ${e.value}`);for(let K of V){let ie=v().readCard(K),ne=rr(ie),fe=t.hashFn(ne),ce=t.kvStorage("card-upsert"),ge=ce.read(K),me=ge?.taskConfigHash!==fe;if(!(!me&&!$)){if(me){let X=ge?.blobRef??v().readCardKey(K)??K;f({type:"task-upsert",taskName:K,taskConfig:ne,timestamp:ae()}),ce.write(K,{blobRef:X,taskConfigHash:fe,updatedAt:ae()});}$&&f({type:"task-restart",taskName:K,timestamp:ae()});}}return j(),te()}catch(p){return re(p)}}function E(C){try{let p=C.params?.token;if(!p)return W("taskFailed requires params.token");let I=C.params?.error??"unknown error",$=tt(p);return $?(f({type:"task-failed",taskName:$.taskName,error:I,timestamp:ae()}),j(),te()):W("Invalid callback token")}catch(p){return re(p)}}function H(C){try{let p=C.params?.token;if(!p)return W("taskProgress requires params.token");let $=(C.body??{}).update??{},V=tt(p);return V?(f({type:"task-progress",taskName:V.taskName,update:$,timestamp:ae()}),j(),te()):W("Invalid callback token")}catch(p){return re(p)}}function M(C){try{let p=C.params?.token,I=C.params?.ref;if(!p)return W("sourceDataFetched requires params.token");if(!I)return W("sourceDataFetched requires params.ref");let $=nr(p);if(!$)return W("Invalid source token");let{cbk:V,cid:K,b:ie,d:ne,cs:fe,rqt:ce}=$,ge=kt(t.blobStorage("sources"),ke=>t.resolveBlob(ke)),me=t.genId();ge.ingestSourceDataStaged(K,ne,ye(I),me);let X=tt(V);if(!X)return W("Invalid callback token embedded in source token");let he=ae();return f({type:"task-progress",taskName:X.taskName,update:{bindTo:ie,outputFile:ne,fetchedAt:he,deliveryToken:me,sourceChecksum:fe,rqt:ce},timestamp:he}),j(),te()}catch(p){return re(p)}}function J(C){try{let p=C.params?.token,I=C.params?.reason??"unknown";if(!p)return W("sourceDataFetchFailure requires params.token");let $=nr(p);if(!$)return W("Invalid source token");let{cbk:V,b:K,d:ie,cs:ne}=$,fe=tt(V);return fe?(f({type:"task-progress",taskName:fe.taskName,update:{bindTo:K,outputFile:ie,failure:!0,reason:I,sourceChecksum:ne},timestamp:ae()}),j(),te()):W("Invalid callback token embedded in source token")}catch(p){return re(p)}}function se(C){try{let p=i().readCardStoreRef();return p?te({storeRef:p}):W(`Board at ${e.value} has no card store configured`)}catch(p){return re(p)}}function Z(C){try{let p=i().readOutputsStoreRef();return p?te({storeRef:p}):W(`Board at ${e.value} has no outputs store configured`)}catch(p){return re(p)}}function Se(C){try{let p=C.params?.key;if(!p)return W("getConfig requires params.key");let I=i(),$;switch(p){case "task-executor":$=I.readTaskExecutorRef()??null;break;case "chat-handler":$=I.readChatHandlerRef()??null;break;case "card-store-ref":$=I.readCardStoreRef();break;case "outputs-store-ref":$=I.readOutputsStoreRef();break;default:return W(`getConfig: unknown key "${p}"`)}return te({value:$})}catch(p){return re(p)}}function ve(C){try{let p=C.params?.key;if(!p)return W("getOutputsDataObject requires params.key");let I=m().readDataObject(p);return te(I)}catch(p){return re(p)}}function we(C){try{return te(m().readAllDataObjects())}catch(p){return re(p)}}function D(C){try{let p=C.params?.key;if(!p)return W("getOutputsComputedValues requires params.key");let I=m().readComputedValues(p);return te(I)}catch(p){return re(p)}}function q(C){try{return te(m().readAllComputedValues())}catch(p){return re(p)}}return {init:S,status:N,getCardStoreRef:se,getOutputsStoreRef:Z,getConfig:Se,getOutputsDataObject:ve,getAllOutputsDataObjects:we,getOutputsComputedValues:D,getAllOutputsComputedValues:q,removeCard:G,retrigger:T,processAccumulatedEvents:O,upsertCard:A,taskFailed:E,taskProgress:H,sourceDataFetched:M,sourceDataFetchFailure:J}}function ar(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {get(s){try{let o=s.params?.id;if(o){let a=e.readCard(o);return a?t({cards:[a]}):r(`card "${o}" not found`)}return t({cards:e.readAllCards()})}catch(o){return n(o)}},set(s){try{let o=s.body;if(o==null)return r("set requires a body (card object or array of cards)");let a=Array.isArray(o)?o:[o];for(let i of a){if(typeof i.id!="string")return r("each card must have a string `id` field");e.writeCard(i.id,i);}return t({count:a.length})}catch(o){return n(o)}},del(s){try{let o=s.body?.ids??[],a=s.params?.id,i=a?[...o,a]:o;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let u of i)e.removeCard(u);return t({count:i.length})}catch(o){return n(o)}},patch(s){try{let o=s.params?.id,a=s.params?.path;if(!o)return r("patch requires params.id");if(!a)return r("patch requires params.path");let i=s.body,u=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:s.body;return e.patchCard(o,a,u),t({count:1})}catch(o){return n(o)}}}}var rt=".artifacts-index.json";function ir(){return new Date().toISOString()}function cr(e){return new TextEncoder().encode(e).byteLength}function Fe(e){let t=e.read(rt);if(!t)return {entries:{}};try{let r=JSON.parse(t);if(r&&r.entries&&typeof r.entries=="object")return r}catch{}return {entries:{}}}function Rt(e,t){e.write(rt,JSON.stringify(t,null,2));}function Yr(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function ur(e,t,r){e.entries[t]={key:t,size:r.size,updatedAt:r.updatedAt,contentType:r.contentType};}function bt(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function Qr(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function Zr(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function en(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function tn(e){let t=Qr(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function rn(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function St(e){function t(r){let n=e.stat?Yr(e.stat(r)):null;if(n)return n;let o=Fe(e).entries[r];if(o)return {...o};if(!e.exists(r))return null;let a=e.read(r);return a===null?{key:r}:{key:r,size:cr(a)}}return {exists(r){return e.exists(r)},putText(r,n,s="text/plain; charset=utf-8"){e.write(r,n);let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??ir(),o.size=o.size??cr(n);let a=Fe(e);return ur(a,r,o),Rt(e,a),o},putBytes(r,n,s="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,i);}let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??ir(),o.size=o.size??n.byteLength;let a=Fe(e);return ur(a,r,o),Rt(e,a),o},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let s=e.readBytes(r);return s===null?null:Buffer.from(s).toString("utf-8")}try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new TextDecoder("utf-8").decode(new Uint8Array(s.data))}catch{}return n},getBytes(r){if(e.readBytes){let s=e.readBytes(r);if(s!==null)return s}let n=e.read(r);if(n===null)return null;try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new Uint8Array(s.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){let n=new Map;if(e.listKeys)for(let o of e.listKeys(r)){if(o===rt)continue;let a=t(o)??{key:o};n.set(o,a);}let s=Fe(e);for(let[o,a]of Object.entries(s.entries))o===rt||r&&!o.startsWith(r)||n.has(o)||n.set(o,{...a});return [...n.values()].sort((o,a)=>o.key.localeCompare(a.key))},remove(r){e.remove(r);let n=Fe(e);delete n.entries[r],Rt(e,n);}}}function dr(e,t){let r=t?.indexFileName;function n(m){return `${m}/${r}`}function s(m){let y=e.getText(n(m));if(!y)return [];try{let k=JSON.parse(y);return Array.isArray(k)?k.filter(g=>g&&typeof g.stored_name=="string").map(g=>({serial:Number(g.serial||bt(String(g.stored_name))||0),role:String(g.role||"system").toLowerCase(),stored_name:String(g.stored_name),path:typeof g.path=="string"?g.path:`${m}/chats/${String(g.stored_name)}`,updated_at:typeof g.updated_at=="string"?g.updated_at:null})):[]}catch{return []}}function o(m,y){e.putText(n(m),JSON.stringify(y,null,2),"application/json; charset=utf-8");}function a(m){let y=s(m),k=0;for(let g of y){let f=Number(g.serial||0);Number.isFinite(f)&&f>k&&(k=f);}return k+1}function i(m,y){let k=s(m);k.push(y),o(m,k);}function u(m){let y=s(m),k=[];for(let g of y){let f=`${m}/${g.stored_name}`,B=e.getText(f);B!==null&&k.push({serial:Number(g.serial||bt(g.stored_name)||0),role:String(g.role||"system").toLowerCase(),text:B,path:typeof g.path=="string"?g.path:`${m}/chats/${g.stored_name}`,stored_name:g.stored_name,updated_at:g.updated_at||null});}return k.sort((g,f)=>g.serial-f.serial||g.stored_name.localeCompare(f.stored_name)),k}function h(m){let y=`${m}/`;for(let k of e.list(y))e.remove(k.key);}function v(m){let y=`${m}/`,k=e.list(y),g=0,f=0,B=false;for(let j of k){let S=j.key.slice(y.length);if(S===".processing"){B=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(S))continue;g+=1;let N=j.updatedAt?Number(new Date(j.updatedAt).getTime()||0):0;N>f&&(f=N);}return {count:g,latest_mtime_ms:f,processing:B}}return {indexKey:n,loadIndex:s,saveIndex:o,nextSerial:a,appendIndexRecord:i,readRecords:u,clear:h,readSignal:v}}function lr(e){function t(s,o){let a=0,i=[];Array.isArray(o)&&i.push(...o);for(let u of e.list(`${s}/`))i.push(rn(u.key));for(let u of i){let h=bt(u);Number.isFinite(h)&&h>a&&(a=h);}return a+1}function r(s,o,a){let i=Number(a?.maxLen||32),{stem:u,ext:h}=tn(s),v=en(h),m=Zr(u),y=`${String(o).padStart(3,"0")}-`,k=v,g=i-y.length-k.length;g<1&&(k="",g=i-y.length);let f=m.slice(0,Math.max(1,g)),B=`${y}${f}${k}`;return B.length>i&&(B=B.slice(0,i).replace(/\.$/,"")),B}function n(s,o,a){let i=t(s,a?.seedNames),u=r(o,i,{maxLen:a?.maxLen});for(;e.exists(`${s}/${u}`);)i+=1,u=r(o,i,{maxLen:a?.maxLen});return u}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function fr(){function e(s,o){if(!Array.isArray(s))return [];let a=[];for(let i of s){if(!i||typeof i!="object")continue;let u=i;typeof u.stored_name=="string"&&a.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,path:typeof u.path=="string"?u.path:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:o||null});}return a}function t(s){return !s||typeof s!="object"?[]:e(s.files,void 0)}function r(s,o){let a=t(s);if(o.length===0)return s.files=a,a;let i=new Set(a.map(u=>u.stored_name));for(let u of o)i.has(u.stored_name)||(a.push(u),i.add(u.stored_name));return s.files=a,a}function n(s,o,a){let i=t(s);if(!Number.isInteger(o)||o<0||o>=i.length)return {ok:false,reason:"index_out_of_range"};let u=i[o];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}var nn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},on=32;function sn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function pr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function gr(e,t){if(!t||typeof t!="object")return;let r=t;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)gr(e,n);return}r.kind==="status"&&pr(r.status)&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card);}function mr(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...nn,...e.corsHeaders||{}},n=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},o=e.invocationAdapter,a=e.notificationTransport||null,i=e.serverUrl||null,u=e.executionExtra||{},h=new Set;function v(c){let d=sr(c.baseRef,c.boardAdapter),l=c.boardAdapter.kvStorageForRef(c.cardStoreRef),w=ar(Qe({readIndex:()=>l.read("_index"),writeIndex:b=>l.write("_index",b),readCard:b=>l.read(b),writeCard:(b,F)=>(l.write(b,F),b),cardExists:b=>l.read(b)!==null,defaultCardKey:b=>b},s.warn)),x=c.artifactsAdapter||c.boardAdapter,L=null,R=null;return {label:c.label,board:d,cardStore:w,get filesArtifacts(){return L??(L=St(x.blobStorage("files")))},get chatsArtifacts(){return R??(R=St(x.blobStorage("chats")))},boardAdapter:c.boardAdapter,cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef,notifyRef:c.notifyRef,taskExecutorRef:c.taskExecutorRef,chatHandlerRef:c.chatHandlerRef,inferenceAdapterRef:c.inferenceAdapterRef,notification:sn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let m=e.boards.map(v),y=new Map;function k(c){return y.get(c)??0}function g(c){let d=m[k(c)];return {files:d?d.filesArtifacts:null,chats:d?d.chatsArtifacts:null}}function f(c){let d=g(c);return d.chats?dr(d.chats,{indexFileName:".index.json"}):null}function B(c){let d=g(c);return d.files?lr(d.files):null}function j(){return fr()}function S(c){return String(c||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function N(c){if(!c||c.notificationTeardown||!a||!c.notifyRef)return;let d=await a.subscribe(c.notifyRef,l=>{gr(c.notification,l);let _=l.kind==="notification-batch"?l.notifications:[l];at(_);});c.notificationTeardown=d;}async function G(c){if(!c||c.initialized)return;let d={cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef},l={};c.taskExecutorRef&&(l["task-executor-ref"]=c.taskExecutorRef),c.chatHandlerRef&&(l["chat-handler-ref"]=c.chatHandlerRef),c.inferenceAdapterRef&&(l["inference-adapter-ref"]=c.inferenceAdapterRef);let _=c.board.init({params:d,body:l});if(_.status!=="success")throw Object.assign(new Error(_.error||`init failed for ${c.label}`),{statusCode:500});if(await N(c),c.chatHandlerRef&&o.describe)try{let w=await o.describe(c.chatHandlerRef);w&&w.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${w.kind}", expected "chat-handler" for ${c.label}`):w&&s.info(`[init] chat-handler validated: ${w.name} (protocol ${w.protocolVersion}) for ${c.label}`);}catch(w){s.warn(`[init] chat-handler describe failed for ${c.label}: ${w?.message||String(w)}`);}c.initialized=true;}function T(c){if(!c.boardAdapter.publishBoardChangeNotifications)return;let d=[],l=c.board.status({});l.status==="success"&&l.data!=null&&pr(l.data)&&d.push({kind:"status",status:l.data});let _=c.board.getAllOutputsDataObjects({});if(_.status==="success"&&_.data!=null)for(let[x,L]of Object.entries(_.data))x&&d.push({kind:"data_object",key:x,payload:L});let w=c.board.getAllOutputsComputedValues({});if(w.status==="success"&&w.data!=null)for(let[x,L]of Object.entries(w.data))x&&d.push({kind:"computed_values",cardId:x,values:L});d.length>0&&c.boardAdapter.publishBoardChangeNotifications(d);}function O(c,d){if(!c||c.cardsBootstrapped)return;let l=c.cardStore.get({}),_=l.status==="success"&&Array.isArray(l.data?.cards)?l.data.cards:[];for(let w of _)typeof w.id=="string"&&(y.set(w.id,d),c.board.upsertCard({params:{cardId:w.id}}));c.cardsBootstrapped=true;}async function A(){for(let c of m)await G(c);}async function E(){await A();for(let c=0;c<m.length;c++)T(m[c]),O(m[c],c);}function H(c){return m[k(c)]??null}function M(c){let d=H(c);if(!d)return null;let l=d.cardStore.get({params:{id:c}});if(l.status!=="success")return null;let _=Array.isArray(l.data?.cards)?l.data.cards:[];return _.length>0?_[0]:null}function J(){let c=l=>{if(!l||!l.cardStore)return [];let _=l.cardStore.get({});return _.status!=="success"||!Array.isArray(_.data?.cards)?[]:_.data.cards},d=[];for(let l of m)d.push(...c(l));return d}function se(){let c=m.map(x=>{try{let R=x.boardAdapter.kvStorageForRef(x.outputsStoreRef).read("status");if(R!=null)return R}catch{}return x.notification.status}).filter(Boolean);if(c.length===0)return null;if(c.length===1)return c[0];let d=[],l=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],_={};for(let x of l)_[x]=0;for(let x of c){let L=x,R=Array.isArray(L.cards)?L.cards:[];d.push(...R);for(let b of l)_[b]+=Number(L?.summary?.[b]||0);}let w=c[0];return {...w,cards:d,summary:{...w.summary||{},card_count:d.length,..._}}}function Z(){let c={},d=l=>{for(let[_,w]of Object.entries(l.notification.computedValues)){let x=l.notification.cards[_];c[_]={schema_version:"v1",card_id:_,card_data:x?.card_data??{},computed_values:w??{}};}};for(let l of m)d(l);return c}function Se(){let c={};for(let d of m)Object.assign(c,d.notification.dataObjects||{});return c}function ve(c){let d=S(c),l=f(c);return l?l.readSignal(d):{count:0,latest_mtime_ms:0,processing:false}}function we(){let c=J(),d=Z(),l=Se(),_={};for(let w of c){if(!w?.id)continue;let x=w.id,L=d[x]||{},R=ve(x),b={...L.card_data&&typeof L.card_data=="object"?L.card_data:w.card_data&&typeof w.card_data=="object"?w.card_data:{},__chat_signal:R};_[x]={schema_version:L.schema_version||"v1",card_id:L.card_id||x,card_data:b,computed_values:L.computed_values&&typeof L.computed_values=="object"?L.computed_values:{}};}return {boardId:n,cardDefinitions:c,statusSnapshot:se(),dataObjectsByToken:l,cardRuntimeById:_}}function D(c,d,l){let _=l?.syncBoard!==false,w=H(c);if(!w)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let x=M(c);if(!x)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let L=d(x)||x,R=w.cardStore.set({body:L});if(R.status!=="success")throw Object.assign(new Error(R.error||`Failed to persist card: ${c}`),{statusCode:500});if(_){let b=w.board.upsertCard({params:{cardId:c,restart:true}});if(b.status!=="success")throw Object.assign(new Error(b.error||`Failed to upsert card: ${c}`),{statusCode:500})}}function q(c,d){D(c,d,{syncBoard:true});}function C(c,d){D(c,d,{syncBoard:false});}function p(c,d){q(c,l=>{if(!d||typeof d!="object"||Object.keys(d).length===0)return l;function _(w,x,L){let R=String(x||"").split(".").filter(Boolean);if(!R.length)return;let b=w;for(let F=0;F<R.length-1;F++){let U=R[F];(!b[U]||typeof b[U]!="object")&&(b[U]={}),b=b[U];}b[R[R.length-1]]=L;}if(d.fieldValues!==void 0&&d.fieldValues!==null){let w=null,x=l.view;if(x&&Array.isArray(x.elements)){for(let L of x.elements)if(L?.data&&L.data.writeTo){w=L.data.writeTo;break}}w?_(l,w,d.fieldValues):typeof d.fieldValues=="object"&&!Array.isArray(d.fieldValues)&&(l.card_data={...l.card_data||{},...d.fieldValues});}else {if(Array.isArray(d._stagedFiles)&&d._stagedFiles.length>0)return l;for(let[w,x]of Object.entries(d))w!=="_stagedFiles"&&(x!==null&&typeof x=="object"&&!Array.isArray(x)&&l[w]!==null&&typeof l[w]=="object"&&!Array.isArray(l[w])?l[w]={...l[w],...x}:l[w]=x);}return l});}function I(c){let d=String(c||"").match(/^(\d+)[-_]/);return d?parseInt(d[1],10):0}function $(c){let d=String(c||"").trim();if(!d)return "upload.bin";let l=Math.max(d.lastIndexOf("/"),d.lastIndexOf("\\"));return (l>=0?d.slice(l+1):d)||"upload.bin"}function V(c){let d=S(c),l=f(c);l&&l.clear(d);}function K(c,d){let l=S(c),_=f(c),w=_?_.nextSerial(l):1,x=String(d||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(w).padStart(3,"0")}_${x}.txt`}function ie(c,d,l,_){let w=new Date().toISOString(),x=S(c),L=g(c),R=K(c,d||"system"),b=`${x}/${R}`,F=[],U=typeof l=="string"?l.trim():"";U&&F.push(U);let P=Array.isArray(_)?_:[];if(P.length){F.length&&F.push(""),F.push("files:");for(let Y of P){if(!Y||typeof Y!="object")continue;let ue=typeof Y.name=="string"?Y.name:"file",de=typeof Y.stored_name=="string"?Y.stored_name:"";F.push(de?`- ${ue} -> ${de}`:`- ${ue}`);}}L.chats&&L.chats.putText(b,`${F.join(`
2
2
  `)}
3
- `);let z=I(R),ee=f(c);return ee&&ee.appendIndexRecord(x,{serial:z,role:d||"system",stored_name:R,path:`${c}/chats/${R}`,updated_at:w}),{at:w,role:d||"system",text:U,files:P,path:`${c}/chats/${R}`}}function ne(c){let d=S(c),l=f(c);return l?l.readRecords(d).map(_=>({..._,path:`${c}/chats/${_.stored_name}`})):[]}function fe(c){let d=[];try{let l=H(c);if(!l)return d;let _=j().read(l.card_data&&typeof l.card_data=="object"?l.card_data:null);for(let w of _)d.push(w.stored_name);}catch{}return d}function ce(c,d,l,_){let w=S(c),x=g(c),L=$(d),R=B(c),b=R?R.allocateStoredName(w,L,{seedNames:fe(c),maxLen:on}):`${String(Date.now())}-${L}`;return x.files&&x.files.putBytes(`${w}/${b}`,new Uint8Array(_),l||"application/octet-stream"),{name:L,stored_name:b,size:_.length,mime_type:l||"application/octet-stream",path:`${c}/files/${b}`,uploaded_at:new Date().toISOString()}}function ge(c,d,l){let _=M(c);if(!_)return;let w=_.board.getConfig({params:{key:"chat-handler"}});if(w.status!=="success")return;let x=w.data?.value;if(!x||typeof x!="object")return;let L=S(c),R=g(c),b=`${L}/.processing`;try{R.chats?.putText(b,"","text/plain; charset=utf-8");}catch{}let F={boardId:n,cardId:String(c),chatsKeyPrefix:d,chatProcessingMarkerKey:b,lastChatFile:l,...u,...i?{serverUrl:i}:{}};o.invoke(x,F).then(U=>{if(U.dispatched)s.info(`[chat-handler] invoked for card "${c}" (boardId: "${n}")`);else {try{R.chats?.remove(b);}catch{}s.warn(`[chat-handler] dispatch failed for card "${c}": ${U.error||"unknown"}`);}},U=>{try{R.chats?.remove(b);}catch{}s.warn(`[chat-handler] invoke failed for card "${c}": ${U?.message||String(U)}`);});}function me(c,d,l){let _=d==="chat-send"?C:q,w;_(c,x=>{let L=new Date().toISOString(),R=x.card_data&&typeof x.card_data=="object"?x.card_data:{};if(x.card_data=R,d==="chat-send"){let b=l&&typeof l.text=="string"?l.text.trim():"",F=[];if(Array.isArray(l?.files)){for(let U of l.files)if(U){if(typeof U=="string"){F.push({name:U});continue}if(typeof U=="object"){let P=U;typeof P.name=="string"&&F.push({name:P.name,size:P.size,mime_type:P.mime_type,path:P.path,uploaded_at:P.uploaded_at,stored_name:P.stored_name});}}}if(b||F.length>0){let U=S(c),z=ie(c,"user",b,F).path,ee=z.includes("/")?z.slice(z.lastIndexOf("/")+1):z;w={chatsKeyPrefix:`${U}/chats`,lastChatFile:ee};for(let Y of F){if(!Y||typeof Y!="object")continue;let ue=typeof Y.name=="string"?Y.name:"file",de=typeof Y.stored_name=="string"?Y.stored_name:null;de&&ie(c,"system",`File ${ue} uploaded as ${de}.`,[]);}}return x}if(d==="file-upload"){let b=j().normalizeIncoming(l?.files,L);return b.length>0&&j().merge(R,b),x}if(d==="action"){let b=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!b)return x;R.lastAction={buttonId:b,at:L},R.lastActionText=`${b} @ ${L}`;}return x}),w&&ge(c,w.chatsKeyPrefix,w.lastChatFile);}function X(c,d,l){let _=JSON.stringify(l),w=typeof Buffer<"u"?Buffer.byteLength(_):new TextEncoder().encode(_).length;c.writeHead(d,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":w}),c.end(_);}async function he(c){let d=[];for await(let _ of c)d.push(_);let l=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(Ae(d)).trim();return l?JSON.parse(l):{}}async function ke(c){let d=[];for await(let l of c)d.push(l);return typeof Buffer<"u"?Buffer.concat(d):Ae(d)}function Ae(c){let d=c.reduce((w,x)=>w+x.length,0),l=new Uint8Array(d),_=0;for(let w of c)l.set(w,_),_+=w.length;return l}let Te=0;function Ne(c){let d=JSON.stringify(c);return Te++,`id: ${Te}
3
+ `);let z=I(R),ee=f(c);return ee&&ee.appendIndexRecord(x,{serial:z,role:d||"system",stored_name:R,path:`${c}/chats/${R}`,updated_at:w}),{at:w,role:d||"system",text:U,files:P,path:`${c}/chats/${R}`}}function ne(c){let d=S(c),l=f(c);return l?l.readRecords(d).map(_=>({..._,path:`${c}/chats/${_.stored_name}`})):[]}function fe(c){let d=[];try{let l=M(c);if(!l)return d;let _=j().read(l.card_data&&typeof l.card_data=="object"?l.card_data:null);for(let w of _)d.push(w.stored_name);}catch{}return d}function ce(c,d,l,_){let w=S(c),x=g(c),L=$(d),R=B(c),b=R?R.allocateStoredName(w,L,{seedNames:fe(c),maxLen:on}):`${String(Date.now())}-${L}`;return x.files&&x.files.putBytes(`${w}/${b}`,new Uint8Array(_),l||"application/octet-stream"),{name:L,stored_name:b,size:_.length,mime_type:l||"application/octet-stream",path:`${c}/files/${b}`,uploaded_at:new Date().toISOString()}}function ge(c,d,l){let _=H(c);if(!_)return;let w=_.board.getConfig({params:{key:"chat-handler"}});if(w.status!=="success")return;let x=w.data?.value;if(!x||typeof x!="object")return;let L=S(c),R=g(c),b=`${L}/.processing`;try{R.chats?.putText(b,"","text/plain; charset=utf-8");}catch{}let F={boardId:n,cardId:String(c),chatsKeyPrefix:d,chatProcessingMarkerKey:b,lastChatFile:l,...u,...i?{serverUrl:i}:{}};o.invoke(x,F).then(U=>{if(U.dispatched)s.info(`[chat-handler] invoked for card "${c}" (boardId: "${n}")`);else {try{R.chats?.remove(b);}catch{}s.warn(`[chat-handler] dispatch failed for card "${c}": ${U.error||"unknown"}`);}},U=>{try{R.chats?.remove(b);}catch{}s.warn(`[chat-handler] invoke failed for card "${c}": ${U?.message||String(U)}`);});}function me(c,d,l){let _=d==="chat-send"?C:q,w;_(c,x=>{let L=new Date().toISOString(),R=x.card_data&&typeof x.card_data=="object"?x.card_data:{};if(x.card_data=R,d==="chat-send"){let b=l&&typeof l.text=="string"?l.text.trim():"",F=[];if(Array.isArray(l?.files)){for(let U of l.files)if(U){if(typeof U=="string"){F.push({name:U});continue}if(typeof U=="object"){let P=U;typeof P.name=="string"&&F.push({name:P.name,size:P.size,mime_type:P.mime_type,path:P.path,uploaded_at:P.uploaded_at,stored_name:P.stored_name});}}}if(b||F.length>0){let U=S(c),z=ie(c,"user",b,F).path,ee=z.includes("/")?z.slice(z.lastIndexOf("/")+1):z;w={chatsKeyPrefix:`${U}/chats`,lastChatFile:ee};for(let Y of F){if(!Y||typeof Y!="object")continue;let ue=typeof Y.name=="string"?Y.name:"file",de=typeof Y.stored_name=="string"?Y.stored_name:null;de&&ie(c,"system",`File ${ue} uploaded as ${de}.`,[]);}}return x}if(d==="file-upload"){let b=j().normalizeIncoming(l?.files,L);return b.length>0&&j().merge(R,b),x}if(d==="action"){let b=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!b)return x;R.lastAction={buttonId:b,at:L},R.lastActionText=`${b} @ ${L}`;}return x}),w&&ge(c,w.chatsKeyPrefix,w.lastChatFile);}function X(c,d,l){let _=JSON.stringify(l),w=typeof Buffer<"u"?Buffer.byteLength(_):new TextEncoder().encode(_).length;c.writeHead(d,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":w}),c.end(_);}async function he(c){let d=[];for await(let _ of c)d.push(_);let l=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(Ae(d)).trim();return l?JSON.parse(l):{}}async function ke(c){let d=[];for await(let l of c)d.push(l);return typeof Buffer<"u"?Buffer.concat(d):Ae(d)}function Ae(c){let d=c.reduce((w,x)=>w+x.length,0),l=new Uint8Array(d),_=0;for(let w of c)l.set(w,_),_+=w.length;return l}let Te=0;function Ne(c){let d=JSON.stringify(c);return Te++,`id: ${Te}
4
4
  data: ${d}
5
5
 
6
6
  `}function at(c){if(!c||c.length===0)return;let d=Ne({kind:"notification-batch",notifications:c});for(let l of h)try{l.write(d);}catch{h.delete(l);}}function Ge(c,d){d.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),h.add(d);let l=we(),_=Ne(l);d.write(_);let w=setInterval(()=>{try{d.write(`: keepalive
7
7
 
8
- `);}catch{}},15e3);c.on("close",()=>{clearInterval(w),h.delete(d),d.end();});}async function xt(c,d,l){let _=c.method||"GET",w=l,x=w.pathname;try{if(_==="GET"&&x===`${t}/init-board`)return await A(),X(d,200,we()),!0;if(_==="GET"&&x===`${t}/sse`){await A(),Ge(c,d);for(let P=0;P<m.length;P++)T(m[P]),O(m[P],P);return !0}if(_==="GET"&&x===`${t}/board-status`)return X(d,200,we()),!0;let L=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)$`));if(_==="GET"&&L){await E();let P=decodeURIComponent(L[1]),z=H(P);return z?(X(d,200,z),!0):(X(d,404,{error:`card not found: ${P}`}),!0)}if(_==="PATCH"&&L){await E();let P=decodeURIComponent(L[1]),z=await he(c);return p(P,z),X(d,200,{ok:!0}),!0}let R=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)/actions$`));if(_==="POST"&&R){await E();let P=decodeURIComponent(R[1]),z=await he(c);return me(P,z?.actionType,z?.payload),X(d,200,{ok:!0}),!0}let b=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)/chats$`));if(_==="GET"&&b){await E();let P=decodeURIComponent(b[1]);return X(d,200,{ok:!0,messages:ne(P)}),!0}let F=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)/files$`));if(_==="POST"&&F){await E();let P=decodeURIComponent(F[1]),z=String(w.searchParams.get("inChat")||"").toLowerCase()==="true",ee=c.headers["x-file-name"],Y=String(c.headers["content-type"]||"application/octet-stream"),ue=Array.isArray(ee)?ee[0]:ee,de=ue?decodeURIComponent(String(ue)):"upload.bin",He=await ke(c);if(!He.length)return X(d,400,{error:"Empty upload body"}),!0;let le=ce(P,de,Y,He);return z&&(C(P,Ce=>{let Ee=new Date().toISOString(),Me=Ce.card_data&&typeof Ce.card_data=="object"?Ce.card_data:{};Ce.card_data=Me;let it=j().normalizeIncoming([{name:le.name,stored_name:le.stored_name,size:le.size,mime_type:le.mime_type,path:le.path,uploaded_at:le.uploaded_at||Ee}],Ee);return j().merge(Me,it),Ce}),ie(P,"system",`file uploaded: ${le.name} as ${le.stored_name}`,[])),X(d,200,{ok:!0,file:le}),!0}let U=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)/files/(\\d+)$`));if(_==="GET"&&U){let P=decodeURIComponent(U[1]),z=parseInt(U[2],10),ee=w.searchParams.get("sn"),Y=H(P);if(!Y)return X(d,404,{error:"Card not found"}),!0;let ue=j().resolve(Y.card_data,z,ee);if(!ue.ok&&ue.reason==="stale_reference")return X(d,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ue.ok)return X(d,404,{error:"File not found"}),!0;let de=ue.file,He=S(P),le=g(P),Ce=`${He}/${de.stored_name}`,Ee=le.files?le.files.getBytes(Ce):null;if(!Ee)return X(d,404,{error:"File not found"}),!0;let Me=de.name||de.stored_name,it=de.mime_type||"application/octet-stream";return d.writeHead(200,{"Content-Type":it,"Content-Disposition":`attachment; filename="${Me}"`,"Content-Length":Ee.length}),d.end(Ee),!0}return !1}catch(L){let R=L?.statusCode||500;return X(d,R,{error:String(L?.message||L)}),true}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleRuntimeApi:xt,buildPublishedRuntimePayload:we,clearChatRecords:V,reportSourceFetched(c,d){let l=m[0];return l?l.board.sourceDataFetched({params:{token:c,ref:d}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(c,d){let l=m[0];return l?l.board.sourceDataFetchFailure({params:{token:c,reason:d}}):{status:"fail",error:"no board context"}},get cardStore(){return m[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Pe(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function vt(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(vt).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${vt(t[n])}`).join(",")}}`}function nt(e,t){let r=t>>>0;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function hr(e){let t=vt(e),r=nt(t,2166136261),n=nt(t,3735928559),s=nt(t,19088743),o=nt(t,4277009102);return [r,n,s,o].map(a=>a.toString(16).padStart(8,"0")).join("")}function wt(e){function t(o){return `${e}:blob:${o}`}let r=new TextEncoder;function n(o){if(typeof btoa=="function"){let a="";for(let i=0;i<o.length;i++)a+=String.fromCharCode(o[i]);return btoa(a)}return ""}function s(o){if(typeof atob=="function"){let a=atob(o),i=new Uint8Array(a.length);for(let u=0;u<a.length;u++)i[u]=a.charCodeAt(u);return i}return new Uint8Array}return {read(o){return globalThis.localStorage.getItem(t(o))},write(o,a){globalThis.localStorage.setItem(t(o),a);},exists(o){return globalThis.localStorage.getItem(t(o))!==null},remove(o){globalThis.localStorage.removeItem(t(o));},readBytes(o){let a=globalThis.localStorage.getItem(t(o));if(a===null)return null;try{let i=JSON.parse(a);if(i&&i.__kind==="bytes-b64"&&typeof i.data=="string")return s(i.data)}catch{}return r.encode(a)},writeBytes(o,a){let i=JSON.stringify({__kind:"bytes-b64",data:n(a)});globalThis.localStorage.setItem(t(o),i);},listKeys(o){let a=t(o??""),i=[];for(let u=0;u<globalThis.localStorage.length;u++){let h=globalThis.localStorage.key(u);h&&h.startsWith(a)&&i.push(h.slice(t("").length));}return i.sort()},stat(o){let a=globalThis.localStorage.getItem(t(o));if(a===null)return null;let i=r.encode(a).byteLength;try{let u=JSON.parse(a);u&&u.__kind==="bytes-b64"&&typeof u.data=="string"&&(i=s(u.data).byteLength);}catch{}return {key:o,size:i}}}}function Ct(e){function t(r){return `${e}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(t(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(t(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(t(r));},listKeys(r){let n=t(r??""),s=[];for(let o=0;o<globalThis.localStorage.length;o++){let a=globalThis.localStorage.key(o);a!==null&&a.startsWith(n)&&s.push(a.slice(t("").length));}return s}}}function kr(e){function t(){let n=globalThis.localStorage.getItem(e);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(e,JSON.stringify(n));}return {readAllEntries(){return t()},appendEntry(n){let s=t();s.push(n),r(s);},generateId(){return globalThis.crypto.randomUUID()}}}function an(){let e=false;return {tryAcquire(){return e?null:(e=true,()=>{e=false;})}}}var yr=new Map;function ot(e){let t=yr.get(e);if(!t){let r=new Set;t={publish(n){for(let s of r)s(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},yr.set(e,t);}return t}function Rr(){return {async subscribe(e,t){return e.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${e.kind}`),()=>{}):ot(e.value).subscribe(n=>{let s=n;if(s&&s.kind==="notification-batch"&&Array.isArray(s.notifications)){for(let o of s.notifications)t(o);return}t(n);})}}}function br(e,t){let r=t?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:t.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:Q({kind:"in-browser",value:e})},n=new Map,s=new Map,o=an();return {kvStorage:a=>Ct(`${e}:${a}`),blobStorage:a=>wt(a?`${e}:${a}`:e),journalAdapter:()=>kr(`${e}:journal`),lock:o,selfRef:r,async dispatchExecution(a,i){if(a.howToRun==="http:post")try{let u=a.whatToRun,h=typeof u=="object"?u.value:ye(u).value,v=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return v.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${v.status}: ${v.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(a.howToRun==="http:get")try{let u=a.whatToRun,h=typeof u=="object"?u.value:ye(u).value,v=new URLSearchParams(Object.entries(i).filter(([,k])=>k!=null).map(([k,g])=>[k,String(g)])),m=`${h}?${v.toString()}`,y=await fetch(m);return y.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${y.status}: ${y.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(a.howToRun==="in-browser"){let u=a.whatToRun,h=typeof u=="object"?u.value:ye(u).value,v=n.get(h);return v?v(a,i):{dispatched:false,error:`No in-browser handler registered for: ${h}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${a.howToRun})`}},resolveBlob(a){if(a.kind==="in-memory"){let h=s.get(a.value);if(h==null)throw new Error(`resolveBlob: in-memory blob not found: ${Q(a)}`);return h}let u=wt(e).read(a.value);if(u===null)throw new Error(`resolveBlob: blob not found: ${Q(a)}`);return u},hashFn:hr,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:a=>Ct(ye(a).value),publishBoardChangeNotifications(a){if(!t?.notifyChannel||a.length===0)return;ot(t.notifyChannel).publish({kind:"notification-batch",notifications:a});},onWarn:t?.onWarn,registerHandler(a,i){n.set(a,i);},writeMemoryBlob(a,i){return s.set(a,i),Q({kind:"in-memory",value:a})}}}function Sr(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function pn(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function De(e,t){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!t)throw new Error("cardId is required");let n=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(B=>B.id===t);if(!n)throw new Error(`cardDefinitions has no entry with id ${t}`);let s=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},o=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},a=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},u=(Array.isArray(s.cards)?s.cards:[]).find(B=>B.name===t),h=structuredClone(n),v=pn(t,o[t]),y={...h.card_data&&typeof h.card_data=="object"&&!Array.isArray(h.card_data)?h.card_data:{},...v.card_data||{},status:Sr(u?.status),lastRun:u?.runtime?.last_transition_at??null};u?.error?.message&&(y.error=u.error.message);let k=u?{task_status:u.status??null,card_status:Sr(u.status),runtime:structuredClone(u.runtime??{}),error:u.error?structuredClone(u.error):null,blocked_by:Array.isArray(u.blocked_by)?structuredClone(u.blocked_by):[],requires_missing:Array.isArray(u.requires_missing)?structuredClone(u.requires_missing):[]}:{task_status:null,card_status:y.status??"fresh",runtime:{last_transition_at:y.lastRun??null},error:y.error?{message:y.error}:null,blocked_by:[],requires_missing:[]},g=Array.isArray(h.requires)?h.requires:[],f={};for(let[B,j]of Object.entries(a))f[B]=structuredClone(j);for(let B of g)Object.prototype.hasOwnProperty.call(f,B)||(f[B]=null);return {id:t,card:h,card_data:y,requires:f,computed_values:v.computed_values,runtime_state:k}}function gn(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(r=>De(e,r.id))}function st(e){return JSON.parse(JSON.stringify(e))}function qe(e,t){if(e===t)return e;try{if(JSON.stringify(e)===JSON.stringify(t))return e}catch{}return t}function be(e,t){if(e===t)return true;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}}function mn(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function vr(e,t,r){let n=e,o=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(u=>u.id),a=t&&t.modelsById||{},i={};for(let u of o){let h=r(e,u),v=a[u];if(!v){i[u]=h;continue}let m={id:h.id,card:qe(v.card,h.card),card_data:qe(v.card_data,h.card_data),requires:qe(v.requires,h.requires),computed_values:qe(v.computed_values,h.computed_values),runtime_state:qe(v.runtime_state,h.runtime_state)};i[u]=m.card===v.card&&m.card_data===v.card_data&&m.requires===v.requires&&m.computed_values===v.computed_values&&m.runtime_state===v.runtime_state?v:m;}return {payload:e,cardIds:o,modelsById:i}}function wr(e,t,r,n){if(!e||!Array.isArray(t)||t.length===0)return e;let s=e.modelsById,o=e.cardIds,a=false,i=false,u={};for(let v of o){let m=s[v],y=m&&m.requires;if(y&&typeof y=="object")for(let k of Object.keys(y))(u[k]=u[k]||[]).push(v);}function h(){a||(s={...s},a=true);}for(let v of t)if(!(!v||!v.kind)){if(v.kind==="computed_values"){let m=v.cardId,y=s[m];if(!y)continue;let k=v.values||{};if(be(y.computed_values,k))continue;h(),s[m]={...y,computed_values:k},i=true;}else if(v.kind==="data_object"){let m=v.key,y=v.payload,k=u[m]||[];for(let g of k){let f=s[g];if(!f)continue;let B=f.requires||{};be(B[m],y)||(h(),s[g]={...f,requires:{...B,[m]:y}},i=true);}}else if(v.kind==="card_refreshed"){let m=v.cardId,y=null,k=s[m],g=v.card;if(k&&g&&typeof g=="object"&&!Array.isArray(g)){let f=g,B=f.card_data&&typeof f.card_data=="object"&&!Array.isArray(f.card_data)?f.card_data:k.card_data,j=f.requires&&typeof f.requires=="object"&&!Array.isArray(f.requires)?f.requires:k.requires,S=f.computed_values&&typeof f.computed_values=="object"&&!Array.isArray(f.computed_values)?f.computed_values:k.computed_values,N=f.runtime_state&&typeof f.runtime_state=="object"&&!Array.isArray(f.runtime_state)?f.runtime_state:k.runtime_state;y={...k,card:g,card_data:B,requires:j,computed_values:S,runtime_state:N};}if(!y)try{let f=n();f&&(y=r(f,m));}catch{}if(!y||k&&be(k.card,y.card)&&be(k.card_data,y.card_data)&&be(k.requires,y.requires)&&be(k.computed_values,y.computed_values)&&be(k.runtime_state,y.runtime_state))continue;h(),s[m]=y,o.includes(m)||(o=[...o,m]),i=true;}else if(v.kind==="status"){let m=v.status?.cards??[];for(let y of m){let k=y?.name;if(!k||!s[k])continue;let g=s[k],f=mn(y.status),B={...g.card_data||{},status:f,lastRun:y.runtime?.last_transition_at??null,...y.error?.message?{error:y.error.message}:{}};y.error?.message||delete B.error;let j={task_status:y.status??null,card_status:f,runtime:y.runtime?st(y.runtime):{},error:y.error?st(y.error):null,blocked_by:Array.isArray(y.blocked_by)?st(y.blocked_by):[],requires_missing:Array.isArray(y.requires_missing)?st(y.requires_missing):[]};be(g.card_data,B)&&be(g.runtime_state,j)||(h(),s[k]={...g,card_data:B,runtime_state:j},i=true);}}}return i?{payload:e.payload,cardIds:o,modelsById:s}:e}function Ss(e,t){let r=t?.cards??[],n=t?.onWarn??(()=>{}),s=`${e}:notify`,o=br(e,{callbackBaseUrl:t?.callbackBaseUrl,notifyChannel:s,onWarn:n}),a=ye(Q({kind:"localstorage",value:e})),i=Q({kind:"localstorage",value:`${e}:card-store`}),u=Q({kind:"localstorage",value:`${e}:outputs`}),h=t?.taskExecutor??null,v=t?.chatHandler??null,m=Q({kind:"in-browser",value:`${e}:task-executor`}),y=Q({kind:"in-browser",value:`${e}:chat-handler`});h&&o.registerHandler(m,h),v&&o.registerHandler(y,v);let k={async invoke(T,O){return T.howToRun==="in-browser",o.dispatchExecution(T,O)}},g=t?.taskExecutorRef??(h?{meta:"task-executor",howToRun:"in-browser",whatToRun:m}:void 0),f=t?.chatHandlerRef??(v?{meta:"chat-handler",howToRun:"in-browser",whatToRun:y}:void 0),B=Rr(),j=mr({boardId:e,boards:[{label:e,boardAdapter:o,baseRef:a,cardStoreRef:i,outputsStoreRef:u,notifyRef:{kind:"in-memory-bus",value:s},taskExecutorRef:g,chatHandlerRef:f}],invocationAdapter:k,notificationTransport:B,logger:{info:(...T)=>console.log("[board]",...T),warn:(...T)=>{n(String(T[0])),console.warn("[board]",...T);},error:(...T)=>console.error("[board]",...T)}});r.length&&j.cardStore.set({body:r}),t?.onBoardChange&&ot(s).subscribe(O=>{let A=O;!A||A.kind!=="notification-batch"||!Array.isArray(A.notifications)||A.notifications.length===0||t.onBoardChange?.({notifications:A.notifications});});function S(T,O,A){let E=A?JSON.stringify(A):"",M=new TextEncoder().encode(E),H=false;return {method:T,url:O,headers:{"content-type":"application/json"},on(J,se){},[Symbol.asyncIterator](){let J={async next(){return H?{done:true,value:void 0}:(H=true,{done:false,value:M})},[Symbol.asyncIterator](){return J}};return J}}}function N(){let T=200,O=[];return {res:{writeHead(E){T=E;},write(E){return O.push(typeof E=="string"?E:new TextDecoder().decode(E)),true},end(E){E&&O.push(typeof E=="string"?E:new TextDecoder().decode(E));}},getResult:()=>{let E=O.join(""),M;try{M=JSON.parse(E);}catch{M=E;}return {status:T,body:M}}}}let G=j.apiBasePath;return {async bootstrap(){let T=S("GET",`${G}/bootstrap`),{res:O}=N();await j.handleRuntimeApi(T,O,new URL(`http://localhost${G}/bootstrap`));},getState(){return j.buildPublishedRuntimePayload()},async patchCard(T,O){let A=`${G}/cards/${encodeURIComponent(T)}`,E=S("PATCH",A,O),{res:M}=N();await j.handleRuntimeApi(E,M,new URL(`http://localhost${A}`));},async applyCardAction(T,O,A){let E=`${G}/cards/${encodeURIComponent(T)}/actions`,M=S("POST",E,{actionType:O,payload:A}),{res:H}=N();await j.handleRuntimeApi(M,H,new URL(`http://localhost${E}`));},readChatRecords(T){let O=`${G}/cards/${encodeURIComponent(T)}/chats`,A=S("GET",O),E=N();j.handleRuntimeApi(A,E.res,new URL(`http://localhost${O}`));let H=E.getResult().body;return Array.isArray(H?.messages)?H.messages:[]},clearChatRecords(T){j.clearChatRecords(T);},writeMemoryBlob(T,O){return o.writeMemoryBlob(T,O)},reportSourceFetched(T,O){j.reportSourceFetched(T,O);},reportSourceFetchFailure(T,O){j.reportSourceFetchFailure(T,O);},get runtime(){return j}}}function Cs(e,t){return vr(e,t,De)}function xs(e,t,r){return wr(e,t,De,r)}
8
+ `);}catch{}},15e3);c.on("close",()=>{clearInterval(w),h.delete(d),d.end();});}async function xt(c,d,l){let _=c.method||"GET",w=l,x=w.pathname;try{if(_==="GET"&&x===`${t}/init-board`)return await A(),X(d,200,we()),!0;if(_==="GET"&&x===`${t}/sse`){await A(),Ge(c,d);for(let P=0;P<m.length;P++)T(m[P]),O(m[P],P);return !0}if(_==="GET"&&x===`${t}/board-status`)return X(d,200,we()),!0;let L=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)$`));if(_==="GET"&&L){await E();let P=decodeURIComponent(L[1]),z=M(P);return z?(X(d,200,z),!0):(X(d,404,{error:`card not found: ${P}`}),!0)}if(_==="PATCH"&&L){await E();let P=decodeURIComponent(L[1]),z=await he(c);return p(P,z),X(d,200,{ok:!0}),!0}let R=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)/actions$`));if(_==="POST"&&R){await E();let P=decodeURIComponent(R[1]),z=await he(c);return me(P,z?.actionType,z?.payload),X(d,200,{ok:!0}),!0}let b=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)/chats$`));if(_==="GET"&&b){await E();let P=decodeURIComponent(b[1]);return X(d,200,{ok:!0,messages:ne(P)}),!0}let F=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)/files$`));if(_==="POST"&&F){await E();let P=decodeURIComponent(F[1]),z=String(w.searchParams.get("inChat")||"").toLowerCase()==="true",ee=c.headers["x-file-name"],Y=String(c.headers["content-type"]||"application/octet-stream"),ue=Array.isArray(ee)?ee[0]:ee,de=ue?decodeURIComponent(String(ue)):"upload.bin",Me=await ke(c);if(!Me.length)return X(d,400,{error:"Empty upload body"}),!0;let le=ce(P,de,Y,Me);return z&&(C(P,Ce=>{let Ee=new Date().toISOString(),He=Ce.card_data&&typeof Ce.card_data=="object"?Ce.card_data:{};Ce.card_data=He;let it=j().normalizeIncoming([{name:le.name,stored_name:le.stored_name,size:le.size,mime_type:le.mime_type,path:le.path,uploaded_at:le.uploaded_at||Ee}],Ee);return j().merge(He,it),Ce}),ie(P,"system",`file uploaded: ${le.name} as ${le.stored_name}`,[])),X(d,200,{ok:!0,file:le}),!0}let U=x.match(new RegExp(`^${Pe(t)}/cards/([^/]+)/files/(\\d+)$`));if(_==="GET"&&U){let P=decodeURIComponent(U[1]),z=parseInt(U[2],10),ee=w.searchParams.get("sn"),Y=M(P);if(!Y)return X(d,404,{error:"Card not found"}),!0;let ue=j().resolve(Y.card_data,z,ee);if(!ue.ok&&ue.reason==="stale_reference")return X(d,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ue.ok)return X(d,404,{error:"File not found"}),!0;let de=ue.file,Me=S(P),le=g(P),Ce=`${Me}/${de.stored_name}`,Ee=le.files?le.files.getBytes(Ce):null;if(!Ee)return X(d,404,{error:"File not found"}),!0;let He=de.name||de.stored_name,it=de.mime_type||"application/octet-stream";return d.writeHead(200,{"Content-Type":it,"Content-Disposition":`attachment; filename="${He}"`,"Content-Length":Ee.length}),d.end(Ee),!0}return !1}catch(L){let R=L?.statusCode||500;return X(d,R,{error:String(L?.message||L)}),true}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleRuntimeApi:xt,buildPublishedRuntimePayload:we,clearChatRecords:V,reportSourceFetched(c,d){let l=m[0];return l?l.board.sourceDataFetched({params:{token:c,ref:d}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(c,d){let l=m[0];return l?l.board.sourceDataFetchFailure({params:{token:c,reason:d}}):{status:"fail",error:"no board context"}},get cardStore(){return m[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Pe(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function vt(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(vt).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${vt(t[n])}`).join(",")}}`}function nt(e,t){let r=t>>>0;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function hr(e){let t=vt(e),r=nt(t,2166136261),n=nt(t,3735928559),s=nt(t,19088743),o=nt(t,4277009102);return [r,n,s,o].map(a=>a.toString(16).padStart(8,"0")).join("")}function wt(e){function t(o){return `${e}:blob:${o}`}let r=new TextEncoder;function n(o){if(typeof btoa=="function"){let a="";for(let i=0;i<o.length;i++)a+=String.fromCharCode(o[i]);return btoa(a)}return ""}function s(o){if(typeof atob=="function"){let a=atob(o),i=new Uint8Array(a.length);for(let u=0;u<a.length;u++)i[u]=a.charCodeAt(u);return i}return new Uint8Array}return {read(o){return globalThis.localStorage.getItem(t(o))},write(o,a){globalThis.localStorage.setItem(t(o),a);},exists(o){return globalThis.localStorage.getItem(t(o))!==null},remove(o){globalThis.localStorage.removeItem(t(o));},readBytes(o){let a=globalThis.localStorage.getItem(t(o));if(a===null)return null;try{let i=JSON.parse(a);if(i&&i.__kind==="bytes-b64"&&typeof i.data=="string")return s(i.data)}catch{}return r.encode(a)},writeBytes(o,a){let i=JSON.stringify({__kind:"bytes-b64",data:n(a)});globalThis.localStorage.setItem(t(o),i);},listKeys(o){let a=t(o??""),i=[];for(let u=0;u<globalThis.localStorage.length;u++){let h=globalThis.localStorage.key(u);h&&h.startsWith(a)&&i.push(h.slice(t("").length));}return i.sort()},stat(o){let a=globalThis.localStorage.getItem(t(o));if(a===null)return null;let i=r.encode(a).byteLength;try{let u=JSON.parse(a);u&&u.__kind==="bytes-b64"&&typeof u.data=="string"&&(i=s(u.data).byteLength);}catch{}return {key:o,size:i}}}}function Ct(e){function t(r){return `${e}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(t(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(t(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(t(r));},listKeys(r){let n=t(r??""),s=[];for(let o=0;o<globalThis.localStorage.length;o++){let a=globalThis.localStorage.key(o);a!==null&&a.startsWith(n)&&s.push(a.slice(t("").length));}return s}}}function kr(e){function t(){let n=globalThis.localStorage.getItem(e);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(e,JSON.stringify(n));}return {readAllEntries(){return t()},appendEntry(n){let s=t();s.push(n),r(s);},generateId(){return globalThis.crypto.randomUUID()}}}function an(){let e=false;return {tryAcquire(){return e?null:(e=true,()=>{e=false;})}}}var yr=new Map;function ot(e){let t=yr.get(e);if(!t){let r=new Set;t={publish(n){for(let s of r)s(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},yr.set(e,t);}return t}function Rr(){return {async subscribe(e,t){return e.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${e.kind}`),()=>{}):ot(e.value).subscribe(n=>{let s=n;if(s&&s.kind==="notification-batch"&&Array.isArray(s.notifications)){for(let o of s.notifications)t(o);return}t(n);})}}}function br(e,t){let r=t?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:t.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:Q({kind:"in-browser",value:e})},n=new Map,s=new Map,o=an();return {kvStorage:a=>Ct(`${e}:${a}`),blobStorage:a=>wt(a?`${e}:${a}`:e),journalAdapter:()=>kr(`${e}:journal`),lock:o,selfRef:r,async dispatchExecution(a,i){if(a.howToRun==="http:post")try{let u=a.whatToRun,h=typeof u=="object"?u.value:ye(u).value,v=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return v.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${v.status}: ${v.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(a.howToRun==="http:get")try{let u=a.whatToRun,h=typeof u=="object"?u.value:ye(u).value,v=new URLSearchParams(Object.entries(i).filter(([,k])=>k!=null).map(([k,g])=>[k,String(g)])),m=`${h}?${v.toString()}`,y=await fetch(m);return y.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${y.status}: ${y.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(a.howToRun==="in-browser"){let u=a.whatToRun,h=typeof u=="object"?u.value:ye(u).value,v=n.get(h);return v?v(a,i):{dispatched:false,error:`No in-browser handler registered for: ${h}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${a.howToRun})`}},resolveBlob(a){if(a.kind==="in-memory"){let h=s.get(a.value);if(h==null)throw new Error(`resolveBlob: in-memory blob not found: ${Q(a)}`);return h}let u=wt(e).read(a.value);if(u===null)throw new Error(`resolveBlob: blob not found: ${Q(a)}`);return u},hashFn:hr,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:a=>Ct(ye(a).value),publishBoardChangeNotifications(a){if(!t?.notifyChannel||a.length===0)return;ot(t.notifyChannel).publish({kind:"notification-batch",notifications:a});},onWarn:t?.onWarn,registerHandler(a,i){n.set(a,i);},writeMemoryBlob(a,i){return s.set(a,i),Q({kind:"in-memory",value:a})}}}function Sr(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function pn(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function De(e,t){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!t)throw new Error("cardId is required");let n=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(B=>B.id===t);if(!n)throw new Error(`cardDefinitions has no entry with id ${t}`);let s=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},o=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},a=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},u=(Array.isArray(s.cards)?s.cards:[]).find(B=>B.name===t),h=structuredClone(n),v=pn(t,o[t]),y={...h.card_data&&typeof h.card_data=="object"&&!Array.isArray(h.card_data)?h.card_data:{},...v.card_data||{},status:Sr(u?.status),lastRun:u?.runtime?.last_transition_at??null};u?.error?.message&&(y.error=u.error.message);let k=u?{task_status:u.status??null,card_status:Sr(u.status),runtime:structuredClone(u.runtime??{}),error:u.error?structuredClone(u.error):null,blocked_by:Array.isArray(u.blocked_by)?structuredClone(u.blocked_by):[],requires_missing:Array.isArray(u.requires_missing)?structuredClone(u.requires_missing):[]}:{task_status:null,card_status:y.status??"fresh",runtime:{last_transition_at:y.lastRun??null},error:y.error?{message:y.error}:null,blocked_by:[],requires_missing:[]},g=Array.isArray(h.requires)?h.requires:[],f={};for(let[B,j]of Object.entries(a))f[B]=structuredClone(j);for(let B of g)Object.prototype.hasOwnProperty.call(f,B)||(f[B]=null);return {id:t,card:h,card_data:y,requires:f,computed_values:v.computed_values,runtime_state:k}}function gn(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(r=>De(e,r.id))}function st(e){return JSON.parse(JSON.stringify(e))}function qe(e,t){if(e===t)return e;try{if(JSON.stringify(e)===JSON.stringify(t))return e}catch{}return t}function be(e,t){if(e===t)return true;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}}function mn(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function vr(e,t,r){let n=e,o=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(u=>u.id),a=t&&t.modelsById||{},i={};for(let u of o){let h=r(e,u),v=a[u];if(!v){i[u]=h;continue}let m={id:h.id,card:qe(v.card,h.card),card_data:qe(v.card_data,h.card_data),requires:qe(v.requires,h.requires),computed_values:qe(v.computed_values,h.computed_values),runtime_state:qe(v.runtime_state,h.runtime_state)};i[u]=m.card===v.card&&m.card_data===v.card_data&&m.requires===v.requires&&m.computed_values===v.computed_values&&m.runtime_state===v.runtime_state?v:m;}return {payload:e,cardIds:o,modelsById:i}}function wr(e,t,r,n){if(!e||!Array.isArray(t)||t.length===0)return e;let s=e.modelsById,o=e.cardIds,a=false,i=false,u={};for(let v of o){let m=s[v],y=m&&m.requires;if(y&&typeof y=="object")for(let k of Object.keys(y))(u[k]=u[k]||[]).push(v);}function h(){a||(s={...s},a=true);}for(let v of t)if(!(!v||!v.kind)){if(v.kind==="computed_values"){let m=v.cardId,y=s[m];if(!y)continue;let k=v.values||{};if(be(y.computed_values,k))continue;h(),s[m]={...y,computed_values:k},i=true;}else if(v.kind==="data_object"){let m=v.key,y=v.payload,k=u[m]||[];for(let g of k){let f=s[g];if(!f)continue;let B=f.requires||{};be(B[m],y)||(h(),s[g]={...f,requires:{...B,[m]:y}},i=true);}}else if(v.kind==="card_refreshed"){let m=v.cardId,y=null,k=s[m],g=v.card;if(k&&g&&typeof g=="object"&&!Array.isArray(g)){let f=g,B=f.card_data&&typeof f.card_data=="object"&&!Array.isArray(f.card_data)?f.card_data:k.card_data,j=f.requires&&typeof f.requires=="object"&&!Array.isArray(f.requires)?f.requires:k.requires,S=f.computed_values&&typeof f.computed_values=="object"&&!Array.isArray(f.computed_values)?f.computed_values:k.computed_values,N=f.runtime_state&&typeof f.runtime_state=="object"&&!Array.isArray(f.runtime_state)?f.runtime_state:k.runtime_state;y={...k,card:g,card_data:B,requires:j,computed_values:S,runtime_state:N};}if(!y)try{let f=n();f&&(y=r(f,m));}catch{}if(!y||k&&be(k.card,y.card)&&be(k.card_data,y.card_data)&&be(k.requires,y.requires)&&be(k.computed_values,y.computed_values)&&be(k.runtime_state,y.runtime_state))continue;h(),s[m]=y,o.includes(m)||(o=[...o,m]),i=true;}else if(v.kind==="status"){let m=v.status?.cards??[];for(let y of m){let k=y?.name;if(!k||!s[k])continue;let g=s[k],f=mn(y.status),B={...g.card_data||{},status:f,lastRun:y.runtime?.last_transition_at??null,...y.error?.message?{error:y.error.message}:{}};y.error?.message||delete B.error;let j={task_status:y.status??null,card_status:f,runtime:y.runtime?st(y.runtime):{},error:y.error?st(y.error):null,blocked_by:Array.isArray(y.blocked_by)?st(y.blocked_by):[],requires_missing:Array.isArray(y.requires_missing)?st(y.requires_missing):[]};be(g.card_data,B)&&be(g.runtime_state,j)||(h(),s[k]={...g,card_data:B,runtime_state:j},i=true);}}}return i?{payload:e.payload,cardIds:o,modelsById:s}:e}function Ss(e,t){let r=t?.cards??[],n=t?.onWarn??(()=>{}),s=`${e}:notify`,o=br(e,{callbackBaseUrl:t?.callbackBaseUrl,notifyChannel:s,onWarn:n}),a=ye(Q({kind:"localstorage",value:e})),i=Q({kind:"localstorage",value:`${e}:card-store`}),u=Q({kind:"localstorage",value:`${e}:outputs`}),h=t?.taskExecutor??null,v=t?.chatHandler??null,m=Q({kind:"in-browser",value:`${e}:task-executor`}),y=Q({kind:"in-browser",value:`${e}:chat-handler`});h&&o.registerHandler(m,h),v&&o.registerHandler(y,v);let k={async invoke(T,O){return T.howToRun==="in-browser",o.dispatchExecution(T,O)}},g=t?.taskExecutorRef??(h?{meta:"task-executor",howToRun:"in-browser",whatToRun:m}:void 0),f=t?.chatHandlerRef??(v?{meta:"chat-handler",howToRun:"in-browser",whatToRun:y}:void 0),B=Rr(),j=mr({boardId:e,boards:[{label:e,boardAdapter:o,baseRef:a,cardStoreRef:i,outputsStoreRef:u,notifyRef:{kind:"in-memory-bus",value:s},taskExecutorRef:g,chatHandlerRef:f}],invocationAdapter:k,notificationTransport:B,logger:{info:(...T)=>console.log("[board]",...T),warn:(...T)=>{n(String(T[0])),console.warn("[board]",...T);},error:(...T)=>console.error("[board]",...T)}});r.length&&j.cardStore.set({body:r}),t?.onBoardChange&&ot(s).subscribe(O=>{let A=O;!A||A.kind!=="notification-batch"||!Array.isArray(A.notifications)||A.notifications.length===0||t.onBoardChange?.({notifications:A.notifications});});function S(T,O,A){let E=A?JSON.stringify(A):"",H=new TextEncoder().encode(E),M=false;return {method:T,url:O,headers:{"content-type":"application/json"},on(J,se){},[Symbol.asyncIterator](){let J={async next(){return M?{done:true,value:void 0}:(M=true,{done:false,value:H})},[Symbol.asyncIterator](){return J}};return J}}}function N(){let T=200,O=[];return {res:{writeHead(E){T=E;},write(E){return O.push(typeof E=="string"?E:new TextDecoder().decode(E)),true},end(E){E&&O.push(typeof E=="string"?E:new TextDecoder().decode(E));}},getResult:()=>{let E=O.join(""),H;try{H=JSON.parse(E);}catch{H=E;}return {status:T,body:H}}}}let G=j.apiBasePath;return {async bootstrap(){let T=S("GET",`${G}/bootstrap`),{res:O}=N();await j.handleRuntimeApi(T,O,new URL(`http://localhost${G}/bootstrap`));},getState(){return j.buildPublishedRuntimePayload()},async patchCard(T,O){let A=`${G}/cards/${encodeURIComponent(T)}`,E=S("PATCH",A,O),{res:H}=N();await j.handleRuntimeApi(E,H,new URL(`http://localhost${A}`));},async applyCardAction(T,O,A){let E=`${G}/cards/${encodeURIComponent(T)}/actions`,H=S("POST",E,{actionType:O,payload:A}),{res:M}=N();await j.handleRuntimeApi(H,M,new URL(`http://localhost${E}`));},readChatRecords(T){let O=`${G}/cards/${encodeURIComponent(T)}/chats`,A=S("GET",O),E=N();j.handleRuntimeApi(A,E.res,new URL(`http://localhost${O}`));let M=E.getResult().body;return Array.isArray(M?.messages)?M.messages:[]},clearChatRecords(T){j.clearChatRecords(T);},writeMemoryBlob(T,O){return o.writeMemoryBlob(T,O)},reportSourceFetched(T,O){j.reportSourceFetched(T,O);},reportSourceFetchFailure(T,O){j.reportSourceFetchFailure(T,O);},get runtime(){return j}}}function Cs(e,t){return vr(e,t,De)}function xs(e,t,r){return wr(e,t,De,r)}
9
9
  exports.applyNotification=xs;exports.buildBoardState=Cs;exports.create=Ss;exports.selectAllLiveCardModels=gn;exports.selectLiveCardModel=De;return exports;})({});//# sourceMappingURL=board-livecards-localstorage.js.map
10
10
  //# sourceMappingURL=board-livecards-localstorage.js.map
@@ -1,4 +1,4 @@
1
- import { B as BoardPlatformAdapter, N as NotificationTransport } from '../types-C2YQXFwo.js';
1
+ import { B as BoardPlatformAdapter, N as NotificationTransport } from '../types-D2XnLbBj.js';
2
2
  import { E as ExecutionRef } from '../execution-interface-ftO1W7Po.js';
3
3
  import '../board-live-cards-lib-tjYsPt5U.js';
4
4