yaml-flow 8.4.8 → 8.4.9

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 (40) hide show
  1. package/browser/asset-integrity.json +2 -2
  2. package/browser/board-livecards-localstorage.js +6 -6
  3. package/cli/browser-api/board-live-cards-browser-adapter.d.ts +1 -1
  4. package/cli/node/board-live-cards-cli.js +13 -13
  5. package/cli/node/chat-store-cli.js +3 -3
  6. package/cli/node/fs-board-adapter.d.ts +2 -2
  7. package/cli/node/fs-board-adapter.js +13 -13
  8. package/cli/{types-BkJvnXVD.d.ts → types-BbQ75HLf.d.ts} +3 -1
  9. package/examples/board/demo-shell-with-server.html +2 -2
  10. package/examples/board/doc.html +2 -2
  11. package/examples/board/server/board-worker/source_def_flows.json +2 -1
  12. package/examples/board/server/board-worker/task-executor.js +88 -2
  13. package/examples/board-local/demo-shell-localstorage.html +3 -3
  14. package/lib/artifacts-store-public.d.cts +1 -1
  15. package/lib/artifacts-store-public.d.ts +1 -1
  16. package/lib/board-live-cards-node.cjs +13 -13
  17. package/lib/board-live-cards-node.d.cts +4 -4
  18. package/lib/board-live-cards-node.d.ts +4 -4
  19. package/lib/board-live-cards-node.js +13 -13
  20. package/lib/{board-live-cards-public-Crjm8KWn.d.ts → board-live-cards-public-C81ZEkF-.d.ts} +3 -1
  21. package/lib/{board-live-cards-public-CU8VVw3v.d.cts → board-live-cards-public-wbWRD1nO.d.cts} +3 -1
  22. package/lib/board-live-cards-public.cjs +2 -2
  23. package/lib/board-live-cards-public.d.cts +1 -1
  24. package/lib/board-live-cards-public.d.ts +1 -1
  25. package/lib/board-live-cards-public.js +2 -2
  26. package/lib/board-live-cards-server-runtime.cjs +3 -3
  27. package/lib/board-live-cards-server-runtime.d.cts +2 -2
  28. package/lib/board-live-cards-server-runtime.d.ts +2 -2
  29. package/lib/board-live-cards-server-runtime.js +3 -3
  30. package/lib/card-store-public.d.cts +1 -1
  31. package/lib/card-store-public.d.ts +1 -1
  32. package/lib/chat-store-public.d.cts +1 -1
  33. package/lib/chat-store-public.d.ts +1 -1
  34. package/lib/server-runtime/index.cjs +3 -3
  35. package/lib/server-runtime/index.d.cts +3 -3
  36. package/lib/server-runtime/index.d.ts +3 -3
  37. package/lib/server-runtime/index.js +3 -3
  38. package/lib/{types-Dc70aHzf.d.cts → types-D5E1YmeB.d.cts} +1 -1
  39. package/lib/{types-YXF9Oai2.d.ts → types-D_WD7RYH.d.ts} +1 -1
  40. package/package.json +1 -1
@@ -1,9 +1,9 @@
1
1
  {
2
- "generatedAt": "2026-05-20T07:55:42.516Z",
2
+ "generatedAt": "2026-05-21T21:52:09.439Z",
3
3
  "algorithm": "sha256",
4
4
  "files": {
5
5
  "browser/board-livecards-localstorage.js": {
6
- "sha256": "sha256-TtTSb9jPgeZmbhnO3+5PUofEmApKzMoxHWXPfs0/N+o=",
6
+ "sha256": "sha256-4AH2ZoPJJ59BlrkKmESA/r4JLu4V7js69U0BmFYznyE=",
7
7
  "bytes": 100149
8
8
  },
9
9
  "browser/live-cards.schema.json": {
@@ -1,10 +1,10 @@
1
- var BoardLiveCardsLocalStorage=(function(exports){'use strict';var Jr=Object.defineProperty;var Hr=(t,e,r)=>e in t?Jr(t,e,{enumerable:true,configurable:true,writable:true,value:r}):t[e]=r;var Oe=(t,e,r)=>Hr(t,e+"",r);var ee="b64:";function Vr(t){let e=new TextEncoder().encode(t),r=globalThis.Buffer,n;if(r)n=r.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Kr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),r=globalThis.Buffer;if(r)return r.from(e,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(e),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ot(t){return `${ee}${Vr(JSON.stringify(t))}`}function bt(t){if(!t.startsWith(ee))throw new Error(`Invalid ref format (expected ${ee}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(Kr(t.slice(ee.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!e||typeof e!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let r=e;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:r.kind,value:r.value}}async function Be(t,e,r){let n=t.tryAcquire();if(!n)return false;try{await e();}finally{n();}return r?.(),true}var Ot={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function pt(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function Bt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function je(t){return t.tasks??{}}function Ce(t){return t?t.status===Ot.FAILED||t.status===Ot.INACTIVATED:false}function Ne(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function $e(t){return t.maxExecutions}function Fe(t,e){let r=new Set;for(let[n,o]of Object.entries(e))if(o.status===Ot.COMPLETED){let s=t.tasks[n];s&&pt(s).forEach(a=>r.add(a));}return Array.from(r)}function De(t,e){let r={};return t.forEach(n=>{let o=e[n];if(!o)return;pt(o).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function Le(t,e,r){let n=t.tasks[e]??re(),o={};if(r){let i=r.tasks[e],a=Bt(i);for(let c of a)for(let[f,p]of Object.entries(r.tasks))if(pt(p).includes(c)){let g=t.tasks[f];g?.lastDataHash&&(o[c]=g.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function qe(t,e,r,n,o,s){let i=t.tasks[r]??re(),a=e.tasks[r];if(!a)throw new Error(`Task "${r}" not found in graph`);let c;n&&a.on&&a.on[n]?c=a.on[n]:c=pt(a);let f=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let l=a.requires??[];for(let h of l)for(let[y,k]of Object.entries(e.tasks))if(pt(k).includes(h)){let T=t.tasks[y];T?.lastDataHash&&(f[h]=T.lastDataHash);break}}let p={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:f,error:void 0},g=[...new Set([...t.availableOutputs,...c])];return {...t,tasks:{...t.tasks,[r]:p},availableOutputs:g,lastUpdated:new Date().toISOString()}}function Pe(t,e,r,n){let o=t.tasks[r]??re(),s=e.tasks[r];if(s?.retry){let c=o.retryCount+1;if(c<=s.retry.max_attempts){let f={...o,status:"not-started",retryCount:c,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:f},lastUpdated:new Date().toISOString()}}}let i={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},a=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(a=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&i.executionCount>=s.circuit_breaker.max_executions){let c=s.circuit_breaker.on_break;a=[...new Set([...a,...c])];}return {...t,tasks:{...t.tasks,[r]:i},availableOutputs:a,lastUpdated:new Date().toISOString()}}function Me(t,e,r,n){let o=t.tasks[e]??re(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Ge(t,e){let r=t.tasks[e];if(!r)return t;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:n},lastUpdated:new Date().toISOString()}}function re(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function ne(t,e){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(t.tasks))n[s]=Je();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function zr(t,e){let{config:r,state:n}=t;if("executionId"in e&&e.executionId&&e.executionId!==n.executionId)return t;switch(e.type){case "task-started":return {config:r,state:Le(n,e.taskName,r)};case "task-completed":return {config:r,state:qe(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:Pe(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:Me(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:Ge(n,e.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:en(n,e.action)};case "task-upsert":return Wr(t,e.taskName,e.taskConfig);case "task-removal":return Xr(t,e.taskName);case "node-requires-add":return Yr(t,e.nodeName,e.tokens);case "node-requires-remove":return Zr(t,e.nodeName,e.tokens);case "node-provides-add":return Qr(t,e.nodeName,e.tokens);case "node-provides-remove":return tn(t,e.nodeName,e.tokens);default:return t}}function Ue(t,e){return e.reduce((r,n)=>zr(r,n),t)}function Wr(t,e,r){let n=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:r}},state:{...t.state,tasks:{...t.state.tasks,[e]:n?t.state.tasks[e]:Je()},lastUpdated:new Date().toISOString()}}}function Xr(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function Yr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Bt(n),s=r.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...o,...s]}}},state:t.state}}function Zr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Bt(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:s}}},state:t.state}}function Qr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=pt(n),s=r.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...o,...s]}}},state:t.state}}function tn(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=pt(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:s}}},state:t.state}}function Kt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function oe(t){if(!t||typeof t!="object")throw new Error("Invalid snapshot: expected an object");let e=t;if(!e.config||typeof e.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!e.state||typeof e.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=e.config,n=e.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 Je(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function en(t,e){let r=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:r};case "pause":return {...t,status:"paused",lastUpdated:r};case "resume":return {...t,status:"running",lastUpdated:r};default:return t}}function zt(t){let{config:e,state:r}=t,n=je(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=rn(n),i=Fe(e,r.tasks),a=new Set([...i,...r.availableOutputs]),c=[],f=[],p=[],g=[];for(let[h,y]of Object.entries(n)){let k=r.tasks[h],T=Ne(y,e.settings),I=T!=="once";if(k?.status===Ot.RUNNING||Ce(k))continue;let b=$e(y);if(b!==void 0&&k&&k.executionCount>=b||y.circuit_breaker&&k&&k.executionCount>=y.circuit_breaker.max_executions||!I&&k?.status===Ot.COMPLETED)continue;if(I&&k?.status===Ot.COMPLETED){let _=Bt(y),B=false;switch(T){case "data-changed":{_.length>0&&_.some(U=>{for(let[z,st]of Object.entries(n))if(pt(st).includes(U)){let Y=r.tasks[z];if(!Y)continue;let xt=k.lastConsumedHashes?.[U];return Y.lastDataHash==null?Y.executionCount>k.lastEpoch:Y.lastDataHash!==xt}return false})||(B=true);break}case "epoch-changed":{_.length>0&&_.some(U=>{for(let[z,st]of Object.entries(n))if(pt(st).includes(U)){let Y=r.tasks[z];if(Y&&Y.executionCount>k.lastEpoch)return true}return false})||(B=true);break}case "time-based":{let L=y.refreshInterval??0;if(L<=0){B=true;break}let U=k.completedAt;if(!U){B=true;break}(Date.now()-Date.parse(U))/1e3<L&&(B=true);break}case "manual":B=true;break}if(B)continue}let w=Bt(y);if(w.length===0){c.push(h);continue}let $=[],G=[],x=[];for(let _ of w){if(a.has(_))continue;let B=s[_]||[];B.length===0?$.push(_):B.every(U=>Ce(r.tasks[U]))?x.push({token:_,failedProducer:B[0]}):G.push(_);}$.length>0?p.push({taskName:h,missingTokens:$}):x.length>0?g.push({taskName:h,failedTokens:x.map(_=>_.token),failedProducers:[...new Set(x.map(_=>_.failedProducer))]}):G.length>0?f.push({taskName:h,waitingOn:G}):c.push(h);}let l={};if(c.length>1){let h=De(c,n);for(let[y,k]of Object.entries(h))k.length>1&&(l[y]=k);}return {eligible:c,pending:f,unresolved:p,blocked:g,conflicts:l}}function rn(t){let e={};for(let[r,n]of Object.entries(t)){for(let o of pt(n))e[o]||(e[o]=[]),e[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(r)||e[s].push(r);if(n.on_failure)for(let o of n.on_failure)e[o]||(e[o]=[]),e[o].includes(r)||e[o].push(r);}return e}var Wt=class{constructor(){Oe(this,"buffer",[]);}append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function be(t){let e=Re(t);return nn(e)}function Re(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(Re).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+Re(e[n])).join(",")+"}"}function nn(t){let e=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*r&n;return e.toString(16).padStart(16,"0")}function on(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),r="";for(let n of e)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function sn(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function He(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return on(e)}function an(t){try{let e=JSON.parse(sn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function we(t,e,r){let{handlers:n,onDrain:o}=e,s=new Wt,i="state"in t&&"config"in t?t:ne(t),a=false,c=new Set,f=new Map(Object.entries(n)),p=new Wt,g=false,l=false;function h(){if(!a){if(g){l=true;return}g=true;try{do l=!1,y();while(l)}finally{g=false;}}}function y(){let b=p.drain(),w=s.drain(),$=[...b,...w];$.length>0&&(i=Ue(i,$));let G=zt(i);$.length>0&&o?.($,i,G);for(let x of G.eligible)I(x);for(let x of $)if(x.type==="task-progress"){let{taskName:_,update:B}=x;if(!i.config.tasks[_])continue;let U=i.state.tasks[_];if(!U||U.status!=="running")continue;let z=He(_),st=T(_,z,B).catch(Y=>{a||(p.append({type:"task-failed",taskName:_,error:Y.message??String(Y),timestamp:new Date().toISOString()}),h());}).finally(()=>{c.delete(st);});c.add(st);}}function k(b){let $=i.config.tasks[b].requires??[],G=new Map;for(let[_,B]of Object.entries(i.config.tasks))for(let L of B.provides??[])G.set(L,_);let x={};for(let _ of $){let B=G.get(_);B?x[_]=i.state.tasks[B]?.data:x[_]=void 0;}return x}async function T(b,w,$){let G=i.config.tasks[b],x=G.taskHandlers??[],_=k(b);for(let B of x){let L=f.get(B);if(!L)throw new Error(`Handler '${B}' not found in registry (task '${b}')`);let U={nodeId:b,state:_,taskState:i.state.tasks[b],config:G,callbackToken:w,update:$};if(await L(U)==="task-initiate-failure")throw new Error(`Handler '${B}' returned task-initiate-failure (task '${b}')`)}}function I(b){let $=i.config.tasks[b]?.taskHandlers;if(!$||$.length===0)return;p.append({type:"task-started",taskName:b,timestamp:new Date().toISOString()}),h();let G=He(b),x=T(b,G).catch(_=>{a||(p.append({type:"task-failed",taskName:b,error:_.message??String(_),timestamp:new Date().toISOString()}),h());}).finally(()=>{c.delete(x);});c.add(x);}return {push(b){a||(b.type==="task-completed"&&b.data&&!b.dataHash&&(b={...b,dataHash:be(b.data)}),s.append(b),h());},pushAll(b){if(!a){for(let w of b)w.type==="task-completed"&&w.data&&!w.dataHash?s.append({...w,dataHash:be(w.data)}):s.append(w);h();}},resolveCallback(b,w,$){if(a)return;let G=an(b);if(!G)return;let{taskName:x}=G;if(i.config.tasks[x]){if($&&$.length>0)s.append({type:"task-failed",taskName:x,error:$.join("; "),timestamp:new Date().toISOString()});else {let _=w&&Object.keys(w).length>0?be(w):void 0;s.append({type:"task-completed",taskName:x,data:w,dataHash:_,timestamp:new Date().toISOString()});}h();}},addNode(b,w){a||(s.append({type:"task-upsert",taskName:b,taskConfig:w,timestamp:new Date().toISOString()}),h());},removeNode(b){a||(s.append({type:"task-removal",taskName:b,timestamp:new Date().toISOString()}),h());},addRequires(b,w){a||(s.append({type:"node-requires-add",nodeName:b,tokens:w,timestamp:new Date().toISOString()}),h());},removeRequires(b,w){a||(s.append({type:"node-requires-remove",nodeName:b,tokens:w,timestamp:new Date().toISOString()}),h());},addProvides(b,w){a||(s.append({type:"node-provides-add",nodeName:b,tokens:w,timestamp:new Date().toISOString()}),h());},removeProvides(b,w){a||(s.append({type:"node-provides-remove",nodeName:b,tokens:w,timestamp:new Date().toISOString()}),h());},registerHandler(b,w){f.set(b,w);},unregisterHandler(b){f.delete(b);},retrigger(b){a||i.config.tasks[b]&&(s.append({type:"task-restart",taskName:b,timestamp:new Date().toISOString()}),h());},retriggerAll(b){if(!a){for(let w of b)i.config.tasks[w]&&s.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()});h();}},snapshot(){return Kt(i)},getState(){return i},getSchedule(){return zt(i)},async waitForHandlers(){c.size>0&&await Promise.allSettled([...c]);},async dispose(b){b?.wait&&c.size>0&&await Promise.allSettled([...c]),a=true;}}}function se(){return function(t){if(t==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+t)}}var cn=se();cn("./jsonata-sync.cjs");var un=se(),ae=un("./jsonata-sync.cjs"),ze=ae;function Ve(t,e){if(!e||!t)return;let r=e.split("."),n=t;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function We(t,e,r){let n=e.split("."),o=t;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function dn(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await ae(o.expr).evaluate(n);We(t.computed_values,o.bindTo,s),n.computed_values=t.computed_values;}catch{}return t}function ln(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let i=ze(s.expr).evaluate(n);We(t.computed_values,s.bindTo,i),n.computed_values=t.computed_values;}catch(i){let a=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:a});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function fn(t,e,r){let n={...r??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return ae(t).evaluate(n)}function gn(t,e){return e.startsWith("fetched_sources.")?Ve(t._sourcesData??{},e.slice(16)):Ve(t,e)}var Ke=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),pn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function mn(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let r=t;(typeof r.id!="string"||!r.id)&&e.push("id: required, must be a non-empty string");for(let n of Object.keys(r))pn.has(n)||e.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&e.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))e.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&e.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&e.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&e.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))e.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${i}]: must be an object`);else {let a=s;typeof a.bindTo!="string"||!a.bindTo?e.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(a.bindTo)&&e.push(`source_defs[${i}]: bindTo "${a.bindTo}" is not unique across source_defs`),n.add(a.bindTo)),typeof a.outputFile!="string"||!a.outputFile?e.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(a.outputFile)&&e.push(`source_defs[${i}]: outputFile "${a.outputFile}" is not unique across source_defs`),o.add(a.outputFile)),a.optionalForCompletionGating!=null&&typeof a.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))e.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?e.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):Ke.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...Ke].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&e.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function hn(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await ae(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function yn(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return t.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=ze(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Ut={run:dn,runSync:ln,eval:fn,resolve:gn,validate:mn,enrichSources:hn,enrichSourcesSync:yn};function Xe(t){return JSON.stringify(t)}function Ye(t){let e;try{e=JSON.parse(t);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${t}`)}if(typeof e!="object"||e===null||typeof e.howToRun!="string"||typeof e.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${t}`);return e}function ie(t,e){function r(){return t.readIndex()??{}}function n(o,s,i){let a=String(s||"").split(".").filter(Boolean);if(a.length===0)return i&&typeof i=="object"&&!Array.isArray(i)?i:{value:i};let c={...o},f=c;for(let p=0;p<a.length-1;p++){let g=a[p],l=f[g],h=l&&typeof l=="object"&&!Array.isArray(l)?{...l}:{};f[g]=h,f=h;}return f[a[a.length-1]]=i,c}return {readCard(o){let s=r()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,i]of Object.entries(r())){if(!t.cardExists(i.key))continue;let a=t.readCard(i.key);a?o.push(a):e?.(`[card-store] could not read card "${s}" at key "${i.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,i]of Object.entries(r()))o[s]=i.checksum;return o},changedSince(o){let s=r(),i=[];for(let[a,c]of Object.entries(s))o[a]!==c.checksum&&i.push(a);for(let a of Object.keys(o))s[a]||i.push(a);return i},validateUpsert(o,s){let i=r(),a=i[o],c=Object.entries(i).find(([,f])=>f.key===s);return a&&a.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${a.key}", cannot remap to "${s}"`}:c&&c[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${c[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,i){let a=r(),c=i??a[o]?.key??t.defaultCardKey(o),f=t.writeCard(c,s);a[o]={key:c,checksum:f,updatedAt:new Date().toISOString()},t.writeIndex(a);},patchCard(o,s,i){let a=r(),c=a[o];if(!c||!t.cardExists(c.key))throw new Error(`card "${o}" not found`);let f=t.readCard(c.key);if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`card "${o}" is not patchable`);let p=n(f,s,i),g=t.writeCard(c.key,p);a[o]={key:c.key,checksum:g,updatedAt:new Date().toISOString()},t.writeIndex(a);},removeCard(o){let s=r(),i=s[o];i&&(t.removeCard(i.key),delete s[o],t.writeIndex(s));},readIndex(){return r()}}}function ve(t,e){return {readSourceData(r,n){let o=t.read(`${r}/${n}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,n,o,s){let i=e(o);t.write(`${r}/.staged/${s}/${n}`,i);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,i=t.read(s);return i==null?false:(t.write(`${r}/${n}`,i),t.remove(s),true)},hasSource(r,n){return t.exists(`${r}/${n}`)}}}function rr(t){function e(r){let n=t.readAllEntries();if(!r)return n;let o=n.findIndex(s=>s.id===r);return o===-1?n:n.slice(o+1)}return {readEntriesAfterCursor(r){let n=e(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return e(r).length},appendEvent(r){t.appendEntry({id:t.generateId(),event:r});}}}function nr(t,e){return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.read(r)??[];t.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(i){let a=i instanceof Error?i.message:String(i);try{e(s,a);}catch{}}t.delete(r);}}}}var ce="v1",$t="board/graph",or="board/lastJournalProcessedId";function Ze(t){return `cards/${t}/runtime`}function sr(t){return {readRuntime(e){return t.read(Ze(e))??{_sources:{}}},writeRuntime(e,r){t.write(Ze(e),r);}}}function kn(t,e){let r={...t};for(let n of e.deleteKeys)delete r[n];return {...r,...e.shallowMerge}}function ar(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,r){if(r.schemaVersion!==ce)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=t.readValues(e);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let o=kn(n.values,r);return {ok:true,newVersion:t.writeValues(e,o,r.deleteKeys)}}}}function ir(t){function e(r){let n=t.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=e("task-executor");if(r?.trim())return Ye(r.trim())},writeTaskExecutorRef(r){t.write("task-executor",Xe(r));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(r){t.write("chat-handler-flow",r);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(r){t.write("card-store-ref",r);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(r){t.write("outputs-store-ref",r);},readScratchStoreRef(){return e("scratch-store-ref")},writeScratchStoreRef(r){t.write("scratch-store-ref",r);},readArchiveStoreRef(){return e("archive-store-ref")},writeArchiveStoreRef(r){t.write("archive-store-ref",r);}}}function cr(t){return {writeComputedValues(e,r){t.write(`cards/${e}/computed_values`,r);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let r of t.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(e[n[1]]=t.read(r));}return e},writeDataObjects(e){for(let[r,n]of Object.entries(e))r&&t.write(`data-objects/${r}`,n);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let r of t.listKeys("data-objects/"))e[r.slice(13)]=t.read(r);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function Qe(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Sn(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function tr(t,e){return t?.lastRequestedToken?Sn(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function Cn(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function er(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function ue(t,e){let r=e.state.tasks,n=e.config.tasks,o=Object.keys(r),s=zt(e),i={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},a=new Map;for(let y of s.pending)a.set(y.taskName,y.waitingOn);for(let y of s.unresolved)a.set(y.taskName,y.missingTokens);for(let y of s.blocked)a.set(y.taskName,y.failedTokens);let c=new Map;for(let[y,k]of Object.entries(n))for(let T of k.requires??[]){let I=c.get(T)??[];I.push(y),c.set(T,I);}let f=o.sort().map(y=>{let k=r[y],T=n[y]??{requires:[],provides:[]};k.status==="completed"?i.completed+=1:k.status==="failed"?i.failed+=1:k.status==="in-progress"&&(i.in_progress+=1);let I=T.requires??[],b=T.provides??[],w=Object.keys(k.data??{}).sort(),$=I.filter(U=>e.state.availableOutputs.includes(U)),G=I.filter(U=>!e.state.availableOutputs.includes(U)),x=a.get(y)??G,_=new Set;for(let U of b)for(let z of c.get(U)??[])z!==y&&_.add(z);let B=k.failedAt,L=k.error?{message:k.error,code:"TASK_FAILED",at:B,source:"task-runtime"}:void 0;return {name:y,status:k.status,error:L,requires:I,requires_satisfied:$,requires_missing:G,provides_declared:b,provides_runtime:w,blocked_by:x,unblocks:Array.from(_).sort(),runtime:{attempt_count:k.executionCount??0,restart_count:k.retryCount??0,in_progress_since:k.status==="in-progress"?k.startedAt??null:null,last_transition_at:k.lastUpdated??null,last_completed_at:k.completedAt??null,last_restarted_at:k.startedAt??null,status_age_ms:k.lastUpdated?0:null}}});i.pending=s.pending.length,i.blocked=s.blocked.length,i.unresolved=s.unresolved.length;let p=f.map(y=>({name:y.name,fanOut:y.unblocks.length})).sort((y,k)=>k.fanOut-y.fanOut||y.name.localeCompare(k.name)),g=p.length>0?p[0]:{name:null,fanOut:0},l=new Set;for(let y of Object.values(n))for(let k of y.requires??[])l.add(k);let h=0;for(let[y,k]of Object.entries(n)){let T=(k.requires??[]).length===0,b=(k.provides??[]).some(w=>(c.get(w)??[]).some($=>$!==y));T&&!b&&(h+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:i.completed,eligible:s.eligible.length,pending:i.pending,blocked:i.blocked,unresolved:i.unresolved,failed:i.failed,in_progress:i.in_progress,orphan_cards:h,topology:{edge_count:Array.from(l).length,max_fan_out_card:g.name,max_fan_out:g.fanOut}},cards:f}}function bn(){return new Date().toISOString()}function ur(t,e,r,n,o,s,i){return async a=>{let c=[],f=r.cardStore.readCard(a.nodeId);if(!f)return "task-initiate-failure";let p=f.id,g=f.card_data??{},l=f.source_defs??[],h=l.filter(P=>P.optionalForCompletionGating!==true),y=r.cardRuntimeStore.readRuntime(p),k=false,T=()=>{k&&(r.cardRuntimeStore.writeRuntime(p,y),k=false);},I=P=>Qe(y._sources[P]),b=(P,M)=>{y._sources[P]=Qe(M),k=true;},w=a.taskState?.executionCount??0;if(y._lastExecutionCount!==w&&(y._sources={},y._lastExecutionCount=w,k=true),a.update){let P=a.update,M=P.outputFile;if(M){let W=I(M);if(P.failure){let nt=P.rqt??W.lastRequestedToken??W.queueRequestedToken;nt&&b(M,er(W,nt));}else {let nt=P.rqt;if(!W.lastCompletedToken||nt>W.lastCompletedToken){let gt=typeof P.deliveryToken=="string"?P.deliveryToken:void 0,A=false;gt&&(A=r.fetchedSourcesStore.commitSourceData(p,M,gt)),A?b(M,Cn(W,nt)):b(M,er(W,nt));}}T();}}let G={};for(let P of l)if(P.outputFile){let M=r.fetchedSourcesStore.readSourceData(p,P.outputFile);M!==null&&(G[P.bindTo]=M);}let x={};for(let[P,M]of Object.entries(a.state??{}))if(M!==null&&typeof M=="object"&&!Array.isArray(M)){let W=M[P];x[P]=W!==void 0?W:M;}else x[P]=M;let _={id:p,card_data:{...g},requires:x,source_defs:l,compute:f.compute};_._sourcesData=G,f.compute&&Ut.runSync(_,{sourcesData:G}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(p,_.computed_values??{});let B={...f},L=Ut.enrichSourcesSync(Array.isArray(f.source_defs)?f.source_defs:void 0,{card_data:f.card_data,requires:x}),U=t.value;B.source_defs=Array.isArray(L)?L.map(P=>({...P,boardDir:typeof P.boardDir=="string"&&P.boardDir?P.boardDir:U})):L;let z=bn(),st=a.update?void 0:z,Y=h.filter(P=>{let M=P.outputFile;if(typeof M!="string"||!M)return true;let W=I(M);st&&(W={...W,queueRequestedToken:st},b(M,W));let nt=W.queueRequestedToken??W.lastRequestedToken??z,gt=tr(W,nt);return gt==="in-flight"?false:gt==="dispatch"});if(T(),Y.length>0){let P=false,M=z;for(let W of Y){let nt=W.outputFile;if(typeof nt!="string"||!nt)continue;let gt=I(nt),A=gt.queueRequestedToken??z;b(nt,{...gt,lastRequestedToken:A}),M=A,P=true;}return P&&T(),P&&(c.push({taskKind:"source-fetch",payload:{boardRef:ot(t),enrichedCard:B,callbackToken:a.callbackToken,rqt:M}}),r.executionRequestStore.appendEntries(e,c)),"task-initiated"}if(h.some(P=>{let M=P.outputFile;if(typeof M!="string"||!M)return false;let W=I(M),nt=W.queueRequestedToken??W.lastRequestedToken??z;return tr(W,nt)==="in-flight"}))return "task-initiated";let Tt=f.provides??[],jt={};for(let{bindTo:P,ref:M}of Tt)jt[P]=Ut.resolve(_,M);return (i??r.outputStore.writeDataObjects.bind(r.outputStore))(jt),l.filter(P=>{if(P.optionalForCompletionGating!==true)return false;let M=I(P.outputFile);return !M.lastRequestedToken||!M.lastCompletedToken?true:M.lastCompletedToken<=M.lastRequestedToken}).length>0&&c.push({taskKind:"source-fetch",payload:{boardRef:ot(t),enrichedCard:B,callbackToken:a.callbackToken,rqt:z}}),n(a.nodeId,jt),c.length>0&&r.executionRequestStore.appendEntries(e,c),"task-initiated"}}var Ae={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function dr(t){return {[$t]:t.graph,[or]:t.lastDrainedJournalId}}function lr(t){let e=t[$t],r=t[or];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${$t}`);return {graph:e,lastDrainedJournalId:typeof r=="string"?r:""}}function fr(t){let e=t.requires,r=t.provides?.map(n=>n.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:r,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function at(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function rt(t){return {status:"fail",error:t}}function it(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Rn(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function pr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function de(t){try{let e=JSON.parse(pr(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function wn(t){return Rn(JSON.stringify(t))}function gr(t){try{let e=JSON.parse(pr(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function ut(){return new Date().toISOString()}function mr(t,e){let r=e.onWarn??(()=>{}),n=ot(t);function o(A){if(A.length!==0)try{let S=e.publishBoardChangeNotifications?.(A);S&&typeof S.catch=="function"&&S.catch(O=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${O instanceof Error?O.message:String(O)}`));}catch(S){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${S instanceof Error?S.message:String(S)}`);}}function s(){let A=a().readCardStoreRef();if(!A)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let S=e.kvStorageForRef(A);return {readIndex(){return S.read("_index")},writeIndex(O){S.write("_index",O);},readCard(O){return S.read(O)},writeCard(O,q){return S.write(O,q),e.hashFn(q)},removeCard(O){S.delete(O);},cardExists(O){return S.read(O)!==null},defaultCardKey(O){return O}}}let i={readValues(A){let S=e.kvStorage("state-snapshot"),O=S.listKeys().sort();if(O.length===0)return {version:null,values:{}};let q={};for(let Z of O)q[Z]=S.read(Z);return {version:e.hashFn(q),values:q}},writeValues(A,S,O){let q=e.kvStorage("state-snapshot");for(let Z of O)q.delete(Z);for(let[Z,H]of Object.entries(S))q.write(Z,H);return e.hashFn(S)}},a=()=>ir(e.kvStorage("config")),c=()=>ar(i),f=()=>rr(e.journalAdapter()),p=()=>ie(s(),r),g=()=>{let A=a().readOutputsStoreRef();if(!A)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return cr(e.kvStorageForRef(A))},l=()=>{let A=a().readArchiveStoreRef();return A?e.archiveFactoryForRef(A):e.archiveFactory()};function h(){return !!c().readSnapshot(t.value).values[$t]}function y(){let A=c().readSnapshot(t.value);if(!A.values[$t])throw new Error(`Board not initialized at ${t.value}`);return lr(A.values)}function k(A,S){let O=c().commitSnapshot(t.value,{schemaVersion:ce,expectedVersion:S,commitId:e.genId(),committedAt:ut(),deleteKeys:[],shallowMerge:dr(A)});if(!O.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${S??"null"} current=${O.currentVersion??"null"}`)}function T(A){f().appendEvent(A);}async function I(){let A=(E,F)=>{let tt=E.payload,d=(tt?.enrichedCard??{}).id??tt?.cardId??"unknown";T({type:"task-failed",taskName:d,error:F,timestamp:ut()});},S=nr(e.kvStorage("execution-requests"),A),O=sr(e.kvStorage("card-runtime")),q=ve(e.blobStorage("sources"),E=>e.resolveBlob(E)),Z=new Map,H={readRuntime(E){return Z.get(E)??O.readRuntime(E)},writeRuntime(E,F){Z.set(E,F);}},dt=[],ct=new Map,St={readSourceData(E,F){let tt=`${E}/${F}`;return ct.has(tt)?ct.get(tt):q.readSourceData(E,F)},ingestSourceDataStaged(E,F,tt,u){q.ingestSourceDataStaged(E,F,tt,u);},commitSourceData(E,F,tt){let u=`${E}/.staged/${tt}/${F}`,m=e.blobStorage("sources").read(u);if(m==null)return false;let C=`${E}/${F}`,R=m.trim();try{ct.set(C,JSON.parse(R));}catch{ct.set(C,R);}return dt.push({cardId:E,outputFile:F,deliveryToken:tt}),true},hasSource(E,F){let tt=`${E}/${F}`;return ct.has(tt)?true:q.hasSource(E,F)}},lt={cardStore:p(),cardRuntimeStore:H,fetchedSourcesStore:St,outputStore:g(),executionRequestStore:S},vt=y(),K=oe(vt.graph),{events:mt,newCursor:It}=f().readEntriesAfterCursor(vt.lastDrainedJournalId),wt=[],Dt=[],Lt=[],Ht=new Map,Vt=(E,F)=>{wt.push({type:"task-completed",taskName:E,data:F,timestamp:ut()});try{l().stream("exec-history").append({taskName:E,status:"completed",completedAt:ut()});}catch{}},qt=(E,F)=>{T({type:"task-failed",taskName:E,error:F,timestamp:ut()});try{l().stream("exec-history").append({taskName:E,status:"failed",error:F,completedAt:ut()});}catch{}},Et=we(K,{handlers:{"card-handler":ur(t,It,lt,Vt,qt,(E,F)=>{Dt.push({cardId:E,values:F});},E=>{Lt.push(E);})}});for(wt=mt;wt.length>0;){let E=wt;wt=[];for(let F of E)if(F.type==="task-restart"){let tt=lt.cardStore.readCard(F.taskName);tt&&Ht.set(F.taskName,tt);}Et.pushAll(E),await Et.waitForHandlers();}let Pt=Et.getState();await Et.dispose({wait:true});let ke=c().readSnapshot(t.value).version;k({lastDrainedJournalId:It,graph:Kt(Pt)},ke);for(let{cardId:E,values:F}of Dt)lt.outputStore.writeComputedValues(E,F);for(let E of Lt)lt.outputStore.writeDataObjects(E);for(let[E,F]of Z)O.writeRuntime(E,F);for(let{cardId:E,outputFile:F,deliveryToken:tt}of dt)q.commitSourceData(E,F,tt);let Mt;try{Mt=ue(n,Pt),lt.outputStore.writeStatusSnapshot(Mt);}catch(E){r(`[board-live-cards-public] status publish failed: ${E instanceof Error?E.message:String(E)}`);}let Nt=[];for(let{cardId:E,values:F}of Dt)Nt.push({kind:"computed_values",cardId:E,values:F});for(let E of Lt)for(let[F,tt]of Object.entries(E))F&&Nt.push({kind:"data_object",key:F,payload:tt});for(let[E,F]of Ht)Nt.push({kind:"card_refreshed",cardId:E,card:F});Mt!==void 0&&Nt.push({kind:"status",status:Mt}),o(Nt);let Se=a().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:ot({kind:"built-in",value:"source-cli-task-executor"})};S.dispatchEntriesForJournalId(It,E=>{if(E.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${E.taskKind}" \u2014 skipping`);return}let F=E.payload,tt=F.enrichedCard?.id??"unknown",u=F.enrichedCard?.source_defs??[];for(let d of u){if(!d.outputFile){r(`[dispatch] source "${d.bindTo}" has no outputFile \u2014 skipping`);continue}let m=wn({cbk:F.callbackToken,rg:t.value,br:ot(t),cid:tt,b:d.bindTo,d:d.outputFile,cs:void 0,rqt:F.rqt});e.dispatchExecution(Se,{source_def:d,base_ref:ot(t),callback:{token:m,via:e.selfRef}}).catch(C=>qt(tt,C instanceof Error?C.message:String(C)));}});}async function b(){try{let A=()=>{let O=y(),{events:q}=f().readEntriesAfterCursor(O.lastDrainedJournalId);q.length<=0||(b(),e.requestProcessAccumulated?.());},S=await Be(e.lock,I,A);return at({ran:S!==!1})}catch(A){return it(A)}}function w(){b(),e.requestProcessAccumulated?.();}function $(A){try{let S=A.params?.cardStoreRef;if(!S)return rt("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!h()){let ct=ne(Ae);k({lastDrainedJournalId:"",graph:Kt(ct)},null);}let O=A.params?.outputsStoreRef;if(!O)return rt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let q=A.params?.scratchStoreRef,Z=A.params?.archiveStoreRef,H=a();H.writeCardStoreRef(S),H.writeOutputsStoreRef(O),q&&H.writeScratchStoreRef(q),Z&&H.writeArchiveStoreRef(Z);let dt=A.body??{};dt["task-executor-ref"]&&H.writeTaskExecutorRef(dt["task-executor-ref"]),Object.prototype.hasOwnProperty.call(dt,"chat-handler-flow")&&H.writeChatHandlerFlow(dt["chat-handler-flow"]);try{g().writeStatusSnapshot(ue(n,oe(y().graph)));}catch{}return at()}catch(S){return it(S)}}function G(A){try{let S=g().readStatusSnapshot();if(!S){S=ue(n,oe(y().graph));try{g().writeStatusSnapshot(S);}catch{}}return at(S)}catch(S){return it(S)}}function x(A){try{let S=A.params?.id;return S?(T({type:"task-removal",taskName:S,timestamp:ut()}),w(),at()):rt("removeCard requires params.id")}catch(S){return it(S)}}function _(A){try{let S=A.params?.id;return S?(T({type:"task-restart",taskName:S,timestamp:ut()}),w(),at()):rt("retrigger requires params.id")}catch(S){return it(S)}}async function B(A){return b()}function L(A){try{let S=A.params?.cardId,O=A.params?.all,q=!!A.params?.restart;if(!S&&!O)return rt("upsertCard requires --card-id <id> or --all");let Z=O?p().readAllCards().map(H=>H.id):[S];for(let H of Z)if(!p().readCard(H))return rt(`Card "${H}" not found in board at ${t.value}`);for(let H of Z){let dt=p().readCard(H),ct=fr(dt),St=e.hashFn(ct),lt=e.kvStorage("card-upsert"),vt=lt.read(H),K=vt?.taskConfigHash!==St;if(!(!K&&!q)){if(K){let mt=vt?.blobRef??p().readCardKey(H)??H;T({type:"task-upsert",taskName:H,taskConfig:ct,timestamp:ut()}),lt.write(H,{blobRef:mt,taskConfigHash:St,updatedAt:ut()});}q&&T({type:"task-restart",taskName:H,timestamp:ut()});}}return w(),at()}catch(S){return it(S)}}function U(A){try{let S=A.params?.token;if(!S)return rt("taskFailed requires params.token");let O=A.params?.error??"unknown error",q=de(S);if(!q)return rt("Invalid callback token");T({type:"task-failed",taskName:q.taskName,error:O,timestamp:ut()});try{l().stream("exec-history").append({taskName:q.taskName,status:"failed",error:O,completedAt:ut()});}catch{}return w(),at()}catch(S){return it(S)}}function z(A){try{let S=A.params?.token;if(!S)return rt("taskProgress requires params.token");let q=(A.body??{}).update??{},Z=de(S);return Z?(T({type:"task-progress",taskName:Z.taskName,update:q,timestamp:ut()}),w(),at()):rt("Invalid callback token")}catch(S){return it(S)}}function st(A){try{let S=A.params?.token,O=A.params?.ref;if(!S)return rt("sourceDataFetched requires params.token");if(!O)return rt("sourceDataFetched requires params.ref");let q=gr(S);if(!q)return rt("Invalid source token");let{cbk:Z,cid:H,b:dt,d:ct,cs:St,rqt:lt}=q,vt=ve(e.blobStorage("sources"),wt=>e.resolveBlob(wt)),K=e.genId();vt.ingestSourceDataStaged(H,ct,bt(O),K);let mt=de(Z);if(!mt)return rt("Invalid callback token embedded in source token");let It=ut();return T({type:"task-progress",taskName:mt.taskName,update:{bindTo:dt,outputFile:ct,fetchedAt:It,deliveryToken:K,sourceChecksum:St,rqt:lt},timestamp:It}),w(),at()}catch(S){return it(S)}}function Y(A){try{let S=A.params?.token,O=A.params?.reason??"unknown";if(!S)return rt("sourceDataFetchFailure requires params.token");let q=gr(S);if(!q)return rt("Invalid source token");let{cbk:Z,b:H,d:dt,cs:ct,rqt:St}=q,lt=de(Z);return lt?(T({type:"task-progress",taskName:lt.taskName,update:{bindTo:H,outputFile:dt,failure:!0,reason:O,sourceChecksum:ct,rqt:St},timestamp:ut()}),w(),at()):rt("Invalid callback token embedded in source token")}catch(S){return it(S)}}function xt(A){try{let S=a().readCardStoreRef();return S?at({storeRef:S}):rt(`Board at ${t.value} has no card store configured`)}catch(S){return it(S)}}function Tt(A){try{let S=a().readOutputsStoreRef();return S?at({storeRef:S}):rt(`Board at ${t.value} has no outputs store configured`)}catch(S){return it(S)}}function jt(A){try{let S=a().readScratchStoreRef();return at({storeRef:S})}catch(S){return it(S)}}function Yt(A){try{let S=a().readArchiveStoreRef();return at({storeRef:S})}catch(S){return it(S)}}function P(A){try{let S=A.params?.key;if(!S)return rt("getConfig requires params.key");let O=a(),q;switch(S){case "task-executor":q=O.readTaskExecutorRef()??null;break;case "chat-handler-flow":q=O.readChatHandlerFlow()??null;break;case "card-store-ref":q=O.readCardStoreRef();break;case "outputs-store-ref":q=O.readOutputsStoreRef();break;case "scratch-store-ref":q=O.readScratchStoreRef();break;case "archive-store-ref":q=O.readArchiveStoreRef();break;default:return rt(`getConfig: unknown key "${S}"`)}return at({value:q})}catch(S){return it(S)}}function M(A){try{let S=A.params?.key;if(!S)return rt("getOutputsDataObject requires params.key");let O=g().readDataObject(S);return at(O)}catch(S){return it(S)}}function W(A){try{return at(g().readAllDataObjects())}catch(S){return it(S)}}function nt(A){try{let S=A.params?.key;if(!S)return rt("getOutputsComputedValues requires params.key");let O=g().readComputedValues(S);return at(O)}catch(S){return it(S)}}function gt(A){try{return at(g().readAllComputedValues())}catch(S){return it(S)}}return {init:$,status:G,getCardStoreRef:xt,getOutputsStoreRef:Tt,getScratchStoreRef:jt,getArchiveStoreRef:Yt,getConfig:P,getOutputsDataObject:M,getAllOutputsDataObjects:W,getOutputsComputedValues:nt,getAllOutputsComputedValues:gt,removeCard:x,retrigger:_,processAccumulatedEvents:B,upsertCard:L,taskFailed:U,taskProgress:z,sourceDataFetched:st,sourceDataFetchFailure:Y}}function hr(t){function e(o){return {status:"success",data:o}}function r(o){return {status:"fail",error:o}}function n(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let i=t.readCard(s);return i?e({cards:[i]}):r(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return n(s)}},set(o){try{let s=o.body;if(s==null)return r("set requires a body (card object or array of cards)");let i=Array.isArray(s)?s:[s];for(let a of i){if(typeof a.id!="string")return r("each card must have a string `id` field");t.writeCard(a.id,a);}return e({count:i.length})}catch(s){return n(s)}},del(o){try{let s=o.body?.ids??[],i=o.params?.id,a=i?[...s,i]:s;if(a.length===0)return r("del requires body.ids (string[]) or params.id");for(let c of a)t.removeCard(c);return e({count:a.length})}catch(s){return n(s)}},patch(o){try{let s=o.params?.id,i=o.params?.path;if(!s)return r("patch requires params.id");if(!i)return r("patch requires params.path");let a=o.body,c=a&&Object.prototype.hasOwnProperty.call(a,"value")?a.value:o.body;return t.patchCard(s,i,c),e({count:1})}catch(s){return n(s)}}}}function yr(){return new Date().toISOString()}function kr(t){return new TextEncoder().encode(t).byteLength}function vn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function An(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function _n(t){let e=String(t||"").trim();if(!e)return "upload.bin";let r=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (r>=0?e.slice(r+1):e)||"upload.bin"}function xn(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Tn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function In(t){let e=_n(t),r=e.lastIndexOf(".");return r<=0||r===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,r),ext:e.slice(r)}}function En(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function Sr(t){function e(r){let n=t.stat?vn(t.stat(r)):null;if(n)return n;if(!t.exists(r))return null;let o=t.read(r);return o===null?{key:r}:{key:r,size:kr(o)}}return {exists(r){return t.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){t.write(r,n);let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??yr(),s.size=s.size??kr(n),s},putBytes(r,n,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});t.write(r,i);}let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??yr(),s.size=s.size??n.byteLength,s},getText(r){let n=t.read(r);if(n===null){if(!t.readBytes)return null;let o=t.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(t.readBytes){let o=t.readBytes(r);if(o!==null)return o}let n=t.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:e,list(r=""){return t.listKeys(r).map(n=>e(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){t.remove(r);}}}function Cr(t){function e(o,s){let i=0,a=[];Array.isArray(s)&&a.push(...s);for(let c of t.list(`${o}/`))a.push(En(c.key));for(let c of a){let f=An(c);Number.isFinite(f)&&f>i&&(i=f);}return i+1}function r(o,s,i){let a=Number(i?.maxLen||32),{stem:c,ext:f}=In(o),p=Tn(f),g=xn(c),l=`${String(s).padStart(3,"0")}-`,h=p,y=a-l.length-h.length;y<1&&(h="",y=a-l.length);let k=g.slice(0,Math.max(1,y)),T=`${l}${k}${h}`;return T.length>a&&(T=T.slice(0,a).replace(/\.$/,"")),T}function n(o,s,i){let a=e(o,i?.seedNames),c=r(s,a,{maxLen:i?.maxLen});for(;t.exists(`${o}/${c}`);)a+=1,c=r(s,a,{maxLen:i?.maxLen});return c}return {nextSerial:e,buildStoredName:r,allocateStoredName:n}}function br(){function t(o,s){if(!Array.isArray(o))return [];let i=[];for(let a of o){if(!a||typeof a!="object")continue;let c=a;typeof c.stored_name=="string"&&i.push({name:typeof c.name=="string"?c.name:c.stored_name,stored_name:c.stored_name,size:typeof c.size=="number"&&Number.isFinite(c.size)?c.size:null,mime_type:typeof c.mime_type=="string"?c.mime_type:null,uploaded_at:typeof c.uploaded_at=="string"?c.uploaded_at:s||null,chat:c.chat===true});}return i}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function r(o,s){let i=e(o);if(s.length===0)return o.files=i,i;let a=new Set(i.map(c=>c.stored_name));for(let c of s)a.has(c.stored_name)||(i.push(c),a.add(c.stored_name));return o.files=i,i}function n(o,s,i){let a=e(o);if(!Number.isInteger(s)||s<0||s>=a.length)return {ok:false,reason:"index_out_of_range"};let c=a[s];return !c||!c.stored_name?{ok:false,reason:"missing_stored_name"}:i&&i!==c.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:c}}return {read:e,normalizeIncoming:t,merge:r,resolve:n}}function Rr(t){return String(t).replace(/[^a-zA-Z0-9_-]/g,"_")}function wr(t){let e=t.payload??{};return {id:t.id,role:typeof e.role=="string"?e.role:"system",text:typeof e.text=="string"?e.text:"",files:Array.isArray(e.files)?e.files:[],updated_at:typeof e.updated_at=="string"?e.updated_at:""}}function vr(t,e){let r=o=>`chats/${Rr(o)}/processing`,n=o=>`chats/${Rr(o)}/config`;return {append(o,s,i,a=[]){return t(o).append({role:s,text:i,files:a,updated_at:new Date().toISOString()}).id},readAll(o){return t(o).readAll().map(wr)},readAfter(o,s){let i=t(o).readAfter(s);return {records:i.entries.map(wr),cursor:i.newCursor}},clear(o){t(o).clear?.();},setProcessing(o,s){s?e.write(r(o),true):e.delete(r(o));},isProcessing(o){return e.read(r(o))===true},getConfig(o){return e.read(n(o))??{}},setConfig(o,s){let i=e.read(n(o))??{};e.write(n(o),{...i,...s});}}}function On(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function Ar(){let t=new Map,e=new Map;function r(n){return t.has(n)||t.set(n,[]),t.get(n)}return {append(n,o,s,i=[]){let a={id:On(),role:o,text:s,files:i,updated_at:new Date().toISOString()};return r(n).push(a),a.id},readAll(n){return r(n).slice()},readAfter(n,o){let s=r(n);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let i=s.findIndex(c=>c.id===o),a=i===-1?s.slice():s.slice(i+1);return {records:a,cursor:a.length>0?a[a.length-1].id:o}},clear(n){t.set(n,[]);},setProcessing(n,o){o?e.set(`p:${n}`,true):e.delete(`p:${n}`);},isProcessing(n){return e.get(`p:${n}`)===true},getConfig(n){return e.get(`c:${n}`)??{}},setConfig(n,o){let s=e.get(`c:${n}`)??{};e.set(`c:${n}`,{...s,...o});}}}function _r(t){function e(a){return {status:"success",data:a}}function r(a){return {status:"fail",error:a}}function n(a){return {status:"error",error:a instanceof Error?a.message:String(a)}}function o(a,c="command envelope"){let f=typeof a.cardId=="string"?a.cardId:void 0;if(!a.command)return r(`chat-store: ${c} missing "command"`);if(!f)return r(`chat-store: ${c} missing "cardId"`);if(a.command==="append")return i.append({params:{cardId:f},body:{role:a.role,text:a.text,files:a.files}});if(a.command==="read-all")return i.readAll({params:{cardId:f}});if(a.command==="read-after")return i.readAfter({params:{cardId:f},body:{cursor:a.cursor??null}});if(a.command==="clear")return i.clear({params:{cardId:f}});if(a.command==="set-processing")return i.setProcessing({params:{cardId:f},body:{active:a.active}});if(a.command==="is-processing")return i.isProcessing({params:{cardId:f}});if(a.command==="get-config")return i.getConfig({params:{cardId:f}});if(a.command==="set-config"){let{command:p,cardId:g,...l}=a;return i.setConfig({params:{cardId:f},body:l})}return r(`chat-store: unknown command "${String(a.command)}"`)}function s(a){if(!Array.isArray(a.commands)||a.commands.length===0)return r('chat-store: command envelope must include a non-empty "commands" array');let c=[];for(let f=0;f<a.commands.length;f+=1){let p=a.commands[f];if(!p||typeof p!="object"||Array.isArray(p))return r(`chat-store: command envelope entry ${f} must be an object`);let g={cardId:a.cardId,...p},l=o(g,`command envelope entry ${f}`);if(l.status!=="success")return l;c.push({index:f,command:String(g.command),data:l.data});}return e({results:c})}let i={append(a){try{let c=a.params?.cardId;if(!c)return r("append requires params.cardId");let f=a.body??{},p=typeof f.role=="string"?f.role:"",g=typeof f.text=="string"?f.text:"",l=Array.isArray(f.files)?f.files:[];if(!p)return r("append requires body.role");let h=t.append(c,p,g,l);return e({id:h})}catch(c){return n(c)}},readAll(a){try{let c=a.params?.cardId;return c?e({records:t.readAll(c)}):r("readAll requires params.cardId")}catch(c){return n(c)}},readAfter(a){try{let c=a.params?.cardId;if(!c)return r("readAfter requires params.cardId");let p=(a.body??{}).cursor??null;return e(t.readAfter(c,p))}catch(c){return n(c)}},clear(a){try{let c=a.params?.cardId;return c?(t.clear(c),e({ok:!0})):r("clear requires params.cardId")}catch(c){return n(c)}},setProcessing(a){try{let c=a.params?.cardId;if(!c)return r("setProcessing requires params.cardId");let f=a.body??{};return typeof f.active!="boolean"?r("setProcessing requires body.active (boolean)"):(t.setProcessing(c,f.active),e({ok:!0}))}catch(c){return n(c)}},isProcessing(a){try{let c=a.params?.cardId;return c?e({active:t.isProcessing(c)}):r("isProcessing requires params.cardId")}catch(c){return n(c)}},getConfig(a){try{let c=a.params?.cardId;return c?e({config:t.getConfig(c)}):r("getConfig requires params.cardId")}catch(c){return n(c)}},setConfig(a){try{let c=a.params?.cardId;if(!c)return r("setConfig requires params.cardId");let f=a.body??{};return t.setConfig(c,f),e({ok:!0})}catch(c){return n(c)}},run:o,runBatch:s};return i}var Bn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},jn=32;function Nn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function xr(t){if(!t||typeof t!="object")return false;let e=t.summary;return !e||typeof e!="object"?false:Number(e.card_count||0)>0}function Tr(t,e){if(!e||typeof e!="object")return;let r=e;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)Tr(t,n);return}r.kind==="status"&&xr(r.status)&&(t.status=r.status),r.kind==="computed_values"&&r.cardId&&(t.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(t.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(t.cards[r.cardId]=r.card);}function Ir(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),r={...Bn,...t.corsHeaders||{}},n=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,i=t.chatFlowRunner||null,a=t.chatStorage??Ar(),c=_r(a),f=t.notificationTransport||null,p=t.serverUrl||null,g=t.executionExtra||{},l=new Map,h=new Map,y=new Map,k=null;function T(u){let d=mr(u.baseRef,u.boardAdapter),m=u.boardAdapter.kvStorageForRef(u.cardStoreRef),R=hr(ie({readIndex:()=>m.read("_index"),writeIndex:j=>m.write("_index",j),readCard:j=>m.read(j),writeCard:(j,X)=>(m.write(j,X),j),cardExists:j=>m.read(j)!==null,defaultCardKey:j=>j},o.warn)),v=u.artifactsAdapter||u.boardAdapter,N=u.filesArtifactsStore??null,D=null;return {label:u.label,board:d,cardStore:R,get filesArtifacts(){return D??(D=N??Sr(v.blobStorage("files")))},boardAdapter:u.boardAdapter,cardStoreRef:u.cardStoreRef,outputsStoreRef:u.outputsStoreRef,scratchStoreRef:u.scratchStoreRef,archiveStoreRef:u.archiveStoreRef,notifyRef:u.notifyRef,taskExecutorRef:u.taskExecutorRef,chatHandlerRef:u.chatHandlerRef,chatHandlerFlow:u.chatHandlerFlow,inferenceAdapterRef:u.inferenceAdapterRef,notification:Nn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let I=t.boards.map(T),b=new Map;function w(u){return b.get(u)??0}function $(u){let d=I[w(u)];return {files:d?d.filesArtifacts:null}}function G(u){let d=$(u);return d.files?Cr(d.files):null}function x(){return br()}function _(u){return String(u||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function B(u){if(!u||u.notificationTeardown||!f||!u.notifyRef)return;let d=await f.subscribe(u.notifyRef,m=>{Tr(u.notification,m);let C=m.kind==="notification-batch"?m.notifications:[m];E(C);});u.notificationTeardown=d;}async function L(u){if(!u||u.initialized)return;let d={cardStoreRef:u.cardStoreRef,outputsStoreRef:u.outputsStoreRef};u.scratchStoreRef&&(d.scratchStoreRef=u.scratchStoreRef),u.archiveStoreRef&&(d.archiveStoreRef=u.archiveStoreRef);let m={};u.taskExecutorRef&&(m["task-executor-ref"]=u.taskExecutorRef),u.chatHandlerFlow!==void 0&&(m["chat-handler-flow"]=u.chatHandlerFlow),u.inferenceAdapterRef&&(m["inference-adapter-ref"]=u.inferenceAdapterRef);let C=u.board.init({params:d,body:m});if(C.status!=="success")throw Object.assign(new Error(C.error||`init failed for ${u.label}`),{statusCode:500});if(await B(u),!u.chatHandlerFlow&&u.chatHandlerRef&&s.describe)try{let R=await s.describe(u.chatHandlerRef);R&&R.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${R.kind}", expected "chat-handler" for ${u.label}`):R&&o.info(`[init] chat-handler validated: ${R.name} (protocol ${R.protocolVersion}) for ${u.label}`);}catch(R){o.warn(`[init] chat-handler describe failed for ${u.label}: ${R?.message||String(R)}`);}u.initialized=true;}function U(u){if(!u.boardAdapter.publishBoardChangeNotifications)return;let d=[],m=u.board.status({});m.status==="success"&&m.data!=null&&xr(m.data)&&d.push({kind:"status",status:m.data});let C=u.board.getAllOutputsDataObjects({});if(C.status==="success"&&C.data!=null)for(let[v,N]of Object.entries(C.data))v&&d.push({kind:"data_object",key:v,payload:N});let R=u.board.getAllOutputsComputedValues({});if(R.status==="success"&&R.data!=null)for(let[v,N]of Object.entries(R.data))v&&d.push({kind:"computed_values",cardId:v,values:N});d.length>0&&u.boardAdapter.publishBoardChangeNotifications(d);}function z(u,d){if(!u||u.cardsBootstrapped)return;let m=u.cardStore.get({}),C=m.status==="success"&&Array.isArray(m.data?.cards)?m.data.cards:[];for(let R of C)typeof R.id=="string"&&(b.set(R.id,d),u.board.upsertCard({params:{cardId:R.id}}));u.cardsBootstrapped=true;}async function st(){for(let u of I)await L(u);}async function Y(){await st();for(let u=0;u<I.length;u++)U(I[u]),z(I[u],u);}function xt(u){return I[w(u)]??null}function Tt(u){let d=xt(u);if(!d)return null;let m=d.cardStore.get({params:{id:u}});if(m.status!=="success")return null;let C=Array.isArray(m.data?.cards)?m.data.cards:[];return C.length>0?C[0]:null}function jt(){let u=m=>{if(!m||!m.cardStore)return [];let C=m.cardStore.get({});return C.status!=="success"||!Array.isArray(C.data?.cards)?[]:C.data.cards},d=[];for(let m of I)d.push(...u(m));return d}function Yt(){let u=I.map(v=>{try{let D=v.boardAdapter.kvStorageForRef(v.outputsStoreRef).read("status");if(D!=null)return D}catch{}return v.notification.status}).filter(Boolean);if(u.length===0)return null;if(u.length===1)return u[0];let d=[],m=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],C={};for(let v of m)C[v]=0;for(let v of u){let N=v,D=Array.isArray(N.cards)?N.cards:[];d.push(...D);for(let j of m)C[j]+=Number(N?.summary?.[j]||0);}let R=u[0];return {...R,cards:d,summary:{...R.summary||{},card_count:d.length,...C}}}function P(){let u={},d=m=>{for(let[C,R]of Object.entries(m.notification.computedValues)){let v=m.notification.cards[C];u[C]={schema_version:"v1",card_id:C,card_data:v?.card_data??{},computed_values:R??{}};}};for(let m of I)d(m);return u}function M(){let u={};for(let d of I)Object.assign(u,d.notification.dataObjects||{});return u}function W(){let u=jt(),d=P(),m=M(),C={};for(let v of u){if(!v?.id)continue;let N=v.id,D=d[N]||{},j={...D.card_data&&typeof D.card_data=="object"?D.card_data:v.card_data&&typeof v.card_data=="object"?v.card_data:{}};C[N]={schema_version:D.schema_version||"v1",card_id:D.card_id||N,card_data:j,computed_values:D.computed_values&&typeof D.computed_values=="object"?D.computed_values:{}};}let R={};for(let v of u){if(!v?.id)continue;let N=v.id;try{let D=H(N),j=a.isProcessing(N);(D.length>0||j)&&(R[N]={messages:D.map(X=>({role:String(X.role||"system"),text:String(X.text||""),files:Array.isArray(X.files)?X.files:[]})),receiving:!1,processing:j});}catch{}}return {boardId:n,cardDefinitions:u,statusSnapshot:Yt(),dataObjectsByToken:m,cardRuntimeById:C,cardChatsByCardId:R}}function nt(u,d,m){let C=m?.syncBoard!==false,R=xt(u);if(!R)throw Object.assign(new Error(`Card not found: ${u}`),{statusCode:404});let v=Tt(u);if(!v)throw Object.assign(new Error(`Card not found: ${u}`),{statusCode:404});let N=d(v)||v,D=R.cardStore.set({body:N});if(D.status!=="success")throw Object.assign(new Error(D.error||`Failed to persist card: ${u}`),{statusCode:500});if(C){let j=R.board.upsertCard({params:{cardId:u,restart:true}});if(j.status!=="success")throw Object.assign(new Error(j.error||`Failed to upsert card: ${u}`),{statusCode:500})}}function gt(u,d){nt(u,d,{syncBoard:true});}function A(u,d){nt(u,d,{syncBoard:false});}function S(u,d){gt(u,m=>{if(!d||typeof d!="object"||Object.keys(d).length===0)return m;function C(R,v,N){let D=String(v||"").split(".").filter(Boolean);if(!D.length)return;let j=R;for(let X=0;X<D.length-1;X++){let et=D[X];(!j[et]||typeof j[et]!="object")&&(j[et]={}),j=j[et];}j[D[D.length-1]]=N;}if(d.fieldValues!==void 0&&d.fieldValues!==null){let R=null,v=m.view;if(v&&Array.isArray(v.elements)){for(let N of v.elements)if(N?.data&&N.data.writeTo){R=N.data.writeTo;break}}R?C(m,R,d.fieldValues):typeof d.fieldValues=="object"&&!Array.isArray(d.fieldValues)&&(m.card_data={...m.card_data||{},...d.fieldValues});}else {if(Array.isArray(d._stagedFiles)&&d._stagedFiles.length>0)return m;for(let[R,v]of Object.entries(d))R!=="_stagedFiles"&&(v!==null&&typeof v=="object"&&!Array.isArray(v)&&m[R]!==null&&typeof m[R]=="object"&&!Array.isArray(m[R])?m[R]={...m[R],...v}:m[R]=v);}return m});}function O(u){let d=String(u||"").trim();if(!d)return "upload.bin";let m=Math.max(d.lastIndexOf("/"),d.lastIndexOf("\\"));return (m>=0?d.slice(m+1):d)||"upload.bin"}function q(u){a.clear(u),a.setProcessing(u,false);}function Z(u,d,m,C){let R=typeof m=="string"?m.trim():"";return a.append(u,d,R,C)}function H(u){return a.readAll(u)}function dt(u){let d=[];try{let m=Tt(u);if(!m)return d;let C=x().read(m.card_data&&typeof m.card_data=="object"?m.card_data:null);for(let R of C)d.push(R.stored_name);}catch{}return d}function ct(u,d,m,C){let R=_(u),v=$(u),N=O(d),D=G(u),j=D?D.allocateStoredName(R,N,{seedNames:dt(u),maxLen:jn}):`${String(Date.now())}-${N}`;return v.files&&v.files.putBytes(`${R}/${j}`,new Uint8Array(C),m||"application/octet-stream"),{name:N,stored_name:j,size:C.length,mime_type:m||"application/octet-stream",uploaded_at:new Date().toISOString()}}function St(u){let d=xt(u);if(!d)return null;let m=d.board.getConfig({params:{key:"chat-handler-flow"}}),C=m.status==="success"?m.data?.value:null,R=d.chatHandlerRef;return C==null&&(!R||typeof R!="object")?null:{ctx:d,handlerFlow:C,handlerRef:R}}function lt(u,d,m=false){let C=St(u);if(!C)return;let{ctx:R,handlerFlow:v,handlerRef:N}=C;if(!m)try{a.setProcessing(u,!0);}catch{}let D={boardId:n,cardId:String(u),lastChatEntryId:d,...g,...p?{serverUrl:p}:{}};if(!i&&v!=null){try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${u}" but no chatFlowRunner was provided`);return}if(v!=null){let X=i;if(!X)return;X.run(v,D,{boardId:n,cardId:String(u),label:R.label,logger:o,serverUrl:p,executionExtra:g}).then(et=>{if(et.dispatched)o.info(`[chat-handler-flow] invoked for card "${u}" (boardId: "${n}")`);else {try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${u}": ${et.error||"unknown"}`);}},et=>{try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${u}": ${et?.message||String(et)}`);});return}let j=N;j&&s.invoke(j,D).then(X=>{if(X.dispatched)o.info(`[chat-handler] invoked for card "${u}" (boardId: "${n}")`);else {try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${u}": ${X.error||"unknown"}`);}},X=>{try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${u}": ${X?.message||String(X)}`);});}function vt(u,d,m){let C=d==="chat-send"?A:gt,R;C(u,v=>{let N=new Date().toISOString(),D=v.card_data&&typeof v.card_data=="object"?v.card_data:{};if(v.card_data=D,d==="chat-send"){let j=m&&typeof m.text=="string"?m.text.trim():"",X=[];if(Array.isArray(m?.files)){for(let et of m.files)if(et){if(typeof et=="string"){X.push({name:et});continue}if(typeof et=="object"){let ft=et;typeof ft.name=="string"&&X.push({name:ft.name,size:ft.size,mime_type:ft.mime_type,uploaded_at:ft.uploaded_at,stored_name:ft.stored_name,chat:ft.chat===true});}}}if(j||X.length>0){let et=c.runBatch({cardId:u,commands:[{command:"append",role:"user",text:j,files:X},{command:"set-processing",active:true}]});if(et.status!=="success")throw new Error(et.error);let ft=et.data.results[0]?.data?.id;if(typeof ft!="string"||!ft)throw new Error(`chat-send did not return an append id for card ${u}`);R={cardId:u,lastEntryId:ft,processingAlreadySet:true};try{let J=H(u);E([{kind:"card_chats",cardId:u,messages:J.map(Q=>({role:String(Q.role||"system"),text:String(Q.text||""),files:Array.isArray(Q.files)?Q.files:[]})),receiving:!0,processing:a.isProcessing(u)}]);}catch{}}return v}if(d==="file-upload"){let j=x().normalizeIncoming(m?.files,N);return j.length>0&&x().merge(D,j),v}if(d==="action"){let j=m&&typeof m.buttonId=="string"?m.buttonId:"";if(!j)return v;D.lastAction={buttonId:j,at:N},D.lastActionText=`${j} @ ${N}`;}return v}),R&&lt(R.cardId,R.lastEntryId,R.processingAlreadySet);}function K(u,d,m){let C=JSON.stringify(m),R=typeof Buffer<"u"?Buffer.byteLength(C):new TextEncoder().encode(C).length;u.writeHead(d,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":R}),u.end(C);}async function mt(u){let d=[];for await(let C of u)d.push(C);let m=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(wt(d)).trim();return m?JSON.parse(m):{}}async function It(u){let d=[];for await(let m of u)d.push(m);return typeof Buffer<"u"?Buffer.concat(d):wt(d)}function wt(u){let d=u.reduce((R,v)=>R+v.length,0),m=new Uint8Array(d),C=0;for(let R of u)m.set(R,C),C+=R.length;return m}let Dt=0;function Lt(u){let d=JSON.stringify(u);return Dt++,`id: ${Dt}
1
+ var BoardLiveCardsLocalStorage=(function(exports){'use strict';var Jr=Object.defineProperty;var Vr=(t,e,r)=>e in t?Jr(t,e,{enumerable:true,configurable:true,writable:true,value:r}):t[e]=r;var Oe=(t,e,r)=>Vr(t,e+"",r);var ee="b64:";function Hr(t){let e=new TextEncoder().encode(t),r=globalThis.Buffer,n;if(r)n=r.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Kr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),r=globalThis.Buffer;if(r)return r.from(e,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(e),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ot(t){return `${ee}${Hr(JSON.stringify(t))}`}function Ct(t){if(!t.startsWith(ee))throw new Error(`Invalid ref format (expected ${ee}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(Kr(t.slice(ee.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!e||typeof e!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let r=e;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:r.kind,value:r.value}}async function Be(t,e,r){let n=t.tryAcquire();if(!n)return false;try{await e();}finally{n();}return r?.(),true}var Ot={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function pt(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function Bt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function je(t){return t.tasks??{}}function be(t){return t?t.status===Ot.FAILED||t.status===Ot.INACTIVATED:false}function Ne(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function $e(t){return t.maxExecutions}function Pe(t,e){let r=new Set;for(let[n,o]of Object.entries(e))if(o.status===Ot.COMPLETED){let s=t.tasks[n];s&&pt(s).forEach(a=>r.add(a));}return Array.from(r)}function Fe(t,e){let r={};return t.forEach(n=>{let o=e[n];if(!o)return;pt(o).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function De(t,e,r){let n=t.tasks[e]??re(),o={};if(r){let i=r.tasks[e],a=Bt(i);for(let c of a)for(let[f,p]of Object.entries(r.tasks))if(pt(p).includes(c)){let g=t.tasks[f];g?.lastDataHash&&(o[c]=g.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Le(t,e,r,n,o,s){let i=t.tasks[r]??re(),a=e.tasks[r];if(!a)throw new Error(`Task "${r}" not found in graph`);let c;n&&a.on&&a.on[n]?c=a.on[n]:c=pt(a);let f=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let l=a.requires??[];for(let h of l)for(let[y,k]of Object.entries(e.tasks))if(pt(k).includes(h)){let T=t.tasks[y];T?.lastDataHash&&(f[h]=T.lastDataHash);break}}let p={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:f,error:void 0},g=[...new Set([...t.availableOutputs,...c])];return {...t,tasks:{...t.tasks,[r]:p},availableOutputs:g,lastUpdated:new Date().toISOString()}}function qe(t,e,r,n){let o=t.tasks[r]??re(),s=e.tasks[r];if(s?.retry){let c=o.retryCount+1;if(c<=s.retry.max_attempts){let f={...o,status:"not-started",retryCount:c,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:f},lastUpdated:new Date().toISOString()}}}let i={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},a=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(a=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&i.executionCount>=s.circuit_breaker.max_executions){let c=s.circuit_breaker.on_break;a=[...new Set([...a,...c])];}return {...t,tasks:{...t.tasks,[r]:i},availableOutputs:a,lastUpdated:new Date().toISOString()}}function Me(t,e,r,n){let o=t.tasks[e]??re(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Ge(t,e){let r=t.tasks[e];if(!r)return t;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:n},lastUpdated:new Date().toISOString()}}function re(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function ne(t,e){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(t.tasks))n[s]=Je();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function zr(t,e){let{config:r,state:n}=t;if("executionId"in e&&e.executionId&&e.executionId!==n.executionId)return t;switch(e.type){case "task-started":return {config:r,state:De(n,e.taskName,r)};case "task-completed":return {config:r,state:Le(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:qe(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:Me(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:Ge(n,e.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:en(n,e.action)};case "task-upsert":return Wr(t,e.taskName,e.taskConfig);case "task-removal":return Xr(t,e.taskName);case "node-requires-add":return Yr(t,e.nodeName,e.tokens);case "node-requires-remove":return Zr(t,e.nodeName,e.tokens);case "node-provides-add":return Qr(t,e.nodeName,e.tokens);case "node-provides-remove":return tn(t,e.nodeName,e.tokens);default:return t}}function Ue(t,e){return e.reduce((r,n)=>zr(r,n),t)}function Wr(t,e,r){let n=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:r}},state:{...t.state,tasks:{...t.state.tasks,[e]:n?t.state.tasks[e]:Je()},lastUpdated:new Date().toISOString()}}}function Xr(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function Yr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Bt(n),s=r.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...o,...s]}}},state:t.state}}function Zr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Bt(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:s}}},state:t.state}}function Qr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=pt(n),s=r.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...o,...s]}}},state:t.state}}function tn(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=pt(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:s}}},state:t.state}}function Kt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function oe(t){if(!t||typeof t!="object")throw new Error("Invalid snapshot: expected an object");let e=t;if(!e.config||typeof e.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!e.state||typeof e.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=e.config,n=e.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 Je(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function en(t,e){let r=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:r};case "pause":return {...t,status:"paused",lastUpdated:r};case "resume":return {...t,status:"running",lastUpdated:r};default:return t}}function zt(t){let{config:e,state:r}=t,n=je(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=rn(n),i=Pe(e,r.tasks),a=new Set([...i,...r.availableOutputs]),c=[],f=[],p=[],g=[];for(let[h,y]of Object.entries(n)){let k=r.tasks[h],T=Ne(y,e.settings),I=T!=="once";if(k?.status===Ot.RUNNING||be(k))continue;let C=$e(y);if(C!==void 0&&k&&k.executionCount>=C||y.circuit_breaker&&k&&k.executionCount>=y.circuit_breaker.max_executions||!I&&k?.status===Ot.COMPLETED)continue;if(I&&k?.status===Ot.COMPLETED){let _=Bt(y),B=false;switch(T){case "data-changed":{_.length>0&&_.some(U=>{for(let[z,st]of Object.entries(n))if(pt(st).includes(U)){let Y=r.tasks[z];if(!Y)continue;let xt=k.lastConsumedHashes?.[U];return Y.lastDataHash==null?Y.executionCount>k.lastEpoch:Y.lastDataHash!==xt}return false})||(B=true);break}case "epoch-changed":{_.length>0&&_.some(U=>{for(let[z,st]of Object.entries(n))if(pt(st).includes(U)){let Y=r.tasks[z];if(Y&&Y.executionCount>k.lastEpoch)return true}return false})||(B=true);break}case "time-based":{let D=y.refreshInterval??0;if(D<=0){B=true;break}let U=k.completedAt;if(!U){B=true;break}(Date.now()-Date.parse(U))/1e3<D&&(B=true);break}case "manual":B=true;break}if(B)continue}let w=Bt(y);if(w.length===0){c.push(h);continue}let $=[],G=[],x=[];for(let _ of w){if(a.has(_))continue;let B=s[_]||[];B.length===0?$.push(_):B.every(U=>be(r.tasks[U]))?x.push({token:_,failedProducer:B[0]}):G.push(_);}$.length>0?p.push({taskName:h,missingTokens:$}):x.length>0?g.push({taskName:h,failedTokens:x.map(_=>_.token),failedProducers:[...new Set(x.map(_=>_.failedProducer))]}):G.length>0?f.push({taskName:h,waitingOn:G}):c.push(h);}let l={};if(c.length>1){let h=Fe(c,n);for(let[y,k]of Object.entries(h))k.length>1&&(l[y]=k);}return {eligible:c,pending:f,unresolved:p,blocked:g,conflicts:l}}function rn(t){let e={};for(let[r,n]of Object.entries(t)){for(let o of pt(n))e[o]||(e[o]=[]),e[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(r)||e[s].push(r);if(n.on_failure)for(let o of n.on_failure)e[o]||(e[o]=[]),e[o].includes(r)||e[o].push(r);}return e}var Wt=class{constructor(){Oe(this,"buffer",[]);}append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function Ce(t){let e=Re(t);return nn(e)}function Re(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(Re).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+Re(e[n])).join(",")+"}"}function nn(t){let e=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*r&n;return e.toString(16).padStart(16,"0")}function on(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),r="";for(let n of e)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function sn(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Ve(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return on(e)}function an(t){try{let e=JSON.parse(sn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function we(t,e,r){let{handlers:n,onDrain:o}=e,s=new Wt,i="state"in t&&"config"in t?t:ne(t),a=false,c=new Set,f=new Map(Object.entries(n)),p=new Wt,g=false,l=false;function h(){if(!a){if(g){l=true;return}g=true;try{do l=!1,y();while(l)}finally{g=false;}}}function y(){let C=p.drain(),w=s.drain(),$=[...C,...w];$.length>0&&(i=Ue(i,$));let G=zt(i);$.length>0&&o?.($,i,G);for(let x of G.eligible)I(x);for(let x of $)if(x.type==="task-progress"){let{taskName:_,update:B}=x;if(!i.config.tasks[_])continue;let U=i.state.tasks[_];if(!U||U.status!=="running")continue;let z=Ve(_),st=T(_,z,B).catch(Y=>{a||(p.append({type:"task-failed",taskName:_,error:Y.message??String(Y),timestamp:new Date().toISOString()}),h());}).finally(()=>{c.delete(st);});c.add(st);}}function k(C){let $=i.config.tasks[C].requires??[],G=new Map;for(let[_,B]of Object.entries(i.config.tasks))for(let D of B.provides??[])G.set(D,_);let x={};for(let _ of $){let B=G.get(_);B?x[_]=i.state.tasks[B]?.data:x[_]=void 0;}return x}async function T(C,w,$){let G=i.config.tasks[C],x=G.taskHandlers??[],_=k(C);for(let B of x){let D=f.get(B);if(!D)throw new Error(`Handler '${B}' not found in registry (task '${C}')`);let U={nodeId:C,state:_,taskState:i.state.tasks[C],config:G,callbackToken:w,update:$};if(await D(U)==="task-initiate-failure")throw new Error(`Handler '${B}' returned task-initiate-failure (task '${C}')`)}}function I(C){let $=i.config.tasks[C]?.taskHandlers;if(!$||$.length===0)return;p.append({type:"task-started",taskName:C,timestamp:new Date().toISOString()}),h();let G=Ve(C),x=T(C,G).catch(_=>{a||(p.append({type:"task-failed",taskName:C,error:_.message??String(_),timestamp:new Date().toISOString()}),h());}).finally(()=>{c.delete(x);});c.add(x);}return {push(C){a||(C.type==="task-completed"&&C.data&&!C.dataHash&&(C={...C,dataHash:Ce(C.data)}),s.append(C),h());},pushAll(C){if(!a){for(let w of C)w.type==="task-completed"&&w.data&&!w.dataHash?s.append({...w,dataHash:Ce(w.data)}):s.append(w);h();}},resolveCallback(C,w,$){if(a)return;let G=an(C);if(!G)return;let{taskName:x}=G;if(i.config.tasks[x]){if($&&$.length>0)s.append({type:"task-failed",taskName:x,error:$.join("; "),timestamp:new Date().toISOString()});else {let _=w&&Object.keys(w).length>0?Ce(w):void 0;s.append({type:"task-completed",taskName:x,data:w,dataHash:_,timestamp:new Date().toISOString()});}h();}},addNode(C,w){a||(s.append({type:"task-upsert",taskName:C,taskConfig:w,timestamp:new Date().toISOString()}),h());},removeNode(C){a||(s.append({type:"task-removal",taskName:C,timestamp:new Date().toISOString()}),h());},addRequires(C,w){a||(s.append({type:"node-requires-add",nodeName:C,tokens:w,timestamp:new Date().toISOString()}),h());},removeRequires(C,w){a||(s.append({type:"node-requires-remove",nodeName:C,tokens:w,timestamp:new Date().toISOString()}),h());},addProvides(C,w){a||(s.append({type:"node-provides-add",nodeName:C,tokens:w,timestamp:new Date().toISOString()}),h());},removeProvides(C,w){a||(s.append({type:"node-provides-remove",nodeName:C,tokens:w,timestamp:new Date().toISOString()}),h());},registerHandler(C,w){f.set(C,w);},unregisterHandler(C){f.delete(C);},retrigger(C){a||i.config.tasks[C]&&(s.append({type:"task-restart",taskName:C,timestamp:new Date().toISOString()}),h());},retriggerAll(C){if(!a){for(let w of C)i.config.tasks[w]&&s.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()});h();}},snapshot(){return Kt(i)},getState(){return i},getSchedule(){return zt(i)},async waitForHandlers(){c.size>0&&await Promise.allSettled([...c]);},async dispose(C){C?.wait&&c.size>0&&await Promise.allSettled([...c]),a=true;}}}function se(){return function(t){if(t==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+t)}}var cn=se();cn("./jsonata-sync.cjs");var un=se(),ae=un("./jsonata-sync.cjs"),ze=ae;function He(t,e){if(!e||!t)return;let r=e.split("."),n=t;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function We(t,e,r){let n=e.split("."),o=t;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function dn(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await ae(o.expr).evaluate(n);We(t.computed_values,o.bindTo,s),n.computed_values=t.computed_values;}catch{}return t}function ln(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let i=ze(s.expr).evaluate(n);We(t.computed_values,s.bindTo,i),n.computed_values=t.computed_values;}catch(i){let a=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:a});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function fn(t,e,r){let n={...r??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return ae(t).evaluate(n)}function gn(t,e){return e.startsWith("fetched_sources.")?He(t._sourcesData??{},e.slice(16)):He(t,e)}var Ke=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),pn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function mn(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let r=t;(typeof r.id!="string"||!r.id)&&e.push("id: required, must be a non-empty string");for(let n of Object.keys(r))pn.has(n)||e.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&e.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))e.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&e.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&e.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&e.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))e.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${i}]: must be an object`);else {let a=s;typeof a.bindTo!="string"||!a.bindTo?e.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(a.bindTo)&&e.push(`source_defs[${i}]: bindTo "${a.bindTo}" is not unique across source_defs`),n.add(a.bindTo)),typeof a.outputFile!="string"||!a.outputFile?e.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(a.outputFile)&&e.push(`source_defs[${i}]: outputFile "${a.outputFile}" is not unique across source_defs`),o.add(a.outputFile)),a.optionalForCompletionGating!=null&&typeof a.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))e.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?e.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):Ke.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...Ke].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&e.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function hn(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await ae(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function yn(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return t.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=ze(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Ut={run:dn,runSync:ln,eval:fn,resolve:gn,validate:mn,enrichSources:hn,enrichSourcesSync:yn};function Xe(t){return JSON.stringify(t)}function Ye(t){let e;try{e=JSON.parse(t);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${t}`)}if(typeof e!="object"||e===null||typeof e.howToRun!="string"||typeof e.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${t}`);return e}function ie(t,e){function r(){return t.readIndex()??{}}function n(o,s,i){let a=String(s||"").split(".").filter(Boolean);if(a.length===0)return i&&typeof i=="object"&&!Array.isArray(i)?i:{value:i};let c={...o},f=c;for(let p=0;p<a.length-1;p++){let g=a[p],l=f[g],h=l&&typeof l=="object"&&!Array.isArray(l)?{...l}:{};f[g]=h,f=h;}return f[a[a.length-1]]=i,c}return {readCard(o){let s=r()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,i]of Object.entries(r())){if(!t.cardExists(i.key))continue;let a=t.readCard(i.key);a?o.push(a):e?.(`[card-store] could not read card "${s}" at key "${i.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,i]of Object.entries(r()))o[s]=i.checksum;return o},changedSince(o){let s=r(),i=[];for(let[a,c]of Object.entries(s))o[a]!==c.checksum&&i.push(a);for(let a of Object.keys(o))s[a]||i.push(a);return i},validateUpsert(o,s){let i=r(),a=i[o],c=Object.entries(i).find(([,f])=>f.key===s);return a&&a.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${a.key}", cannot remap to "${s}"`}:c&&c[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${c[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,i){let a=r(),c=i??a[o]?.key??t.defaultCardKey(o),f=t.writeCard(c,s);a[o]={key:c,checksum:f,updatedAt:new Date().toISOString()},t.writeIndex(a);},patchCard(o,s,i){let a=r(),c=a[o];if(!c||!t.cardExists(c.key))throw new Error(`card "${o}" not found`);let f=t.readCard(c.key);if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`card "${o}" is not patchable`);let p=n(f,s,i),g=t.writeCard(c.key,p);a[o]={key:c.key,checksum:g,updatedAt:new Date().toISOString()},t.writeIndex(a);},removeCard(o){let s=r(),i=s[o];i&&(t.removeCard(i.key),delete s[o],t.writeIndex(s));},readIndex(){return r()}}}function ve(t,e){return {readSourceData(r,n){let o=t.read(`${r}/${n}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,n,o,s){let i=e(o);t.write(`${r}/.staged/${s}/${n}`,i);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,i=t.read(s);return i==null?false:(t.write(`${r}/${n}`,i),t.remove(s),true)},hasSource(r,n){return t.exists(`${r}/${n}`)}}}function rr(t){function e(r){let n=t.readAllEntries();if(!r)return n;let o=n.findIndex(s=>s.id===r);return o===-1?n:n.slice(o+1)}return {readEntriesAfterCursor(r){let n=e(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return e(r).length},appendEvent(r){t.appendEntry({id:t.generateId(),event:r});}}}function nr(t,e){return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.read(r)??[];t.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(i){let a=i instanceof Error?i.message:String(i);try{e(s,a);}catch{}}t.delete(r);}}}}var ce="v1",$t="board/graph",or="board/lastJournalProcessedId";function Ze(t){return `cards/${t}/runtime`}function sr(t){return {readRuntime(e){return t.read(Ze(e))??{_sources:{}}},writeRuntime(e,r){t.write(Ze(e),r);}}}function kn(t,e){let r={...t};for(let n of e.deleteKeys)delete r[n];return {...r,...e.shallowMerge}}function ar(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,r){if(r.schemaVersion!==ce)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=t.readValues(e);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let o=kn(n.values,r);return {ok:true,newVersion:t.writeValues(e,o,r.deleteKeys)}}}}function ir(t){function e(r){let n=t.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=e("task-executor");if(r?.trim())return Ye(r.trim())},writeTaskExecutorRef(r){t.write("task-executor",Xe(r));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(r){t.write("chat-handler-flow",r);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(r){t.write("card-store-ref",r);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(r){t.write("outputs-store-ref",r);},readScratchStoreRef(){return e("scratch-store-ref")},writeScratchStoreRef(r){t.write("scratch-store-ref",r);},readArchiveStoreRef(){return e("archive-store-ref")},writeArchiveStoreRef(r){t.write("archive-store-ref",r);}}}function cr(t){return {writeComputedValues(e,r){t.write(`cards/${e}/computed_values`,r);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let r of t.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(e[n[1]]=t.read(r));}return e},writeDataObjects(e){for(let[r,n]of Object.entries(e))r&&t.write(`data-objects/${r}`,n);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let r of t.listKeys("data-objects/"))e[r.slice(13)]=t.read(r);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function Qe(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Sn(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function tr(t,e){return t?.lastRequestedToken?Sn(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function bn(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function er(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function ue(t,e){let r=e.state.tasks,n=e.config.tasks,o=Object.keys(r),s=zt(e),i={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},a=new Map;for(let y of s.pending)a.set(y.taskName,y.waitingOn);for(let y of s.unresolved)a.set(y.taskName,y.missingTokens);for(let y of s.blocked)a.set(y.taskName,y.failedTokens);let c=new Map;for(let[y,k]of Object.entries(n))for(let T of k.requires??[]){let I=c.get(T)??[];I.push(y),c.set(T,I);}let f=o.sort().map(y=>{let k=r[y],T=n[y]??{requires:[],provides:[]};k.status==="completed"?i.completed+=1:k.status==="failed"?i.failed+=1:k.status==="in-progress"&&(i.in_progress+=1);let I=T.requires??[],C=T.provides??[],w=Object.keys(k.data??{}).sort(),$=I.filter(U=>e.state.availableOutputs.includes(U)),G=I.filter(U=>!e.state.availableOutputs.includes(U)),x=a.get(y)??G,_=new Set;for(let U of C)for(let z of c.get(U)??[])z!==y&&_.add(z);let B=k.failedAt,D=k.error?{message:k.error,code:"TASK_FAILED",at:B,source:"task-runtime"}:void 0;return {name:y,status:k.status,error:D,requires:I,requires_satisfied:$,requires_missing:G,provides_declared:C,provides_runtime:w,blocked_by:x,unblocks:Array.from(_).sort(),runtime:{attempt_count:k.executionCount??0,restart_count:k.retryCount??0,in_progress_since:k.status==="in-progress"?k.startedAt??null:null,last_transition_at:k.lastUpdated??null,last_completed_at:k.completedAt??null,last_restarted_at:k.startedAt??null,status_age_ms:k.lastUpdated?0:null}}});i.pending=s.pending.length,i.blocked=s.blocked.length,i.unresolved=s.unresolved.length;let p=f.map(y=>({name:y.name,fanOut:y.unblocks.length})).sort((y,k)=>k.fanOut-y.fanOut||y.name.localeCompare(k.name)),g=p.length>0?p[0]:{name:null,fanOut:0},l=new Set;for(let y of Object.values(n))for(let k of y.requires??[])l.add(k);let h=0;for(let[y,k]of Object.entries(n)){let T=(k.requires??[]).length===0,C=(k.provides??[]).some(w=>(c.get(w)??[]).some($=>$!==y));T&&!C&&(h+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:i.completed,eligible:s.eligible.length,pending:i.pending,blocked:i.blocked,unresolved:i.unresolved,failed:i.failed,in_progress:i.in_progress,orphan_cards:h,topology:{edge_count:Array.from(l).length,max_fan_out_card:g.name,max_fan_out:g.fanOut}},cards:f}}function Cn(){return new Date().toISOString()}function ur(t,e,r,n,o,s,i){return async a=>{let c=[],f=r.cardStore.readCard(a.nodeId);if(!f)return "task-initiate-failure";let p=f.id,g=f.card_data??{},l=f.source_defs??[],h=l.filter(q=>q.optionalForCompletionGating!==true),y=r.cardRuntimeStore.readRuntime(p),k=false,T=()=>{k&&(r.cardRuntimeStore.writeRuntime(p,y),k=false);},I=q=>Qe(y._sources[q]),C=(q,M)=>{y._sources[q]=Qe(M),k=true;},w=a.taskState?.executionCount??0;if(y._lastExecutionCount!==w&&(y._sources={},y._lastExecutionCount=w,k=true),a.update){let q=a.update,M=q.outputFile;if(M){let W=I(M);if(q.failure){let nt=q.rqt??W.lastRequestedToken??W.queueRequestedToken;nt&&C(M,er(W,nt));}else {let nt=q.rqt;if(!W.lastCompletedToken||nt>W.lastCompletedToken){let gt=typeof q.deliveryToken=="string"?q.deliveryToken:void 0,A=false;gt&&(A=r.fetchedSourcesStore.commitSourceData(p,M,gt)),A?C(M,bn(W,nt)):C(M,er(W,nt));}}T();}}let G={};for(let q of l)if(q.outputFile){let M=r.fetchedSourcesStore.readSourceData(p,q.outputFile);M!==null&&(G[q.bindTo]=M);}let x={};for(let[q,M]of Object.entries(a.state??{}))if(M!==null&&typeof M=="object"&&!Array.isArray(M)){let W=M[q];x[q]=W!==void 0?W:M;}else x[q]=M;let _={id:p,card_data:{...g},requires:x,source_defs:l,compute:f.compute};_._sourcesData=G,f.compute&&Ut.runSync(_,{sourcesData:G}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(p,_.computed_values??{});let B={...f},D=Ut.enrichSourcesSync(Array.isArray(f.source_defs)?f.source_defs:void 0,{card_data:f.card_data,requires:x}),U=t.value;B.source_defs=Array.isArray(D)?D.map(q=>({...q,boardDir:typeof q.boardDir=="string"&&q.boardDir?q.boardDir:U})):D;let z=Cn(),st=a.update?void 0:z,Y=h.filter(q=>{let M=q.outputFile;if(typeof M!="string"||!M)return true;let W=I(M);st&&(W={...W,queueRequestedToken:st},C(M,W));let nt=W.queueRequestedToken??W.lastRequestedToken??z,gt=tr(W,nt);return gt==="in-flight"?false:gt==="dispatch"});if(T(),Y.length>0){let q=false,M=z;for(let W of Y){let nt=W.outputFile;if(typeof nt!="string"||!nt)continue;let gt=I(nt),A=gt.queueRequestedToken??z;C(nt,{...gt,lastRequestedToken:A}),M=A,q=true;}return q&&T(),q&&(c.push({taskKind:"source-fetch",payload:{boardRef:ot(t),enrichedCard:B,callbackToken:a.callbackToken,rqt:M}}),r.executionRequestStore.appendEntries(e,c)),"task-initiated"}if(h.some(q=>{let M=q.outputFile;if(typeof M!="string"||!M)return false;let W=I(M),nt=W.queueRequestedToken??W.lastRequestedToken??z;return tr(W,nt)==="in-flight"}))return "task-initiated";let Tt=f.provides??[],jt={};for(let{bindTo:q,ref:M}of Tt)jt[q]=Ut.resolve(_,M);return (i??r.outputStore.writeDataObjects.bind(r.outputStore))(jt),l.filter(q=>{if(q.optionalForCompletionGating!==true)return false;let M=I(q.outputFile);return !M.lastRequestedToken||!M.lastCompletedToken?true:M.lastCompletedToken<=M.lastRequestedToken}).length>0&&c.push({taskKind:"source-fetch",payload:{boardRef:ot(t),enrichedCard:B,callbackToken:a.callbackToken,rqt:z}}),n(a.nodeId,jt),c.length>0&&r.executionRequestStore.appendEntries(e,c),"task-initiated"}}var Ae={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function dr(t){return {[$t]:t.graph,[or]:t.lastDrainedJournalId}}function lr(t){let e=t[$t],r=t[or];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${$t}`);return {graph:e,lastDrainedJournalId:typeof r=="string"?r:""}}function fr(t){let e=t.requires,r=t.provides?.map(n=>n.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:r,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function at(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function rt(t){return {status:"fail",error:t}}function it(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Rn(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function pr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function de(t){try{let e=JSON.parse(pr(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function wn(t){return Rn(JSON.stringify(t))}function gr(t){try{let e=JSON.parse(pr(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function ut(){return new Date().toISOString()}function mr(t,e){let r=e.onWarn??(()=>{}),n=ot(t);function o(A){if(A.length!==0)try{let S=e.publishBoardChangeNotifications?.(A);S&&typeof S.catch=="function"&&S.catch(O=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${O instanceof Error?O.message:String(O)}`));}catch(S){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${S instanceof Error?S.message:String(S)}`);}}function s(){let A=a().readCardStoreRef();if(!A)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let S=e.kvStorageForRef(A);return {readIndex(){return S.read("_index")},writeIndex(O){S.write("_index",O);},readCard(O){return S.read(O)},writeCard(O,L){return S.write(O,L),e.hashFn(L)},removeCard(O){S.delete(O);},cardExists(O){return S.read(O)!==null},defaultCardKey(O){return O}}}let i={readValues(A){let S=e.kvStorage("state-snapshot"),O=S.listKeys().sort();if(O.length===0)return {version:null,values:{}};let L={};for(let Z of O)L[Z]=S.read(Z);return {version:e.hashFn(L),values:L}},writeValues(A,S,O){let L=e.kvStorage("state-snapshot");for(let Z of O)L.delete(Z);for(let[Z,V]of Object.entries(S))L.write(Z,V);return e.hashFn(S)}},a=()=>ir(e.kvStorage("config")),c=()=>ar(i),f=()=>rr(e.journalAdapter()),p=()=>ie(s(),r),g=()=>{let A=a().readOutputsStoreRef();if(!A)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return cr(e.kvStorageForRef(A))},l=()=>{let A=a().readArchiveStoreRef();return A?e.archiveFactoryForRef(A):e.archiveFactory()};function h(){return !!c().readSnapshot(t.value).values[$t]}function y(){let A=c().readSnapshot(t.value);if(!A.values[$t])throw new Error(`Board not initialized at ${t.value}`);return lr(A.values)}function k(A,S){let O=c().commitSnapshot(t.value,{schemaVersion:ce,expectedVersion:S,commitId:e.genId(),committedAt:ut(),deleteKeys:[],shallowMerge:dr(A)});if(!O.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${S??"null"} current=${O.currentVersion??"null"}`)}function T(A){f().appendEvent(A);}async function I(){let A=(E,P)=>{let tt=E.payload,d=(tt?.enrichedCard??{}).id??tt?.cardId??"unknown";T({type:"task-failed",taskName:d,error:P,timestamp:ut()});},S=nr(e.kvStorage("execution-requests"),A),O=sr(e.kvStorage("card-runtime")),L=ve(e.blobStorage("sources"),E=>e.resolveBlob(E)),Z=new Map,V={readRuntime(E){return Z.get(E)??O.readRuntime(E)},writeRuntime(E,P){Z.set(E,P);}},dt=[],ct=new Map,St={readSourceData(E,P){let tt=`${E}/${P}`;return ct.has(tt)?ct.get(tt):L.readSourceData(E,P)},ingestSourceDataStaged(E,P,tt,u){L.ingestSourceDataStaged(E,P,tt,u);},commitSourceData(E,P,tt){let u=`${E}/.staged/${tt}/${P}`,m=e.blobStorage("sources").read(u);if(m==null)return false;let b=`${E}/${P}`,R=m.trim();try{ct.set(b,JSON.parse(R));}catch{ct.set(b,R);}return dt.push({cardId:E,outputFile:P,deliveryToken:tt}),true},hasSource(E,P){let tt=`${E}/${P}`;return ct.has(tt)?true:L.hasSource(E,P)}},lt={cardStore:p(),cardRuntimeStore:V,fetchedSourcesStore:St,outputStore:g(),executionRequestStore:S},vt=y(),K=oe(vt.graph),{events:mt,newCursor:It}=f().readEntriesAfterCursor(vt.lastDrainedJournalId),wt=[],Ft=[],Dt=[],Vt=new Map,Ht=(E,P)=>{wt.push({type:"task-completed",taskName:E,data:P,timestamp:ut()});try{l().stream("exec-history").append({taskName:E,status:"completed",completedAt:ut()});}catch{}},Lt=(E,P)=>{T({type:"task-failed",taskName:E,error:P,timestamp:ut()});try{l().stream("exec-history").append({taskName:E,status:"failed",error:P,completedAt:ut()});}catch{}},Et=we(K,{handlers:{"card-handler":ur(t,It,lt,Ht,Lt,(E,P)=>{Ft.push({cardId:E,values:P});},E=>{Dt.push(E);})}});for(wt=mt;wt.length>0;){let E=wt;wt=[];for(let P of E)if(P.type==="task-restart"){let tt=lt.cardStore.readCard(P.taskName);tt&&Vt.set(P.taskName,tt);}Et.pushAll(E),await Et.waitForHandlers();}let qt=Et.getState();await Et.dispose({wait:true});let ke=c().readSnapshot(t.value).version;k({lastDrainedJournalId:It,graph:Kt(qt)},ke);for(let{cardId:E,values:P}of Ft)lt.outputStore.writeComputedValues(E,P);for(let E of Dt)lt.outputStore.writeDataObjects(E);for(let[E,P]of Z)O.writeRuntime(E,P);for(let{cardId:E,outputFile:P,deliveryToken:tt}of dt)L.commitSourceData(E,P,tt);let Mt;try{Mt=ue(n,qt),lt.outputStore.writeStatusSnapshot(Mt);}catch(E){r(`[board-live-cards-public] status publish failed: ${E instanceof Error?E.message:String(E)}`);}let Nt=[];for(let{cardId:E,values:P}of Ft)Nt.push({kind:"computed_values",cardId:E,values:P});for(let E of Dt)for(let[P,tt]of Object.entries(E))P&&Nt.push({kind:"data_object",key:P,payload:tt});for(let[E,P]of Vt)Nt.push({kind:"card_refreshed",cardId:E,card:P});Mt!==void 0&&Nt.push({kind:"status",status:Mt}),o(Nt);let Se=a().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:ot({kind:"built-in",value:"source-cli-task-executor"})};S.dispatchEntriesForJournalId(It,E=>{if(E.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${E.taskKind}" \u2014 skipping`);return}let P=E.payload,tt=P.enrichedCard?.id??"unknown",u=P.enrichedCard?.source_defs??[];for(let d of u){if(!d.outputFile){r(`[dispatch] source "${d.bindTo}" has no outputFile \u2014 skipping`);continue}let m=wn({cbk:P.callbackToken,rg:t.value,br:ot(t),cid:tt,b:d.bindTo,d:d.outputFile,cs:void 0,rqt:P.rqt});e.dispatchExecution(Se,{source_def:d,base_ref:ot(t),callback:{token:m,via:e.selfRef}}).catch(b=>Lt(tt,b instanceof Error?b.message:String(b)));}});}async function C(){try{let A=()=>{let O=y(),{events:L}=f().readEntriesAfterCursor(O.lastDrainedJournalId);L.length<=0||(C(),e.requestProcessAccumulated?.());},S=await Be(e.lock,I,A);return at({ran:S!==!1})}catch(A){return it(A)}}function w(){C(),e.requestProcessAccumulated?.();}function $(A){try{let S=A.params?.cardStoreRef;if(!S)return rt("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!h()){let ct=ne(Ae);k({lastDrainedJournalId:"",graph:Kt(ct)},null);}let O=A.params?.outputsStoreRef;if(!O)return rt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let L=A.params?.scratchStoreRef,Z=A.params?.archiveStoreRef,V=a();V.writeCardStoreRef(S),V.writeOutputsStoreRef(O),L&&V.writeScratchStoreRef(L),Z&&V.writeArchiveStoreRef(Z);let dt=A.body??{};dt["task-executor-ref"]&&V.writeTaskExecutorRef(dt["task-executor-ref"]),Object.prototype.hasOwnProperty.call(dt,"chat-handler-flow")&&V.writeChatHandlerFlow(dt["chat-handler-flow"]);try{g().writeStatusSnapshot(ue(n,oe(y().graph)));}catch{}return at()}catch(S){return it(S)}}function G(A){try{let S=g().readStatusSnapshot();if(!S){S=ue(n,oe(y().graph));try{g().writeStatusSnapshot(S);}catch{}}return at(S)}catch(S){return it(S)}}function x(A){try{let S=A.params?.id;return S?(T({type:"task-removal",taskName:S,timestamp:ut()}),w(),at()):rt("removeCard requires params.id")}catch(S){return it(S)}}function _(A){try{let S=A.params?.id;return S?(T({type:"task-restart",taskName:S,timestamp:ut()}),w(),at()):rt("retrigger requires params.id")}catch(S){return it(S)}}async function B(A){return C()}function D(A){try{let S=A.params?.cardId,O=A.params?.all,L=!!A.params?.restart;if(!S&&!O)return rt("upsertCard requires --card-id <id> or --all");let Z=O?p().readAllCards().map(V=>V.id):[S];for(let V of Z)if(!p().readCard(V))return rt(`Card "${V}" not found in board at ${t.value}`);for(let V of Z){let dt=p().readCard(V),ct=fr(dt),St=e.hashFn(ct),lt=e.kvStorage("card-upsert"),vt=lt.read(V),K=vt?.taskConfigHash!==St;if(!(!K&&!L)){if(K){let mt=vt?.blobRef??p().readCardKey(V)??V;T({type:"task-upsert",taskName:V,taskConfig:ct,timestamp:ut()}),lt.write(V,{blobRef:mt,taskConfigHash:St,updatedAt:ut()});}L&&T({type:"task-restart",taskName:V,timestamp:ut()});}}return w(),at()}catch(S){return it(S)}}function U(A){try{let S=A.params?.token;if(!S)return rt("taskFailed requires params.token");let O=A.params?.error??"unknown error",L=de(S);if(!L)return rt("Invalid callback token");T({type:"task-failed",taskName:L.taskName,error:O,timestamp:ut()});try{l().stream("exec-history").append({taskName:L.taskName,status:"failed",error:O,completedAt:ut()});}catch{}return w(),at()}catch(S){return it(S)}}function z(A){try{let S=A.params?.token;if(!S)return rt("taskProgress requires params.token");let L=(A.body??{}).update??{},Z=de(S);return Z?(T({type:"task-progress",taskName:Z.taskName,update:L,timestamp:ut()}),w(),at()):rt("Invalid callback token")}catch(S){return it(S)}}function st(A){try{let S=A.params?.token,O=A.params?.ref;if(!S)return rt("sourceDataFetched requires params.token");if(!O)return rt("sourceDataFetched requires params.ref");let L=gr(S);if(!L)return rt("Invalid source token");let{cbk:Z,cid:V,b:dt,d:ct,cs:St,rqt:lt}=L,vt=ve(e.blobStorage("sources"),wt=>e.resolveBlob(wt)),K=e.genId();vt.ingestSourceDataStaged(V,ct,Ct(O),K);let mt=de(Z);if(!mt)return rt("Invalid callback token embedded in source token");let It=ut();return T({type:"task-progress",taskName:mt.taskName,update:{bindTo:dt,outputFile:ct,fetchedAt:It,deliveryToken:K,sourceChecksum:St,rqt:lt},timestamp:It}),w(),at()}catch(S){return it(S)}}function Y(A){try{let S=A.params?.token,O=A.params?.reason??"unknown";if(!S)return rt("sourceDataFetchFailure requires params.token");let L=gr(S);if(!L)return rt("Invalid source token");let{cbk:Z,b:V,d:dt,cs:ct,rqt:St}=L,lt=de(Z);return lt?(T({type:"task-progress",taskName:lt.taskName,update:{bindTo:V,outputFile:dt,failure:!0,reason:O,sourceChecksum:ct,rqt:St},timestamp:ut()}),w(),at()):rt("Invalid callback token embedded in source token")}catch(S){return it(S)}}function xt(A){try{let S=a().readCardStoreRef();return S?at({storeRef:S}):rt(`Board at ${t.value} has no card store configured`)}catch(S){return it(S)}}function Tt(A){try{let S=a().readOutputsStoreRef();return S?at({storeRef:S}):rt(`Board at ${t.value} has no outputs store configured`)}catch(S){return it(S)}}function jt(A){try{let S=a().readScratchStoreRef();return at({storeRef:S})}catch(S){return it(S)}}function Yt(A){try{let S=a().readArchiveStoreRef();return at({storeRef:S})}catch(S){return it(S)}}function q(A){try{let S=A.params?.key;if(!S)return rt("getConfig requires params.key");let O=a(),L;switch(S){case "task-executor":L=O.readTaskExecutorRef()??null;break;case "chat-handler-flow":L=O.readChatHandlerFlow()??null;break;case "card-store-ref":L=O.readCardStoreRef();break;case "outputs-store-ref":L=O.readOutputsStoreRef();break;case "scratch-store-ref":L=O.readScratchStoreRef();break;case "archive-store-ref":L=O.readArchiveStoreRef();break;default:return rt(`getConfig: unknown key "${S}"`)}return at({value:L})}catch(S){return it(S)}}function M(A){try{let S=A.params?.key;if(!S)return rt("getOutputsDataObject requires params.key");let O=g().readDataObject(S);return at(O)}catch(S){return it(S)}}function W(A){try{return at(g().readAllDataObjects())}catch(S){return it(S)}}function nt(A){try{let S=A.params?.key;if(!S)return rt("getOutputsComputedValues requires params.key");let O=g().readComputedValues(S);return at(O)}catch(S){return it(S)}}function gt(A){try{return at(g().readAllComputedValues())}catch(S){return it(S)}}return {init:$,status:G,getCardStoreRef:xt,getOutputsStoreRef:Tt,getScratchStoreRef:jt,getArchiveStoreRef:Yt,getConfig:q,getOutputsDataObject:M,getAllOutputsDataObjects:W,getOutputsComputedValues:nt,getAllOutputsComputedValues:gt,removeCard:x,retrigger:_,processAccumulatedEvents:B,upsertCard:D,taskFailed:U,taskProgress:z,sourceDataFetched:st,sourceDataFetchFailure:Y}}function hr(t){function e(o){return {status:"success",data:o}}function r(o){return {status:"fail",error:o}}function n(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let i=t.readCard(s);return i?e({cards:[i]}):r(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return n(s)}},set(o){try{let s=o.body;if(s==null)return r("set requires a body (card object or array of cards)");let i=Array.isArray(s)?s:[s];for(let a of i){if(typeof a.id!="string")return r("each card must have a string `id` field");t.writeCard(a.id,a);}return e({count:i.length})}catch(s){return n(s)}},del(o){try{let s=o.body?.ids??[],i=o.params?.id,a=i?[...s,i]:s;if(a.length===0)return r("del requires body.ids (string[]) or params.id");for(let c of a)t.removeCard(c);return e({count:a.length})}catch(s){return n(s)}},patch(o){try{let s=o.params?.id,i=o.params?.path;if(!s)return r("patch requires params.id");if(!i)return r("patch requires params.path");let a=o.body,c=a&&Object.prototype.hasOwnProperty.call(a,"value")?a.value:o.body;return t.patchCard(s,i,c),e({count:1})}catch(s){return n(s)}}}}function yr(){return new Date().toISOString()}function kr(t){return new TextEncoder().encode(t).byteLength}function vn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function An(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function _n(t){let e=String(t||"").trim();if(!e)return "upload.bin";let r=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (r>=0?e.slice(r+1):e)||"upload.bin"}function xn(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Tn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function In(t){let e=_n(t),r=e.lastIndexOf(".");return r<=0||r===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,r),ext:e.slice(r)}}function En(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function Sr(t){function e(r){let n=t.stat?vn(t.stat(r)):null;if(n)return n;if(!t.exists(r))return null;let o=t.read(r);return o===null?{key:r}:{key:r,size:kr(o)}}return {exists(r){return t.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){t.write(r,n);let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??yr(),s.size=s.size??kr(n),s},putBytes(r,n,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});t.write(r,i);}let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??yr(),s.size=s.size??n.byteLength,s},getText(r){let n=t.read(r);if(n===null){if(!t.readBytes)return null;let o=t.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(t.readBytes){let o=t.readBytes(r);if(o!==null)return o}let n=t.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:e,list(r=""){return t.listKeys(r).map(n=>e(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){t.remove(r);}}}function br(t){function e(o,s){let i=0,a=[];Array.isArray(s)&&a.push(...s);for(let c of t.list(`${o}/`))a.push(En(c.key));for(let c of a){let f=An(c);Number.isFinite(f)&&f>i&&(i=f);}return i+1}function r(o,s,i){let a=Number(i?.maxLen||32),{stem:c,ext:f}=In(o),p=Tn(f),g=xn(c),l=`${String(s).padStart(3,"0")}-`,h=p,y=a-l.length-h.length;y<1&&(h="",y=a-l.length);let k=g.slice(0,Math.max(1,y)),T=`${l}${k}${h}`;return T.length>a&&(T=T.slice(0,a).replace(/\.$/,"")),T}function n(o,s,i){let a=e(o,i?.seedNames),c=r(s,a,{maxLen:i?.maxLen});for(;t.exists(`${o}/${c}`);)a+=1,c=r(s,a,{maxLen:i?.maxLen});return c}return {nextSerial:e,buildStoredName:r,allocateStoredName:n}}function Cr(){function t(o,s){if(!Array.isArray(o))return [];let i=[];for(let a of o){if(!a||typeof a!="object")continue;let c=a;typeof c.stored_name=="string"&&i.push({name:typeof c.name=="string"?c.name:c.stored_name,stored_name:c.stored_name,size:typeof c.size=="number"&&Number.isFinite(c.size)?c.size:null,mime_type:typeof c.mime_type=="string"?c.mime_type:null,uploaded_at:typeof c.uploaded_at=="string"?c.uploaded_at:s||null,chat:c.chat===true});}return i}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function r(o,s){let i=e(o);if(s.length===0)return o.files=i,i;let a=new Set(i.map(c=>c.stored_name));for(let c of s)a.has(c.stored_name)||(i.push(c),a.add(c.stored_name));return o.files=i,i}function n(o,s,i){let a=e(o);if(!Number.isInteger(s)||s<0||s>=a.length)return {ok:false,reason:"index_out_of_range"};let c=a[s];return !c||!c.stored_name?{ok:false,reason:"missing_stored_name"}:i&&i!==c.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:c}}return {read:e,normalizeIncoming:t,merge:r,resolve:n}}function Rr(t){return String(t).replace(/[^a-zA-Z0-9_-]/g,"_")}function wr(t){let e=t.payload??{};return {id:t.id,role:typeof e.role=="string"?e.role:"system",text:typeof e.text=="string"?e.text:"",files:Array.isArray(e.files)?e.files:[],updated_at:typeof e.updated_at=="string"?e.updated_at:""}}function vr(t,e){let r=o=>`chats/${Rr(o)}/processing`,n=o=>`chats/${Rr(o)}/config`;return {append(o,s,i,a=[]){return t(o).append({role:s,text:i,files:a,updated_at:new Date().toISOString()}).id},readAll(o){return t(o).readAll().map(wr)},readAfter(o,s){let i=t(o).readAfter(s);return {records:i.entries.map(wr),cursor:i.newCursor}},clear(o){t(o).clear?.();},setProcessing(o,s){s?e.write(r(o),true):e.delete(r(o));},isProcessing(o){return e.read(r(o))===true},getConfig(o){return e.read(n(o))??{}},setConfig(o,s){let i=e.read(n(o))??{};e.write(n(o),{...i,...s});}}}function On(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function Ar(){let t=new Map,e=new Map;function r(n){return t.has(n)||t.set(n,[]),t.get(n)}return {append(n,o,s,i=[]){let a={id:On(),role:o,text:s,files:i,updated_at:new Date().toISOString()};return r(n).push(a),a.id},readAll(n){return r(n).slice()},readAfter(n,o){let s=r(n);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let i=s.findIndex(c=>c.id===o),a=i===-1?s.slice():s.slice(i+1);return {records:a,cursor:a.length>0?a[a.length-1].id:o}},clear(n){t.set(n,[]);},setProcessing(n,o){o?e.set(`p:${n}`,true):e.delete(`p:${n}`);},isProcessing(n){return e.get(`p:${n}`)===true},getConfig(n){return e.get(`c:${n}`)??{}},setConfig(n,o){let s=e.get(`c:${n}`)??{};e.set(`c:${n}`,{...s,...o});}}}function _r(t){function e(a){return {status:"success",data:a}}function r(a){return {status:"fail",error:a}}function n(a){return {status:"error",error:a instanceof Error?a.message:String(a)}}function o(a,c="command envelope"){let f=typeof a.cardId=="string"?a.cardId:void 0;if(!a.command)return r(`chat-store: ${c} missing "command"`);if(!f)return r(`chat-store: ${c} missing "cardId"`);if(a.command==="append")return i.append({params:{cardId:f},body:{role:a.role,text:a.text,files:a.files}});if(a.command==="read-all")return i.readAll({params:{cardId:f}});if(a.command==="read-after")return i.readAfter({params:{cardId:f},body:{cursor:a.cursor??null}});if(a.command==="clear")return i.clear({params:{cardId:f}});if(a.command==="set-processing")return i.setProcessing({params:{cardId:f},body:{active:a.active}});if(a.command==="is-processing")return i.isProcessing({params:{cardId:f}});if(a.command==="get-config")return i.getConfig({params:{cardId:f}});if(a.command==="set-config"){let{command:p,cardId:g,...l}=a;return i.setConfig({params:{cardId:f},body:l})}return r(`chat-store: unknown command "${String(a.command)}"`)}function s(a){if(!Array.isArray(a.commands)||a.commands.length===0)return r('chat-store: command envelope must include a non-empty "commands" array');let c=[];for(let f=0;f<a.commands.length;f+=1){let p=a.commands[f];if(!p||typeof p!="object"||Array.isArray(p))return r(`chat-store: command envelope entry ${f} must be an object`);let g={cardId:a.cardId,...p},l=o(g,`command envelope entry ${f}`);if(l.status!=="success")return l;c.push({index:f,command:String(g.command),data:l.data});}return e({results:c})}let i={append(a){try{let c=a.params?.cardId;if(!c)return r("append requires params.cardId");let f=a.body??{},p=typeof f.role=="string"?f.role:"",g=typeof f.text=="string"?f.text:"",l=Array.isArray(f.files)?f.files:[];if(!p)return r("append requires body.role");let h=t.append(c,p,g,l);return e({id:h})}catch(c){return n(c)}},readAll(a){try{let c=a.params?.cardId;return c?e({records:t.readAll(c)}):r("readAll requires params.cardId")}catch(c){return n(c)}},readAfter(a){try{let c=a.params?.cardId;if(!c)return r("readAfter requires params.cardId");let p=(a.body??{}).cursor??null;return e(t.readAfter(c,p))}catch(c){return n(c)}},clear(a){try{let c=a.params?.cardId;return c?(t.clear(c),e({ok:!0})):r("clear requires params.cardId")}catch(c){return n(c)}},setProcessing(a){try{let c=a.params?.cardId;if(!c)return r("setProcessing requires params.cardId");let f=a.body??{};return typeof f.active!="boolean"?r("setProcessing requires body.active (boolean)"):(t.setProcessing(c,f.active),e({ok:!0}))}catch(c){return n(c)}},isProcessing(a){try{let c=a.params?.cardId;return c?e({active:t.isProcessing(c)}):r("isProcessing requires params.cardId")}catch(c){return n(c)}},getConfig(a){try{let c=a.params?.cardId;return c?e({config:t.getConfig(c)}):r("getConfig requires params.cardId")}catch(c){return n(c)}},setConfig(a){try{let c=a.params?.cardId;if(!c)return r("setConfig requires params.cardId");let f=a.body??{};return t.setConfig(c,f),e({ok:!0})}catch(c){return n(c)}},run:o,runBatch:s};return i}var Bn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},jn=32;function Nn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function xr(t){if(!t||typeof t!="object")return false;let e=t.summary;return !e||typeof e!="object"?false:Number(e.card_count||0)>0}function Tr(t,e){if(!e||typeof e!="object")return;let r=e;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)Tr(t,n);return}r.kind==="status"&&xr(r.status)&&(t.status=r.status),r.kind==="computed_values"&&r.cardId&&(t.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(t.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(t.cards[r.cardId]=r.card);}function Ir(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),r={...Bn,...t.corsHeaders||{}},n=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,i=t.chatFlowRunner||null,a=t.chatStorage??Ar(),c=_r(a),f=t.notificationTransport||null,p=t.serverUrl||null,g=t.executionExtra||{},l=new Map,h=new Map,y=new Map,k=null;function T(u){let d=mr(u.baseRef,u.boardAdapter),m=u.boardAdapter.kvStorageForRef(u.cardStoreRef),R=hr(ie({readIndex:()=>m.read("_index"),writeIndex:j=>m.write("_index",j),readCard:j=>m.read(j),writeCard:(j,X)=>(m.write(j,X),j),cardExists:j=>m.read(j)!==null,defaultCardKey:j=>j},o.warn)),v=u.artifactsAdapter||u.boardAdapter,N=u.filesArtifactsStore??null,F=null;return {label:u.label,board:d,cardStore:R,get filesArtifacts(){return F??(F=N??Sr(v.blobStorage("files")))},boardAdapter:u.boardAdapter,cardStoreRef:u.cardStoreRef,outputsStoreRef:u.outputsStoreRef,scratchStoreRef:u.scratchStoreRef,archiveStoreRef:u.archiveStoreRef,notifyRef:u.notifyRef,taskExecutorRef:u.taskExecutorRef,chatHandlerRef:u.chatHandlerRef,chatHandlerFlow:u.chatHandlerFlow,inferenceAdapterRef:u.inferenceAdapterRef,notification:Nn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let I=t.boards.map(T),C=new Map;function w(u){return C.get(u)??0}function $(u){let d=I[w(u)];return {files:d?d.filesArtifacts:null}}function G(u){let d=$(u);return d.files?br(d.files):null}function x(){return Cr()}function _(u){return String(u||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function B(u){if(!u||u.notificationTeardown||!f||!u.notifyRef)return;let d=await f.subscribe(u.notifyRef,m=>{Tr(u.notification,m);let b=m.kind==="notification-batch"?m.notifications:[m];E(b);});u.notificationTeardown=d;}async function D(u){if(!u||u.initialized)return;let d={cardStoreRef:u.cardStoreRef,outputsStoreRef:u.outputsStoreRef};u.scratchStoreRef&&(d.scratchStoreRef=u.scratchStoreRef),u.archiveStoreRef&&(d.archiveStoreRef=u.archiveStoreRef);let m={};u.taskExecutorRef&&(m["task-executor-ref"]=u.taskExecutorRef),u.chatHandlerFlow!==void 0&&(m["chat-handler-flow"]=u.chatHandlerFlow),u.inferenceAdapterRef&&(m["inference-adapter-ref"]=u.inferenceAdapterRef);let b=u.board.init({params:d,body:m});if(b.status!=="success")throw Object.assign(new Error(b.error||`init failed for ${u.label}`),{statusCode:500});if(await B(u),!u.chatHandlerFlow&&u.chatHandlerRef&&s.describe)try{let R=await s.describe(u.chatHandlerRef);R&&R.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${R.kind}", expected "chat-handler" for ${u.label}`):R&&o.info(`[init] chat-handler validated: ${R.name} (protocol ${R.protocolVersion}) for ${u.label}`);}catch(R){o.warn(`[init] chat-handler describe failed for ${u.label}: ${R?.message||String(R)}`);}u.initialized=true;}function U(u){if(!u.boardAdapter.publishBoardChangeNotifications)return;let d=[],m=u.board.status({});m.status==="success"&&m.data!=null&&xr(m.data)&&d.push({kind:"status",status:m.data});let b=u.board.getAllOutputsDataObjects({});if(b.status==="success"&&b.data!=null)for(let[v,N]of Object.entries(b.data))v&&d.push({kind:"data_object",key:v,payload:N});let R=u.board.getAllOutputsComputedValues({});if(R.status==="success"&&R.data!=null)for(let[v,N]of Object.entries(R.data))v&&d.push({kind:"computed_values",cardId:v,values:N});d.length>0&&u.boardAdapter.publishBoardChangeNotifications(d);}function z(u,d){if(!u||u.cardsBootstrapped)return;let m=u.cardStore.get({}),b=m.status==="success"&&Array.isArray(m.data?.cards)?m.data.cards:[];for(let R of b)typeof R.id=="string"&&(C.set(R.id,d),u.board.upsertCard({params:{cardId:R.id}}));u.cardsBootstrapped=true;}async function st(){for(let u of I)await D(u);}async function Y(){await st();for(let u=0;u<I.length;u++)U(I[u]),z(I[u],u);}function xt(u){return I[w(u)]??null}function Tt(u){let d=xt(u);if(!d)return null;let m=d.cardStore.get({params:{id:u}});if(m.status!=="success")return null;let b=Array.isArray(m.data?.cards)?m.data.cards:[];return b.length>0?b[0]:null}function jt(){let u=m=>{if(!m||!m.cardStore)return [];let b=m.cardStore.get({});return b.status!=="success"||!Array.isArray(b.data?.cards)?[]:b.data.cards},d=[];for(let m of I)d.push(...u(m));return d}function Yt(){let u=I.map(v=>{try{let F=v.boardAdapter.kvStorageForRef(v.outputsStoreRef).read("status");if(F!=null)return F}catch{}return v.notification.status}).filter(Boolean);if(u.length===0)return null;if(u.length===1)return u[0];let d=[],m=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],b={};for(let v of m)b[v]=0;for(let v of u){let N=v,F=Array.isArray(N.cards)?N.cards:[];d.push(...F);for(let j of m)b[j]+=Number(N?.summary?.[j]||0);}let R=u[0];return {...R,cards:d,summary:{...R.summary||{},card_count:d.length,...b}}}function q(){let u={},d=m=>{for(let[b,R]of Object.entries(m.notification.computedValues)){let v=m.notification.cards[b];u[b]={schema_version:"v1",card_id:b,card_data:v?.card_data??{},computed_values:R??{}};}};for(let m of I)d(m);return u}function M(){let u={};for(let d of I)Object.assign(u,d.notification.dataObjects||{});return u}function W(){let u=jt(),d=q(),m=M(),b={};for(let v of u){if(!v?.id)continue;let N=v.id,F=d[N]||{},j={...F.card_data&&typeof F.card_data=="object"?F.card_data:v.card_data&&typeof v.card_data=="object"?v.card_data:{}};b[N]={schema_version:F.schema_version||"v1",card_id:F.card_id||N,card_data:j,computed_values:F.computed_values&&typeof F.computed_values=="object"?F.computed_values:{}};}let R={};for(let v of u){if(!v?.id)continue;let N=v.id;try{let F=V(N),j=a.isProcessing(N);(F.length>0||j)&&(R[N]={messages:F.map(X=>({role:String(X.role||"system"),text:String(X.text||""),files:Array.isArray(X.files)?X.files:[]})),receiving:!1,processing:j});}catch{}}return {boardId:n,cardDefinitions:u,statusSnapshot:Yt(),dataObjectsByToken:m,cardRuntimeById:b,cardChatsByCardId:R}}function nt(u,d,m){let b=m?.syncBoard!==false,R=xt(u);if(!R)throw Object.assign(new Error(`Card not found: ${u}`),{statusCode:404});let v=Tt(u);if(!v)throw Object.assign(new Error(`Card not found: ${u}`),{statusCode:404});let N=d(v)||v,F=R.cardStore.set({body:N});if(F.status!=="success")throw Object.assign(new Error(F.error||`Failed to persist card: ${u}`),{statusCode:500});if(b){let j=R.board.upsertCard({params:{cardId:u,restart:true}});if(j.status!=="success")throw Object.assign(new Error(j.error||`Failed to upsert card: ${u}`),{statusCode:500})}}function gt(u,d){nt(u,d,{syncBoard:true});}function A(u,d){nt(u,d,{syncBoard:false});}function S(u,d){gt(u,m=>{if(!d||typeof d!="object"||Object.keys(d).length===0)return m;function b(R,v,N){let F=String(v||"").split(".").filter(Boolean);if(!F.length)return;let j=R;for(let X=0;X<F.length-1;X++){let et=F[X];(!j[et]||typeof j[et]!="object")&&(j[et]={}),j=j[et];}j[F[F.length-1]]=N;}if(d.fieldValues!==void 0&&d.fieldValues!==null){let R=null,v=m.view;if(v&&Array.isArray(v.elements)){for(let N of v.elements)if(N?.data&&N.data.writeTo){R=N.data.writeTo;break}}R?b(m,R,d.fieldValues):typeof d.fieldValues=="object"&&!Array.isArray(d.fieldValues)&&(m.card_data={...m.card_data||{},...d.fieldValues});}else {if(Array.isArray(d._stagedFiles)&&d._stagedFiles.length>0)return m;for(let[R,v]of Object.entries(d))R!=="_stagedFiles"&&(v!==null&&typeof v=="object"&&!Array.isArray(v)&&m[R]!==null&&typeof m[R]=="object"&&!Array.isArray(m[R])?m[R]={...m[R],...v}:m[R]=v);}return m});}function O(u){let d=String(u||"").trim();if(!d)return "upload.bin";let m=Math.max(d.lastIndexOf("/"),d.lastIndexOf("\\"));return (m>=0?d.slice(m+1):d)||"upload.bin"}function L(u){a.clear(u),a.setProcessing(u,false);}function Z(u,d,m,b){let R=typeof m=="string"?m.trim():"";return a.append(u,d,R,b)}function V(u){return a.readAll(u)}function dt(u){let d=[];try{let m=Tt(u);if(!m)return d;let b=x().read(m.card_data&&typeof m.card_data=="object"?m.card_data:null);for(let R of b)d.push(R.stored_name);}catch{}return d}function ct(u,d,m,b){let R=_(u),v=$(u),N=O(d),F=G(u),j=F?F.allocateStoredName(R,N,{seedNames:dt(u),maxLen:jn}):`${String(Date.now())}-${N}`;return v.files&&v.files.putBytes(`${R}/${j}`,new Uint8Array(b),m||"application/octet-stream"),{name:N,stored_name:j,size:b.length,mime_type:m||"application/octet-stream",uploaded_at:new Date().toISOString()}}function St(u){let d=xt(u);if(!d)return null;let m=d.board.getConfig({params:{key:"chat-handler-flow"}}),b=m.status==="success"?m.data?.value:null,R=d.chatHandlerRef;return b==null&&(!R||typeof R!="object")?null:{ctx:d,handlerFlow:b,handlerRef:R}}function lt(u,d,m=false){let b=St(u);if(!b)return;let{ctx:R,handlerFlow:v,handlerRef:N}=b;if(!m)try{a.setProcessing(u,!0);}catch{}let F={boardId:n,cardId:String(u),lastChatEntryId:d,...g,...p?{serverUrl:p}:{}};if(!i&&v!=null){try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${u}" but no chatFlowRunner was provided`);return}if(v!=null){let X=i;if(!X)return;X.run(v,F,{boardId:n,cardId:String(u),label:R.label,logger:o,serverUrl:p,executionExtra:g}).then(et=>{if(et.dispatched)o.info(`[chat-handler-flow] invoked for card "${u}" (boardId: "${n}")`);else {try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${u}": ${et.error||"unknown"}`);}},et=>{try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${u}": ${et?.message||String(et)}`);});return}let j=N;j&&s.invoke(j,F).then(X=>{if(X.dispatched)o.info(`[chat-handler] invoked for card "${u}" (boardId: "${n}")`);else {try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${u}": ${X.error||"unknown"}`);}},X=>{try{a.setProcessing(u,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${u}": ${X?.message||String(X)}`);});}function vt(u,d,m){let b=d==="chat-send"?A:gt,R;b(u,v=>{let N=new Date().toISOString(),F=v.card_data&&typeof v.card_data=="object"?v.card_data:{};if(v.card_data=F,d==="chat-send"){let j=m&&typeof m.text=="string"?m.text.trim():"",X=[];if(Array.isArray(m?.files)){for(let et of m.files)if(et){if(typeof et=="string"){X.push({name:et});continue}if(typeof et=="object"){let ft=et;typeof ft.name=="string"&&X.push({name:ft.name,size:ft.size,mime_type:ft.mime_type,uploaded_at:ft.uploaded_at,stored_name:ft.stored_name,chat:ft.chat===true});}}}if(j||X.length>0){let et=c.runBatch({cardId:u,commands:[{command:"append",role:"user",text:j,files:X},{command:"set-processing",active:true}]});if(et.status!=="success")throw new Error(et.error);let ft=et.data.results[0]?.data?.id;if(typeof ft!="string"||!ft)throw new Error(`chat-send did not return an append id for card ${u}`);R={cardId:u,lastEntryId:ft,processingAlreadySet:true};try{let J=V(u);E([{kind:"card_chats",cardId:u,messages:J.map(Q=>({role:String(Q.role||"system"),text:String(Q.text||""),files:Array.isArray(Q.files)?Q.files:[]})),receiving:!0,processing:a.isProcessing(u)}]);}catch{}}return v}if(d==="file-upload"){let j=x().normalizeIncoming(m?.files,N);return j.length>0&&x().merge(F,j),v}if(d==="action"){let j=m&&typeof m.buttonId=="string"?m.buttonId:"";if(!j)return v;F.lastAction={buttonId:j,at:N},F.lastActionText=`${j} @ ${N}`;}return v}),R&&lt(R.cardId,R.lastEntryId,R.processingAlreadySet);}function K(u,d,m){let b=JSON.stringify(m),R=typeof Buffer<"u"?Buffer.byteLength(b):new TextEncoder().encode(b).length;u.writeHead(d,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":R}),u.end(b);}async function mt(u){let d=[];for await(let b of u)d.push(b);let m=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(wt(d)).trim();return m?JSON.parse(m):{}}async function It(u){let d=[];for await(let m of u)d.push(m);return typeof Buffer<"u"?Buffer.concat(d):wt(d)}function wt(u){let d=u.reduce((R,v)=>R+v.length,0),m=new Uint8Array(d),b=0;for(let R of u)m.set(R,b),b+=R.length;return m}let Ft=0;function Dt(u){let d=JSON.stringify(u);return Ft++,`id: ${Ft}
2
2
  data: ${d}
3
3
 
4
- `}function Ht(u){let d=u;try{d.flushHeaders?.();}catch{}try{d.flush?.();}catch{}try{d.socket?.setNoDelay?.(!0);}catch{}try{d.socket?.uncork?.();}catch{}}function Vt(u,d){let m=l.get(u);if(!m)return;let C=Lt(d);try{m.res.write(C),Ht(m.res);}catch{l.delete(u);}}function qt(){let u=new Set;for(let d of l.values())for(let m of d.subscribedChatCardIds)u.add(m);return Array.from(u)}function Ee(u){let d=h.has(u)?h.get(u):null,{cursor:m}=a.readAfter(u,d),C=a.isProcessing(u),R=C!==(y.get(u)??false),v=m!==d;return v&&h.set(u,m),y.set(u,C),v||R}function ye(u,d=true){let m=H(u),C=Date.now();return {kind:"card_chats",cardId:u,sentAt:new Date(C).toISOString(),sentAtMs:C,messages:m.map(R=>({role:String(R.role||"system"),text:String(R.text||""),files:Array.isArray(R.files)?R.files:[]})),receiving:d,processing:a.isProcessing(u)}}function Et(u,d=true){let m={kind:"notification-batch",notifications:[ye(u,d)]};for(let[C,R]of l.entries())R.subscribedChatCardIds.has(u)&&Vt(C,m);}function Pt(){qt().length>0||(k&&(clearInterval(k),k=null),h.clear(),y.clear());}function ke(){if(k)return;let u=()=>{let d=qt();if(d.length===0){Pt();return}let m=new Set(d);for(let C of Array.from(h.keys()))m.has(C)||h.delete(C);for(let C of Array.from(y.keys()))m.has(C)||y.delete(C);for(let C of d)Ee(C)&&Et(C,true);};u(),k=setInterval(u,1e3);}function Mt(u,d){let m=l.get(u);if(!m)return false;m.subscribedChatCardIds.add(d);let{cursor:C}=a.readAfter(d,null);return h.set(d,C),y.set(d,a.isProcessing(d)),ke(),Vt(u,{kind:"notification-batch",notifications:[ye(d,true)]}),true}function Nt(u,d){let m=l.get(u);return m?(m.subscribedChatCardIds.delete(d),qt().includes(d)||(h.delete(d),y.delete(d)),Pt(),true):false}function Se(u){if(!u||typeof u!="object")return false;let d=u.kind;return d==="card_chats"||d==="chat_messages"}function E(u){if(!u||u.length===0)return;let d=[],m=new Set;for(let C of u)Se(C)&&typeof C.cardId=="string"?m.add(String(C.cardId)):d.push(C);if(d.length>0){let C={kind:"notification-batch",notifications:d};for(let R of l.keys())Vt(R,C);}for(let C of m)Et(C,true);}function F(u,d,m){let C=l.get(m),R=C?new Set(C.subscribedChatCardIds):new Set;if(C)try{C.res.end();}catch{}d.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),Ht(d),l.set(m,{res:d,subscribedChatCardIds:R});let v=W(),N=Lt(v);d.write(N);let D=setInterval(()=>{try{d.write(`: keepalive
4
+ `}function Vt(u){let d=u;try{d.flushHeaders?.();}catch{}try{d.flush?.();}catch{}try{d.socket?.setNoDelay?.(!0);}catch{}try{d.socket?.uncork?.();}catch{}}function Ht(u,d){let m=l.get(u);if(!m)return;let b=Dt(d);try{m.res.write(b),Vt(m.res);}catch{l.delete(u);}}function Lt(){let u=new Set;for(let d of l.values())for(let m of d.subscribedChatCardIds)u.add(m);return Array.from(u)}function Ee(u){let d=h.has(u)?h.get(u):null,{cursor:m}=a.readAfter(u,d),b=a.isProcessing(u),R=b!==(y.get(u)??false),v=m!==d;return v&&h.set(u,m),y.set(u,b),v||R}function ye(u,d=true){let m=V(u),b=Date.now();return {kind:"card_chats",cardId:u,sentAt:new Date(b).toISOString(),sentAtMs:b,messages:m.map(R=>({role:String(R.role||"system"),text:String(R.text||""),files:Array.isArray(R.files)?R.files:[]})),receiving:d,processing:a.isProcessing(u)}}function Et(u,d=true){let m={kind:"notification-batch",notifications:[ye(u,d)]};for(let[b,R]of l.entries())R.subscribedChatCardIds.has(u)&&Ht(b,m);}function qt(){Lt().length>0||(k&&(clearInterval(k),k=null),h.clear(),y.clear());}function ke(){if(k)return;let u=()=>{let d=Lt();if(d.length===0){qt();return}let m=new Set(d);for(let b of Array.from(h.keys()))m.has(b)||h.delete(b);for(let b of Array.from(y.keys()))m.has(b)||y.delete(b);for(let b of d)Ee(b)&&Et(b,true);};u(),k=setInterval(u,1e3);}function Mt(u,d){let m=l.get(u);if(!m)return false;m.subscribedChatCardIds.add(d);let{cursor:b}=a.readAfter(d,null);return h.set(d,b),y.set(d,a.isProcessing(d)),ke(),Ht(u,{kind:"notification-batch",notifications:[ye(d,true)]}),true}function Nt(u,d){let m=l.get(u);return m?(m.subscribedChatCardIds.delete(d),Lt().includes(d)||(h.delete(d),y.delete(d)),qt(),true):false}function Se(u){if(!u||typeof u!="object")return false;let d=u.kind;return d==="card_chats"||d==="chat_messages"}function E(u){if(!u||u.length===0)return;let d=[],m=new Set;for(let b of u)Se(b)&&typeof b.cardId=="string"?m.add(String(b.cardId)):d.push(b);if(d.length>0){let b={kind:"notification-batch",notifications:d};for(let R of l.keys())Ht(R,b);}for(let b of m)Et(b,true);}function P(u,d,m){let b=l.get(m),R=b?new Set(b.subscribedChatCardIds):new Set;if(b)try{b.res.end();}catch{}d.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),Vt(d),l.set(m,{res:d,subscribedChatCardIds:R});let v=W(),N=Dt(v);d.write(N);let F=setInterval(()=>{try{d.write(`: keepalive
5
5
 
6
- `);}catch{}},15e3);u.on("close",()=>{clearInterval(D),l.get(m)?.res===d&&(l.delete(m),Pt());try{d.end();}catch{}});}async function tt(u,d,m){let C=u.method||"GET",R=m,v=R.pathname;try{if(C==="GET"&&v===`${e}/init-board`)return await st(),K(d,200,W()),!0;if(C==="GET"&&v===`${e}/sse`){await st();let V=String(R.searchParams.get("clientId")||"").trim();if(!V)return K(d,400,{error:"clientId query param is required for SSE"}),!0;F(u,d,V);for(let J=0;J<I.length;J++)U(I[J]),z(I[J],J);return !0}if(C==="GET"&&v===`${e}/board-status`)return K(d,200,W()),!0;let N=v.match(new RegExp(`^${Ft(e)}/cards/([^/]+)$`));if(C==="GET"&&N){await Y();let V=decodeURIComponent(N[1]),J=Tt(V);return J?(K(d,200,J),!0):(K(d,404,{error:`card not found: ${V}`}),!0)}if(C==="PATCH"&&N){await Y();let V=decodeURIComponent(N[1]),J=await mt(u);return S(V,J),K(d,200,{ok:!0}),!0}let D=v.match(new RegExp(`^${Ft(e)}/cards/([^/]+)/actions$`));if(C==="POST"&&D){await Y();let V=decodeURIComponent(D[1]),J=Date.now(),Q=new Date(J).toISOString(),At=await mt(u),ht=At?.actionType;if(ht==="chat-send"&&!St(V)){let _t=Date.now();return K(d,409,{error:`chat handler is not configured for card: ${V}`,requestReceivedAt:Q,requestReceivedAtMs:J,responseSentAt:new Date(_t).toISOString(),responseSentAtMs:_t,responseStatus:409}),!0}vt(V,ht,At?.payload);let yt=Date.now();return K(d,200,{ok:!0,requestReceivedAt:Q,requestReceivedAtMs:J,responseSentAt:new Date(yt).toISOString(),responseSentAtMs:yt,responseStatus:200}),!0}let j=v.match(new RegExp(`^${Ft(e)}/cards/([^/]+)/chats$`));if(C==="GET"&&j){await Y();let V=decodeURIComponent(j[1]);return K(d,200,{ok:!0,messages:H(V)}),!0}if(C==="POST"&&j){await Y();let V=decodeURIComponent(j[1]),J=await mt(u),Q=typeof J?.role=="string"?J.role:"assistant",At=typeof J?.text=="string"?J.text:"",ht=Array.isArray(J?.files)?J.files:[],yt=J?.done===!0,_t=a.append(V,Q,At,ht);return yt&&a.setProcessing(V,!1),Et(V,!yt),K(d,200,{ok:!0,id:_t}),!0}let X=v.match(new RegExp(`^${Ft(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(C==="POST"&&X){await Y();let V=decodeURIComponent(X[1]),J=await mt(u),Q=typeof J?.clientId=="string"?J.clientId.trim():"";return Q?Mt(Q,V)?(K(d,200,{ok:!0,clientId:Q,cardId:V,subscribed:!0}),!0):(K(d,404,{error:`SSE client not connected: ${Q}`}),!0):(K(d,400,{error:"clientId is required"}),!0)}let et=v.match(new RegExp(`^${Ft(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(C==="POST"&&et){await Y();let V=decodeURIComponent(et[1]),J=await mt(u),Q=typeof J?.clientId=="string"?J.clientId.trim():"";return Q?Nt(Q,V)?(K(d,200,{ok:!0,clientId:Q,cardId:V,subscribed:!1}),!0):(K(d,404,{error:`SSE client not connected: ${Q}`}),!0):(K(d,400,{error:"clientId is required"}),!0)}let ft=v.match(new RegExp(`^${Ft(e)}/cards/([^/]+)/files$`));if(C==="POST"&&ft){await Y();let V=decodeURIComponent(ft[1]),J=String(R.searchParams.get("inChat")||"").toLowerCase()==="true",Q=u.headers["x-file-name"],At=String(u.headers["content-type"]||"application/octet-stream"),ht=Array.isArray(Q)?Q[0]:Q,yt=ht?decodeURIComponent(String(ht)):"upload.bin",_t=await It(u);if(!_t.length)return K(d,400,{error:"Empty upload body"}),!0;let kt=ct(V,yt,At,_t),Gt=null;if(A(V,Ct=>{let Qt=new Date().toISOString(),te=Ct.card_data&&typeof Ct.card_data=="object"?Ct.card_data:{};Ct.card_data=te;let Gr=x().normalizeIncoming([{name:kt.name,stored_name:kt.stored_name,size:kt.size,mime_type:kt.mime_type,uploaded_at:kt.uploaded_at||Qt,chat:J}],Qt);return Gt=x().merge(te,Gr).findIndex(Ur=>Ur.stored_name===kt.stored_name),Ct}),J){let Ct=typeof Gt=="number"&&Gt>=0?` #${Gt}`:"";Z(V,"system",`file uploaded: ${kt.name} as ${kt.stored_name}${Ct}`,[]);}return K(d,200,{ok:!0,file:kt}),!0}let Zt=v.match(new RegExp(`^${Ft(e)}/cards/([^/]+)/files/(\\d+)$`));if(C==="GET"&&Zt){let V=decodeURIComponent(Zt[1]),J=parseInt(Zt[2],10),Q=R.searchParams.get("sn"),At=Tt(V);if(!At)return K(d,404,{error:"Card not found"}),!0;let ht=x().resolve(At.card_data,J,Q);if(!ht.ok&&ht.reason==="stale_reference")return K(d,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ht.ok)return K(d,404,{error:"File not found"}),!0;let yt=ht.file,_t=_(V),kt=$(V),Gt=`${_t}/${yt.stored_name}`,Ct=kt.files?kt.files.getBytes(Gt):null;if(!Ct)return K(d,404,{error:"File not found"}),!0;let Qt=yt.name||yt.stored_name,te=yt.mime_type||"application/octet-stream";return d.writeHead(200,{"Content-Type":te,"Content-Disposition":`attachment; filename="${Qt}"`,"Content-Length":Ct.length}),d.end(Ct),!0}return !1}catch(N){let D=N?.statusCode||500;return K(d,D,{error:String(N?.message||N)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleRuntimeApi:tt,buildPublishedRuntimePayload:W,clearChatRecords:q,reportSourceFetched(u,d){let m=I[0];return m?m.board.sourceDataFetched({params:{token:u,ref:d}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(u,d){let m=I[0];return m?m.board.sourceDataFetchFailure({params:{token:u,reason:d}}):{status:"fail",error:"no board context"}},get cardStore(){return I[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Ft(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function xe(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return `[${t.map(xe).join(",")}]`;let e=t;return `{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${xe(e[n])}`).join(",")}}`}function le(t,e){let r=e>>>0;for(let n=0;n<t.length;n++)r^=t.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function jr(t){let e=xe(t),r=le(e,2166136261),n=le(e,3735928559),o=le(e,19088743),s=le(e,4277009102);return [r,n,o,s].map(i=>i.toString(16).padStart(8,"0")).join("")}function ge(t){function e(s){return `${t}:blob:${s}`}let r=new TextEncoder;function n(s){if(typeof btoa=="function"){let i="";for(let a=0;a<s.length;a++)i+=String.fromCharCode(s[a]);return btoa(i)}return ""}function o(s){if(typeof atob=="function"){let i=atob(s),a=new Uint8Array(i.length);for(let c=0;c<i.length;c++)a[c]=i.charCodeAt(c);return a}return new Uint8Array}return {read(s){return globalThis.localStorage.getItem(e(s))},write(s,i){globalThis.localStorage.setItem(e(s),i);},exists(s){return globalThis.localStorage.getItem(e(s))!==null},remove(s){globalThis.localStorage.removeItem(e(s));},readBytes(s){let i=globalThis.localStorage.getItem(e(s));if(i===null)return null;try{let a=JSON.parse(i);if(a&&a.__kind==="bytes-b64"&&typeof a.data=="string")return o(a.data)}catch{}return r.encode(i)},writeBytes(s,i){let a=JSON.stringify({__kind:"bytes-b64",data:n(i)});globalThis.localStorage.setItem(e(s),a);},listKeys(s){let i=e(s??""),a=[];for(let c=0;c<globalThis.localStorage.length;c++){let f=globalThis.localStorage.key(c);f&&f.startsWith(i)&&a.push(f.slice(e("").length));}return a.sort()},stat(s){let i=globalThis.localStorage.getItem(e(s));if(i===null)return null;let a=r.encode(i).byteLength;try{let c=JSON.parse(i);c&&c.__kind==="bytes-b64"&&typeof c.data=="string"&&(a=o(c.data).byteLength);}catch{}return {key:s,size:a}}}}var $n=":scratch-marker",Fn=":scratch-config",fe=":scratch:",Dn=1440*60*1e3,Ln=720*60*1e3,qn=200;function Er(t,e){if(!t)return e;let r=t.replace(/[^A-Za-z0-9._-]/g,"_");return r.length>0?r:e}function Te(t){let e=`${t}${$n}`,r=`${t}${Fn}`,n=g=>`${t}${fe}${g}`,o=g=>`${t}${fe}${g}:__ts`,s=globalThis.localStorage.getItem(e)===null;if(s)try{globalThis.localStorage.setItem(e,`scratch-store
7
- ${new Date().toISOString()}`);}catch{}function i(){let g=globalThis.localStorage.getItem(r);if(g===null)return {};try{let l=JSON.parse(g);return l&&typeof l=="object"&&!Array.isArray(l)?l:{}}catch{return {}}}function a(g){try{globalThis.localStorage.setItem(r,JSON.stringify(g));}catch{}}if(s){let g=i();typeof g["retention.lastSweepAt"]!="number"&&(g["retention.lastSweepAt"]=Date.now(),a(g));}function c(){if(globalThis.localStorage.getItem(e)===null)return;let g=i(),l=typeof g["retention.maxAgeMs"]=="number"?g["retention.maxAgeMs"]:Dn,h=typeof g["retention.sweepIntervalMs"]=="number"?g["retention.sweepIntervalMs"]:Ln;if(l<=0||h<=0)return;let y=typeof g["retention.lastSweepAt"]=="number"?g["retention.lastSweepAt"]:0,k=Date.now();if(k-y<h)return;g["retention.lastSweepAt"]=k,a(g);let T=k,I=`${t}${fe}`,b=[];for(let w=0;w<globalThis.localStorage.length;w++){let $=globalThis.localStorage.key(w);$&&$.startsWith(I)&&!$.endsWith(":__ts")&&b.push($);}for(let w of b){if(Date.now()-T>qn)break;let $=globalThis.localStorage.getItem(`${w}:__ts`),G=$===null?0:Number($);if(Number.isFinite(G)&&G>0&&k-G>l){try{globalThis.localStorage.removeItem(w);}catch{}try{globalThis.localStorage.removeItem(`${w}:__ts`);}catch{}}}}function f(g,l){let h=Er(g,"scratch"),y=Er(l,".json"),k=y.startsWith(".")?y:`.${y}`,T=Math.random().toString(36).slice(2,10);return `${h}-${Date.now()}-${T}${k}`}function p(g,l){globalThis.localStorage.setItem(n(g),l),globalThis.localStorage.setItem(o(g),String(Date.now()));}return {read(g){return globalThis.localStorage.getItem(n(g))},write(g,l){p(g,l);try{c();}catch{}},exists(g){return globalThis.localStorage.getItem(n(g))!==null},remove(g){try{globalThis.localStorage.removeItem(n(g));}catch{}try{globalThis.localStorage.removeItem(o(g));}catch{}},readBytes(g){let l=globalThis.localStorage.getItem(n(g));return l===null?null:new TextEncoder().encode(l)},writeBytes(g,l){let h="";for(let y=0;y<l.length;y++)h+=String.fromCharCode(l[y]);p(g,h);try{c();}catch{}},stat(g){let l=globalThis.localStorage.getItem(n(g));if(l===null)return null;let h=globalThis.localStorage.getItem(o(g)),y=h===null?null:Number(h);return {key:g,size:new TextEncoder().encode(l).byteLength,updatedAt:y!==null&&Number.isFinite(y)?new Date(y).toISOString():void 0}},listKeys(g){let l=`${t}${fe}`,h=[];for(let y=0;y<globalThis.localStorage.length;y++){let k=globalThis.localStorage.key(y);if(k&&k.startsWith(l)&&!k.endsWith(":__ts")){let T=k.slice(l.length);(!g||T.startsWith(g))&&h.push(T);}}return h.sort()},getUniqueKey(g,l){return f(g,l)},create(g,l,h){let y=f(l,h);p(y,g);try{c();}catch{}return y},keyRef(g){return {kind:"local-storage-scratch",value:g,extra:{prefix:t}}},config:{get(g){return i()[g]??null},set(g,l){let h=i();l==null?delete h[g]:h[g]=l,a(h);}}}}var Pn=":archive-marker",Mn=":archive-config",_e=":archive:stream:",Or=":archive:blob:";function Br(t){let e=t.replace(/[^A-Za-z0-9._-]/g,"_");if(!e)throw new Error("Archive segment name cannot be empty after sanitization");return e}function Ie(t){let e=`${t}${Pn}`,r=`${t}${Mn}`,n=a=>`${t}${_e}${a}`;if(globalThis.localStorage.getItem(e)===null)try{globalThis.localStorage.setItem(e,`archive-store
8
- ${new Date().toISOString()}`);}catch{}function o(){let a=globalThis.localStorage.getItem(r);if(a===null)return {};try{let c=JSON.parse(a);return c&&typeof c=="object"&&!Array.isArray(c)?c:{}}catch{return {}}}function s(a){try{globalThis.localStorage.setItem(r,JSON.stringify(a));}catch{}}function i(){if(globalThis.localStorage.getItem(e)===null)return;let a=o(),c=typeof a["retention.maxAgeMs"]=="number"?a["retention.maxAgeMs"]:0,f=typeof a["retention.sweepIntervalMs"]=="number"?a["retention.sweepIntervalMs"]:0;if(c<=0||f<=0)return;let p=typeof a["retention.lastSweepAt"]=="number"?a["retention.lastSweepAt"]:0,g=Date.now();if(g-p<f)return;a["retention.lastSweepAt"]=g,s(a);let l=`${t}${_e}`;for(let h=0;h<globalThis.localStorage.length;h++){let y=globalThis.localStorage.key(h);if(!y||!y.startsWith(l))continue;let k=globalThis.localStorage.getItem(y);if(k)try{let T=JSON.parse(k),I=T.filter(b=>typeof b.__ts!="number"||g-b.__ts<=c);I.length!==T.length&&globalThis.localStorage.setItem(y,JSON.stringify(I));}catch{}}}return {stream(a){let c=Br(a),f=n(c);function p(){let l=globalThis.localStorage.getItem(f);if(!l)return [];try{return JSON.parse(l)}catch{return []}}function g(l){try{globalThis.localStorage.setItem(f,JSON.stringify(l));}catch{}}return {append(l){let h={id:globalThis.crypto.randomUUID(),payload:l,__ts:Date.now()},y=p();y.push(h),g(y);try{i();}catch{}return {id:h.id,payload:h.payload}},readAll(){return p().map(l=>({id:l.id,payload:l.payload}))},readAfter(l){let h=p();if(!l){let I=h.map(b=>({id:b.id,payload:b.payload}));return {entries:I,newCursor:I.length>0?I[I.length-1].id:null}}let y=h.findIndex(I=>I.id===l),T=(y===-1?h:h.slice(y+1)).map(I=>({id:I.id,payload:I.payload}));return {entries:T,newCursor:T.length>0?T[T.length-1].id:l}},clear(){try{globalThis.localStorage.removeItem(f);}catch{}}}},blob(a){let c=Br(a),f=ge(`${t}${Or}${c}`);return {read:p=>f.read(p),write:(p,g)=>{f.write(p,g);try{i();}catch{}},exists:p=>f.exists(p),remove:p=>f.remove(p),readBytes:f.readBytes?p=>f.readBytes(p):void 0,writeBytes:f.writeBytes?(p,g)=>{f.writeBytes(p,g);try{i();}catch{}}:void 0,listKeys:p=>f.listKeys(p),stat:f.stat?p=>f.stat(p):void 0}},listStreams(a){let c=`${t}${_e}`,f=[];for(let p=0;p<globalThis.localStorage.length;p++){let g=globalThis.localStorage.key(p);if(!g||!g.startsWith(c))continue;let l=g.slice(c.length);(!a||l.startsWith(a))&&f.push(l);}return f.sort()},listBlobs(a){let c=`${t}${Or}`,f=new Set;for(let p=0;p<globalThis.localStorage.length;p++){let g=globalThis.localStorage.key(p);if(!g||!g.startsWith(c))continue;let l=g.slice(c.length),h=l.indexOf(":"),y=h===-1?l:l.slice(0,h);(!a||y.startsWith(a))&&f.add(y);}return Array.from(f).sort()},config:{get(a){return o()[a]??null},set(a,c){let f=o();c==null?delete f[a]:f[a]=c,s(f);}}}}function pe(t){function e(r){return `${t}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(e(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(e(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(e(r));},listKeys(r){let n=e(r??""),o=[];for(let s=0;s<globalThis.localStorage.length;s++){let i=globalThis.localStorage.key(s);i!==null&&i.startsWith(n)&&o.push(i.slice(e("").length));}return o}}}function Nr(t){function e(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {readAllEntries(){return e()},appendEntry(n){let o=e();o.push(n),r(o);},generateId(){return globalThis.crypto.randomUUID()}}}function Gn(){let t=false;return {tryAcquire(){return t?null:(t=true,()=>{t=false;})}}}function Un(t){return String(t).replace(/[^a-zA-Z0-9_-]/g,"_")}function Jn(t){function e(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {append(n){let o={id:globalThis.crypto.randomUUID(),payload:n},s=e();return s.push(o),r(s),o},readAll(){return e()},readAfter(n){let o=e();if(!n)return {entries:o,newCursor:o.length>0?o[o.length-1].id:null};let s=o.findIndex(a=>a.id===n),i=s===-1?o:o.slice(s+1);return {entries:i,newCursor:i.length>0?i[i.length-1].id:n}},clear(){globalThis.localStorage.removeItem(t);}}}function Fr(t){return vr(e=>Jn(`${t}:chat:journal:${Un(e)}`),pe(`${t}:chat`))}var $r=new Map;function me(t){let e=$r.get(t);if(!e){let r=new Set;e={publish(n){for(let o of r)o(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},$r.set(t,e);}return e}function Dr(){return {async subscribe(t,e){return t.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${t.kind}`),()=>{}):me(t.value).subscribe(n=>{let o=n;if(o&&o.kind==="notification-batch"&&Array.isArray(o.notifications)){for(let s of o.notifications)e(s);return}e(n);})}}}function Lr(t,e){let r=e?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:e.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:ot({kind:"in-browser",value:t})},n=new Map,o=new Map,s=Gn();return {kvStorage:i=>pe(`${t}:${i}`),blobStorage:i=>ge(i?`${t}:${i}`:t),scratchStorage:()=>Te(`${t}:scratch`),scratchStorageForRef:i=>Te(bt(i).value),archiveFactory:()=>Ie(`${t}:archive`),archiveFactoryForRef:i=>Ie(bt(i).value),journalAdapter:()=>Nr(`${t}:journal`),lock:s,selfRef:r,async dispatchExecution(i,a){if(i.howToRun==="http:post")try{let c=i.whatToRun,f=typeof c=="object"?c.value:bt(c).value,p=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return p.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${p.status}: ${p.statusText}`}}catch(c){return {dispatched:false,error:c instanceof Error?c.message:String(c)}}if(i.howToRun==="http:get")try{let c=i.whatToRun,f=typeof c=="object"?c.value:bt(c).value,p=new URLSearchParams(Object.entries(a).filter(([,h])=>h!=null).map(([h,y])=>[h,String(y)])),g=`${f}?${p.toString()}`,l=await fetch(g);return l.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${l.status}: ${l.statusText}`}}catch(c){return {dispatched:false,error:c instanceof Error?c.message:String(c)}}if(i.howToRun==="in-browser"){let c=i.whatToRun,f=typeof c=="object"?c.value:bt(c).value,p=n.get(f);return p?p(i,a):{dispatched:false,error:`No in-browser handler registered for: ${f}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${i.howToRun})`}},resolveBlob(i){if(i.kind==="in-memory"){let f=o.get(i.value);if(f==null)throw new Error(`resolveBlob: in-memory blob not found: ${ot(i)}`);return f}let c=ge(t).read(i.value);if(c===null)throw new Error(`resolveBlob: blob not found: ${ot(i)}`);return c},hashFn:jr,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:i=>pe(bt(i).value),publishBoardChangeNotifications(i){if(!e?.notifyChannel||i.length===0)return;me(e.notifyChannel).publish({kind:"notification-batch",notifications:i});},onWarn:e?.onWarn,registerHandler(i,a){n.set(i,a);},writeMemoryBlob(i,a){return o.set(i,a),ot({kind:"in-memory",value:i})}}}function qr(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function Hn(t,e){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:t,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function Xt(t,e){if(!t||typeof t!="object")throw new Error("payload must be an object");if(!e)throw new Error("cardId is required");let n=(Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).find(w=>w.id===e);if(!n)throw new Error(`cardDefinitions has no entry with id ${e}`);let o=t.statusSnapshot&&typeof t.statusSnapshot=="object"?t.statusSnapshot:{},s=t.cardRuntimeById&&typeof t.cardRuntimeById=="object"?t.cardRuntimeById:{},i=t.dataObjectsByToken&&typeof t.dataObjectsByToken=="object"?t.dataObjectsByToken:{},c=(Array.isArray(o.cards)?o.cards:[]).find(w=>w.name===e),f=structuredClone(n),p=Hn(e,s[e]),l={...f.card_data&&typeof f.card_data=="object"&&!Array.isArray(f.card_data)?f.card_data:{},...p.card_data||{},status:qr(c?.status),lastRun:c?.runtime?.last_transition_at??null};c?.error?.message&&(l.error=c.error.message);let h=c?{task_status:c.status??null,card_status:qr(c.status),runtime:structuredClone(c.runtime??{}),error:c.error?structuredClone(c.error):null,blocked_by:Array.isArray(c.blocked_by)?structuredClone(c.blocked_by):[],requires_missing:Array.isArray(c.requires_missing)?structuredClone(c.requires_missing):[]}:{task_status:null,card_status:l.status??"fresh",runtime:{last_transition_at:l.lastRun??null},error:l.error?{message:l.error}:null,blocked_by:[],requires_missing:[]},y=Array.isArray(f.requires)?f.requires:[],k={};for(let[w,$]of Object.entries(i))k[w]=structuredClone($);for(let w of y)Object.prototype.hasOwnProperty.call(k,w)||(k[w]=null);let I=(t.cardChatsByCardId&&typeof t.cardChatsByCardId=="object"?t.cardChatsByCardId:{})[e],b=I?{messages:Array.isArray(I.messages)?I.messages:[],receiving:!!I.receiving,processing:!!I.processing}:null;return {id:e,card:f,card_data:l,requires:k,computed_values:p.computed_values,runtime_state:h,card_chats:b}}function Vn(t){if(!t||typeof t!="object")throw new Error("payload must be an object");return (Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).map(r=>Xt(t,r.id))}function he(t){return JSON.parse(JSON.stringify(t))}function Jt(t,e){if(t===e)return t;try{if(JSON.stringify(t)===JSON.stringify(e))return t}catch{}return e}function Rt(t,e){if(t===e)return true;try{return JSON.stringify(t)===JSON.stringify(e)}catch{return false}}function Kn(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function Pr(t,e,r){let n=t,s=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(c=>c.id),i=e&&e.modelsById||{},a={};for(let c of s){let f=r(t,c),p=i[c];if(!p){a[c]=f;continue}let g=f.card_chats!=null?Jt(p.card_chats,f.card_chats??null):p.card_chats??null,l={id:f.id,card:Jt(p.card,f.card),card_data:Jt(p.card_data,f.card_data),requires:Jt(p.requires,f.requires),computed_values:Jt(p.computed_values,f.computed_values),runtime_state:Jt(p.runtime_state,f.runtime_state),card_chats:g};a[c]=l.card===p.card&&l.card_data===p.card_data&&l.requires===p.requires&&l.computed_values===p.computed_values&&l.runtime_state===p.runtime_state&&l.card_chats===p.card_chats?p:l;}return {payload:t,cardIds:s,modelsById:a}}function Mr(t,e,r,n){if(!t||!Array.isArray(e)||e.length===0)return t;let o=t.modelsById,s=t.cardIds,i=false,a=false,c={};for(let p of s){let g=o[p],l=g&&g.requires;if(l&&typeof l=="object")for(let h of Object.keys(l))(c[h]=c[h]||[]).push(p);}function f(){i||(o={...o},i=true);}for(let p of e)if(!(!p||!p.kind)){if(p.kind==="computed_values"){let g=p.cardId,l=o[g];if(!l)continue;let h=p.values||{};if(Rt(l.computed_values,h))continue;f(),o[g]={...l,computed_values:h},a=true;}else if(p.kind==="data_object"){let g=p.key,l=p.payload,h=c[g]||[];for(let y of h){let k=o[y];if(!k)continue;let T=k.requires||{};Rt(T[g],l)||(f(),o[y]={...k,requires:{...T,[g]:l}},a=true);}}else if(p.kind==="card_refreshed"){let g=p.cardId,l=null,h=o[g],y=p.card;if(h&&y&&typeof y=="object"&&!Array.isArray(y)){let k=y,T=k.card_data&&typeof k.card_data=="object"&&!Array.isArray(k.card_data)?k.card_data:h.card_data,I=k.requires&&typeof k.requires=="object"&&!Array.isArray(k.requires)?k.requires:h.requires,b=k.computed_values&&typeof k.computed_values=="object"&&!Array.isArray(k.computed_values)?k.computed_values:h.computed_values,w=k.runtime_state&&typeof k.runtime_state=="object"&&!Array.isArray(k.runtime_state)?k.runtime_state:h.runtime_state;l={...h,card:y,card_data:T,requires:I,computed_values:b,runtime_state:w};}if(!l)try{let k=n();k&&(l=r(k,g));}catch{}if(!l||h&&Rt(h.card,l.card)&&Rt(h.card_data,l.card_data)&&Rt(h.requires,l.requires)&&Rt(h.computed_values,l.computed_values)&&Rt(h.runtime_state,l.runtime_state))continue;f(),o[g]=l,s.includes(g)||(s=[...s,g]),a=true;}else if(p.kind==="card_chats"){let g=p.cardId,l=o[g];if(!l)continue;let h=Array.isArray(p.messages)?p.messages:l.card_chats?.messages??[],y=typeof p.receiving=="boolean"?p.receiving:l.card_chats?.receiving??false,k=typeof p.processing=="boolean"?p.processing:l.card_chats?.processing??false,T={messages:h,receiving:y,processing:k};if(Rt(l.card_chats,T))continue;f(),o[g]={...l,card_chats:T},a=true;}else if(p.kind==="chat_messages"){let g=p.cardId,l=o[g];if(!l)continue;let h=Array.isArray(p.messages)?p.messages:[],y=l.card_chats||{receiving:false,processing:false},k={messages:h,receiving:y.receiving,processing:!!y.processing};if(Rt(l.card_chats,k))continue;f(),o[g]={...l,card_chats:k},a=true;}else if(p.kind==="status"){let g=p.status?.cards??[];for(let l of g){let h=l?.name;if(!h||!o[h])continue;let y=o[h],k=Kn(l.status),T={...y.card_data||{},status:k,lastRun:l.runtime?.last_transition_at??null,...l.error?.message?{error:l.error.message}:{}};l.error?.message||delete T.error;let I={task_status:l.status??null,card_status:k,runtime:l.runtime?he(l.runtime):{},error:l.error?he(l.error):null,blocked_by:Array.isArray(l.blocked_by)?he(l.blocked_by):[],requires_missing:Array.isArray(l.requires_missing)?he(l.requires_missing):[]};Rt(y.card_data,T)&&Rt(y.runtime_state,I)||(f(),o[h]={...y,card_data:T,runtime_state:I},a=true);}}}return a?{payload:t.payload,cardIds:s,modelsById:o}:t}function hs(t,e){let r=e?.cards??[],n=e?.onWarn??(()=>{}),o=`${t}:notify`,s=Lr(t,{callbackBaseUrl:e?.callbackBaseUrl,notifyChannel:o,onWarn:n}),i=bt(ot({kind:"localstorage",value:t})),a=ot({kind:"localstorage",value:`${t}:card-store`}),c=ot({kind:"localstorage",value:`${t}:outputs`}),f=e?.taskExecutor??null,p=e?.chatHandler??null,g=ot({kind:"in-browser",value:`${t}:task-executor`}),l=ot({kind:"in-browser",value:`${t}:chat-handler`});f&&s.registerHandler(g,f),p&&s.registerHandler(l,p);let h={async invoke(x,_){return x.howToRun==="in-browser",s.dispatchExecution(x,_)}},y=e?.taskExecutorRef??(f?{meta:"task-executor",howToRun:"in-browser",whatToRun:g}:void 0),k=e?.chatHandlerRef??(p?{meta:"chat-handler",howToRun:"in-browser",whatToRun:l}:void 0),T=Dr(),I=Fr(t),b=Ir({boardId:t,chatStorage:I,boards:[{label:t,boardAdapter:s,baseRef:i,cardStoreRef:a,outputsStoreRef:c,notifyRef:{kind:"in-memory-bus",value:o},taskExecutorRef:y,chatHandlerRef:k}],invocationAdapter:h,notificationTransport:T,logger:{info:(...x)=>console.log("[board]",...x),warn:(...x)=>{n(String(x[0])),console.warn("[board]",...x);},error:(...x)=>console.error("[board]",...x)}});r.length&&b.cardStore.set({body:r}),e?.onBoardChange&&me(o).subscribe(_=>{let B=_;!B||B.kind!=="notification-batch"||!Array.isArray(B.notifications)||B.notifications.length===0||e.onBoardChange?.({notifications:B.notifications});});function w(x,_,B){let L=B?JSON.stringify(B):"",U=new TextEncoder().encode(L),z=false;return {method:x,url:_,headers:{"content-type":"application/json"},on(st,Y){},[Symbol.asyncIterator](){let st={async next(){return z?{done:true,value:void 0}:(z=true,{done:false,value:U})},[Symbol.asyncIterator](){return st}};return st}}}function $(){let x=200,_=[];return {res:{writeHead(L){x=L;},write(L){return _.push(typeof L=="string"?L:new TextDecoder().decode(L)),true},end(L){L&&_.push(typeof L=="string"?L:new TextDecoder().decode(L));}},getResult:()=>{let L=_.join(""),U;try{U=JSON.parse(L);}catch{U=L;}return {status:x,body:U}}}}let G=b.apiBasePath;return {async bootstrap(){let x=w("GET",`${G}/bootstrap`),{res:_}=$();await b.handleRuntimeApi(x,_,new URL(`http://localhost${G}/bootstrap`));},getState(){return b.buildPublishedRuntimePayload()},async patchCard(x,_){let B=`${G}/cards/${encodeURIComponent(x)}`,L=w("PATCH",B,_),{res:U}=$();await b.handleRuntimeApi(L,U,new URL(`http://localhost${B}`));},async applyCardAction(x,_,B){let L=`${G}/cards/${encodeURIComponent(x)}/actions`,U=w("POST",L,{actionType:_,payload:B}),{res:z}=$();await b.handleRuntimeApi(U,z,new URL(`http://localhost${L}`));},readChatRecords(x){let _=`${G}/cards/${encodeURIComponent(x)}/chats`,B=w("GET",_),L=$();b.handleRuntimeApi(B,L.res,new URL(`http://localhost${_}`));let z=L.getResult().body;return Array.isArray(z?.messages)?z.messages:[]},clearChatRecords(x){b.clearChatRecords(x);},writeMemoryBlob(x,_){return s.writeMemoryBlob(x,_)},reportSourceFetched(x,_){b.reportSourceFetched(x,_);},reportSourceFetchFailure(x,_){b.reportSourceFetchFailure(x,_);},get runtime(){return b}}}function Ss(t,e){return Pr(t,e,Xt)}function Cs(t,e,r){return Mr(t,e,Xt,r)}
9
- exports.applyNotification=Cs;exports.buildBoardState=Ss;exports.create=hs;exports.selectAllLiveCardModels=Vn;exports.selectLiveCardModel=Xt;return exports;})({});//# sourceMappingURL=board-livecards-localstorage.js.map
6
+ `);}catch{}},15e3);u.on("close",()=>{clearInterval(F),l.get(m)?.res===d&&(l.delete(m),qt());try{d.end();}catch{}});}async function tt(u,d,m){let b=u.method||"GET",R=m,v=R.pathname;try{if(b==="GET"&&v===`${e}/init-board`)return await st(),K(d,200,W()),!0;if(b==="GET"&&v===`${e}/sse`){await st();let H=String(R.searchParams.get("clientId")||"").trim();if(!H)return K(d,400,{error:"clientId query param is required for SSE"}),!0;P(u,d,H);for(let J=0;J<I.length;J++)U(I[J]),z(I[J],J);return !0}if(b==="GET"&&v===`${e}/board-status`)return K(d,200,W()),!0;let N=v.match(new RegExp(`^${Pt(e)}/cards/([^/]+)$`));if(b==="GET"&&N){await Y();let H=decodeURIComponent(N[1]),J=Tt(H);return J?(K(d,200,J),!0):(K(d,404,{error:`card not found: ${H}`}),!0)}if(b==="PATCH"&&N){await Y();let H=decodeURIComponent(N[1]),J=await mt(u);return S(H,J),K(d,200,{ok:!0}),!0}let F=v.match(new RegExp(`^${Pt(e)}/cards/([^/]+)/actions$`));if(b==="POST"&&F){await Y();let H=decodeURIComponent(F[1]),J=Date.now(),Q=new Date(J).toISOString(),At=await mt(u),ht=At?.actionType;if(ht==="chat-send"&&!St(H)){let _t=Date.now();return K(d,409,{error:`chat handler is not configured for card: ${H}`,requestReceivedAt:Q,requestReceivedAtMs:J,responseSentAt:new Date(_t).toISOString(),responseSentAtMs:_t,responseStatus:409}),!0}vt(H,ht,At?.payload);let yt=Date.now();return K(d,200,{ok:!0,requestReceivedAt:Q,requestReceivedAtMs:J,responseSentAt:new Date(yt).toISOString(),responseSentAtMs:yt,responseStatus:200}),!0}let j=v.match(new RegExp(`^${Pt(e)}/cards/([^/]+)/chats$`));if(b==="GET"&&j){await Y();let H=decodeURIComponent(j[1]);return K(d,200,{ok:!0,messages:V(H)}),!0}if(b==="POST"&&j){await Y();let H=decodeURIComponent(j[1]),J=await mt(u),Q=typeof J?.role=="string"?J.role:"assistant",At=typeof J?.text=="string"?J.text:"",ht=Array.isArray(J?.files)?J.files:[],yt=J?.done===!0,_t=a.append(H,Q,At,ht);return yt&&a.setProcessing(H,!1),Et(H,!yt),K(d,200,{ok:!0,id:_t}),!0}let X=v.match(new RegExp(`^${Pt(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(b==="POST"&&X){await Y();let H=decodeURIComponent(X[1]),J=await mt(u),Q=typeof J?.clientId=="string"?J.clientId.trim():"";return Q?Mt(Q,H)?(K(d,200,{ok:!0,clientId:Q,cardId:H,subscribed:!0}),!0):(K(d,404,{error:`SSE client not connected: ${Q}`}),!0):(K(d,400,{error:"clientId is required"}),!0)}let et=v.match(new RegExp(`^${Pt(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(b==="POST"&&et){await Y();let H=decodeURIComponent(et[1]),J=await mt(u),Q=typeof J?.clientId=="string"?J.clientId.trim():"";return Q?Nt(Q,H)?(K(d,200,{ok:!0,clientId:Q,cardId:H,subscribed:!1}),!0):(K(d,404,{error:`SSE client not connected: ${Q}`}),!0):(K(d,400,{error:"clientId is required"}),!0)}let ft=v.match(new RegExp(`^${Pt(e)}/cards/([^/]+)/files$`));if(b==="POST"&&ft){await Y();let H=decodeURIComponent(ft[1]),J=String(R.searchParams.get("inChat")||"").toLowerCase()==="true",Q=u.headers["x-file-name"],At=String(u.headers["content-type"]||"application/octet-stream"),ht=Array.isArray(Q)?Q[0]:Q,yt=ht?decodeURIComponent(String(ht)):"upload.bin",_t=await It(u);if(!_t.length)return K(d,400,{error:"Empty upload body"}),!0;let kt=ct(H,yt,At,_t),Gt=null;if(A(H,bt=>{let Qt=new Date().toISOString(),te=bt.card_data&&typeof bt.card_data=="object"?bt.card_data:{};bt.card_data=te;let Gr=x().normalizeIncoming([{name:kt.name,stored_name:kt.stored_name,size:kt.size,mime_type:kt.mime_type,uploaded_at:kt.uploaded_at||Qt,chat:J}],Qt);return Gt=x().merge(te,Gr).findIndex(Ur=>Ur.stored_name===kt.stored_name),bt}),J){let bt=typeof Gt=="number"&&Gt>=0?` #${Gt}`:"";Z(H,"system",`file uploaded: ${kt.name} as ${kt.stored_name}${bt}`,[]);}return K(d,200,{ok:!0,file:kt}),!0}let Zt=v.match(new RegExp(`^${Pt(e)}/cards/([^/]+)/files/(\\d+)$`));if(b==="GET"&&Zt){let H=decodeURIComponent(Zt[1]),J=parseInt(Zt[2],10),Q=R.searchParams.get("sn"),At=Tt(H);if(!At)return K(d,404,{error:"Card not found"}),!0;let ht=x().resolve(At.card_data,J,Q);if(!ht.ok&&ht.reason==="stale_reference")return K(d,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ht.ok)return K(d,404,{error:"File not found"}),!0;let yt=ht.file,_t=_(H),kt=$(H),Gt=`${_t}/${yt.stored_name}`,bt=kt.files?kt.files.getBytes(Gt):null;if(!bt)return K(d,404,{error:"File not found"}),!0;let Qt=yt.name||yt.stored_name,te=yt.mime_type||"application/octet-stream";return d.writeHead(200,{"Content-Type":te,"Content-Disposition":`attachment; filename="${Qt}"`,"Content-Length":bt.length}),d.end(bt),!0}return !1}catch(N){let F=N?.statusCode||500;return K(d,F,{error:String(N?.message||N)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleRuntimeApi:tt,buildPublishedRuntimePayload:W,clearChatRecords:L,reportSourceFetched(u,d){let m=I[0];return m?m.board.sourceDataFetched({params:{token:u,ref:d}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(u,d){let m=I[0];return m?m.board.sourceDataFetchFailure({params:{token:u,reason:d}}):{status:"fail",error:"no board context"}},get cardStore(){return I[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Pt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function xe(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return `[${t.map(xe).join(",")}]`;let e=t;return `{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${xe(e[n])}`).join(",")}}`}function le(t,e){let r=e>>>0;for(let n=0;n<t.length;n++)r^=t.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function jr(t){let e=xe(t),r=le(e,2166136261),n=le(e,3735928559),o=le(e,19088743),s=le(e,4277009102);return [r,n,o,s].map(i=>i.toString(16).padStart(8,"0")).join("")}function ge(t){function e(s){return `${t}:blob:${s}`}let r=new TextEncoder;function n(s){if(typeof btoa=="function"){let i="";for(let a=0;a<s.length;a++)i+=String.fromCharCode(s[a]);return btoa(i)}return ""}function o(s){if(typeof atob=="function"){let i=atob(s),a=new Uint8Array(i.length);for(let c=0;c<i.length;c++)a[c]=i.charCodeAt(c);return a}return new Uint8Array}return {read(s){return globalThis.localStorage.getItem(e(s))},write(s,i){globalThis.localStorage.setItem(e(s),i);},exists(s){return globalThis.localStorage.getItem(e(s))!==null},remove(s){globalThis.localStorage.removeItem(e(s));},readBytes(s){let i=globalThis.localStorage.getItem(e(s));if(i===null)return null;try{let a=JSON.parse(i);if(a&&a.__kind==="bytes-b64"&&typeof a.data=="string")return o(a.data)}catch{}return r.encode(i)},writeBytes(s,i){let a=JSON.stringify({__kind:"bytes-b64",data:n(i)});globalThis.localStorage.setItem(e(s),a);},listKeys(s){let i=e(s??""),a=[];for(let c=0;c<globalThis.localStorage.length;c++){let f=globalThis.localStorage.key(c);f&&f.startsWith(i)&&a.push(f.slice(e("").length));}return a.sort()},stat(s){let i=globalThis.localStorage.getItem(e(s));if(i===null)return null;let a=r.encode(i).byteLength;try{let c=JSON.parse(i);c&&c.__kind==="bytes-b64"&&typeof c.data=="string"&&(a=o(c.data).byteLength);}catch{}return {key:s,size:a}}}}var $n=":scratch-marker",Pn=":scratch-config",fe=":scratch:",Fn=1440*60*1e3,Dn=720*60*1e3,Ln=200;function Er(t,e){if(!t)return e;let r=t.replace(/[^A-Za-z0-9._-]/g,"_");return r.length>0?r:e}function Te(t){let e=`${t}${$n}`,r=`${t}${Pn}`,n=g=>`${t}${fe}${g}`,o=g=>`${t}${fe}${g}:__ts`,s=globalThis.localStorage.getItem(e)===null;if(s)try{globalThis.localStorage.setItem(e,`scratch-store
7
+ ${new Date().toISOString()}`);}catch{}function i(){let g=globalThis.localStorage.getItem(r);if(g===null)return {};try{let l=JSON.parse(g);return l&&typeof l=="object"&&!Array.isArray(l)?l:{}}catch{return {}}}function a(g){try{globalThis.localStorage.setItem(r,JSON.stringify(g));}catch{}}if(s){let g=i();typeof g["retention.lastSweepAt"]!="number"&&(g["retention.lastSweepAt"]=Date.now(),a(g));}function c(){if(globalThis.localStorage.getItem(e)===null)return;let g=i(),l=typeof g["retention.maxAgeMs"]=="number"?g["retention.maxAgeMs"]:Fn,h=typeof g["retention.sweepIntervalMs"]=="number"?g["retention.sweepIntervalMs"]:Dn;if(l<=0||h<=0)return;let y=typeof g["retention.lastSweepAt"]=="number"?g["retention.lastSweepAt"]:0,k=Date.now();if(k-y<h)return;g["retention.lastSweepAt"]=k,a(g);let T=k,I=`${t}${fe}`,C=[];for(let w=0;w<globalThis.localStorage.length;w++){let $=globalThis.localStorage.key(w);$&&$.startsWith(I)&&!$.endsWith(":__ts")&&C.push($);}for(let w of C){if(Date.now()-T>Ln)break;let $=globalThis.localStorage.getItem(`${w}:__ts`),G=$===null?0:Number($);if(Number.isFinite(G)&&G>0&&k-G>l){try{globalThis.localStorage.removeItem(w);}catch{}try{globalThis.localStorage.removeItem(`${w}:__ts`);}catch{}}}}function f(g,l){let h=Er(g,"scratch"),y=Er(l,".json"),k=y.startsWith(".")?y:`.${y}`,T=Math.random().toString(36).slice(2,10);return `${h}-${Date.now()}-${T}${k}`}function p(g,l){globalThis.localStorage.setItem(n(g),l),globalThis.localStorage.setItem(o(g),String(Date.now()));}return {read(g){return globalThis.localStorage.getItem(n(g))},write(g,l){p(g,l);try{c();}catch{}},exists(g){return globalThis.localStorage.getItem(n(g))!==null},remove(g){try{globalThis.localStorage.removeItem(n(g));}catch{}try{globalThis.localStorage.removeItem(o(g));}catch{}},readBytes(g){let l=globalThis.localStorage.getItem(n(g));return l===null?null:new TextEncoder().encode(l)},writeBytes(g,l){let h="";for(let y=0;y<l.length;y++)h+=String.fromCharCode(l[y]);p(g,h);try{c();}catch{}},stat(g){let l=globalThis.localStorage.getItem(n(g));if(l===null)return null;let h=globalThis.localStorage.getItem(o(g)),y=h===null?null:Number(h);return {key:g,size:new TextEncoder().encode(l).byteLength,updatedAt:y!==null&&Number.isFinite(y)?new Date(y).toISOString():void 0}},listKeys(g){let l=`${t}${fe}`,h=[];for(let y=0;y<globalThis.localStorage.length;y++){let k=globalThis.localStorage.key(y);if(k&&k.startsWith(l)&&!k.endsWith(":__ts")){let T=k.slice(l.length);(!g||T.startsWith(g))&&h.push(T);}}return h.sort()},getUniqueKey(g,l){return f(g,l)},create(g,l,h){let y=f(l,h);p(y,g);try{c();}catch{}return y},keyRef(g){return {kind:"local-storage-scratch",value:g,extra:{prefix:t}}},config:{get(g){return i()[g]??null},set(g,l){let h=i();l==null?delete h[g]:h[g]=l,a(h);}}}}var qn=":archive-marker",Mn=":archive-config",_e=":archive:stream:",Or=":archive:blob:";function Br(t){let e=t.replace(/[^A-Za-z0-9._-]/g,"_");if(!e)throw new Error("Archive segment name cannot be empty after sanitization");return e}function Ie(t){let e=`${t}${qn}`,r=`${t}${Mn}`,n=a=>`${t}${_e}${a}`;if(globalThis.localStorage.getItem(e)===null)try{globalThis.localStorage.setItem(e,`archive-store
8
+ ${new Date().toISOString()}`);}catch{}function o(){let a=globalThis.localStorage.getItem(r);if(a===null)return {};try{let c=JSON.parse(a);return c&&typeof c=="object"&&!Array.isArray(c)?c:{}}catch{return {}}}function s(a){try{globalThis.localStorage.setItem(r,JSON.stringify(a));}catch{}}function i(){if(globalThis.localStorage.getItem(e)===null)return;let a=o(),c=typeof a["retention.maxAgeMs"]=="number"?a["retention.maxAgeMs"]:0,f=typeof a["retention.sweepIntervalMs"]=="number"?a["retention.sweepIntervalMs"]:0;if(c<=0||f<=0)return;let p=typeof a["retention.lastSweepAt"]=="number"?a["retention.lastSweepAt"]:0,g=Date.now();if(g-p<f)return;a["retention.lastSweepAt"]=g,s(a);let l=`${t}${_e}`;for(let h=0;h<globalThis.localStorage.length;h++){let y=globalThis.localStorage.key(h);if(!y||!y.startsWith(l))continue;let k=globalThis.localStorage.getItem(y);if(k)try{let T=JSON.parse(k),I=T.filter(C=>typeof C.__ts!="number"||g-C.__ts<=c);I.length!==T.length&&globalThis.localStorage.setItem(y,JSON.stringify(I));}catch{}}}return {stream(a){let c=Br(a),f=n(c);function p(){let l=globalThis.localStorage.getItem(f);if(!l)return [];try{return JSON.parse(l)}catch{return []}}function g(l){try{globalThis.localStorage.setItem(f,JSON.stringify(l));}catch{}}return {append(l){let h={id:globalThis.crypto.randomUUID(),payload:l,__ts:Date.now()},y=p();y.push(h),g(y);try{i();}catch{}return {id:h.id,payload:h.payload}},readAll(){return p().map(l=>({id:l.id,payload:l.payload}))},readAfter(l){let h=p();if(!l){let I=h.map(C=>({id:C.id,payload:C.payload}));return {entries:I,newCursor:I.length>0?I[I.length-1].id:null}}let y=h.findIndex(I=>I.id===l),T=(y===-1?h:h.slice(y+1)).map(I=>({id:I.id,payload:I.payload}));return {entries:T,newCursor:T.length>0?T[T.length-1].id:l}},clear(){try{globalThis.localStorage.removeItem(f);}catch{}}}},blob(a){let c=Br(a),f=ge(`${t}${Or}${c}`);return {read:p=>f.read(p),write:(p,g)=>{f.write(p,g);try{i();}catch{}},exists:p=>f.exists(p),remove:p=>f.remove(p),readBytes:f.readBytes?p=>f.readBytes(p):void 0,writeBytes:f.writeBytes?(p,g)=>{f.writeBytes(p,g);try{i();}catch{}}:void 0,listKeys:p=>f.listKeys(p),stat:f.stat?p=>f.stat(p):void 0}},listStreams(a){let c=`${t}${_e}`,f=[];for(let p=0;p<globalThis.localStorage.length;p++){let g=globalThis.localStorage.key(p);if(!g||!g.startsWith(c))continue;let l=g.slice(c.length);(!a||l.startsWith(a))&&f.push(l);}return f.sort()},listBlobs(a){let c=`${t}${Or}`,f=new Set;for(let p=0;p<globalThis.localStorage.length;p++){let g=globalThis.localStorage.key(p);if(!g||!g.startsWith(c))continue;let l=g.slice(c.length),h=l.indexOf(":"),y=h===-1?l:l.slice(0,h);(!a||y.startsWith(a))&&f.add(y);}return Array.from(f).sort()},config:{get(a){return o()[a]??null},set(a,c){let f=o();c==null?delete f[a]:f[a]=c,s(f);}}}}function pe(t){function e(r){return `${t}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(e(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(e(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(e(r));},listKeys(r){let n=e(r??""),o=[];for(let s=0;s<globalThis.localStorage.length;s++){let i=globalThis.localStorage.key(s);i!==null&&i.startsWith(n)&&o.push(i.slice(e("").length));}return o}}}function Nr(t){function e(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {readAllEntries(){return e()},appendEntry(n){let o=e();o.push(n),r(o);},generateId(){return globalThis.crypto.randomUUID()}}}function Gn(){let t=false;return {tryAcquire(){return t?null:(t=true,()=>{t=false;})}}}function Un(t){return String(t).replace(/[^a-zA-Z0-9_-]/g,"_")}function Jn(t){function e(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {append(n){let o={id:globalThis.crypto.randomUUID(),payload:n},s=e();return s.push(o),r(s),o},readAll(){return e()},readAfter(n){let o=e();if(!n)return {entries:o,newCursor:o.length>0?o[o.length-1].id:null};let s=o.findIndex(a=>a.id===n),i=s===-1?o:o.slice(s+1);return {entries:i,newCursor:i.length>0?i[i.length-1].id:n}},clear(){globalThis.localStorage.removeItem(t);}}}function Pr(t){return vr(e=>Jn(`${t}:chat:journal:${Un(e)}`),pe(`${t}:chat`))}var $r=new Map;function me(t){let e=$r.get(t);if(!e){let r=new Set;e={publish(n){for(let o of r)o(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},$r.set(t,e);}return e}function Fr(){return {async subscribe(t,e){return t.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${t.kind}`),()=>{}):me(t.value).subscribe(n=>{let o=n;if(o&&o.kind==="notification-batch"&&Array.isArray(o.notifications)){for(let s of o.notifications)e(s);return}e(n);})}}}function Dr(t,e){let r=e?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:e.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:ot({kind:"in-browser",value:t})},n=new Map,o=new Map,s=Gn();return {kvStorage:i=>pe(`${t}:${i}`),blobStorage:i=>ge(i?`${t}:${i}`:t),scratchStorage:()=>Te(`${t}:scratch`),scratchStorageForRef:i=>Te(Ct(i).value),archiveFactory:()=>Ie(`${t}:archive`),archiveFactoryForRef:i=>Ie(Ct(i).value),journalAdapter:()=>Nr(`${t}:journal`),lock:s,selfRef:r,async dispatchExecution(i,a){if(i.howToRun==="http:post")try{let c=i.whatToRun,f=typeof c=="object"?c.value:Ct(c).value,p=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return p.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${p.status}: ${p.statusText}`}}catch(c){return {dispatched:false,error:c instanceof Error?c.message:String(c)}}if(i.howToRun==="http:get")try{let c=i.whatToRun,f=typeof c=="object"?c.value:Ct(c).value,p=new URLSearchParams(Object.entries(a).filter(([,h])=>h!=null).map(([h,y])=>[h,String(y)])),g=`${f}?${p.toString()}`,l=await fetch(g);return l.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${l.status}: ${l.statusText}`}}catch(c){return {dispatched:false,error:c instanceof Error?c.message:String(c)}}if(i.howToRun==="in-browser"){let c=i.whatToRun,f=typeof c=="object"?c.value:Ct(c).value,p=n.get(f);return p?p(i,a):{dispatched:false,error:`No in-browser handler registered for: ${f}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${i.howToRun})`}},resolveBlob(i){if(i.kind==="in-memory"){let f=o.get(i.value);if(f==null)throw new Error(`resolveBlob: in-memory blob not found: ${ot(i)}`);return f}let c=ge(t).read(i.value);if(c===null)throw new Error(`resolveBlob: blob not found: ${ot(i)}`);return c},hashFn:jr,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:i=>pe(Ct(i).value),publishBoardChangeNotifications(i){if(!e?.notifyChannel||i.length===0)return;me(e.notifyChannel).publish({kind:"notification-batch",notifications:i});},onWarn:e?.onWarn,registerHandler(i,a){n.set(i,a);},writeMemoryBlob(i,a){return o.set(i,a),ot({kind:"in-memory",value:i})}}}function Lr(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function Vn(t,e){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:t,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function Xt(t,e){if(!t||typeof t!="object")throw new Error("payload must be an object");if(!e)throw new Error("cardId is required");let n=(Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).find(w=>w.id===e);if(!n)throw new Error(`cardDefinitions has no entry with id ${e}`);let o=t.statusSnapshot&&typeof t.statusSnapshot=="object"?t.statusSnapshot:{},s=t.cardRuntimeById&&typeof t.cardRuntimeById=="object"?t.cardRuntimeById:{},i=t.dataObjectsByToken&&typeof t.dataObjectsByToken=="object"?t.dataObjectsByToken:{},c=(Array.isArray(o.cards)?o.cards:[]).find(w=>w.name===e),f=structuredClone(n),p=Vn(e,s[e]),l={...f.card_data&&typeof f.card_data=="object"&&!Array.isArray(f.card_data)?f.card_data:{},...p.card_data||{},status:Lr(c?.status),lastRun:c?.runtime?.last_transition_at??null};c?.error?.message&&(l.error=c.error.message);let h=c?{task_status:c.status??null,card_status:Lr(c.status),runtime:structuredClone(c.runtime??{}),error:c.error?structuredClone(c.error):null,blocked_by:Array.isArray(c.blocked_by)?structuredClone(c.blocked_by):[],requires_missing:Array.isArray(c.requires_missing)?structuredClone(c.requires_missing):[]}:{task_status:null,card_status:l.status??"fresh",runtime:{last_transition_at:l.lastRun??null},error:l.error?{message:l.error}:null,blocked_by:[],requires_missing:[]},y=Array.isArray(f.requires)?f.requires:[],k={};for(let[w,$]of Object.entries(i))k[w]=structuredClone($);for(let w of y)Object.prototype.hasOwnProperty.call(k,w)||(k[w]=null);let I=(t.cardChatsByCardId&&typeof t.cardChatsByCardId=="object"?t.cardChatsByCardId:{})[e],C=I?{messages:Array.isArray(I.messages)?I.messages:[],receiving:!!I.receiving,processing:!!I.processing}:null;return {id:e,card:f,card_data:l,requires:k,computed_values:p.computed_values,runtime_state:h,card_chats:C}}function Hn(t){if(!t||typeof t!="object")throw new Error("payload must be an object");return (Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).map(r=>Xt(t,r.id))}function he(t){return JSON.parse(JSON.stringify(t))}function Jt(t,e){if(t===e)return t;try{if(JSON.stringify(t)===JSON.stringify(e))return t}catch{}return e}function Rt(t,e){if(t===e)return true;try{return JSON.stringify(t)===JSON.stringify(e)}catch{return false}}function Kn(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function qr(t,e,r){let n=t,s=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(c=>c.id),i=e&&e.modelsById||{},a={};for(let c of s){let f=r(t,c),p=i[c];if(!p){a[c]=f;continue}let g=f.card_chats!=null?Jt(p.card_chats,f.card_chats??null):p.card_chats??null,l={id:f.id,card:Jt(p.card,f.card),card_data:Jt(p.card_data,f.card_data),requires:Jt(p.requires,f.requires),computed_values:Jt(p.computed_values,f.computed_values),runtime_state:Jt(p.runtime_state,f.runtime_state),card_chats:g};a[c]=l.card===p.card&&l.card_data===p.card_data&&l.requires===p.requires&&l.computed_values===p.computed_values&&l.runtime_state===p.runtime_state&&l.card_chats===p.card_chats?p:l;}return {payload:t,cardIds:s,modelsById:a}}function Mr(t,e,r,n){if(!t||!Array.isArray(e)||e.length===0)return t;let o=t.modelsById,s=t.cardIds,i=false,a=false,c={};for(let p of s){let g=o[p],l=g&&g.requires;if(l&&typeof l=="object")for(let h of Object.keys(l))(c[h]=c[h]||[]).push(p);}function f(){i||(o={...o},i=true);}for(let p of e)if(!(!p||!p.kind)){if(p.kind==="computed_values"){let g=p.cardId,l=o[g];if(!l)continue;let h=p.values||{};if(Rt(l.computed_values,h))continue;f(),o[g]={...l,computed_values:h},a=true;}else if(p.kind==="data_object"){let g=p.key,l=p.payload,h=c[g]||[];for(let y of h){let k=o[y];if(!k)continue;let T=k.requires||{};Rt(T[g],l)||(f(),o[y]={...k,requires:{...T,[g]:l}},a=true);}}else if(p.kind==="card_refreshed"){let g=p.cardId,l=null,h=o[g],y=p.card;if(h&&y&&typeof y=="object"&&!Array.isArray(y)){let k=y,T=k.card_data&&typeof k.card_data=="object"&&!Array.isArray(k.card_data)?k.card_data:h.card_data,I=k.requires&&typeof k.requires=="object"&&!Array.isArray(k.requires)?k.requires:h.requires,C=k.computed_values&&typeof k.computed_values=="object"&&!Array.isArray(k.computed_values)?k.computed_values:h.computed_values,w=k.runtime_state&&typeof k.runtime_state=="object"&&!Array.isArray(k.runtime_state)?k.runtime_state:h.runtime_state;l={...h,card:y,card_data:T,requires:I,computed_values:C,runtime_state:w};}if(!l)try{let k=n();k&&(l=r(k,g));}catch{}if(!l||h&&Rt(h.card,l.card)&&Rt(h.card_data,l.card_data)&&Rt(h.requires,l.requires)&&Rt(h.computed_values,l.computed_values)&&Rt(h.runtime_state,l.runtime_state))continue;f(),o[g]=l,s.includes(g)||(s=[...s,g]),a=true;}else if(p.kind==="card_chats"){let g=p.cardId,l=o[g];if(!l)continue;let h=Array.isArray(p.messages)?p.messages:l.card_chats?.messages??[],y=typeof p.receiving=="boolean"?p.receiving:l.card_chats?.receiving??false,k=typeof p.processing=="boolean"?p.processing:l.card_chats?.processing??false,T={messages:h,receiving:y,processing:k};if(Rt(l.card_chats,T))continue;f(),o[g]={...l,card_chats:T},a=true;}else if(p.kind==="chat_messages"){let g=p.cardId,l=o[g];if(!l)continue;let h=Array.isArray(p.messages)?p.messages:[],y=l.card_chats||{receiving:false,processing:false},k={messages:h,receiving:y.receiving,processing:!!y.processing};if(Rt(l.card_chats,k))continue;f(),o[g]={...l,card_chats:k},a=true;}else if(p.kind==="status"){let g=p.status?.cards??[];for(let l of g){let h=l?.name;if(!h||!o[h])continue;let y=o[h],k=Kn(l.status),T={...y.card_data||{},status:k,lastRun:l.runtime?.last_transition_at??null,...l.error?.message?{error:l.error.message}:{}};l.error?.message||delete T.error;let I={task_status:l.status??null,card_status:k,runtime:l.runtime?he(l.runtime):{},error:l.error?he(l.error):null,blocked_by:Array.isArray(l.blocked_by)?he(l.blocked_by):[],requires_missing:Array.isArray(l.requires_missing)?he(l.requires_missing):[]};Rt(y.card_data,T)&&Rt(y.runtime_state,I)||(f(),o[h]={...y,card_data:T,runtime_state:I},a=true);}}}return a?{payload:t.payload,cardIds:s,modelsById:o}:t}function hs(t,e){let r=e?.cards??[],n=e?.onWarn??(()=>{}),o=`${t}:notify`,s=Dr(t,{callbackBaseUrl:e?.callbackBaseUrl,notifyChannel:o,onWarn:n}),i=Ct(ot({kind:"localstorage",value:t})),a=ot({kind:"localstorage",value:`${t}:card-store`}),c=ot({kind:"localstorage",value:`${t}:outputs`}),f=e?.taskExecutor??null,p=e?.chatHandler??null,g=ot({kind:"in-browser",value:`${t}:task-executor`}),l=ot({kind:"in-browser",value:`${t}:chat-handler`});f&&s.registerHandler(g,f),p&&s.registerHandler(l,p);let h={async invoke(x,_){return x.howToRun==="in-browser",s.dispatchExecution(x,_)}},y=e?.taskExecutorRef??(f?{meta:"task-executor",howToRun:"in-browser",whatToRun:g}:void 0),k=e?.chatHandlerRef??(p?{meta:"chat-handler",howToRun:"in-browser",whatToRun:l}:void 0),T=Fr(),I=Pr(t),C=Ir({boardId:t,chatStorage:I,boards:[{label:t,boardAdapter:s,baseRef:i,cardStoreRef:a,outputsStoreRef:c,notifyRef:{kind:"in-memory-bus",value:o},taskExecutorRef:y,chatHandlerRef:k}],invocationAdapter:h,notificationTransport:T,logger:{info:(...x)=>console.log("[board]",...x),warn:(...x)=>{n(String(x[0])),console.warn("[board]",...x);},error:(...x)=>console.error("[board]",...x)}});r.length&&C.cardStore.set({body:r}),e?.onBoardChange&&me(o).subscribe(_=>{let B=_;!B||B.kind!=="notification-batch"||!Array.isArray(B.notifications)||B.notifications.length===0||e.onBoardChange?.({notifications:B.notifications});});function w(x,_,B){let D=B?JSON.stringify(B):"",U=new TextEncoder().encode(D),z=false;return {method:x,url:_,headers:{"content-type":"application/json"},on(st,Y){},[Symbol.asyncIterator](){let st={async next(){return z?{done:true,value:void 0}:(z=true,{done:false,value:U})},[Symbol.asyncIterator](){return st}};return st}}}function $(){let x=200,_=[];return {res:{writeHead(D){x=D;},write(D){return _.push(typeof D=="string"?D:new TextDecoder().decode(D)),true},end(D){D&&_.push(typeof D=="string"?D:new TextDecoder().decode(D));}},getResult:()=>{let D=_.join(""),U;try{U=JSON.parse(D);}catch{U=D;}return {status:x,body:U}}}}let G=C.apiBasePath;return {async bootstrap(){let x=w("GET",`${G}/bootstrap`),{res:_}=$();await C.handleRuntimeApi(x,_,new URL(`http://localhost${G}/bootstrap`));},getState(){return C.buildPublishedRuntimePayload()},async patchCard(x,_){let B=`${G}/cards/${encodeURIComponent(x)}`,D=w("PATCH",B,_),{res:U}=$();await C.handleRuntimeApi(D,U,new URL(`http://localhost${B}`));},async applyCardAction(x,_,B){let D=`${G}/cards/${encodeURIComponent(x)}/actions`,U=w("POST",D,{actionType:_,payload:B}),{res:z}=$();await C.handleRuntimeApi(U,z,new URL(`http://localhost${D}`));},readChatRecords(x){let _=`${G}/cards/${encodeURIComponent(x)}/chats`,B=w("GET",_),D=$();C.handleRuntimeApi(B,D.res,new URL(`http://localhost${_}`));let z=D.getResult().body;return Array.isArray(z?.messages)?z.messages:[]},clearChatRecords(x){C.clearChatRecords(x);},writeMemoryBlob(x,_){return s.writeMemoryBlob(x,_)},reportSourceFetched(x,_){C.reportSourceFetched(x,_);},reportSourceFetchFailure(x,_){C.reportSourceFetchFailure(x,_);},get runtime(){return C}}}function Ss(t,e){return qr(t,e,Xt)}function bs(t,e,r){return Mr(t,e,Xt,r)}
9
+ exports.applyNotification=bs;exports.buildBoardState=Ss;exports.create=hs;exports.selectAllLiveCardModels=Hn;exports.selectLiveCardModel=Xt;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, C as ChatStorage } from '../types-BkJvnXVD.js';
1
+ import { B as BoardPlatformAdapter, N as NotificationTransport, C as ChatStorage } from '../types-BbQ75HLf.js';
2
2
  import { E as ExecutionRef } from '../execution-interface-DCFBy4L8.js';
3
3
  import '../board-live-cards-lib-COi4bSpk.js';
4
4