yaml-flow 8.4.16 → 8.4.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/browser/asset-integrity.json +3 -3
  2. package/browser/board-livecards-client.js +1 -1
  3. package/browser/board-livecards-localstorage.js +6 -6
  4. package/cli/browser-api/board-live-cards-browser-adapter.d.ts +1 -1
  5. package/cli/bundled/board-live-cards-cli.mjs +18 -18
  6. package/cli/bundled/card-store-cli.mjs +78 -78
  7. package/cli/bundled/chat-store-cli.mjs +10 -10
  8. package/cli/{types-YNCagczT.d.ts → types-juH2nFpz.d.ts} +12 -0
  9. package/examples/board/demo-shell-with-server.html +2 -2
  10. package/examples/board/doc.html +2 -2
  11. package/examples/board-local/demo-shell-localstorage.html +3 -3
  12. package/lib/artifacts-store-public.d.cts +1 -1
  13. package/lib/artifacts-store-public.d.ts +1 -1
  14. package/lib/board-live-cards-node.cjs +12 -12
  15. package/lib/board-live-cards-node.d.cts +4 -4
  16. package/lib/board-live-cards-node.d.ts +4 -4
  17. package/lib/board-live-cards-node.js +12 -12
  18. package/lib/{board-live-cards-public-CQ82CDdS.d.cts → board-live-cards-public-B4RcYPC_.d.cts} +12 -0
  19. package/lib/{board-live-cards-public-CtlVp0L3.d.ts → board-live-cards-public-ydXuA4zh.d.ts} +12 -0
  20. package/lib/board-live-cards-public.cjs +2 -2
  21. package/lib/board-live-cards-public.d.cts +1 -1
  22. package/lib/board-live-cards-public.d.ts +1 -1
  23. package/lib/board-live-cards-public.js +2 -2
  24. package/lib/board-live-cards-server-runtime.cjs +4 -4
  25. package/lib/board-live-cards-server-runtime.d.cts +2 -2
  26. package/lib/board-live-cards-server-runtime.d.ts +2 -2
  27. package/lib/board-live-cards-server-runtime.js +4 -4
  28. package/lib/board-livegraph-runtime/index.cjs +1 -1
  29. package/lib/board-livegraph-runtime/index.d.cts +1 -1
  30. package/lib/board-livegraph-runtime/index.d.ts +1 -1
  31. package/lib/board-livegraph-runtime/index.js +1 -1
  32. package/lib/card-store-public.cjs +1 -1
  33. package/lib/card-store-public.d.cts +12 -1
  34. package/lib/card-store-public.d.ts +12 -1
  35. package/lib/card-store-public.js +1 -1
  36. package/lib/chat-store-public.cjs +1 -1
  37. package/lib/chat-store-public.d.cts +5 -2
  38. package/lib/chat-store-public.d.ts +5 -2
  39. package/lib/chat-store-public.js +1 -1
  40. package/lib/continuous-event-graph/index.cjs +2 -2
  41. package/lib/continuous-event-graph/index.d.cts +2 -2
  42. package/lib/continuous-event-graph/index.d.ts +2 -2
  43. package/lib/continuous-event-graph/index.js +2 -2
  44. package/lib/index.cjs +12 -12
  45. package/lib/index.d.cts +1 -1
  46. package/lib/index.d.ts +1 -1
  47. package/lib/index.js +12 -12
  48. package/lib/{live-cards-bridge-b25aAVvE.d.cts → live-cards-bridge-Bwi-lbBT.d.cts} +2 -0
  49. package/lib/{live-cards-bridge-DC_ZU0eS.d.ts → live-cards-bridge-YL6AWawT.d.ts} +2 -0
  50. package/lib/server-runtime/index.cjs +4 -4
  51. package/lib/server-runtime/index.d.cts +3 -3
  52. package/lib/server-runtime/index.d.ts +3 -3
  53. package/lib/server-runtime/index.js +4 -4
  54. package/lib/{types-vTfV-Zkn.d.ts → types-1L1D33mr.d.ts} +1 -1
  55. package/lib/{types-D1R0JHIs.d.cts → types-D501gMQt.d.cts} +1 -1
  56. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
- 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var ue="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 a of e)o+=String.fromCharCode(a);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function xr(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 a=0;a<n.length;a+=1)o[a]=n.charCodeAt(a);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function xt(t){return `${ue}${vr(JSON.stringify(t))}`}function xe(t){if(!t.startsWith(ue))throw new Error(`Invalid ref format (expected ${ue}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(xr(t.slice(ue.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 Ae(t,e,r){let n=t.tryAcquire();if(!n)return false;try{await e();}finally{n();}return r?.(),true}var jt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function yt(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function Nt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function Ee(t){return t.tasks??{}}function Ce(t){return t?t.status===jt.FAILED||t.status===jt.INACTIVATED:false}function Te(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function _e(t){return t.maxExecutions}function Ie(t,e){let r=new Set;for(let[n,o]of Object.entries(e))if(o.status===jt.COMPLETED){let a=t.tasks[n];a&&yt(a).forEach(i=>r.add(i));}return Array.from(r)}function Oe(t,e){let r={};return t.forEach(n=>{let o=e[n];if(!o)return;yt(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function je(t,e,r){let n=t.tasks[e]??ce(),o={};if(r){let c=r.tasks[e],i=Nt(c);for(let l of i)for(let[h,E]of Object.entries(r.tasks))if(yt(E).includes(l)){let N=t.tasks[h];N?.lastDataHash&&(o[l]=N.lastDataHash);break}}let a={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:a},lastUpdated:new Date().toISOString()}}function Ne(t,e,r,n,o,a){let c=t.tasks[r]??ce(),i=e.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let l;n&&i.on&&i.on[n]?l=i.on[n]:l=yt(i);let h=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let q=i.requires??[];for(let $ of q)for(let[w,v]of Object.entries(e.tasks))if(yt(v).includes($)){let S=t.tasks[w];S?.lastDataHash&&(h[$]=S.lastDataHash);break}}let E={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:a,lastConsumedHashes:h,error:void 0},N=[...new Set([...t.availableOutputs,...l])];return {...t,tasks:{...t.tasks,[r]:E},availableOutputs:N,lastUpdated:new Date().toISOString()}}function $e(t,e,r,n){let o=t.tasks[r]??ce(),a=e.tasks[r];if(a?.retry){let l=o.retryCount+1;if(l<=a.retry.max_attempts){let h={...o,status:"not-started",retryCount:l,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:h},lastUpdated:new Date().toISOString()}}}let c={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},i=t.availableOutputs;if(a?.on_failure&&a.on_failure.length>0&&(i=[...new Set([...t.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&c.executionCount>=a.circuit_breaker.max_executions){let l=a.circuit_breaker.on_break;i=[...new Set([...i,...l])];}return {...t,tasks:{...t.tasks,[r]:c},availableOutputs:i,lastUpdated:new Date().toISOString()}}function Fe(t,e,r,n){let o=t.tasks[e]??ce(),a={...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]:a},lastUpdated:new Date().toISOString()}}function Pe(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 ce(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function de(t,e){let r=`live-${Date.now()}`,n={};for(let a of Object.keys(t.tasks))n[a]=Be();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 Ar(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:je(n,e.taskName,r)};case "task-completed":return {config:r,state:Ne(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:$e(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:Fe(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:Pe(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:Nr(n,e.action)};case "task-upsert":return Er(t,e.taskName,e.taskConfig);case "task-removal":return Tr(t,e.taskName);case "node-requires-add":return _r(t,e.nodeName,e.tokens);case "node-requires-remove":return Ir(t,e.nodeName,e.tokens);case "node-provides-add":return Or(t,e.nodeName,e.tokens);case "node-provides-remove":return jr(t,e.nodeName,e.tokens);default:return t}}function De(t,e){return e.reduce((r,n)=>Ar(r,n),t)}function Er(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]:Be()},lastUpdated:new Date().toISOString()}}}function Tr(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:o,...a}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:a,lastUpdated:new Date().toISOString()}}}function _r(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Nt(n),a=r.filter(c=>!o.includes(c));return a.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...o,...a]}}},state:t.state}}function Ir(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Nt(n),a=o.filter(c=>!r.includes(c));return a.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:a}}},state:t.state}}function Or(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=yt(n),a=r.filter(c=>!o.includes(c));return a.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...o,...a]}}},state:t.state}}function jr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=yt(n),a=o.filter(c=>!r.includes(c));return a.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:a}}},state:t.state}}function Xt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function le(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 Be(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Nr(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=Ee(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=$r(n),c=Ie(e,r.tasks),i=new Set([...c,...r.availableOutputs]),l=[],h=[],E=[],N=[];for(let[$,w]of Object.entries(n)){let v=r.tasks[$],S=Te(w,e.settings),I=S!=="once";if(v?.status===jt.RUNNING||Ce(v))continue;let p=_e(w);if(p!==void 0&&v&&v.executionCount>=p||w.circuit_breaker&&v&&v.executionCount>=w.circuit_breaker.max_executions||!I&&v?.status===jt.COMPLETED)continue;if(I&&v?.status===jt.COMPLETED){let x=Nt(w),B=false;switch(S){case "data-changed":{x.length>0&&x.some(K=>{for(let[X,st]of Object.entries(n))if(yt(st).includes(K)){let at=r.tasks[X];if(!at)continue;let $t=v.lastConsumedHashes?.[K];return at.lastDataHash==null?at.executionCount>v.lastEpoch:at.lastDataHash!==$t}return false})||(B=true);break}case "epoch-changed":{x.length>0&&x.some(K=>{for(let[X,st]of Object.entries(n))if(yt(st).includes(K)){let at=r.tasks[X];if(at&&at.executionCount>v.lastEpoch)return true}return false})||(B=true);break}case "time-based":{let tt=w.refreshInterval??0;if(tt<=0){B=true;break}let K=v.completedAt;if(!K){B=true;break}(Date.now()-Date.parse(K))/1e3<tt&&(B=true);break}case "manual":B=true;break}if(B)continue}let C=Nt(w);if(C.length===0){l.push($);continue}let G=[],T=[],M=[];for(let x of C){if(i.has(x))continue;let B=a[x]||[];B.length===0?G.push(x):B.every(K=>Ce(r.tasks[K]))?M.push({token:x,failedProducer:B[0]}):T.push(x);}G.length>0?E.push({taskName:$,missingTokens:G}):M.length>0?N.push({taskName:$,failedTokens:M.map(x=>x.token),failedProducers:[...new Set(M.map(x=>x.failedProducer))]}):T.length>0?h.push({taskName:$,waitingOn:T}):l.push($);}let q={};if(l.length>1){let $=Oe(l,n);for(let[w,v]of Object.entries($))v.length>1&&(q[w]=v);}return {eligible:l,pending:h,unresolved:E,blocked:N,conflicts:q}}function $r(t){let e={};for(let[r,n]of Object.entries(t)){for(let o of yt(n))e[o]||(e[o]=[]),e[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let a of o)e[a]||(e[a]=[]),e[a].includes(r)||e[a].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 Qt=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function Re(t){let e=be(t);return Fr(e)}function be(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(be).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+be(e[n])).join(",")+"}"}function Fr(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 Pr(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 Dr(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 a=0;a<n.length;a++)o[a]=n.charCodeAt(a);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function qe(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Pr(e)}function Br(t){try{let e=JSON.parse(Dr(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Le(t,e,r){let{handlers:n,onDrain:o}=e,a=new Qt,c="state"in t&&"config"in t?t:de(t),i=false,l=new Set,h=new Map(Object.entries(n)),E=new Qt,N=false,q=false;function $(){if(!i){if(N){q=true;return}N=true;try{do q=!1,w();while(q)}finally{N=false;}}}function w(){let p=E.drain(),C=a.drain(),G=[...p,...C];G.length>0&&(c=De(c,G));let T=Zt(c);G.length>0&&o?.(G,c,T);for(let M of T.eligible)I(M);for(let M of G)if(M.type==="task-progress"){let{taskName:x,update:B}=M;if(!c.config.tasks[x])continue;let K=c.state.tasks[x];if(!K||K.status!=="running")continue;let X=qe(x),st=S(x,X,B).catch(at=>{i||(E.append({type:"task-failed",taskName:x,error:at.message??String(at),timestamp:new Date().toISOString()}),$());}).finally(()=>{l.delete(st);});l.add(st);}}function v(p){let G=c.config.tasks[p].requires??[],T=new Map;for(let[x,B]of Object.entries(c.config.tasks))for(let tt of B.provides??[])T.set(tt,x);let M={};for(let x of G){let B=T.get(x);B?M[x]=c.state.tasks[B]?.data:M[x]=void 0;}return M}async function S(p,C,G){let T=c.config.tasks[p],M=T.taskHandlers??[],x=v(p);for(let B of M){let tt=h.get(B);if(!tt)throw new Error(`Handler '${B}' not found in registry (task '${p}')`);let K={nodeId:p,state:x,taskState:c.state.tasks[p],config:T,callbackToken:C,update:G};if(await tt(K)==="task-initiate-failure")throw new Error(`Handler '${B}' returned task-initiate-failure (task '${p}')`)}}function I(p){let G=c.config.tasks[p]?.taskHandlers;if(!G||G.length===0)return;E.append({type:"task-started",taskName:p,timestamp:new Date().toISOString()}),$();let T=qe(p),M=S(p,T).catch(x=>{i||(E.append({type:"task-failed",taskName:p,error:x.message??String(x),timestamp:new Date().toISOString()}),$());}).finally(()=>{l.delete(M);});l.add(M);}return {push(p){i||(p.type==="task-completed"&&p.data&&!p.dataHash&&(p={...p,dataHash:Re(p.data)}),a.append(p),$());},pushAll(p){if(!i){for(let C of p)C.type==="task-completed"&&C.data&&!C.dataHash?a.append({...C,dataHash:Re(C.data)}):a.append(C);$();}},resolveCallback(p,C,G){if(i)return;let T=Br(p);if(!T)return;let{taskName:M}=T;if(c.config.tasks[M]){if(G&&G.length>0)a.append({type:"task-failed",taskName:M,error:G.join("; "),timestamp:new Date().toISOString()});else {let x=C&&Object.keys(C).length>0?Re(C):void 0;a.append({type:"task-completed",taskName:M,data:C,dataHash:x,timestamp:new Date().toISOString()});}$();}},addNode(p,C){i||(a.append({type:"task-upsert",taskName:p,taskConfig:C,timestamp:new Date().toISOString()}),$());},removeNode(p){i||(a.append({type:"task-removal",taskName:p,timestamp:new Date().toISOString()}),$());},addRequires(p,C){i||(a.append({type:"node-requires-add",nodeName:p,tokens:C,timestamp:new Date().toISOString()}),$());},removeRequires(p,C){i||(a.append({type:"node-requires-remove",nodeName:p,tokens:C,timestamp:new Date().toISOString()}),$());},addProvides(p,C){i||(a.append({type:"node-provides-add",nodeName:p,tokens:C,timestamp:new Date().toISOString()}),$());},removeProvides(p,C){i||(a.append({type:"node-provides-remove",nodeName:p,tokens:C,timestamp:new Date().toISOString()}),$());},registerHandler(p,C){h.set(p,C);},unregisterHandler(p){h.delete(p);},retrigger(p){i||c.config.tasks[p]&&(a.append({type:"task-restart",taskName:p,timestamp:new Date().toISOString()}),$());},retriggerAll(p){if(!i){for(let C of p)c.config.tasks[C]&&a.append({type:"task-restart",taskName:C,timestamp:new Date().toISOString()});$();}},snapshot(){return Xt(c)},getState(){return c},getSchedule(){return Zt(c)},async waitForHandlers(){l.size>0&&await Promise.allSettled([...l]);},async dispose(p){p?.wait&&l.size>0&&await Promise.allSettled([...l]),i=true;}}}var Lr=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-server-runtime.cjs', document.baseURI).href)));Lr("./jsonata-sync.cjs");var Mr=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-server-runtime.cjs', document.baseURI).href))),fe=Mr("./jsonata-sync.cjs"),Ve=fe;function Ge(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 Ue(t,e,r){let n=e.split("."),o=t;for(let a=0;a<n.length-1;a++)(o[n[a]]==null||typeof o[n[a]]!="object")&&(o[n[a]]={}),o=o[n[a]];o[n[n.length-1]]=r;}async function Vr(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 a=await fe(o.expr).evaluate(n);Ue(t.computed_values,o.bindTo,a),n.computed_values=t.computed_values;}catch{}return t}function Ur(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 a of t.compute)try{let c=Ve(a.expr).evaluate(n);Ue(t.computed_values,a.bindTo,c),n.computed_values=t.computed_values;}catch(c){let i=c instanceof Error?c.message:String(c);o.push({bindTo:a.bindTo,error:i});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function Hr(t,e,r){let n={...r??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return fe(t).evaluate(n)}function Kr(t,e){return e.startsWith("fetched_sources.")?Ge(t._sourcesData??{},e.slice(16)):Ge(t,e)}var Me=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Jr=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function zr(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))Jr.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 a=n;(typeof a.bindTo!="string"||!a.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof a.ref!="string"||!a.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 a=n;(typeof a.bindTo!="string"||!a.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof a.expr!="string"||!a.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((a,c)=>{if(!a||typeof a!="object"||Array.isArray(a))e.push(`source_defs[${c}]: must be an object`);else {let i=a;typeof i.bindTo!="string"||!i.bindTo?e.push(`source_defs[${c}]: missing required "bindTo" property`):(n.has(i.bindTo)&&e.push(`source_defs[${c}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?e.push(`source_defs[${c}]: missing required "outputFile" property`):(o.has(i.outputFile)&&e.push(`source_defs[${c}]: outputFile "${i.outputFile}" is not unique across source_defs`),o.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${c}]: 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,a)=>{if(!o||typeof o!="object"){e.push(`view.elements[${a}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${a}].kind: required, must be a string`):Me.has(o.kind)||e.push(`view.elements[${a}].kind: unknown kind "${o.kind}". Valid: ${[...Me].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${a}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&e.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function Wr(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[a,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[a]=await fe(c).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}}))}function Yr(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[a,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[a]=Ve(c).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}})}var te={run:Vr,runSync:Ur,eval:Hr,resolve:Kr,validate:zr,enrichSources:Wr,enrichSourcesSync:Yr};function He(t){return JSON.stringify(t)}function Ke(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 ge(t,e){function r(){return t.readIndex()??{}}function n(o,a,c){let i=String(a||"").split(".").filter(Boolean);if(i.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let l={...o},h=l;for(let E=0;E<i.length-1;E++){let N=i[E],q=h[N],$=q&&typeof q=="object"&&!Array.isArray(q)?{...q}:{};h[N]=$,h=$;}return h[i[i.length-1]]=c,l}return {readCard(o){let a=r()[o];return !a||!t.cardExists(a.key)?null:t.readCard(a.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[a,c]of Object.entries(r())){if(!t.cardExists(c.key))continue;let i=t.readCard(c.key);i?o.push(i):e?.(`[card-store] could not read card "${a}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[a,c]of Object.entries(r()))o[a]=c.checksum;return o},changedSince(o){let a=r(),c=[];for(let[i,l]of Object.entries(a))o[i]!==l.checksum&&c.push(i);for(let i of Object.keys(o))a[i]||c.push(i);return c},validateUpsert(o,a){let c=r(),i=c[o],l=Object.entries(c).find(([,h])=>h.key===a);return i&&i.key!==a?{ok:false,error:`Card id "${o}" is already mapped to key "${i.key}", cannot remap to "${a}"`}:l&&l[0]!==o?{ok:false,error:`Key "${a}" is already mapped to card id "${l[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,a,c){let i=r(),l=c??i[o]?.key??t.defaultCardKey(o),h=t.writeCard(l,a);i[o]={key:l,checksum:h,updatedAt:new Date().toISOString()},t.writeIndex(i);},patchCard(o,a,c){let i=r(),l=i[o];if(!l||!t.cardExists(l.key))throw new Error(`card "${o}" not found`);let h=t.readCard(l.key);if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`card "${o}" is not patchable`);let E=n(h,a,c),N=t.writeCard(l.key,E);i[o]={key:l.key,checksum:N,updatedAt:new Date().toISOString()},t.writeIndex(i);},removeCard(o){let a=r(),c=a[o];c&&(t.removeCard(c.key),delete a[o],t.writeIndex(a));},readIndex(){return r()}}}function pe(t,e){return {readSourceData(r,n){let o=t.read(`${r}/${n}`);if(o==null)return null;let a=o.trim();if(!a)return null;try{return JSON.parse(a)}catch{return a}},ingestSourceDataStaged(r,n,o,a){let c=e(o);t.write(`${r}/.staged/${a}/${n}`,c);},commitSourceData(r,n,o){let a=`${r}/.staged/${o}/${n}`,c=t.read(a);return c==null?false:(t.write(`${r}/${n}`,c),t.remove(a),true)},hasSource(r,n){return t.exists(`${r}/${n}`)},listSources(r){return t.listKeys(`${r}/`).filter(n=>!n.includes("/.staged/")).map(n=>n.slice(`${r}/`.length))}}}function Xe(t){function e(r){let n=t.readAllEntries();if(!r)return n;let o=n.findIndex(a=>a.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 Ze(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 a of o)try{n(a);}catch(c){let i=c instanceof Error?c.message:String(c);try{e(a,i);}catch{}}t.delete(r);}}}}var me="v1",Dt="board/graph",Qe="board/lastJournalProcessedId";function Je(t){return `cards/${t}/runtime`}function tr(t){return {readRuntime(e){return t.read(Je(e))??{_sources:{}}},writeRuntime(e,r){t.write(Je(e),r);}}}function Xr(t,e){let r={...t};for(let n of e.deleteKeys)delete r[n];return {...r,...e.shallowMerge}}function er(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,r){if(r.schemaVersion!==me)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=Xr(n.values,r);return {ok:true,newVersion:t.writeValues(e,o,r.deleteKeys)}}}}function rr(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 Ke(r.trim())},writeTaskExecutorRef(r){t.write("task-executor",He(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);},readChatStoreRef(){return e("chat-store-ref")},writeChatStoreRef(r){t.write("chat-store-ref",r);},readArtifactsStoreRef(){return e("artifacts-store-ref")},writeArtifactsStoreRef(r){t.write("artifacts-store-ref",r);}}}function nr(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 ze(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Zr(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function We(t,e){return t?.lastRequestedToken?Zr(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function Qr(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function Ye(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function he(t,e){let r=e.state.tasks,n=e.config.tasks,o=Object.keys(r),a=Zt(e),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let w of a.pending)i.set(w.taskName,w.waitingOn);for(let w of a.unresolved)i.set(w.taskName,w.missingTokens);for(let w of a.blocked)i.set(w.taskName,w.failedTokens);let l=new Map;for(let[w,v]of Object.entries(n))for(let S of v.requires??[]){let I=l.get(S)??[];I.push(w),l.set(S,I);}let h=o.sort().map(w=>{let v=r[w],S=n[w]??{requires:[],provides:[]};v.status==="completed"?c.completed+=1:v.status==="failed"?c.failed+=1:v.status==="in-progress"&&(c.in_progress+=1);let I=S.requires??[],p=S.provides??[],C=Object.keys(v.data??{}).sort(),G=I.filter(K=>e.state.availableOutputs.includes(K)),T=I.filter(K=>!e.state.availableOutputs.includes(K)),M=i.get(w)??T,x=new Set;for(let K of p)for(let X of l.get(K)??[])X!==w&&x.add(X);let B=v.failedAt,tt=v.error?{message:v.error,code:"TASK_FAILED",at:B,source:"task-runtime"}:void 0;return {name:w,status:v.status,error:tt,requires:I,requires_satisfied:G,requires_missing:T,provides_declared:p,provides_runtime:C,blocked_by:M,unblocks:Array.from(x).sort(),runtime:{attempt_count:v.executionCount??0,restart_count:v.retryCount??0,in_progress_since:v.status==="in-progress"?v.startedAt??null:null,last_transition_at:v.lastUpdated??null,last_completed_at:v.completedAt??null,last_restarted_at:v.startedAt??null,status_age_ms:v.lastUpdated?0:null}}});c.pending=a.pending.length,c.blocked=a.blocked.length,c.unresolved=a.unresolved.length;let E=h.map(w=>({name:w.name,fanOut:w.unblocks.length})).sort((w,v)=>v.fanOut-w.fanOut||w.name.localeCompare(v.name)),N=E.length>0?E[0]:{name:null,fanOut:0},q=new Set;for(let w of Object.values(n))for(let v of w.requires??[])q.add(v);let $=0;for(let[w,v]of Object.entries(n)){let S=(v.requires??[]).length===0,p=(v.provides??[]).some(C=>(l.get(C)??[]).some(G=>G!==w));S&&!p&&($+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:c.completed,eligible:a.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:$,topology:{edge_count:Array.from(q).length,max_fan_out_card:N.name,max_fan_out:N.fanOut}},cards:h}}function tn(){return new Date().toISOString()}function or(t,e,r,n,o,a,c){return async i=>{let l=[],h=r.cardStore.readCard(i.nodeId);if(!h)return "task-initiate-failure";let E=h.id,N=h.card_data??{},q=h.source_defs??[],$=q.filter(F=>F.optionalForCompletionGating!==true),w=r.cardRuntimeStore.readRuntime(E),v=false,S=()=>{v&&(r.cardRuntimeStore.writeRuntime(E,w),v=false);},I=F=>ze(w._sources[F]),p=(F,P)=>{w._sources[F]=ze(P),v=true;},C=i.taskState?.executionCount??0;if(w._lastExecutionCount!==C&&(w._sources={},w._lastExecutionCount=C,v=true),i.update){let F=i.update,P=F.outputFile;if(P){let W=I(P);if(F.failure){let it=F.rqt??W.lastRequestedToken??W.queueRequestedToken;it&&p(P,Ye(W,it));}else {let it=F.rqt;if(!W.lastCompletedToken||it>W.lastCompletedToken){let kt=typeof F.deliveryToken=="string"?F.deliveryToken:void 0,Et=false;kt&&(Et=r.fetchedSourcesStore.commitSourceData(E,P,kt)),Et?p(P,Qr(W,it)):p(P,Ye(W,it));}}S();}}let T={};for(let F of q)if(F.outputFile){let P=r.fetchedSourcesStore.readSourceData(E,F.outputFile);P!==null&&(T[F.bindTo]=P);}let M={};for(let[F,P]of Object.entries(i.state??{}))if(P!==null&&typeof P=="object"&&!Array.isArray(P)){let W=P[F];M[F]=W!==void 0?W:P;}else M[F]=P;let x={id:E,card_data:{...N},requires:M,source_defs:q,compute:h.compute};x._sourcesData=T,h.compute&&te.runSync(x,{sourcesData:T}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(E,x.computed_values??{});let B={...h},tt=te.enrichSourcesSync(Array.isArray(h.source_defs)?h.source_defs:void 0,{card_data:h.card_data,requires:M}),K=t.value;B.source_defs=Array.isArray(tt)?tt.map(F=>({...F,boardDir:typeof F.boardDir=="string"&&F.boardDir?F.boardDir:K})):tt;let X=tn(),st=i.update?void 0:X,at=$.filter(F=>{let P=F.outputFile;if(typeof P!="string"||!P)return true;let W=I(P);st&&(W={...W,queueRequestedToken:st},p(P,W));let it=W.queueRequestedToken??W.lastRequestedToken??X,kt=We(W,it);return kt==="in-flight"?false:kt==="dispatch"});if(S(),at.length>0){let F=false,P=X;for(let W of at){let it=W.outputFile;if(typeof it!="string"||!it)continue;let kt=I(it),Et=kt.queueRequestedToken??X;p(it,{...kt,lastRequestedToken:Et}),P=Et,F=true;}return F&&S(),F&&(l.push({taskKind:"source-fetch",payload:{boardRef:xt(t),enrichedCard:B,callbackToken:i.callbackToken,rqt:P}}),r.executionRequestStore.appendEntries(e,l)),"task-initiated"}if($.some(F=>{let P=F.outputFile;if(typeof P!="string"||!P)return false;let W=I(P),it=W.queueRequestedToken??W.lastRequestedToken??X;return We(W,it)==="in-flight"}))return "task-initiated";let Bt=h.provides??[],At={};for(let{bindTo:F,ref:P}of Bt)At[F]=te.resolve(x,P);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(At),q.filter(F=>{if(F.optionalForCompletionGating!==true)return false;let P=I(F.outputFile);return !P.lastRequestedToken||!P.lastCompletedToken?true:P.lastCompletedToken<=P.lastRequestedToken}).length>0&&l.push({taskKind:"source-fetch",payload:{boardRef:xt(t),enrichedCard:B,callbackToken:i.callbackToken,rqt:X}}),n(i.nodeId,At),l.length>0&&r.executionRequestStore.appendEntries(e,l),"task-initiated"}}var we={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function sr(t){return {[Dt]:t.graph,[Qe]:t.lastDrainedJournalId}}function ar(t){let e=t[Dt],r=t[Qe];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Dt}`);return {graph:e,lastDrainedJournalId:typeof r=="string"?r:""}}function ir(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 nt(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function rt(t){return {status:"fail",error:t}}function ot(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function en(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 cr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function ye(t){try{let e=JSON.parse(cr(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function rn(t){return en(JSON.stringify(t))}function ur(t){try{let e=JSON.parse(cr(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function dt(){return new Date().toISOString()}function dr(t,e){let r=e.onWarn??(()=>{}),n=xt(t);function o(y){if(y.length!==0)try{let f=e.publishBoardChangeNotifications?.(y);f&&typeof f.catch=="function"&&f.catch(R=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${R instanceof Error?R.message:String(R)}`));}catch(f){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${f instanceof Error?f.message:String(f)}`);}}function a(){let y=i().readCardStoreRef();if(!y)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let f=e.kvStorageForRef(y);return {readIndex(){return f.read("_index")},writeIndex(R){f.write("_index",R);},readCard(R){return f.read(R)},writeCard(R,A){return f.write(R,A),e.hashFn(A)},removeCard(R){f.delete(R);},cardExists(R){return f.read(R)!==null},defaultCardKey(R){return R}}}let c={readValues(y){let f=e.kvStorage("state-snapshot"),R=f.listKeys().sort();if(R.length===0)return {version:null,values:{}};let A={};for(let L of R)A[L]=f.read(L);return {version:e.hashFn(A),values:A}},writeValues(y,f,R){let A=e.kvStorage("state-snapshot");for(let L of R)A.delete(L);for(let[L,z]of Object.entries(f))A.write(L,z);return e.hashFn(f)}},i=()=>rr(e.kvStorage("config")),l=()=>er(c),h=()=>Xe(e.journalAdapter()),E=()=>ge(a(),r),N=()=>{let y=i().readOutputsStoreRef();if(!y)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return nr(e.kvStorageForRef(y))},q=()=>{let y=i().readArchiveStoreRef();return y?e.archiveFactoryForRef(y):e.archiveFactory()};function $(){return !!l().readSnapshot(t.value).values[Dt]}function w(){let y=l().readSnapshot(t.value);if(!y.values[Dt])throw new Error(`Board not initialized at ${t.value}`);return ar(y.values)}function v(y,f){let R=l().commitSnapshot(t.value,{schemaVersion:me,expectedVersion:f,commitId:e.genId(),committedAt:dt(),deleteKeys:[],shallowMerge:sr(y)});if(!R.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${f??"null"} current=${R.currentVersion??"null"}`)}function S(y){h().appendEvent(y);}async function I(){let y=(b,O)=>{let Y=b.payload,s=(Y?.enrichedCard??{}).id??Y?.cardId??"unknown";S({type:"task-failed",taskName:s,error:O,timestamp:dt()});},f=Ze(e.kvStorage("execution-requests"),y),R=tr(e.kvStorage("card-runtime")),A=pe(e.blobStorage("sources"),b=>e.resolveBlob(b)),L=new Map,z={readRuntime(b){return L.get(b)??R.readRuntime(b)},writeRuntime(b,O){L.set(b,O);}},ct=[],Z=new Map,lt={readSourceData(b,O){let Y=`${b}/${O}`;return Z.has(Y)?Z.get(Y):A.readSourceData(b,O)},ingestSourceDataStaged(b,O,Y,vt){A.ingestSourceDataStaged(b,O,Y,vt);},commitSourceData(b,O,Y){let vt=`${b}/.staged/${Y}/${O}`,u=e.blobStorage("sources").read(vt);if(u==null)return false;let d=`${b}/${O}`,g=u.trim();try{Z.set(d,JSON.parse(g));}catch{Z.set(d,g);}return ct.push({cardId:b,outputFile:O,deliveryToken:Y}),true},hasSource(b,O){let Y=`${b}/${O}`;return Z.has(Y)?true:A.hasSource(b,O)},listSources(b){let O=A.listSources(b),Y=new Set;for(let s of Z.keys())s.startsWith(`${b}/`)&&Y.add(s.slice(`${b}/`.length));let vt=new Set([...O,...Y]);return Array.from(vt)}},ut={cardStore:E(),cardRuntimeStore:z,fetchedSourcesStore:lt,outputStore:N(),executionRequestStore:f},H=w(),ft=le(H.graph),{events:It,newCursor:Tt}=h().readEntriesAfterCursor(H.lastDrainedJournalId),wt=[],Gt=[],Mt=[],Vt=new Map,Ut=(b,O)=>{wt.push({type:"task-completed",taskName:b,data:O,timestamp:dt()});try{q().stream("exec-history").append({taskName:b,status:"completed",completedAt:dt()});}catch{}},zt=(b,O)=>{S({type:"task-failed",taskName:b,error:O,timestamp:dt()});try{q().stream("exec-history").append({taskName:b,status:"failed",error:O,completedAt:dt()});}catch{}},Ft=Le(ft,{handlers:{"card-handler":or(t,Tt,ut,Ut,zt,(b,O)=>{Gt.push({cardId:b,values:O});},b=>{Mt.push(b);})}});for(wt=It;wt.length>0;){let b=wt;wt=[];for(let O of b)if(O.type==="task-restart"){let Y=ut.cardStore.readCard(O.taskName);Y&&Vt.set(O.taskName,Y);}Ft.pushAll(b),await Ft.waitForHandlers();}let Ht=Ft.getState();await Ft.dispose({wait:true});let Wt=l().readSnapshot(t.value).version;v({lastDrainedJournalId:Tt,graph:Xt(Ht)},Wt);for(let{cardId:b,values:O}of Gt)ut.outputStore.writeComputedValues(b,O);for(let b of Mt)ut.outputStore.writeDataObjects(b);for(let[b,O]of L)R.writeRuntime(b,O);for(let{cardId:b,outputFile:O,deliveryToken:Y}of ct)A.commitSourceData(b,O,Y);let Kt;try{Kt=he(n,Ht),ut.outputStore.writeStatusSnapshot(Kt);}catch(b){r(`[board-live-cards-public] status publish failed: ${b instanceof Error?b.message:String(b)}`);}let Pt=[];for(let{cardId:b,values:O}of Gt)Pt.push({kind:"computed_values",cardId:b,values:O});for(let b of Mt)for(let[O,Y]of Object.entries(b))O&&Pt.push({kind:"data_object",key:O,payload:Y});for(let[b,O]of Vt)Pt.push({kind:"card_refreshed",cardId:b,card:O});Kt!==void 0&&Pt.push({kind:"status",status:Kt}),o(Pt);let Se=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:xt({kind:"built-in",value:"source-cli-task-executor"})};f.dispatchEntriesForJournalId(Tt,b=>{if(b.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${b.taskKind}" \u2014 skipping`);return}let O=b.payload,Y=O.enrichedCard?.id??"unknown",vt=O.enrichedCard?.source_defs??[];for(let s of vt){if(!s.outputFile){r(`[dispatch] source "${s.bindTo}" has no outputFile \u2014 skipping`);continue}let u=rn({cbk:O.callbackToken,rg:t.value,br:xt(t),cid:Y,b:s.bindTo,d:s.outputFile,cs:void 0,rqt:O.rqt});e.dispatchExecution(Se,{source_def:s,base_ref:xt(t),callback:{token:u,via:e.selfRef}}).catch(d=>zt(Y,d instanceof Error?d.message:String(d)));}});}async function p(){try{let y=()=>{let R=w(),{events:A}=h().readEntriesAfterCursor(R.lastDrainedJournalId);A.length<=0||(p(),e.requestProcessAccumulated?.());},f=await Ae(e.lock,I,y);return nt({ran:f!==!1})}catch(y){return ot(y)}}function C(){p(),e.requestProcessAccumulated?.();}function G(y){try{let f=y.params?.cardStoreRef;if(!f)return rt("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!$()){let ut=de(we);v({lastDrainedJournalId:"",graph:Xt(ut)},null);}let R=y.params?.outputsStoreRef;if(!R)return rt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let A=y.params?.scratchStoreRef,L=y.params?.archiveStoreRef,z=y.params?.chatStoreRef,ct=y.params?.artifactsStoreRef,Z=i();Z.writeCardStoreRef(f),Z.writeOutputsStoreRef(R),A&&Z.writeScratchStoreRef(A),L&&Z.writeArchiveStoreRef(L),z&&Z.writeChatStoreRef(z),ct&&Z.writeArtifactsStoreRef(ct);let lt=y.body??{};lt["task-executor-ref"]&&Z.writeTaskExecutorRef(lt["task-executor-ref"]),Object.prototype.hasOwnProperty.call(lt,"chat-handler-flow")&&Z.writeChatHandlerFlow(lt["chat-handler-flow"]);try{N().writeStatusSnapshot(he(n,le(w().graph)));}catch{}return nt()}catch(f){return ot(f)}}function T(y){try{let f=N().readStatusSnapshot();if(!f){f=he(n,le(w().graph));try{N().writeStatusSnapshot(f);}catch{}}return nt(f)}catch(f){return ot(f)}}function M(y){try{let f=y.params?.id;return f?(S({type:"task-removal",taskName:f,timestamp:dt()}),C(),nt()):rt("removeCard requires params.id")}catch(f){return ot(f)}}function x(y){try{let f=y.params?.id;return f?(S({type:"task-restart",taskName:f,timestamp:dt()}),C(),nt()):rt("retrigger requires params.id")}catch(f){return ot(f)}}async function B(y){return p()}function tt(y){try{let f=y.params?.cardId,R=y.params?.all,A=!!y.params?.restart;if(!f&&!R)return rt("upsertCard requires --card-id <id> or --all");let L=R?E().readAllCards().map(z=>z.id):[f];for(let z of L)if(!E().readCard(z))return rt(`Card "${z}" not found in board at ${t.value}`);for(let z of L){let ct=E().readCard(z),Z=ir(ct),lt=e.hashFn(Z),ut=e.kvStorage("card-upsert"),H=ut.read(z),ft=H?.taskConfigHash!==lt;if(!(!ft&&!A)){if(ft){let It=H?.blobRef??E().readCardKey(z)??z;S({type:"task-upsert",taskName:z,taskConfig:Z,timestamp:dt()}),ut.write(z,{blobRef:It,taskConfigHash:lt,updatedAt:dt()});}A&&S({type:"task-restart",taskName:z,timestamp:dt()});}}return C(),nt()}catch(f){return ot(f)}}function K(y){try{let f=y.params?.token;if(!f)return rt("taskFailed requires params.token");let R=y.params?.error??"unknown error",A=ye(f);if(!A)return rt("Invalid callback token");S({type:"task-failed",taskName:A.taskName,error:R,timestamp:dt()});try{q().stream("exec-history").append({taskName:A.taskName,status:"failed",error:R,completedAt:dt()});}catch{}return C(),nt()}catch(f){return ot(f)}}function X(y){try{let f=y.params?.token;if(!f)return rt("taskProgress requires params.token");let A=(y.body??{}).update??{},L=ye(f);return L?(S({type:"task-progress",taskName:L.taskName,update:A,timestamp:dt()}),C(),nt()):rt("Invalid callback token")}catch(f){return ot(f)}}function st(y){try{let f=y.params?.token,R=y.params?.ref;if(!f)return rt("sourceDataFetched requires params.token");if(!R)return rt("sourceDataFetched requires params.ref");let A=ur(f);if(!A)return rt("Invalid source token");let{cbk:L,cid:z,b:ct,d:Z,cs:lt,rqt:ut}=A,H=pe(e.blobStorage("sources"),wt=>e.resolveBlob(wt)),ft=e.genId();H.ingestSourceDataStaged(z,Z,xe(R),ft);let It=ye(L);if(!It)return rt("Invalid callback token embedded in source token");let Tt=dt();return S({type:"task-progress",taskName:It.taskName,update:{bindTo:ct,outputFile:Z,fetchedAt:Tt,deliveryToken:ft,sourceChecksum:lt,rqt:ut},timestamp:Tt}),C(),nt()}catch(f){return ot(f)}}function at(y){try{let f=y.params?.token,R=y.params?.reason??"unknown";if(!f)return rt("sourceDataFetchFailure requires params.token");let A=ur(f);if(!A)return rt("Invalid source token");let{cbk:L,b:z,d:ct,cs:Z,rqt:lt}=A,ut=ye(L);return ut?(S({type:"task-progress",taskName:ut.taskName,update:{bindTo:z,outputFile:ct,failure:!0,reason:R,sourceChecksum:Z,rqt:lt},timestamp:dt()}),C(),nt()):rt("Invalid callback token embedded in source token")}catch(f){return ot(f)}}function $t(y){try{let f=i().readCardStoreRef();return f?nt({storeRef:f}):rt(`Board at ${t.value} has no card store configured`)}catch(f){return ot(f)}}function Bt(y){try{let f=i().readOutputsStoreRef();return f?nt({storeRef:f}):rt(`Board at ${t.value} has no outputs store configured`)}catch(f){return ot(f)}}function At(y){try{let f=i().readScratchStoreRef();return nt({storeRef:f})}catch(f){return ot(f)}}function mt(y){try{let f=i().readArchiveStoreRef();return nt({storeRef:f})}catch(f){return ot(f)}}function F(y){try{let f=i().readChatStoreRef();return nt({storeRef:f})}catch(f){return ot(f)}}function P(y){try{let f=i().readArtifactsStoreRef();return nt({storeRef:f})}catch(f){return ot(f)}}function W(y){try{let f=y.params?.key;if(!f)return rt("getConfig requires params.key");let R=i(),A;switch(f){case "task-executor":A=R.readTaskExecutorRef()??null;break;case "chat-handler-flow":A=R.readChatHandlerFlow()??null;break;case "card-store-ref":A=R.readCardStoreRef();break;case "outputs-store-ref":A=R.readOutputsStoreRef();break;case "scratch-store-ref":A=R.readScratchStoreRef();break;case "archive-store-ref":A=R.readArchiveStoreRef();break;case "chat-store-ref":A=R.readChatStoreRef();break;case "artifacts-store-ref":A=R.readArtifactsStoreRef();break;default:return rt(`getConfig: unknown key "${f}"`)}return nt({value:A})}catch(f){return ot(f)}}function it(y){try{let f=y.params?.key;if(!f)return rt("getOutputsDataObject requires params.key");let R=N().readDataObject(f);return nt(R)}catch(f){return ot(f)}}function kt(y){try{return nt(N().readAllDataObjects())}catch(f){return ot(f)}}function Et(y){try{let f=y.params?.key;if(!f)return rt("getOutputsComputedValues requires params.key");let R=N().readComputedValues(f);return nt(R)}catch(f){return ot(f)}}function qt(y){try{return nt(N().readAllComputedValues())}catch(f){return ot(f)}}function Lt(){return pe(e.blobStorage("sources"),y=>e.resolveBlob(y))}function ee(y){let f=e.blobStorage("sources").keyRef?.(y);return f?xt(f):y}function re(y){try{let f=y.params?.key;if(!f)return rt("getOutputsFetchedSources requires params.key");let R=Lt().listSources(f),A={};for(let L of R)A[L]=ee(`${f}/${L}`);return nt(A)}catch(f){return ot(f)}}function ke(y){try{let f=Lt(),R=new Set;for(let L of e.blobStorage("sources").listKeys()){let z=L.indexOf("/");z>0&&!L.includes("/.staged/")&&R.add(L.slice(0,z));}let A={};for(let L of R){let z=f.listSources(L);if(z.length>0){A[L]={};for(let ct of z)A[L][ct]=ee(`${L}/${ct}`);}}return nt(A)}catch(f){return ot(f)}}return {init:G,status:T,getCardStoreRef:$t,getOutputsStoreRef:Bt,getScratchStoreRef:At,getArchiveStoreRef:mt,getChatStoreRef:F,getArtifactsStoreRef:P,getConfig:W,getOutputsDataObject:it,getAllOutputsDataObjects:kt,getOutputsComputedValues:Et,getAllOutputsComputedValues:qt,getOutputsFetchedSources:re,getAllOutputsFetchedSources:ke,removeCard:M,retrigger:x,processAccumulatedEvents:B,upsertCard:tt,taskFailed:K,taskProgress:X,sourceDataFetched:st,sourceDataFetchFailure:at}}function lr(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 a=o.params?.id;if(a){let c=t.readCard(a);return c?e({cards:[c]}):r(`card "${a}" not found`)}return e({cards:t.readAllCards()})}catch(a){return n(a)}},set(o){try{let a=o.body;if(a==null)return r("set requires a body (card object or array of cards)");let c=Array.isArray(a)?a:[a];for(let i of c){if(typeof i.id!="string")return r("each card must have a string `id` field");t.writeCard(i.id,i);}return e({count:c.length})}catch(a){return n(a)}},del(o){try{let a=o.body?.ids??[],c=o.params?.id,i=c?[...a,c]:a;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let l of i)t.removeCard(l);return e({count:i.length})}catch(a){return n(a)}},patch(o){try{let a=o.params?.id,c=o.params?.path;if(!a)return r("patch requires params.id");if(!c)return r("patch requires params.path");let i=o.body,l=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:o.body;return t.patchCard(a,c,l),e({count:1})}catch(a){return n(a)}}}}function fr(){return new Date().toISOString()}function gr(t){return new TextEncoder().encode(t).byteLength}function nn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function on(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function sn(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 an(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function un(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function cn(t){let e=sn(t),r=e.lastIndexOf(".");return r<=0||r===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,r),ext:e.slice(r)}}function dn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function pr(t){function e(r){let n=t.stat?nn(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:gr(o)}}return {exists(r){return t.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){t.write(r,n);let a=e(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??fr(),a.size=a.size??gr(n),a},putBytes(r,n,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(r,n);else {let c=JSON.stringify({__kind:"bytes-array",data:[...n]});t.write(r,c);}let a=e(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??fr(),a.size=a.size??n.byteLength,a},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 mr(t){function e(o,a){let c=0,i=[];Array.isArray(a)&&i.push(...a);for(let l of t.list(`${o}/`))i.push(dn(l.key));for(let l of i){let h=on(l);Number.isFinite(h)&&h>c&&(c=h);}return c+1}function r(o,a,c){let i=Number(c?.maxLen||32),{stem:l,ext:h}=cn(o),E=un(h),N=an(l),q=`${String(a).padStart(3,"0")}-`,$=E,w=i-q.length-$.length;w<1&&($="",w=i-q.length);let v=N.slice(0,Math.max(1,w)),S=`${q}${v}${$}`;return S.length>i&&(S=S.slice(0,i).replace(/\.$/,"")),S}function n(o,a,c){let i=e(o,c?.seedNames),l=r(a,i,{maxLen:c?.maxLen});for(;t.exists(`${o}/${l}`);)i+=1,l=r(a,i,{maxLen:c?.maxLen});return l}return {nextSerial:e,buildStoredName:r,allocateStoredName:n}}function hr(){function t(o,a){if(!Array.isArray(o))return [];let c=[];for(let i of o){if(!i||typeof i!="object")continue;let l=i;typeof l.stored_name=="string"&&c.push({name:typeof l.name=="string"?l.name:l.stored_name,stored_name:l.stored_name,size:typeof l.size=="number"&&Number.isFinite(l.size)?l.size:null,mime_type:typeof l.mime_type=="string"?l.mime_type:null,uploaded_at:typeof l.uploaded_at=="string"?l.uploaded_at:a||null,chat:l.chat===true});}return c}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function r(o,a){let c=e(o);if(a.length===0)return o.files=c,c;let i=new Set(c.map(l=>l.stored_name));for(let l of a)i.has(l.stored_name)||(c.push(l),i.add(l.stored_name));return o.files=c,c}function n(o,a,c){let i=e(o);if(!Number.isInteger(a)||a<0||a>=i.length)return {ok:false,reason:"index_out_of_range"};let l=i[a];return !l||!l.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==l.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:l}}return {read:e,normalizeIncoming:t,merge:r,resolve:n}}function ln(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function yr(){let t=new Map,e=new Map;function r(n){return t.has(n)||t.set(n,[]),t.get(n)}return {append(n,o,a,c=[]){let i={id:ln(),role:o,text:a,files:c,updated_at:new Date().toISOString()};return r(n).push(i),i.id},readAll(n){return r(n).slice()},readAfter(n,o){let a=r(n);if(!o)return {records:a.slice(),cursor:a.length>0?a[a.length-1].id:null};let c=a.findIndex(l=>l.id===o),i=c===-1?a.slice():a.slice(c+1);return {records:i,cursor:i.length>0?i[i.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 a=e.get(`c:${n}`)??{};e.set(`c:${n}`,{...a,...o});}}}function kr(t){function e(i){return {status:"success",data:i}}function r(i){return {status:"fail",error:i}}function n(i){return {status:"error",error:i instanceof Error?i.message:String(i)}}function o(i,l="command envelope"){let h=typeof i.cardId=="string"?i.cardId:void 0;if(!i.command)return r(`chat-store: ${l} missing "command"`);if(!h)return r(`chat-store: ${l} missing "cardId"`);if(i.command==="append")return c.append({params:{cardId:h},body:{role:i.role,text:i.text,files:i.files}});if(i.command==="read-all")return c.readAll({params:{cardId:h}});if(i.command==="read-after")return c.readAfter({params:{cardId:h},body:{cursor:i.cursor??null}});if(i.command==="clear")return c.clear({params:{cardId:h}});if(i.command==="set-processing")return c.setProcessing({params:{cardId:h},body:{active:i.active}});if(i.command==="is-processing")return c.isProcessing({params:{cardId:h}});if(i.command==="get-config")return c.getConfig({params:{cardId:h}});if(i.command==="set-config"){let{command:E,cardId:N,...q}=i;return c.setConfig({params:{cardId:h},body:q})}return r(`chat-store: unknown command "${String(i.command)}"`)}function a(i){if(!Array.isArray(i.commands)||i.commands.length===0)return r('chat-store: command envelope must include a non-empty "commands" array');let l=[];for(let h=0;h<i.commands.length;h+=1){let E=i.commands[h];if(!E||typeof E!="object"||Array.isArray(E))return r(`chat-store: command envelope entry ${h} must be an object`);let N={cardId:i.cardId,...E},q=o(N,`command envelope entry ${h}`);if(q.status!=="success")return q;l.push({index:h,command:String(N.command),data:q.data});}return e({results:l})}let c={append(i){try{let l=i.params?.cardId;if(!l)return r("append requires params.cardId");let h=i.body??{},E=typeof h.role=="string"?h.role:"",N=typeof h.text=="string"?h.text:"",q=Array.isArray(h.files)?h.files:[];if(!E)return r("append requires body.role");let $=t.append(l,E,N,q);return e({id:$})}catch(l){return n(l)}},readAll(i){try{let l=i.params?.cardId;return l?e({records:t.readAll(l)}):r("readAll requires params.cardId")}catch(l){return n(l)}},readAfter(i){try{let l=i.params?.cardId;if(!l)return r("readAfter requires params.cardId");let E=(i.body??{}).cursor??null;return e(t.readAfter(l,E))}catch(l){return n(l)}},clear(i){try{let l=i.params?.cardId;return l?(t.clear(l),e({ok:!0})):r("clear requires params.cardId")}catch(l){return n(l)}},setProcessing(i){try{let l=i.params?.cardId;if(!l)return r("setProcessing requires params.cardId");let h=i.body??{};return typeof h.active!="boolean"?r("setProcessing requires body.active (boolean)"):(t.setProcessing(l,h.active),e({ok:!0}))}catch(l){return n(l)}},isProcessing(i){try{let l=i.params?.cardId;return l?e({active:t.isProcessing(l)}):r("isProcessing requires params.cardId")}catch(l){return n(l)}},getConfig(i){try{let l=i.params?.cardId;return l?e({config:t.getConfig(l)}):r("getConfig requires params.cardId")}catch(l){return n(l)}},setConfig(i){try{let l=i.params?.cardId;if(!l)return r("setConfig requires params.cardId");let h=i.body??{};return t.setConfig(l,h),e({ok:!0})}catch(l){return n(l)}},run:o,runBatch:a};return c}var Sr={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},fn=32;function gn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Cr(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 Rr(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)Rr(t,n);return}r.kind==="status"&&Cr(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 ho(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),r={...Sr,...t.corsHeaders||{}},n=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},a=t.invocationAdapter,c=t.chatFlowRunner||null,i=t.chatStorage??yr(),l=kr(i),h=t.notificationTransport||null,E=t.serverUrl||null,N=t.executionExtra||{},q=t.onSseClientConnected,$=t.onSseClientDisconnected,w=t.onChannelSubscribed,v=t.onChannelUnsubscribed,S=new Map,I=new Map,p=new Map,C=null;function G(s){let u=dr(s.baseRef,s.boardAdapter),d=s.boardAdapter.kvStorageForRef(s.cardStoreRef),m=lr(ge({readIndex:()=>d.read("_index"),writeIndex:j=>d.write("_index",j),readCard:j=>d.read(j),writeCard:(j,J)=>(d.write(j,J),j),cardExists:j=>d.read(j)!==null,defaultCardKey:j=>j},o.warn)),k=s.artifactsAdapter||s.boardAdapter,_=s.filesArtifactsStore??null,D=null;return {label:s.label,board:u,cardStore:m,get filesArtifacts(){return D??=_??pr(k.blobStorage("files"))},boardAdapter:s.boardAdapter,cardStoreRef:s.cardStoreRef,outputsStoreRef:s.outputsStoreRef,scratchStoreRef:s.scratchStoreRef,archiveStoreRef:s.archiveStoreRef,notifyRef:s.notifyRef,taskExecutorRef:s.taskExecutorRef,chatHandlerRef:s.chatHandlerRef,chatHandlerFlow:s.chatHandlerFlow,inferenceAdapterRef:s.inferenceAdapterRef,notification:gn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let T=t.boards.map(G),M=new Map;function x(s){return M.get(s)??0}function B(s){let u=T[x(s)];return {files:u?u.filesArtifacts:null}}function tt(s){let u=B(s);return u.files?mr(u.files):null}function K(){return hr()}function X(s){return String(s||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function st(s){if(!s||s.notificationTeardown||!h||!s.notifyRef)return;let u=await h.subscribe(s.notifyRef,d=>{Rr(s.notification,d);let g=d.kind==="notification-batch"?d.notifications:[d];O(g);});s.notificationTeardown=u;}async function at(s){if(!s||s.initialized)return;let u={cardStoreRef:s.cardStoreRef,outputsStoreRef:s.outputsStoreRef};s.scratchStoreRef&&(u.scratchStoreRef=s.scratchStoreRef),s.archiveStoreRef&&(u.archiveStoreRef=s.archiveStoreRef);let d={};s.taskExecutorRef&&(d["task-executor-ref"]=s.taskExecutorRef),s.chatHandlerFlow!==void 0&&(d["chat-handler-flow"]=s.chatHandlerFlow),s.inferenceAdapterRef&&(d["inference-adapter-ref"]=s.inferenceAdapterRef);let g=s.board.init({params:u,body:d});if(g.status!=="success")throw Object.assign(new Error(g.error||`init failed for ${s.label}`),{statusCode:500});if(await st(s),!s.chatHandlerFlow&&s.chatHandlerRef&&a.describe)try{let m=await a.describe(s.chatHandlerRef);m&&m.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${m.kind}", expected "chat-handler" for ${s.label}`):m&&o.info(`[init] chat-handler validated: ${m.name} (protocol ${m.protocolVersion}) for ${s.label}`);}catch(m){o.warn(`[init] chat-handler describe failed for ${s.label}: ${m?.message||String(m)}`);}s.initialized=true;}function $t(s){if(!s.boardAdapter.publishBoardChangeNotifications)return;let u=[],d=s.board.status({});d.status==="success"&&d.data!=null&&Cr(d.data)&&u.push({kind:"status",status:d.data});let g=s.board.getAllOutputsDataObjects({});if(g.status==="success"&&g.data!=null)for(let[k,_]of Object.entries(g.data))k&&u.push({kind:"data_object",key:k,payload:_});let m=s.board.getAllOutputsComputedValues({});if(m.status==="success"&&m.data!=null)for(let[k,_]of Object.entries(m.data))k&&u.push({kind:"computed_values",cardId:k,values:_});u.length>0&&s.boardAdapter.publishBoardChangeNotifications(u);}function Bt(s,u){if(!s||s.cardsBootstrapped)return;let d=s.cardStore.get({}),g=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let m of g)typeof m.id=="string"&&(M.set(m.id,u),s.board.upsertCard({params:{cardId:m.id}}));s.cardsBootstrapped=true;}async function At(){for(let s of T)await at(s);}async function mt(){await At();for(let s=0;s<T.length;s++)$t(T[s]),Bt(T[s],s);}function F(s){return T[x(s)]??null}function P(s){let u=F(s);if(!u)return null;let d=u.cardStore.get({params:{id:s}});if(d.status!=="success")return null;let g=Array.isArray(d.data?.cards)?d.data.cards:[];return g.length>0?g[0]:null}function W(){let s=d=>{if(!d||!d.cardStore)return [];let g=d.cardStore.get({});return g.status!=="success"||!Array.isArray(g.data?.cards)?[]:g.data.cards},u=[];for(let d of T)u.push(...s(d));return u}function it(){let s=T.map(k=>{try{let D=k.boardAdapter.kvStorageForRef(k.outputsStoreRef).read("status");if(D!=null)return D}catch{}return k.notification.status}).filter(Boolean);if(s.length===0)return null;if(s.length===1)return s[0];let u=[],d=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],g={};for(let k of d)g[k]=0;for(let k of s){let _=k,D=Array.isArray(_.cards)?_.cards:[];u.push(...D);for(let j of d)g[j]+=Number(_?.summary?.[j]||0);}let m=s[0];return {...m,cards:u,summary:{...m.summary||{},card_count:u.length,...g}}}function kt(){let s={},u=d=>{for(let[g,m]of Object.entries(d.notification.computedValues)){let k=d.notification.cards[g];s[g]={schema_version:"v1",card_id:g,card_data:k?.card_data??{},computed_values:m??{}};}};for(let d of T)u(d);return s}function Et(){let s={};for(let u of T)Object.assign(s,u.notification.dataObjects||{});return s}function qt(){let s=W(),u=kt(),d=Et(),g={};for(let k of s){if(!k?.id)continue;let _=k.id,D=u[_]||{},j={...D.card_data&&typeof D.card_data=="object"?D.card_data:k.card_data&&typeof k.card_data=="object"?k.card_data:{}};g[_]={schema_version:D.schema_version||"v1",card_id:D.card_id||_,card_data:j,computed_values:D.computed_values&&typeof D.computed_values=="object"?D.computed_values:{}};}let m={};for(let k of s){if(!k?.id)continue;let _=k.id;try{let D=L(_),j=i.isProcessing(_);(D.length>0||j)&&(m[_]={messages:D.map(J=>({role:String(J.role||"system"),text:String(J.text||""),files:Array.isArray(J.files)?J.files:[]})),receiving:!1,processing:j});}catch{}}return {boardId:n,cardDefinitions:s,statusSnapshot:it(),dataObjectsByToken:d,cardRuntimeById:g,cardChatsByCardId:m}}function Lt(s,u,d){let g=d?.syncBoard!==false,m=d?.restartOnlyIfChanged===true,k=F(s);if(!k)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let _=P(s);if(!_)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let D=m?JSON.stringify(_):null,j=u(_)||_;if(m&&JSON.stringify(j)===D)return;let J=k.cardStore.set({body:j});if(J.status!=="success")throw Object.assign(new Error(J.error||`Failed to persist card: ${s}`),{statusCode:500});if(g){let Q=k.board.upsertCard({params:{cardId:s,restart:true}});if(Q.status!=="success")throw Object.assign(new Error(Q.error||`Failed to upsert card: ${s}`),{statusCode:500})}}function ee(s,u){Lt(s,u,{syncBoard:true});}function re(s,u){Lt(s,u,{syncBoard:false});}function ke(s){let u=F(s);if(!u)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});if(!P(s))throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let g=u.board.upsertCard({params:{cardId:s,restart:true}});if(g.status!=="success")throw Object.assign(new Error(g.error||`Failed to retrigger card: ${s}`),{statusCode:500})}function y(s,u){Lt(s,d=>{if(!u||typeof u!="object"||Object.keys(u).length===0)return d;function g(m,k,_){let D=String(k||"").split(".").filter(Boolean);if(!D.length)return;let j=m;for(let J=0;J<D.length-1;J++){let Q=D[J];(!j[Q]||typeof j[Q]!="object")&&(j[Q]={}),j=j[Q];}j[D[D.length-1]]=_;}if(u.fieldValues!==void 0&&u.fieldValues!==null){let m=null,k=d.view;if(k&&Array.isArray(k.elements)){for(let _ of k.elements)if(_?.data&&_.data.writeTo){m=_.data.writeTo;break}}m?g(d,m,u.fieldValues):typeof u.fieldValues=="object"&&!Array.isArray(u.fieldValues)&&(d.card_data={...d.card_data||{},...u.fieldValues});}else {if(Array.isArray(u._stagedFiles)&&u._stagedFiles.length>0)return d;for(let[m,k]of Object.entries(u))m!=="_stagedFiles"&&(k!==null&&typeof k=="object"&&!Array.isArray(k)&&d[m]!==null&&typeof d[m]=="object"&&!Array.isArray(d[m])?d[m]={...d[m],...k}:d[m]=k);}return d},{syncBoard:true,restartOnlyIfChanged:true});}function f(s){let u=String(s||"").trim();if(!u)return "upload.bin";let d=Math.max(u.lastIndexOf("/"),u.lastIndexOf("\\"));return (d>=0?u.slice(d+1):u)||"upload.bin"}function R(s){i.clear(s),i.setProcessing(s,false);}function A(s,u,d,g){let m=typeof d=="string"?d.trim():"";return i.append(s,u,m,g)}function L(s){return i.readAll(s)}function z(s){let u=[];try{let d=P(s);if(!d)return u;let g=K().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let m of g)u.push(m.stored_name);}catch{}return u}function ct(s,u,d,g){let m=X(s),k=B(s),_=f(u),D=tt(s),j=D?D.allocateStoredName(m,_,{seedNames:z(s),maxLen:fn}):`${String(Date.now())}-${_}`;return k.files&&k.files.putBytes(`${m}/${j}`,new Uint8Array(g),d||"application/octet-stream"),{name:_,stored_name:j,size:g.length,mime_type:d||"application/octet-stream",uploaded_at:new Date().toISOString()}}function Z(s){let u=F(s);if(!u)return null;let d=u.board.getConfig({params:{key:"chat-handler-flow"}}),g=d.status==="success"?d.data?.value:null,m=u.chatHandlerRef;return g==null&&(!m||typeof m!="object")?null:{ctx:u,handlerFlow:g,handlerRef:m}}function lt(s,u,d=false){let g=Z(s);if(!g)return;let{ctx:m,handlerFlow:k,handlerRef:_}=g;if(!d)try{i.setProcessing(s,!0);}catch{}let D={boardId:n,cardId:String(s),lastChatEntryId:u,...N,...E?{serverUrl:E}:{}};if(!c&&k!=null){try{i.setProcessing(s,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${s}" but no chatFlowRunner was provided`);return}if(k!=null){let J=c;if(!J)return;J.run(k,D,{boardId:n,cardId:String(s),label:m.label,logger:o,serverUrl:E,executionExtra:N}).then(Q=>{if(Q.dispatched)o.info(`[chat-handler-flow] invoked for card "${s}" (boardId: "${n}")`);else {try{i.setProcessing(s,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${s}": ${Q.error||"unknown"}`);}},Q=>{try{i.setProcessing(s,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${s}": ${Q?.message||String(Q)}`);});return}let j=_;j&&a.invoke(j,D).then(J=>{if(J.dispatched)o.info(`[chat-handler] invoked for card "${s}" (boardId: "${n}")`);else {try{i.setProcessing(s,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${s}": ${J.error||"unknown"}`);}},J=>{try{i.setProcessing(s,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${s}": ${J?.message||String(J)}`);});}function ut(s,u,d){let g=u==="chat-send"?re:ee,m;g(s,k=>{let _=new Date().toISOString(),D=k.card_data&&typeof k.card_data=="object"?k.card_data:{};if(k.card_data=D,u==="chat-send"){let j=d&&typeof d.text=="string"?d.text.trim():"",J=[];if(Array.isArray(d?.files)){for(let Q of d.files)if(Q){if(typeof Q=="string"){J.push({name:Q});continue}if(typeof Q=="object"){let ht=Q;typeof ht.name=="string"&&J.push({name:ht.name,size:ht.size,mime_type:ht.mime_type,uploaded_at:ht.uploaded_at,stored_name:ht.stored_name,chat:ht.chat===true});}}}if(j||J.length>0){let Q=l.runBatch({cardId:s,commands:[{command:"append",role:"user",text:j,files:J},{command:"set-processing",active:true}]});if(Q.status!=="success")throw new Error(Q.error);let ht=Q.data.results[0]?.data?.id;if(typeof ht!="string"||!ht)throw new Error(`chat-send did not return an append id for card ${s}`);m={cardId:s,lastEntryId:ht,processingAlreadySet:true};try{let se=L(s);O([{kind:"card_chats",cardId:s,messages:se.map(Ot=>({role:String(Ot.role||"system"),text:String(Ot.text||""),files:Array.isArray(Ot.files)?Ot.files:[]})),receiving:!0,processing:i.isProcessing(s)}]);}catch{}}return k}if(u==="file-upload"){let j=K().normalizeIncoming(d?.files,_);return j.length>0&&K().merge(D,j),k}if(u==="action"){let j=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!j)return k;D.lastAction={buttonId:j,at:_},D.lastActionText=`${j} @ ${_}`;}return k}),m&&lt(m.cardId,m.lastEntryId,m.processingAlreadySet);}function H(s,u,d){let g=JSON.stringify(d),m=typeof Buffer<"u"?Buffer.byteLength(g):new TextEncoder().encode(g).length;s.writeHead(u,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":m}),s.end(g);}async function ft(s){let u=[];for await(let g of s)u.push(g);let d=typeof Buffer<"u"?Buffer.concat(u).toString("utf-8").trim():new TextDecoder().decode(Tt(u)).trim();return d?JSON.parse(d):{}}async function It(s){let u=[];for await(let d of s)u.push(d);return typeof Buffer<"u"?Buffer.concat(u):Tt(u)}function Tt(s){let u=s.reduce((m,k)=>m+k.length,0),d=new Uint8Array(u),g=0;for(let m of s)d.set(m,g),g+=m.length;return d}let wt=0;function Gt(s){let u=JSON.stringify(s);return wt++,`id: ${wt}
2
- data: ${u}
1
+ 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var st="b64:";function vr(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let s="";for(let a of t)s+=String.fromCharCode(a);n=btoa(s);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function xr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),s=new Uint8Array(n.length);for(let a=0;a<n.length;a+=1)s[a]=n.charCodeAt(a);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function be(e){return `${st}${vr(JSON.stringify(e))}`}function At(e){if(!e.startsWith(st))throw new Error(`Invalid ref format (expected ${st}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(xr(e.slice(st.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Et(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var je={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ge(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function Ne(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function _t(e){return e.tasks??{}}function bt(e){return e?e.status===je.FAILED||e.status===je.INACTIVATED:false}function It(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Tt(e){return e.maxExecutions}function Ot(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===je.COMPLETED){let a=e.tasks[n];a&&ge(a).forEach(c=>r.add(c));}return Array.from(r)}function jt(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;ge(s).forEach(u=>{r[u]||(r[u]=[]),r[u].push(n);});}),r}function Nt(e,t,r){let n=e.tasks[t]??at(),s={};if(r){let u=r.tasks[t],c=Ne(u);for(let f of c)for(let[g,m]of Object.entries(r.tasks))if(ge(m).includes(f)){let R=e.tasks[g];R?.lastDataHash&&(s[f]=R.lastDataHash);break}}let a={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:a},lastUpdated:new Date().toISOString()}}function $t(e,t,r,n,s,a){let u=e.tasks[r]??at(),c=t.tasks[r];if(!c)throw new Error(`Task "${r}" not found in graph`);let f;n&&c.on&&c.on[n]?f=c.on[n]:f=ge(c);let g=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let O=c.requires??[];for(let F of O)for(let[S,x]of Object.entries(t.tasks))if(ge(x).includes(F)){let b=e.tasks[S];b?.lastDataHash&&(g[F]=b.lastDataHash);break}}let m={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:s,data:a,lastConsumedHashes:g,error:void 0},R=[...new Set([...e.availableOutputs,...f])];return {...e,tasks:{...e.tasks,[r]:m},availableOutputs:R,lastUpdated:new Date().toISOString()}}function Ft(e,t,r,n){let s=e.tasks[r]??at(),a=t.tasks[r];if(a?.retry){let f=s.retryCount+1;if(f<=a.retry.max_attempts){let g={...s,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:g},lastUpdated:new Date().toISOString()}}}let u={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},c=e.availableOutputs;if(a?.on_failure&&a.on_failure.length>0&&(c=[...new Set([...e.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&u.executionCount>=a.circuit_breaker.max_executions){let f=a.circuit_breaker.on_break;c=[...new Set([...c,...f])];}return {...e,tasks:{...e.tasks,[r]:u},availableOutputs:c,lastUpdated:new Date().toISOString()}}function Pt(e,t,r,n){let s=e.tasks[t]??at(),a={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:a},lastUpdated:new Date().toISOString()}}function Dt(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function at(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function it(e,t){let r=`live-${Date.now()}`,n={};for(let a of Object.keys(e.tasks))n[a]=qt();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function Ar(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:Nt(n,t.taskName,r)};case "task-completed":return {config:r,state:$t(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:Ft(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Pt(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Dt(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Nr(n,t.action)};case "task-upsert":return Er(e,t.taskName,t.taskConfig);case "task-removal":return _r(e,t.taskName);case "node-requires-add":return Ir(e,t.nodeName,t.tokens);case "node-requires-remove":return Tr(e,t.nodeName,t.tokens);case "node-provides-add":return Or(e,t.nodeName,t.tokens);case "node-provides-remove":return jr(e,t.nodeName,t.tokens);default:return e}}function Bt(e,t){return t.reduce((r,n)=>Ar(r,n),e)}function Er(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:qt()},lastUpdated:new Date().toISOString()}}}function _r(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...a}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:a,lastUpdated:new Date().toISOString()}}}function Ir(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Ne(n),a=r.filter(u=>!s.includes(u));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...a]}}},state:e.state}}function Tr(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Ne(n),a=s.filter(u=>!r.includes(u));return a.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:a}}},state:e.state}}function Or(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=ge(n),a=r.filter(u=>!s.includes(u));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...a]}}},state:e.state}}function jr(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=ge(n),a=s.filter(u=>!r.includes(u));return a.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:a}}},state:e.state}}function Je(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function ut(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function qt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Nr(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function ze(e){let{config:t,state:r}=e,n=_t(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=$r(n),u=Ot(t,r.tasks),c=new Set([...u,...r.availableOutputs]),f=[],g=[],m=[],R=[];for(let[F,S]of Object.entries(n)){let x=r.tasks[F],b=It(S,t.settings),N=b!=="once";if(x?.status===je.RUNNING||bt(x))continue;let L=Tt(S);if(L!==void 0&&x&&x.executionCount>=L||S.circuit_breaker&&x&&x.executionCount>=S.circuit_breaker.max_executions||!N&&x?.status===je.COMPLETED)continue;if(N&&x?.status===je.COMPLETED){let A=Ne(S),E=false;switch(b){case "data-changed":{A.length>0&&A.some(H=>{for(let[W,oe]of Object.entries(n))if(ge(oe).includes(H)){let se=r.tasks[W];if(!se)continue;let Ce=x.lastConsumedHashes?.[H];return se.lastDataHash==null?se.executionCount>x.lastEpoch:se.lastDataHash!==Ce}return false})||(E=true);break}case "epoch-changed":{A.length>0&&A.some(H=>{for(let[W,oe]of Object.entries(n))if(ge(oe).includes(H)){let se=r.tasks[W];if(se&&se.executionCount>x.lastEpoch)return true}return false})||(E=true);break}case "time-based":{let z=S.refreshInterval??0;if(z<=0){E=true;break}let H=x.completedAt;if(!H){E=true;break}(Date.now()-Date.parse(H))/1e3<z&&(E=true);break}case "manual":E=true;break}if(E)continue}let y=Ne(S);if(y.length===0){f.push(F);continue}let T=[],I=[],U=[];for(let A of y){if(c.has(A))continue;let E=a[A]||[];E.length===0?T.push(A):E.every(H=>bt(r.tasks[H]))?U.push({token:A,failedProducer:E[0]}):I.push(A);}T.length>0?m.push({taskName:F,missingTokens:T}):U.length>0?R.push({taskName:F,failedTokens:U.map(A=>A.token),failedProducers:[...new Set(U.map(A=>A.failedProducer))]}):I.length>0?g.push({taskName:F,waitingOn:I}):f.push(F);}let O={};if(f.length>1){let F=jt(f,n);for(let[S,x]of Object.entries(F))x.length>1&&(O[S]=x);}return {eligible:f,pending:g,unresolved:m,blocked:R,conflicts:O}}function $r(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of ge(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let a of s)t[a]||(t[a]=[]),t[a].includes(r)||t[a].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var We=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function wt(e){let t=vt(e);return Fr(t)}function vt(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(vt).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+vt(t[n])).join(",")+"}"}function Fr(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Pr(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Dr(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let a=0;a<n.length;a++)s[a]=n.charCodeAt(a);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function Lt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Pr(t)}function Br(e){try{let t=JSON.parse(Dr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Gt(e,t,r){let{handlers:n,onNodeRemoved:s,onDrain:a}=t,u=new We,c="state"in e&&"config"in e?e:it(e),f=false,g=new Set,m=new Map(Object.entries(n)),R=new We,O=false,F=false;function S(){if(!f){if(O){F=true;return}O=true;try{do F=!1,x();while(F)}finally{O=false;}}}function x(){let y=R.drain(),T=u.drain(),I=[...y,...T];if(I.length>0&&(c=Bt(c,I),s)){for(let A of I)if(A.type==="task-removal")try{s(A.taskName);}catch(E){console.warn("[reactive] onNodeRemoved failed:",E instanceof Error?E.message:String(E));}}let U=ze(c);I.length>0&&a?.(I,c,U);for(let A of U.eligible)L(A);for(let A of I)if(A.type==="task-progress"){let{taskName:E,update:z}=A;if(!c.config.tasks[E])continue;let W=c.state.tasks[E];if(!W||W.status!=="running")continue;let oe=Lt(E),se=N(E,oe,z).catch(Ce=>{f||(R.append({type:"task-failed",taskName:E,error:Ce.message??String(Ce),timestamp:new Date().toISOString()}),S());}).finally(()=>{g.delete(se);});g.add(se);}}function b(y){let I=c.config.tasks[y].requires??[],U=new Map;for(let[E,z]of Object.entries(c.config.tasks))for(let H of z.provides??[])U.set(H,E);let A={};for(let E of I){let z=U.get(E);z?A[E]=c.state.tasks[z]?.data:A[E]=void 0;}return A}async function N(y,T,I){let U=c.config.tasks[y],A=U.taskHandlers??[],E=b(y);for(let z of A){let H=m.get(z);if(!H)throw new Error(`Handler '${z}' not found in registry (task '${y}')`);let W={nodeId:y,state:E,taskState:c.state.tasks[y],config:U,callbackToken:T,update:I};if(await H(W)==="task-initiate-failure")throw new Error(`Handler '${z}' returned task-initiate-failure (task '${y}')`)}}function L(y){let I=c.config.tasks[y]?.taskHandlers;if(!I||I.length===0)return;R.append({type:"task-started",taskName:y,timestamp:new Date().toISOString()}),S();let U=Lt(y),A=N(y,U).catch(E=>{f||(R.append({type:"task-failed",taskName:y,error:E.message??String(E),timestamp:new Date().toISOString()}),S());}).finally(()=>{g.delete(A);});g.add(A);}return {push(y){f||(y.type==="task-completed"&&y.data&&!y.dataHash&&(y={...y,dataHash:wt(y.data)}),u.append(y),S());},pushAll(y){if(!f){for(let T of y)T.type==="task-completed"&&T.data&&!T.dataHash?u.append({...T,dataHash:wt(T.data)}):u.append(T);S();}},resolveCallback(y,T,I){if(f)return;let U=Br(y);if(!U)return;let{taskName:A}=U;if(c.config.tasks[A]){if(I&&I.length>0)u.append({type:"task-failed",taskName:A,error:I.join("; "),timestamp:new Date().toISOString()});else {let E=T&&Object.keys(T).length>0?wt(T):void 0;u.append({type:"task-completed",taskName:A,data:T,dataHash:E,timestamp:new Date().toISOString()});}S();}},addNode(y,T){f||(u.append({type:"task-upsert",taskName:y,taskConfig:T,timestamp:new Date().toISOString()}),S());},removeNode(y){f||(u.append({type:"task-removal",taskName:y,timestamp:new Date().toISOString()}),S());},addRequires(y,T){f||(u.append({type:"node-requires-add",nodeName:y,tokens:T,timestamp:new Date().toISOString()}),S());},removeRequires(y,T){f||(u.append({type:"node-requires-remove",nodeName:y,tokens:T,timestamp:new Date().toISOString()}),S());},addProvides(y,T){f||(u.append({type:"node-provides-add",nodeName:y,tokens:T,timestamp:new Date().toISOString()}),S());},removeProvides(y,T){f||(u.append({type:"node-provides-remove",nodeName:y,tokens:T,timestamp:new Date().toISOString()}),S());},registerHandler(y,T){m.set(y,T);},unregisterHandler(y){m.delete(y);},retrigger(y){f||c.config.tasks[y]&&(u.append({type:"task-restart",taskName:y,timestamp:new Date().toISOString()}),S());},retriggerAll(y){if(!f){for(let T of y)c.config.tasks[T]&&u.append({type:"task-restart",taskName:T,timestamp:new Date().toISOString()});S();}},snapshot(){return Je(c)},getState(){return c},getSchedule(){return ze(c)},async waitForHandlers(){g.size>0&&await Promise.allSettled([...g]);},async dispose(y){y?.wait&&g.size>0&&await Promise.allSettled([...g]),f=true;}}}var Lr=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-server-runtime.cjs', document.baseURI).href)));Lr("./jsonata-sync.cjs");var Vr=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-server-runtime.cjs', document.baseURI).href))),ct=Vr("./jsonata-sync.cjs"),Ut=ct;function Vt(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function Ht(e,t,r){let n=t.split("."),s=e;for(let a=0;a<n.length-1;a++)(s[n[a]]==null||typeof s[n[a]]!="object")&&(s[n[a]]={}),s=s[n[a]];s[n[n.length-1]]=r;}async function Mr(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let a=await ct(s.expr).evaluate(n);Ht(e.computed_values,s.bindTo,a),n.computed_values=e.computed_values;}catch{}return e}function Ur(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let a of e.compute)try{let u=Ut(a.expr).evaluate(n);Ht(e.computed_values,a.bindTo,u),n.computed_values=e.computed_values;}catch(u){let c=u instanceof Error?u.message:String(u);s.push({bindTo:a.bindTo,error:c});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Hr(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return ct(e).evaluate(n)}function Kr(e,t){return t.startsWith("fetched_sources.")?Vt(e._sourcesData??{},t.slice(16)):Vt(e,t)}var Mt=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Jr=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function zr(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Jr.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof a.ref!="string"||!a.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof a.expr!="string"||!a.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((a,u)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`source_defs[${u}]: must be an object`);else {let c=a;typeof c.bindTo!="string"||!c.bindTo?t.push(`source_defs[${u}]: missing required "bindTo" property`):(n.has(c.bindTo)&&t.push(`source_defs[${u}]: bindTo "${c.bindTo}" is not unique across source_defs`),n.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?t.push(`source_defs[${u}]: missing required "outputFile" property`):(s.has(c.outputFile)&&t.push(`source_defs[${u}]: outputFile "${c.outputFile}" is not unique across source_defs`),s.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${u}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,a)=>{if(!s||typeof s!="object"){t.push(`view.elements[${a}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${a}].kind: required, must be a string`):Mt.has(s.kind)||t.push(`view.elements[${a}].kind: unknown kind "${s.kind}". Valid: ${[...Mt].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${a}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Wr(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[a,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{s[a]=await ct(u).evaluate(r);}catch{s[a]=void 0;}}return {...n,_projections:s}}))}function Yr(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[a,u]of Object.entries(n.projections))if(typeof u=="string"&&u.trim().length>0)try{s[a]=Ut(u).evaluate(r);}catch{s[a]=void 0;}}return {...n,_projections:s}})}var Ye={run:Mr,runSync:Ur,eval:Hr,resolve:Kr,validate:zr,enrichSources:Wr,enrichSourcesSync:Yr};function Kt(e){return JSON.stringify(e)}function Jt(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function dt(e,t){function r(){return e.readIndex()??{}}function n(s,a,u){let c=String(a||"").split(".").filter(Boolean);if(c.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let f={...s},g=f;for(let m=0;m<c.length-1;m++){let R=c[m],O=g[R],F=O&&typeof O=="object"&&!Array.isArray(O)?{...O}:{};g[R]=F,g=F;}return g[c[c.length-1]]=u,f}return {readCard(s){let a=r()[s];return !a||!e.cardExists(a.key)?null:e.readCard(a.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[a,u]of Object.entries(r())){if(!e.cardExists(u.key))continue;let c=e.readCard(u.key);c?s.push(c):t?.(`[card-store] could not read card "${a}" at key "${u.key}"`);}return s},readChecksumIndex(){let s={};for(let[a,u]of Object.entries(r()))s[a]=u.checksum;return s},changedSince(s){let a=r(),u=[];for(let[c,f]of Object.entries(a))s[c]!==f.checksum&&u.push(c);for(let c of Object.keys(s))a[c]||u.push(c);return u},validateUpsert(s,a){let u=r(),c=u[s],f=Object.entries(u).find(([,g])=>g.key===a);return c&&c.key!==a?{ok:false,error:`Card id "${s}" is already mapped to key "${c.key}", cannot remap to "${a}"`}:f&&f[0]!==s?{ok:false,error:`Key "${a}" is already mapped to card id "${f[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,a,u){let c=r(),f=u??c[s]?.key??e.defaultCardKey(s),g=e.writeCard(f,a);c[s]={key:f,checksum:g,updatedAt:new Date().toISOString()},e.writeIndex(c);},patchCard(s,a,u){let c=r(),f=c[s];if(!f||!e.cardExists(f.key))throw new Error(`card "${s}" not found`);let g=e.readCard(f.key);if(!g||typeof g!="object"||Array.isArray(g))throw new Error(`card "${s}" is not patchable`);let m=n(g,a,u),R=e.writeCard(f.key,m);c[s]={key:f.key,checksum:R,updatedAt:new Date().toISOString()},e.writeIndex(c);},removeCard(s){let a=r(),u=a[s];u&&(e.removeCard(u.key),delete a[s],e.writeIndex(a));},readIndex(){return r()}}}function lt(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let a=s.trim();if(!a)return null;try{return JSON.parse(a)}catch{return a}},ingestSourceDataStaged(r,n,s,a){let u=t(s);e.write(`${r}/.staged/${a}/${n}`,u);},commitSourceData(r,n,s){let a=`${r}/.staged/${s}/${n}`,u=e.read(a);return u==null?false:(e.write(`${r}/${n}`,u),e.remove(a),true)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return e.listKeys(`${r}/`).filter(n=>!n.includes("/.staged/")).map(n=>n.slice(`${r}/`.length))}}}function Zt(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(a=>a.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function Qt(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let a of s)try{n(a);}catch(u){let c=u instanceof Error?u.message:String(u);try{t(a,c);}catch{}}e.delete(r);}}}}var ft="v1",Fe="board/graph",er="board/lastJournalProcessedId";function zt(e){return `cards/${e}/runtime`}function tr(e){return {readRuntime(t){return e.read(zt(t))??{_sources:{}}},writeRuntime(t,r){e.write(zt(t),r);}}}function Xr(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function rr(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==ft)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=Xr(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function nr(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Jt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Kt(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){e.write("archive-store-ref",r);},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){e.write("chat-store-ref",r);},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){e.write("artifacts-store-ref",r);}}}function or(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Wt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Zr(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Yt(e,t){return e?.lastRequestedToken?Zr(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Qr(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Xt(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function gt(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),a=ze(t),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},c=new Map;for(let S of a.pending)c.set(S.taskName,S.waitingOn);for(let S of a.unresolved)c.set(S.taskName,S.missingTokens);for(let S of a.blocked)c.set(S.taskName,S.failedTokens);let f=new Map;for(let[S,x]of Object.entries(n))for(let b of x.requires??[]){let N=f.get(b)??[];N.push(S),f.set(b,N);}let g=s.sort().map(S=>{let x=r[S],b=n[S]??{requires:[],provides:[]};x.status==="completed"?u.completed+=1:x.status==="failed"?u.failed+=1:x.status==="in-progress"&&(u.in_progress+=1);let N=b.requires??[],L=b.provides??[],y=Object.keys(x.data??{}).sort(),T=N.filter(H=>t.state.availableOutputs.includes(H)),I=N.filter(H=>!t.state.availableOutputs.includes(H)),U=c.get(S)??I,A=new Set;for(let H of L)for(let W of f.get(H)??[])W!==S&&A.add(W);let E=x.failedAt,z=x.error?{message:x.error,code:"TASK_FAILED",at:E,source:"task-runtime"}:void 0;return {name:S,status:x.status,error:z,requires:N,requires_satisfied:T,requires_missing:I,provides_declared:L,provides_runtime:y,blocked_by:U,unblocks:Array.from(A).sort(),runtime:{attempt_count:x.executionCount??0,restart_count:x.retryCount??0,in_progress_since:x.status==="in-progress"?x.startedAt??null:null,last_transition_at:x.lastUpdated??null,last_completed_at:x.completedAt??null,last_restarted_at:x.startedAt??null,status_age_ms:x.lastUpdated?0:null}}});u.pending=a.pending.length,u.blocked=a.blocked.length,u.unresolved=a.unresolved.length;let m=g.map(S=>({name:S.name,fanOut:S.unblocks.length})).sort((S,x)=>x.fanOut-S.fanOut||S.name.localeCompare(x.name)),R=m.length>0?m[0]:{name:null,fanOut:0},O=new Set;for(let S of Object.values(n))for(let x of S.requires??[])O.add(x);let F=0;for(let[S,x]of Object.entries(n)){let b=(x.requires??[]).length===0,L=(x.provides??[]).some(y=>(f.get(y)??[]).some(T=>T!==S));b&&!L&&(F+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:u.completed,eligible:a.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:F,topology:{edge_count:Array.from(O).length,max_fan_out_card:R.name,max_fan_out:R.fanOut}},cards:g}}function en(){return new Date().toISOString()}function sr(e,t,r,n,s,a,u){return async c=>{let f=[],g=r.cardStore.readCard(c.nodeId);if(!g)return "task-initiate-failure";let m=g.id,R=g.card_data??{},O=g.source_defs??[],F=O.filter(P=>P.optionalForCompletionGating!==true),S=r.cardRuntimeStore.readRuntime(m),x=false,b=()=>{x&&(r.cardRuntimeStore.writeRuntime(m,S),x=false);},N=P=>Wt(S._sources[P]),L=(P,D)=>{S._sources[P]=Wt(D),x=true;},y=c.taskState?.executionCount??0;if(S._lastExecutionCount!==y&&(S._sources={},S._lastExecutionCount=y,x=true),c.update){let P=c.update,D=P.outputFile;if(D){let Y=N(D);if(P.failure){let ae=P.rqt??Y.lastRequestedToken??Y.queueRequestedToken;ae&&L(D,Xt(Y,ae));}else {let ae=P.rqt;if(!Y.lastCompletedToken||ae>Y.lastCompletedToken){let pe=typeof P.deliveryToken=="string"?P.deliveryToken:void 0,ve=false;pe&&(ve=r.fetchedSourcesStore.commitSourceData(m,D,pe)),ve?L(D,Qr(Y,ae)):L(D,Xt(Y,ae));}}b();}}let I={};for(let P of O)if(P.outputFile){let D=r.fetchedSourcesStore.readSourceData(m,P.outputFile);D!==null&&(I[P.bindTo]=D);}let U={};for(let[P,D]of Object.entries(c.state??{}))if(D!==null&&typeof D=="object"&&!Array.isArray(D)){let Y=D[P];U[P]=Y!==void 0?Y:D;}else U[P]=D;let A={id:m,card_data:{...R},requires:U,source_defs:O,compute:g.compute};A._sourcesData=I,g.compute&&Ye.runSync(A,{sourcesData:I}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(m,A.computed_values??{});let E={...g},z=Ye.enrichSourcesSync(Array.isArray(g.source_defs)?g.source_defs:void 0,{card_data:g.card_data,requires:U}),H=e.value;E.source_defs=Array.isArray(z)?z.map(P=>({...P,boardDir:typeof P.boardDir=="string"&&P.boardDir?P.boardDir:H})):z;let W=en(),oe=c.update?void 0:W,se=F.filter(P=>{let D=P.outputFile;if(typeof D!="string"||!D)return true;let Y=N(D);oe&&(Y={...Y,queueRequestedToken:oe},L(D,Y));let ae=Y.queueRequestedToken??Y.lastRequestedToken??W,pe=Yt(Y,ae);return pe==="in-flight"?false:pe==="dispatch"});if(b(),se.length>0){let P=false,D=W;for(let Y of se){let ae=Y.outputFile;if(typeof ae!="string"||!ae)continue;let pe=N(ae),ve=pe.queueRequestedToken??W;L(ae,{...pe,lastRequestedToken:ve}),D=ve,P=true;}return P&&b(),P&&(f.push({taskKind:"source-fetch",payload:{boardRef:be(e),enrichedCard:E,callbackToken:c.callbackToken,rqt:D}}),r.executionRequestStore.appendEntries(t,f)),"task-initiated"}if(F.some(P=>{let D=P.outputFile;if(typeof D!="string"||!D)return false;let Y=N(D),ae=Y.queueRequestedToken??Y.lastRequestedToken??W;return Yt(Y,ae)==="in-flight"}))return "task-initiated";let Pe=g.provides??[],we={};for(let{bindTo:P,ref:D}of Pe)we[P]=Ye.resolve(A,D);return (u??r.outputStore.writeDataObjects.bind(r.outputStore))(we),O.filter(P=>{if(P.optionalForCompletionGating!==true)return false;let D=N(P.outputFile);return !D.lastRequestedToken||!D.lastCompletedToken?true:D.lastCompletedToken<=D.lastRequestedToken}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:be(e),enrichedCard:E,callbackToken:c.callbackToken,rqt:W}}),n(c.nodeId,we),f.length>0&&r.executionRequestStore.appendEntries(t,f),"task-initiated"}}var xt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function ar(e){return {[Fe]:e.graph,[er]:e.lastDrainedJournalId}}function ir(e){let t=e[Fe],r=e[er];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${Fe}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function ur(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function pt(e){function t(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 s(a){if(Array.isArray(a))return a;if(a&&typeof a=="object"){let u=a;return Array.isArray(u.files)?u.files:[a]}return null}return {get(a){try{let u=a.params?.id;if(u){let c=e.readCard(u);return c?t({cards:[c]}):r(`card "${u}" not found`)}return t({cards:e.readAllCards()})}catch(u){return n(u)}},set(a){try{let u=a.body;if(u==null)return r("set requires a body (card object or array of cards)");let c=Array.isArray(u)?u:[u];for(let f of c){if(typeof f.id!="string")return r("each card must have a string `id` field");e.writeCard(f.id,f);}return t({count:c.length})}catch(u){return n(u)}},del(a){try{let u=a.body?.ids??[],c=a.params?.id,f=c?[...u,c]:u;if(f.length===0)return r("del requires body.ids (string[]) or params.id");for(let g of f)e.removeCard(g);return t({count:f.length})}catch(u){return n(u)}},patch(a){try{let u=a.params?.id,c=a.params?.path;if(!u)return r("patch requires params.id");if(!c)return r("patch requires params.path");let f=a.body,g=f&&Object.prototype.hasOwnProperty.call(f,"value")?f.value:a.body;return e.patchCard(u,c,g),t({count:1})}catch(u){return n(u)}},appendFiles(a){try{let u=a.params?.id;if(!u)return r("appendFiles requires params.id");let c=e.readCard(u);if(!c)return r(`card "${u}" not found`);let f=s(a.body);if(!f||f.length===0)return r("appendFiles requires a file metadata object, array, or body.files array");let g=c.card_data&&typeof c.card_data=="object"&&!Array.isArray(c.card_data)?c.card_data:{},m=Array.isArray(g.files)?g.files:[],R=[...m,...f],O=f.map((S,x)=>({idx:m.length+x,entry:S})),F=this.patch({params:{id:u,path:"card_data.files"},body:{value:R}});return F.status!=="success"?F:t({files_added:O})}catch(u){return n(u)}}}}function te(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function X(e){return {status:"fail",error:e}}function re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function tn(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function dr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(s)}function mt(e){try{let t=JSON.parse(dr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function rn(e){return tn(JSON.stringify(e))}function cr(e){try{let t=JSON.parse(dr(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ue(){return new Date().toISOString()}function lr(e,t){let r=t.onWarn??(()=>{}),n=be(e);function s(C){if(C.length!==0)try{let l=t.publishBoardChangeNotifications?.(C);l&&typeof l.catch=="function"&&l.catch(w=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${w instanceof Error?w.message:String(w)}`));}catch(l){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${l instanceof Error?l.message:String(l)}`);}}function a(){let C=c().readCardStoreRef();if(!C)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let l=t.kvStorageForRef(C);return {readIndex(){return l.read("_index")},writeIndex(w){l.write("_index",w);},readCard(w){return l.read(w)},writeCard(w,_){return l.write(w,_),t.hashFn(_)},removeCard(w){l.delete(w);},cardExists(w){return l.read(w)!==null},defaultCardKey(w){return w}}}let u={readValues(C){let l=t.kvStorage("state-snapshot"),w=l.listKeys().sort();if(w.length===0)return {version:null,values:{}};let _={};for(let G of w)_[G]=l.read(G);return {version:t.hashFn(_),values:_}},writeValues(C,l,w){let _=t.kvStorage("state-snapshot");for(let G of w)_.delete(G);for(let[G,K]of Object.entries(l))_.write(G,K);return t.hashFn(l)}},c=()=>nr(t.kvStorage("config")),f=()=>rr(u),g=()=>Zt(t.journalAdapter()),m=()=>dt(a(),r),R=()=>{let C=c().readOutputsStoreRef();if(!C)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return or(t.kvStorageForRef(C))},O=()=>{let C=c().readArchiveStoreRef();return C?t.archiveFactoryForRef(C):t.archiveFactory()};function F(){return !!f().readSnapshot(e.value).values[Fe]}function S(){let C=f().readSnapshot(e.value);if(!C.values[Fe])throw new Error(`Board not initialized at ${e.value}`);return ir(C.values)}function x(C,l){let w=f().commitSnapshot(e.value,{schemaVersion:ft,expectedVersion:l,commitId:t.genId(),committedAt:ue(),deleteKeys:[],shallowMerge:ar(C)});if(!w.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${l??"null"} current=${w.currentVersion??"null"}`)}function b(C){g().appendEvent(C);}async function N(){let C=(v,o)=>{let i=v.payload,p=(i?.enrichedCard??{}).id??i?.cardId??"unknown";b({type:"task-failed",taskName:p,error:o,timestamp:ue()});},l=Qt(t.kvStorage("execution-requests"),C),w=tr(t.kvStorage("card-runtime")),_=lt(t.blobStorage("sources"),v=>t.resolveBlob(v)),G=new Map,K={readRuntime(v){return G.get(v)??w.readRuntime(v)},writeRuntime(v,o){G.set(v,o);}},ie=[],Q=new Map,q={readSourceData(v,o){let i=`${v}/${o}`;return Q.has(i)?Q.get(i):_.readSourceData(v,o)},ingestSourceDataStaged(v,o,i,d){_.ingestSourceDataStaged(v,o,i,d);},commitSourceData(v,o,i){let d=`${v}/.staged/${i}/${o}`,h=t.blobStorage("sources").read(d);if(h==null)return false;let k=`${v}/${o}`,j=h.trim();try{Q.set(k,JSON.parse(j));}catch{Q.set(k,j);}return ie.push({cardId:v,outputFile:o,deliveryToken:i}),true},hasSource(v,o){let i=`${v}/${o}`;return Q.has(i)?true:_.hasSource(v,o)},listSources(v){let o=_.listSources(v),i=new Set;for(let p of Q.keys())p.startsWith(`${v}/`)&&i.add(p.slice(`${v}/`.length));let d=new Set([...o,...i]);return Array.from(d)}},ne={cardStore:m(),cardRuntimeStore:K,fetchedSourcesStore:q,outputStore:R(),executionRequestStore:l},xe=S(),Se=ut(xe.graph),{events:Ae,newCursor:Ee}=g().readEntriesAfterCursor(xe.lastDrainedJournalId),Re=[],$e=[],Te=[],Be=new Map,qe=new Set,Ct=(v,o)=>{Re.push({type:"task-completed",taskName:v,data:o,timestamp:ue()});try{O().stream("exec-history").append({taskName:v,status:"completed",completedAt:ue()});}catch{}},He=(v,o)=>{b({type:"task-failed",taskName:v,error:o,timestamp:ue()});try{O().stream("exec-history").append({taskName:v,status:"failed",error:o,completedAt:ue()});}catch{}},Le=Gt(Se,{handlers:{"card-handler":sr(e,Ee,ne,Ct,He,(v,o)=>{$e.push({cardId:v,values:o});},v=>{Te.push(v);})},onNodeRemoved:v=>{Be.delete(v),G.delete(v),qe.add(v);}});for(Re=Ae;Re.length>0;){let v=Re;Re=[];for(let o of v)if(o.type==="task-restart"){let i=ne.cardStore.readCard(o.taskName);i&&Be.set(o.taskName,i);}Le.pushAll(v),await Le.waitForHandlers();}let et=Le.getState();await Le.dispose({wait:true});let St=f().readSnapshot(e.value).version;x({lastDrainedJournalId:Ee,graph:Je(et)},St);for(let{cardId:v,values:o}of $e)ne.outputStore.writeComputedValues(v,o);for(let v of Te)ne.outputStore.writeDataObjects(v);for(let[v,o]of G)w.writeRuntime(v,o);for(let{cardId:v,outputFile:o,deliveryToken:i}of ie)_.commitSourceData(v,o,i);let Ge;try{Ge=gt(n,et),ne.outputStore.writeStatusSnapshot(Ge);}catch(v){r(`[board-live-cards-public] status publish failed: ${v instanceof Error?v.message:String(v)}`);}let _e=[];for(let{cardId:v,values:o}of $e)_e.push({kind:"computed_values",cardId:v,values:o});for(let v of Te)for(let[o,i]of Object.entries(v))o&&_e.push({kind:"data_object",key:o,payload:i});for(let[v,o]of Be)_e.push({kind:"card_refreshed",cardId:v,card:o});for(let v of qe)_e.push({kind:"card_removed",cardId:v});Ge!==void 0&&_e.push({kind:"status",status:Ge}),s(_e);let Rt=c().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:be({kind:"built-in",value:"source-cli-task-executor"})};l.dispatchEntriesForJournalId(Ee,v=>{if(v.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${v.taskKind}" \u2014 skipping`);return}let o=v.payload,i=o.enrichedCard?.id??"unknown",d=o.enrichedCard?.source_defs??[];for(let p of d){if(!p.outputFile){r(`[dispatch] source "${p.bindTo}" has no outputFile \u2014 skipping`);continue}let h=rn({cbk:o.callbackToken,rg:e.value,br:be(e),cid:i,b:p.bindTo,d:p.outputFile,cs:void 0,rqt:o.rqt});t.dispatchExecution(Rt,{source_def:p,base_ref:be(e),callback:{token:h,via:t.selfRef}}).catch(k=>He(i,k instanceof Error?k.message:String(k)));}});}async function L(){try{let C=()=>{let w=S(),{events:_}=g().readEntriesAfterCursor(w.lastDrainedJournalId);_.length<=0||(L(),t.requestProcessAccumulated?.());},l=await Et(t.lock,N,C);return te({ran:l!==!1})}catch(C){return re(C)}}function y(){L(),t.requestProcessAccumulated?.();}function T(C){try{let l=C.params?.cardStoreRef;if(!l)return X("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!F()){let ne=it(xt);x({lastDrainedJournalId:"",graph:Je(ne)},null);}let w=C.params?.outputsStoreRef;if(!w)return X("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let _=C.params?.scratchStoreRef,G=C.params?.archiveStoreRef,K=C.params?.chatStoreRef,ie=C.params?.artifactsStoreRef,Q=c();Q.writeCardStoreRef(l),Q.writeOutputsStoreRef(w),_&&Q.writeScratchStoreRef(_),G&&Q.writeArchiveStoreRef(G),K&&Q.writeChatStoreRef(K),ie&&Q.writeArtifactsStoreRef(ie);let q=C.body??{};q["task-executor-ref"]&&Q.writeTaskExecutorRef(q["task-executor-ref"]),Object.prototype.hasOwnProperty.call(q,"chat-handler-flow")&&Q.writeChatHandlerFlow(q["chat-handler-flow"]);try{R().writeStatusSnapshot(gt(n,ut(S().graph)));}catch{}return te()}catch(l){return re(l)}}function I(C){try{let l=R().readStatusSnapshot();if(!l){l=gt(n,ut(S().graph));try{R().writeStatusSnapshot(l);}catch{}}return te(l)}catch(l){return re(l)}}function U(C){try{let l=C.params?.id;return l?(b({type:"task-removal",taskName:l,timestamp:ue()}),y(),te()):X("removeCard requires params.id")}catch(l){return re(l)}}function A(C){try{let l=C.params?.cardId;if(!l)return X("addCardFiles requires params.cardId");let w=pt(m()).appendFiles({params:{id:l},body:C.body});if(w.status!=="success")return w;let _=E({params:{cardId:l}});return _.status!=="success"?_:te({cardId:l,files_added:w.data.files_added,notified:!0})}catch(l){return re(l)}}function E(C){try{let l=C.params?.cardId;if(!l)return X("cardRefreshedNotify requires params.cardId");let w=m().readCard(l);return w?(s([{kind:"card_refreshed",cardId:l,card:w}]),te({cardId:l,notified:!0})):X(`Card "${l}" not found in board at ${e.value}`)}catch(l){return re(l)}}function z(C){try{let l=C.params?.id;return l?(b({type:"task-restart",taskName:l,timestamp:ue()}),y(),te()):X("retrigger requires params.id")}catch(l){return re(l)}}async function H(C){return L()}function W(C){try{let l=C.params?.cardId,w=C.params?.all,_=!!C.params?.restart;if(!l&&!w)return X("upsertCard requires --card-id <id> or --all");let G=w?m().readAllCards().map(K=>K.id):[l];for(let K of G)if(!m().readCard(K))return X(`Card "${K}" not found in board at ${e.value}`);for(let K of G){let ie=m().readCard(K),Q=ur(ie),q=t.hashFn(Q),ne=t.kvStorage("card-upsert"),xe=ne.read(K),Se=xe?.taskConfigHash!==q;if(!(!Se&&!_)){if(Se){let Ae=xe?.blobRef??m().readCardKey(K)??K;b({type:"task-upsert",taskName:K,taskConfig:Q,timestamp:ue()}),ne.write(K,{blobRef:Ae,taskConfigHash:q,updatedAt:ue()});}_&&b({type:"task-restart",taskName:K,timestamp:ue()});}}return y(),te()}catch(l){return re(l)}}function oe(C){try{let l=C.params?.token;if(!l)return X("taskFailed requires params.token");let w=C.params?.error??"unknown error",_=mt(l);if(!_)return X("Invalid callback token");b({type:"task-failed",taskName:_.taskName,error:w,timestamp:ue()});try{O().stream("exec-history").append({taskName:_.taskName,status:"failed",error:w,completedAt:ue()});}catch{}return y(),te()}catch(l){return re(l)}}function se(C){try{let l=C.params?.token;if(!l)return X("taskProgress requires params.token");let _=(C.body??{}).update??{},G=mt(l);return G?(b({type:"task-progress",taskName:G.taskName,update:_,timestamp:ue()}),y(),te()):X("Invalid callback token")}catch(l){return re(l)}}function Ce(C){try{let l=C.params?.token,w=C.params?.ref;if(!l)return X("sourceDataFetched requires params.token");if(!w)return X("sourceDataFetched requires params.ref");let _=cr(l);if(!_)return X("Invalid source token");let{cbk:G,cid:K,b:ie,d:Q,cs:q,rqt:ne}=_,xe=lt(t.blobStorage("sources"),Re=>t.resolveBlob(Re)),Se=t.genId();xe.ingestSourceDataStaged(K,Q,At(w),Se);let Ae=mt(G);if(!Ae)return X("Invalid callback token embedded in source token");let Ee=ue();return b({type:"task-progress",taskName:Ae.taskName,update:{bindTo:ie,outputFile:Q,fetchedAt:Ee,deliveryToken:Se,sourceChecksum:q,rqt:ne},timestamp:Ee}),y(),te()}catch(l){return re(l)}}function Pe(C){try{let l=C.params?.token,w=C.params?.reason??"unknown";if(!l)return X("sourceDataFetchFailure requires params.token");let _=cr(l);if(!_)return X("Invalid source token");let{cbk:G,b:K,d:ie,cs:Q,rqt:q}=_,ne=mt(G);return ne?(b({type:"task-progress",taskName:ne.taskName,update:{bindTo:K,outputFile:ie,failure:!0,reason:w,sourceChecksum:Q,rqt:q},timestamp:ue()}),y(),te()):X("Invalid callback token embedded in source token")}catch(l){return re(l)}}function we(C){try{let l=c().readCardStoreRef();return l?te({storeRef:l}):X(`Board at ${e.value} has no card store configured`)}catch(l){return re(l)}}function le(C){try{let l=c().readOutputsStoreRef();return l?te({storeRef:l}):X(`Board at ${e.value} has no outputs store configured`)}catch(l){return re(l)}}function P(C){try{let l=c().readScratchStoreRef();return te({storeRef:l})}catch(l){return re(l)}}function D(C){try{let l=c().readArchiveStoreRef();return te({storeRef:l})}catch(l){return re(l)}}function Y(C){try{let l=c().readChatStoreRef();return te({storeRef:l})}catch(l){return re(l)}}function ae(C){try{let l=c().readArtifactsStoreRef();return te({storeRef:l})}catch(l){return re(l)}}function pe(C){try{let l=C.params?.key;if(!l)return X("getConfig requires params.key");let w=c(),_;switch(l){case "task-executor":_=w.readTaskExecutorRef()??null;break;case "chat-handler-flow":_=w.readChatHandlerFlow()??null;break;case "card-store-ref":_=w.readCardStoreRef();break;case "outputs-store-ref":_=w.readOutputsStoreRef();break;case "scratch-store-ref":_=w.readScratchStoreRef();break;case "archive-store-ref":_=w.readArchiveStoreRef();break;case "chat-store-ref":_=w.readChatStoreRef();break;case "artifacts-store-ref":_=w.readArtifactsStoreRef();break;default:return X(`getConfig: unknown key "${l}"`)}return te({value:_})}catch(l){return re(l)}}function ve(C){try{let l=C.params?.key;if(!l)return X("getOutputsDataObject requires params.key");let w=R().readDataObject(l);return te(w)}catch(l){return re(l)}}function De(C){try{return te(R().readAllDataObjects())}catch(l){return re(l)}}function Me(C){try{let l=C.params?.key;if(!l)return X("getOutputsComputedValues requires params.key");let w=R().readComputedValues(l);return te(w)}catch(l){return re(l)}}function ht(C){try{return te(R().readAllComputedValues())}catch(l){return re(l)}}function Ue(){return lt(t.blobStorage("sources"),C=>t.resolveBlob(C))}function Xe(C){let l=t.blobStorage("sources").keyRef?.(C);return l?be(l):C}function yt(C){try{let l=C.params?.key;if(!l)return X("getOutputsFetchedSources requires params.key");let w=Ue().listSources(l),_={};for(let G of w)_[G]=Xe(`${l}/${G}`);return te(_)}catch(l){return re(l)}}function kt(C){try{let l=Ue(),w=new Set;for(let G of t.blobStorage("sources").listKeys()){let K=G.indexOf("/");K>0&&!G.includes("/.staged/")&&w.add(G.slice(0,K));}let _={};for(let G of w){let K=l.listSources(G);if(K.length>0){_[G]={};for(let ie of K)_[G][ie]=Xe(`${G}/${ie}`);}}return te(_)}catch(l){return re(l)}}return {init:T,status:I,getCardStoreRef:we,getOutputsStoreRef:le,getScratchStoreRef:P,getArchiveStoreRef:D,getChatStoreRef:Y,getArtifactsStoreRef:ae,getConfig:pe,getOutputsDataObject:ve,getAllOutputsDataObjects:De,getOutputsComputedValues:Me,getAllOutputsComputedValues:ht,getOutputsFetchedSources:yt,getAllOutputsFetchedSources:kt,removeCard:U,addCardFiles:A,cardRefreshedNotify:E,retrigger:z,processAccumulatedEvents:H,upsertCard:W,taskFailed:oe,taskProgress:se,sourceDataFetched:Ce,sourceDataFetchFailure:Pe}}function fr(){return new Date().toISOString()}function gr(e){return new TextEncoder().encode(e).byteLength}function nn(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function on(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function sn(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function an(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function un(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function cn(e){let t=sn(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function dn(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function pr(e){function t(r){let n=e.stat?nn(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let s=e.read(r);return s===null?{key:r}:{key:r,size:gr(s)}}return {exists(r){return e.exists(r)},putText(r,n,s="text/plain; charset=utf-8"){e.write(r,n);let a=t(r)??{key:r};return a.contentType=s,a.updatedAt=a.updatedAt??fr(),a.size=a.size??gr(n),a},putBytes(r,n,s="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let u=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,u);}let a=t(r)??{key:r};return a.contentType=s,a.updatedAt=a.updatedAt??fr(),a.size=a.size??n.byteLength,a},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let s=e.readBytes(r);return s===null?null:Buffer.from(s).toString("utf-8")}try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new TextDecoder("utf-8").decode(new Uint8Array(s.data))}catch{}return n},getBytes(r){if(e.readBytes){let s=e.readBytes(r);if(s!==null)return s}let n=e.read(r);if(n===null)return null;try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new Uint8Array(s.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,s)=>n.key.localeCompare(s.key))},remove(r){e.remove(r);}}}function mr(e){function t(s,a){let u=0,c=[];Array.isArray(a)&&c.push(...a);for(let f of e.list(`${s}/`))c.push(dn(f.key));for(let f of c){let g=on(f);Number.isFinite(g)&&g>u&&(u=g);}return u+1}function r(s,a,u){let c=Number(u?.maxLen||32),{stem:f,ext:g}=cn(s),m=un(g),R=an(f),O=`${String(a).padStart(3,"0")}-`,F=m,S=c-O.length-F.length;S<1&&(F="",S=c-O.length);let x=R.slice(0,Math.max(1,S)),b=`${O}${x}${F}`;return b.length>c&&(b=b.slice(0,c).replace(/\.$/,"")),b}function n(s,a,u){let c=t(s,u?.seedNames),f=r(a,c,{maxLen:u?.maxLen});for(;e.exists(`${s}/${f}`);)c+=1,f=r(a,c,{maxLen:u?.maxLen});return f}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function hr(){function e(s,a){if(!Array.isArray(s))return [];let u=[];for(let c of s){if(!c||typeof c!="object")continue;let f=c;typeof f.stored_name=="string"&&u.push({name:typeof f.name=="string"?f.name:f.stored_name,stored_name:f.stored_name,size:typeof f.size=="number"&&Number.isFinite(f.size)?f.size:null,mime_type:typeof f.mime_type=="string"?f.mime_type:null,uploaded_at:typeof f.uploaded_at=="string"?f.uploaded_at:a||null,chat:f.chat===true});}return u}function t(s){return !s||typeof s!="object"?[]:e(s.files,void 0)}function r(s,a){let u=t(s);if(a.length===0)return s.files=u,u;let c=new Set(u.map(f=>f.stored_name));for(let f of a)c.has(f.stored_name)||(u.push(f),c.add(f.stored_name));return s.files=u,u}function n(s,a,u){let c=t(s);if(!Number.isInteger(a)||a<0||a>=c.length)return {ok:false,reason:"index_out_of_range"};let f=c[a];return !f||!f.stored_name?{ok:false,reason:"missing_stored_name"}:u&&u!==f.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:f}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function ln(){let e=globalThis.crypto;return typeof e?.randomUUID=="function"?String(e.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function yr(){let e=new Map,t=new Map;function r(n){return e.has(n)||e.set(n,[]),e.get(n)}return {append(n,s,a,u=[]){let c={id:ln(),role:s,text:a,files:u,updated_at:new Date().toISOString()};return r(n).push(c),c.id},readAll(n){return r(n).slice()},readAfter(n,s){let a=r(n);if(!s)return {records:a.slice(),cursor:a.length>0?a[a.length-1].id:null};let u=a.findIndex(f=>f.id===s),c=u===-1?a.slice():a.slice(u+1);return {records:c,cursor:c.length>0?c[c.length-1].id:s}},clear(n){e.set(n,[]);},setProcessing(n,s){s?t.set(`p:${n}`,true):t.delete(`p:${n}`);},isProcessing(n){return t.get(`p:${n}`)===true},getConfig(n){return t.get(`c:${n}`)??{}},setConfig(n,s){let a=t.get(`c:${n}`)??{};t.set(`c:${n}`,{...a,...s});}}}function kr(e){function t(g){let m=typeof g=="number"?g:Number(g);return Number.isInteger(m)&&m>0?m:null}function r(g,m){let R=m;for(let O=g.length-1;O>=0;O-=1)if(g[O]?.role==="user"&&(R-=1,R===0))return g.slice(O);return g}function n(g){return {status:"success",data:g}}function s(g){return {status:"fail",error:g}}function a(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}function u(g,m="command envelope"){let R=typeof g.cardId=="string"?g.cardId:void 0;if(!g.command)return s(`chat-store: ${m} missing "command"`);if(!R)return s(`chat-store: ${m} missing "cardId"`);if(g.command==="append")return f.append({params:{cardId:R},body:{role:g.role,text:g.text,files:g.files}});if(g.command==="read-all")return f.readAll({params:{cardId:R},body:{lastUserTurns:g.lastUserTurns}});if(g.command==="read-after")return f.readAfter({params:{cardId:R},body:{cursor:g.cursor??null}});if(g.command==="clear")return f.clear({params:{cardId:R}});if(g.command==="set-processing")return f.setProcessing({params:{cardId:R},body:{active:g.active}});if(g.command==="is-processing")return f.isProcessing({params:{cardId:R}});if(g.command==="get-config")return f.getConfig({params:{cardId:R}});if(g.command==="set-config"){let{command:O,cardId:F,...S}=g;return f.setConfig({params:{cardId:R},body:S})}return s(`chat-store: unknown command "${String(g.command)}"`)}function c(g){if(!Array.isArray(g.commands)||g.commands.length===0)return s('chat-store: command envelope must include a non-empty "commands" array');let m=[];for(let R=0;R<g.commands.length;R+=1){let O=g.commands[R];if(!O||typeof O!="object"||Array.isArray(O))return s(`chat-store: command envelope entry ${R} must be an object`);let F={cardId:g.cardId,...O},S=u(F,`command envelope entry ${R}`);if(S.status!=="success")return S;m.push({index:R,command:String(F.command),data:S.data});}return n({results:m})}let f={append(g){try{let m=g.params?.cardId;if(!m)return s("append requires params.cardId");let R=g.body??{},O=typeof R.role=="string"?R.role:"",F=typeof R.text=="string"?R.text:"",S=Array.isArray(R.files)?R.files:[];if(!O)return s("append requires body.role");let x=e.append(m,O,F,S);return n({id:x})}catch(m){return a(m)}},readAll(g){try{let m=g.params?.cardId;if(!m)return s("readAll requires params.cardId");let R=g.body??{},O=e.readAll(m);if(R.lastUserTurns===void 0)return n({records:O});let F=t(R.lastUserTurns);return F===null?s("readAll requires body.lastUserTurns (positive integer)"):n({records:r(O,F)})}catch(m){return a(m)}},readAfter(g){try{let m=g.params?.cardId;if(!m)return s("readAfter requires params.cardId");let O=(g.body??{}).cursor??null;return n(e.readAfter(m,O))}catch(m){return a(m)}},clear(g){try{let m=g.params?.cardId;return m?(e.clear(m),n({ok:!0})):s("clear requires params.cardId")}catch(m){return a(m)}},setProcessing(g){try{let m=g.params?.cardId;if(!m)return s("setProcessing requires params.cardId");let R=g.body??{};return typeof R.active!="boolean"?s("setProcessing requires body.active (boolean)"):(e.setProcessing(m,R.active),n({ok:!0}))}catch(m){return a(m)}},isProcessing(g){try{let m=g.params?.cardId;return m?n({active:e.isProcessing(m)}):s("isProcessing requires params.cardId")}catch(m){return a(m)}},getConfig(g){try{let m=g.params?.cardId;return m?n({config:e.getConfig(m)}):s("getConfig requires params.cardId")}catch(m){return a(m)}},setConfig(g){try{let m=g.params?.cardId;if(!m)return s("setConfig requires params.cardId");let R=g.body??{};return e.setConfig(m,R),n({ok:!0})}catch(m){return a(m)}},run:u,runBatch:c};return f}var Cr={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},fn=32;function gn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Sr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function Rr(e,t){if(!t||typeof t!="object")return;let r=t;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)Rr(e,n);return}r.kind==="status"&&Sr(r.status)&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card),r.kind==="card_removed"&&r.cardId&&(delete e.cards[r.cardId],delete e.computedValues[r.cardId]);}function yo(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...Cr,...e.corsHeaders||{}},n=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},a=e.invocationAdapter,u=e.chatFlowRunner||null,c=e.chatStorage??yr(),f=kr(c),g=e.notificationTransport||null,m=e.serverUrl||null,R=e.executionExtra||{},O=e.onSseClientConnected,F=e.onSseClientDisconnected,S=e.onChannelSubscribed,x=e.onChannelUnsubscribed,b=new Map,N=new Map,L=new Map,y=null;function T(o){let i=lr(o.baseRef,o.boardAdapter),d=o.boardAdapter.kvStorageForRef(o.cardStoreRef),h=pt(dt({readIndex:()=>d.read("_index"),writeIndex:$=>d.write("_index",$),readCard:$=>d.read($),writeCard:($,J)=>(d.write($,J),$),cardExists:$=>d.read($)!==null,defaultCardKey:$=>$},s.warn)),k=o.artifactsAdapter||o.boardAdapter,j=o.filesArtifactsStore??null,B=null;return {label:o.label,board:i,cardStore:h,get filesArtifacts(){return B??=j??pr(k.blobStorage("files"))},boardAdapter:o.boardAdapter,cardStoreRef:o.cardStoreRef,outputsStoreRef:o.outputsStoreRef,scratchStoreRef:o.scratchStoreRef,archiveStoreRef:o.archiveStoreRef,notifyRef:o.notifyRef,taskExecutorRef:o.taskExecutorRef,chatHandlerRef:o.chatHandlerRef,chatHandlerFlow:o.chatHandlerFlow,inferenceAdapterRef:o.inferenceAdapterRef,notification:gn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let I=e.boards.map(T),U=new Map;function A(o){return U.get(o)??0}function E(o){let i=I[A(o)];return {files:i?i.filesArtifacts:null}}function z(o){let i=E(o);return i.files?mr(i.files):null}function H(){return hr()}function W(o){return String(o||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function oe(o){if(!o||o.notificationTeardown||!g||!o.notifyRef)return;let i=await g.subscribe(o.notifyRef,d=>{Rr(o.notification,d);let p=d.kind==="notification-batch"?d.notifications:[d];_e(p);});o.notificationTeardown=i;}async function se(o){if(!o||o.initialized)return;let i={cardStoreRef:o.cardStoreRef,outputsStoreRef:o.outputsStoreRef};o.scratchStoreRef&&(i.scratchStoreRef=o.scratchStoreRef),o.archiveStoreRef&&(i.archiveStoreRef=o.archiveStoreRef);let d={};o.taskExecutorRef&&(d["task-executor-ref"]=o.taskExecutorRef),o.chatHandlerFlow!==void 0&&(d["chat-handler-flow"]=o.chatHandlerFlow),o.inferenceAdapterRef&&(d["inference-adapter-ref"]=o.inferenceAdapterRef);let p=o.board.init({params:i,body:d});if(p.status!=="success")throw Object.assign(new Error(p.error||`init failed for ${o.label}`),{statusCode:500});if(await oe(o),!o.chatHandlerFlow&&o.chatHandlerRef&&a.describe)try{let h=await a.describe(o.chatHandlerRef);h&&h.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${h.kind}", expected "chat-handler" for ${o.label}`):h&&s.info(`[init] chat-handler validated: ${h.name} (protocol ${h.protocolVersion}) for ${o.label}`);}catch(h){s.warn(`[init] chat-handler describe failed for ${o.label}: ${h?.message||String(h)}`);}o.initialized=true;}function Ce(o){if(!o.boardAdapter.publishBoardChangeNotifications)return;let i=[],d=o.board.status({});d.status==="success"&&d.data!=null&&Sr(d.data)&&i.push({kind:"status",status:d.data});let p=o.board.getAllOutputsDataObjects({});if(p.status==="success"&&p.data!=null)for(let[k,j]of Object.entries(p.data))k&&i.push({kind:"data_object",key:k,payload:j});let h=o.board.getAllOutputsComputedValues({});if(h.status==="success"&&h.data!=null)for(let[k,j]of Object.entries(h.data))k&&i.push({kind:"computed_values",cardId:k,values:j});i.length>0&&o.boardAdapter.publishBoardChangeNotifications(i);}function Pe(o,i){if(!o||o.cardsBootstrapped)return;let d=o.cardStore.get({}),p=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let h of p)typeof h.id=="string"&&(U.set(h.id,i),o.board.upsertCard({params:{cardId:h.id}}));o.cardsBootstrapped=true;}async function we(){for(let o of I)await se(o);}async function le(){await we();for(let o=0;o<I.length;o++)Ce(I[o]),Pe(I[o],o);}function P(o){return I[A(o)]??null}function D(o){let i=P(o);if(!i)return null;let d=i.cardStore.get({params:{id:o}});if(d.status!=="success")return null;let p=Array.isArray(d.data?.cards)?d.data.cards:[];return p.length>0?p[0]:null}function Y(){let o=d=>{if(!d||!d.cardStore)return [];let p=d.cardStore.get({});return p.status!=="success"||!Array.isArray(p.data?.cards)?[]:p.data.cards},i=[];for(let d of I)i.push(...o(d));return i}function ae(){let o=I.map(k=>{try{let B=k.boardAdapter.kvStorageForRef(k.outputsStoreRef).read("status");if(B!=null)return B}catch{}return k.notification.status}).filter(Boolean);if(o.length===0)return null;if(o.length===1)return o[0];let i=[],d=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],p={};for(let k of d)p[k]=0;for(let k of o){let j=k,B=Array.isArray(j.cards)?j.cards:[];i.push(...B);for(let $ of d)p[$]+=Number(j?.summary?.[$]||0);}let h=o[0];return {...h,cards:i,summary:{...h.summary||{},card_count:i.length,...p}}}function pe(){let o={},i=d=>{for(let[p,h]of Object.entries(d.notification.computedValues)){let k=d.notification.cards[p];o[p]={schema_version:"v1",card_id:p,card_data:k?.card_data??{},computed_values:h??{}};}};for(let d of I)i(d);return o}function ve(){let o={};for(let i of I)Object.assign(o,i.notification.dataObjects||{});return o}function De(){let o=Y(),i=pe(),d=ve(),p={};for(let k of o){if(!k?.id)continue;let j=k.id,B=i[j]||{},$={...B.card_data&&typeof B.card_data=="object"?B.card_data:k.card_data&&typeof k.card_data=="object"?k.card_data:{}};p[j]={schema_version:B.schema_version||"v1",card_id:B.card_id||j,card_data:$,computed_values:B.computed_values&&typeof B.computed_values=="object"?B.computed_values:{}};}let h={};for(let k of o){if(!k?.id)continue;let j=k.id;try{let B=w(j),$=c.isProcessing(j);(B.length>0||$)&&(h[j]={messages:B.map(J=>({role:String(J.role||"system"),text:String(J.text||""),files:Array.isArray(J.files)?J.files:[]})),receiving:!1,processing:$});}catch{}}return {boardId:n,cardDefinitions:o,statusSnapshot:ae(),dataObjectsByToken:d,cardRuntimeById:p,cardChatsByCardId:h}}function Me(o,i,d){let p=d?.syncBoard!==false,h=d?.restartOnlyIfChanged===true,k=P(o);if(!k)throw Object.assign(new Error(`Card not found: ${o}`),{statusCode:404});let j=D(o);if(!j)throw Object.assign(new Error(`Card not found: ${o}`),{statusCode:404});let B=h?JSON.stringify(j):null,$=i(j)||j;if(h&&JSON.stringify($)===B)return;let J=k.cardStore.set({body:$});if(J.status!=="success")throw Object.assign(new Error(J.error||`Failed to persist card: ${o}`),{statusCode:500});if(p){let Z=k.board.upsertCard({params:{cardId:o,restart:true}});if(Z.status!=="success")throw Object.assign(new Error(Z.error||`Failed to upsert card: ${o}`),{statusCode:500})}}function ht(o,i){Me(o,i,{syncBoard:true});}function Ue(o,i){Me(o,i,{syncBoard:false});}function Xe(o){let i=P(o);if(!i)throw Object.assign(new Error(`Card not found: ${o}`),{statusCode:404});if(!D(o))throw Object.assign(new Error(`Card not found: ${o}`),{statusCode:404});let p=i.board.upsertCard({params:{cardId:o,restart:true}});if(p.status!=="success")throw Object.assign(new Error(p.error||`Failed to retrigger card: ${o}`),{statusCode:500})}function yt(o,i){Me(o,d=>{if(!i||typeof i!="object"||Object.keys(i).length===0)return d;function p(h,k,j){let B=String(k||"").split(".").filter(Boolean);if(!B.length)return;let $=h;for(let J=0;J<B.length-1;J++){let Z=B[J];(!$[Z]||typeof $[Z]!="object")&&($[Z]={}),$=$[Z];}$[B[B.length-1]]=j;}if(i.fieldValues!==void 0&&i.fieldValues!==null){let h=null,k=d.view;if(k&&Array.isArray(k.elements)){for(let j of k.elements)if(j?.data&&j.data.writeTo){h=j.data.writeTo;break}}h?p(d,h,i.fieldValues):typeof i.fieldValues=="object"&&!Array.isArray(i.fieldValues)&&(d.card_data={...d.card_data||{},...i.fieldValues});}else {if(Array.isArray(i._stagedFiles)&&i._stagedFiles.length>0)return d;for(let[h,k]of Object.entries(i))h!=="_stagedFiles"&&(k!==null&&typeof k=="object"&&!Array.isArray(k)&&d[h]!==null&&typeof d[h]=="object"&&!Array.isArray(d[h])?d[h]={...d[h],...k}:d[h]=k);}return d},{syncBoard:true,restartOnlyIfChanged:true});}function kt(o){let i=String(o||"").trim();if(!i)return "upload.bin";let d=Math.max(i.lastIndexOf("/"),i.lastIndexOf("\\"));return (d>=0?i.slice(d+1):i)||"upload.bin"}function C(o){c.clear(o),c.setProcessing(o,false);}function l(o,i,d,p){let h=typeof d=="string"?d.trim():"";return c.append(o,i,h,p)}function w(o){return c.readAll(o)}function _(o){let i=[];try{let d=D(o);if(!d)return i;let p=H().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let h of p)i.push(h.stored_name);}catch{}return i}function G(o,i,d,p){let h=W(o),k=E(o),j=kt(i),B=z(o),$=B?B.allocateStoredName(h,j,{seedNames:_(o),maxLen:fn}):`${String(Date.now())}-${j}`;return k.files&&k.files.putBytes(`${h}/${$}`,new Uint8Array(p),d||"application/octet-stream"),{name:j,stored_name:$,size:p.length,mime_type:d||"application/octet-stream",uploaded_at:new Date().toISOString()}}function K(o){let i=P(o);if(!i)return null;let d=i.board.getConfig({params:{key:"chat-handler-flow"}}),p=d.status==="success"?d.data?.value:null,h=i.chatHandlerRef;return p==null&&(!h||typeof h!="object")?null:{ctx:i,handlerFlow:p,handlerRef:h}}function ie(o,i,d=false){let p=K(o);if(!p)return;let{ctx:h,handlerFlow:k,handlerRef:j}=p;if(!d)try{c.setProcessing(o,!0);}catch{}let B={boardId:n,cardId:String(o),lastChatEntryId:i,...R,...m?{serverUrl:m}:{}};if(!u&&k!=null){try{c.setProcessing(o,!1);}catch{}s.warn(`[chat-handler-flow] configured for card "${o}" but no chatFlowRunner was provided`);return}if(k!=null){let J=u;if(!J)return;J.run(k,B,{boardId:n,cardId:String(o),label:h.label,logger:s,serverUrl:m,executionExtra:R}).then(Z=>{if(Z.dispatched)s.info(`[chat-handler-flow] invoked for card "${o}" (boardId: "${n}")`);else {try{c.setProcessing(o,!1);}catch{}s.warn(`[chat-handler-flow] dispatch failed for card "${o}": ${Z.error||"unknown"}`);}},Z=>{try{c.setProcessing(o,!1);}catch{}s.warn(`[chat-handler-flow] invoke failed for card "${o}": ${Z?.message||String(Z)}`);});return}let $=j;$&&a.invoke($,B).then(J=>{if(J.dispatched)s.info(`[chat-handler] invoked for card "${o}" (boardId: "${n}")`);else {try{c.setProcessing(o,!1);}catch{}s.warn(`[chat-handler] dispatch failed for card "${o}": ${J.error||"unknown"}`);}},J=>{try{c.setProcessing(o,!1);}catch{}s.warn(`[chat-handler] invoke failed for card "${o}": ${J?.message||String(J)}`);});}function Q(o,i,d){let p=i==="chat-send"?Ue:ht,h;p(o,k=>{let j=new Date().toISOString(),B=k.card_data&&typeof k.card_data=="object"?k.card_data:{};if(k.card_data=B,i==="chat-send"){let $=d&&typeof d.text=="string"?d.text.trim():"",J=[];if(Array.isArray(d?.files)){for(let Z of d.files)if(Z){if(typeof Z=="string"){J.push({name:Z});continue}if(typeof Z=="object"){let fe=Z;typeof fe.name=="string"&&J.push({name:fe.name,size:fe.size,mime_type:fe.mime_type,uploaded_at:fe.uploaded_at,stored_name:fe.stored_name,chat:fe.chat===true});}}}if($||J.length>0){let Z=f.runBatch({cardId:o,commands:[{command:"append",role:"user",text:$,files:J},{command:"set-processing",active:true}]});if(Z.status!=="success")throw new Error(Z.error);let fe=Z.data.results[0]?.data?.id;if(typeof fe!="string"||!fe)throw new Error(`chat-send did not return an append id for card ${o}`);h={cardId:o,lastEntryId:fe,processingAlreadySet:true};try{let rt=w(o);_e([{kind:"card_chats",cardId:o,messages:rt.map(Oe=>({role:String(Oe.role||"system"),text:String(Oe.text||""),files:Array.isArray(Oe.files)?Oe.files:[]})),receiving:!0,processing:c.isProcessing(o)}]);}catch{}}return k}if(i==="file-upload"){let $=H().normalizeIncoming(d?.files,j);return $.length>0&&H().merge(B,$),k}if(i==="action"){let $=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!$)return k;B.lastAction={buttonId:$,at:j},B.lastActionText=`${$} @ ${j}`;}return k}),h&&ie(h.cardId,h.lastEntryId,h.processingAlreadySet);}function q(o,i,d){let p=JSON.stringify(d),h=typeof Buffer<"u"?Buffer.byteLength(p):new TextEncoder().encode(p).length;o.writeHead(i,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":h}),o.end(p);}async function ne(o){let i=[];for await(let p of o)i.push(p);let d=typeof Buffer<"u"?Buffer.concat(i).toString("utf-8").trim():new TextDecoder().decode(Se(i)).trim();return d?JSON.parse(d):{}}async function xe(o){let i=[];for await(let d of o)i.push(d);return typeof Buffer<"u"?Buffer.concat(i):Se(i)}function Se(o){let i=o.reduce((h,k)=>h+k.length,0),d=new Uint8Array(i),p=0;for(let h of o)d.set(h,p),p+=h.length;return d}let Ae=0;function Ee(o){let i=JSON.stringify(o);return Ae++,`id: ${Ae}
2
+ data: ${i}
3
3
 
4
- `}function Mt(s){let u=s;try{u.flushHeaders?.();}catch{}try{u.flush?.();}catch{}try{u.socket?.setNoDelay?.(!0);}catch{}try{u.socket?.uncork?.();}catch{}}function Vt(s,u){let d=S.get(s);if(d&&!(u&&d.res!==u)){S.delete(s),Wt();try{$?.(s);}catch{}try{d.res.end();}catch{}}}function Ut(s,u){let d=S.get(s);if(!d)return;let g=Gt(u);try{d.res.write(g),Mt(d.res);}catch{Vt(s,d.res);}}function zt(s,u,d,g,m){if(!S.has(u)){H(s,404,{error:`SSE client not connected: ${u}`});return}m?w?.(u,d,g):v?.(u,d,g),H(s,200,{ok:true,clientId:u,channelName:d,...g.cardId?{cardId:g.cardId}:{},subscribed:m});}function ne(){let s=new Set;for(let u of S.values())for(let d of u.subscribedChatCardIds)s.add(d);return Array.from(s)}function ve(s){let u=I.has(s)?I.get(s):null,{cursor:d}=i.readAfter(s,u),g=i.isProcessing(s),m=g!==(p.get(s)??false),k=d!==u;return k&&I.set(s,d),p.set(s,g),k||m}function Ft(s,u=true){let d=L(s),g=Date.now();return {kind:"card_chats",cardId:s,sentAt:new Date(g).toISOString(),sentAtMs:g,messages:d.map(m=>({role:String(m.role||"system"),text:String(m.text||""),files:Array.isArray(m.files)?m.files:[]})),receiving:u,processing:i.isProcessing(s)}}function Ht(s,u=true){let d={kind:"notification-batch",notifications:[Ft(s,u)]};for(let[g,m]of S.entries())m.subscribedChatCardIds.has(s)&&Ut(g,d);}function Wt(){ne().length>0||(C&&(clearInterval(C),C=null),I.clear(),p.clear());}function Kt(){if(C)return;let s=()=>{let u=ne();if(u.length===0){Wt();return}let d=new Set(u);for(let g of Array.from(I.keys()))d.has(g)||I.delete(g);for(let g of Array.from(p.keys()))d.has(g)||p.delete(g);for(let g of u)ve(g)&&Ht(g,true);};s(),C=setInterval(s,1e3);}function Pt(s,u){let d=S.get(s);if(!d)return false;d.subscribedChatCardIds.add(u);let{cursor:g}=i.readAfter(u,null);return I.set(u,g),p.set(u,i.isProcessing(u)),Kt(),Ut(s,{kind:"notification-batch",notifications:[Ft(u,true)]}),true}function Se(s,u){let d=S.get(s);return d?(d.subscribedChatCardIds.delete(u),ne().includes(u)||(I.delete(u),p.delete(u)),Wt(),true):false}function b(s){if(!s||typeof s!="object")return false;let u=s.kind;return u==="card_chats"||u==="chat_messages"}function O(s){if(!s||s.length===0)return;let u=[],d=new Set;for(let g of s)b(g)&&typeof g.cardId=="string"?d.add(String(g.cardId)):u.push(g);if(u.length>0){let g={kind:"notification-batch",notifications:u};for(let m of S.keys())Ut(m,g);}for(let g of d)Ht(g,true);}function Y(s,u,d){let g=S.get(d),m=g?new Set(g.subscribedChatCardIds):new Set;g&&Vt(d,g.res),u.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),Mt(u),S.set(d,{res:u,subscribedChatCardIds:m});let k=qt(),_=Gt(k);u.write(_);try{q?.(d,j=>{Ut(d,j);});}catch{}let D=setInterval(()=>{try{u.write(`: keepalive
4
+ `}function Re(o){let i=o;try{i.flushHeaders?.();}catch{}try{i.flush?.();}catch{}try{i.socket?.setNoDelay?.(!0);}catch{}try{i.socket?.uncork?.();}catch{}}function $e(o,i){let d=b.get(o);if(d&&!(i&&d.res!==i)){b.delete(o),Qe();try{F?.(o);}catch{}try{d.res.end();}catch{}}}function Te(o,i){let d=b.get(o);if(!d)return;let p=Ee(i);try{d.res.write(p),Re(d.res);}catch{$e(o,d.res);}}function Be(o,i,d,p,h){if(!b.has(i)){q(o,404,{error:`SSE client not connected: ${i}`});return}h?S?.(i,d,p):x?.(i,d,p),q(o,200,{ok:true,clientId:i,channelName:d,...p.cardId?{cardId:p.cardId}:{},subscribed:h});}function qe(){let o=new Set;for(let i of b.values())for(let d of i.subscribedChatCardIds)o.add(d);return Array.from(o)}function Ct(o){let i=N.has(o)?N.get(o):null,{cursor:d}=c.readAfter(o,i),p=c.isProcessing(o),h=p!==(L.get(o)??false),k=d!==i;return k&&N.set(o,d),L.set(o,p),k||h}function He(o,i=true){let d=w(o),p=Date.now();return {kind:"card_chats",cardId:o,sentAt:new Date(p).toISOString(),sentAtMs:p,messages:d.map(h=>({role:String(h.role||"system"),text:String(h.text||""),files:Array.isArray(h.files)?h.files:[]})),receiving:i,processing:c.isProcessing(o)}}function Ze(o,i=true){let d={kind:"notification-batch",notifications:[He(o,i)]};for(let[p,h]of b.entries())h.subscribedChatCardIds.has(o)&&Te(p,d);}function Qe(){qe().length>0||(y&&(clearInterval(y),y=null),N.clear(),L.clear());}function Le(){if(y)return;let o=()=>{let i=qe();if(i.length===0){Qe();return}let d=new Set(i);for(let p of Array.from(N.keys()))d.has(p)||N.delete(p);for(let p of Array.from(L.keys()))d.has(p)||L.delete(p);for(let p of i)Ct(p)&&Ze(p,true);};o(),y=setInterval(o,1e3);}function et(o,i){let d=b.get(o);if(!d)return false;d.subscribedChatCardIds.add(i);let{cursor:p}=c.readAfter(i,null);return N.set(i,p),L.set(i,c.isProcessing(i)),Le(),Te(o,{kind:"notification-batch",notifications:[He(i,true)]}),true}function St(o,i){let d=b.get(o);return d?(d.subscribedChatCardIds.delete(i),qe().includes(i)||(N.delete(i),L.delete(i)),Qe(),true):false}function Ge(o){if(!o||typeof o!="object")return false;let i=o.kind;return i==="card_chats"||i==="chat_messages"}function _e(o){if(!o||o.length===0)return;let i=[],d=new Set;for(let p of o)Ge(p)&&typeof p.cardId=="string"?d.add(String(p.cardId)):i.push(p);if(i.length>0){let p={kind:"notification-batch",notifications:i};for(let h of b.keys())Te(h,p);}for(let p of d)Ze(p,true);}function Rt(o,i,d){let p=b.get(d),h=p?new Set(p.subscribedChatCardIds):new Set;p&&$e(d,p.res),i.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),Re(i),b.set(d,{res:i,subscribedChatCardIds:h});let k=De(),j=Ee(k);i.write(j);try{O?.(d,$=>{Te(d,$);});}catch{}let B=setInterval(()=>{try{i.write(`: keepalive
5
5
 
6
- `);}catch{}},15e3);s.on("close",()=>{clearInterval(D),Vt(d,u);});}async function vt(s,u,d){let g=s.method||"GET",m=d,k=m.pathname;try{if(g==="GET"&&k===`${e}/init-board`)return await At(),H(u,200,qt()),!0;if(g==="GET"&&k===`${e}/sse`){await At();let V=String(m.searchParams.get("clientId")||"").trim();if(!V)return H(u,400,{error:"clientId query param is required for SSE"}),!0;Y(s,u,V);for(let U=0;U<T.length;U++)$t(T[U]),Bt(T[U],U);return !0}if(g==="GET"&&k===`${e}/board-status`)return H(u,200,qt()),!0;let _=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)$`));if(g==="GET"&&_){await mt();let V=decodeURIComponent(_[1]),U=P(V);return U?(H(u,200,U),!0):(H(u,404,{error:`card not found: ${V}`}),!0)}if(g==="PATCH"&&_){await mt();let V=decodeURIComponent(_[1]),U=await ft(s);return y(V,U),H(u,200,{ok:!0}),!0}let D=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)/retrigger$`));if(g==="POST"&&D){await mt();let V=decodeURIComponent(D[1]);return ke(V),H(u,200,{ok:!0}),!0}let j=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)/actions$`));if(g==="POST"&&j){await mt();let V=decodeURIComponent(j[1]),U=Date.now(),et=new Date(U).toISOString(),gt=await ft(s),pt=gt?.actionType;if(pt==="chat-send"&&!Z(V)){let _t=Date.now();return H(u,409,{error:`chat handler is not configured for card: ${V}`,requestReceivedAt:et,requestReceivedAtMs:U,responseSentAt:new Date(_t).toISOString(),responseSentAtMs:_t,responseStatus:409}),!0}ut(V,pt,gt?.payload);let St=Date.now();return H(u,200,{ok:!0,requestReceivedAt:et,requestReceivedAtMs:U,responseSentAt:new Date(St).toISOString(),responseSentAtMs:St,responseStatus:200}),!0}let J=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)/chats$`));if(g==="GET"&&J){await mt();let V=decodeURIComponent(J[1]);return H(u,200,{ok:!0,messages:L(V)}),!0}if(g==="POST"&&J){await mt();let V=decodeURIComponent(J[1]),U=await ft(s),et=typeof U?.role=="string"?U.role:"assistant",gt=typeof U?.text=="string"?U.text:"",pt=Array.isArray(U?.files)?U.files:[],St=U?.done===!0,_t=i.append(V,et,gt,pt);return St&&i.setProcessing(V,!1),Ht(V,!St),H(u,200,{ok:!0,id:_t}),!0}let Q=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(g==="POST"&&Q){await mt();let V=decodeURIComponent(Q[1]),U=await ft(s),et=typeof U?.clientId=="string"?U.clientId.trim():"";return et?Pt(et,V)?(H(u,200,{ok:!0,clientId:et,cardId:V,subscribed:!0}),!0):(H(u,404,{error:`SSE client not connected: ${et}`}),!0):(H(u,400,{error:"clientId is required"}),!0)}let ht=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(g==="POST"&&ht){await mt();let V=decodeURIComponent(ht[1]),U=await ft(s),et=typeof U?.clientId=="string"?U.clientId.trim():"";return et?Se(et,V)?(H(u,200,{ok:!0,clientId:et,cardId:V,subscribed:!1}),!0):(H(u,404,{error:`SSE client not connected: ${et}`}),!0):(H(u,400,{error:"clientId is required"}),!0)}let oe=k.match(new RegExp(`^${bt(e)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(g==="POST"&&oe){await mt();let V=decodeURIComponent(oe[1]),U=oe[2]==="subscribe",et=await ft(s),gt=typeof et?.clientId=="string"?et.clientId.trim():"";return gt?(zt(u,gt,V,{},U),!0):(H(u,400,{error:"clientId is required"}),!0)}let Yt=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(g==="POST"&&Yt){await mt();let V=decodeURIComponent(Yt[1]),U=decodeURIComponent(Yt[2]),et=Yt[3]==="subscribe",gt=await ft(s),pt=typeof gt?.clientId=="string"?gt.clientId.trim():"";return pt?(zt(u,pt,U,{cardId:V},et),!0):(H(u,400,{error:"clientId is required"}),!0)}let se=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)/files$`));if(g==="POST"&&se){await mt();let V=decodeURIComponent(se[1]),U=String(m.searchParams.get("inChat")||"").toLowerCase()==="true",et=s.headers["x-file-name"],gt=String(s.headers["content-type"]||"application/octet-stream"),pt=Array.isArray(et)?et[0]:et,St=pt?decodeURIComponent(String(pt)):"upload.bin",_t=await It(s);if(!_t.length)return H(u,400,{error:"Empty upload body"}),!0;let Ct=ct(V,St,gt,_t),Jt=null;if(re(V,Rt=>{let ae=new Date().toISOString(),ie=Rt.card_data&&typeof Rt.card_data=="object"?Rt.card_data:{};Rt.card_data=ie;let br=K().normalizeIncoming([{name:Ct.name,stored_name:Ct.stored_name,size:Ct.size,mime_type:Ct.mime_type,uploaded_at:Ct.uploaded_at||ae,chat:U}],ae);return Jt=K().merge(ie,br).findIndex(wr=>wr.stored_name===Ct.stored_name),Rt}),U){let Rt=typeof Jt=="number"&&Jt>=0?` #${Jt}`:"";A(V,"system",`file uploaded: ${Ct.name} as ${Ct.stored_name}${Rt}`,[]);}return H(u,200,{ok:!0,file:Ct}),!0}let Ot=k.match(new RegExp(`^${bt(e)}/cards/([^/]+)/files/(\\d+)$`));if(g==="GET"&&Ot){let V=decodeURIComponent(Ot[1]),U=parseInt(Ot[2],10),et=m.searchParams.get("sn"),gt=P(V);if(!gt)return H(u,404,{error:"Card not found"}),!0;let pt=K().resolve(gt.card_data,U,et);if(!pt.ok&&pt.reason==="stale_reference")return H(u,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!pt.ok)return H(u,404,{error:"File not found"}),!0;let St=pt.file,_t=X(V),Ct=B(V),Jt=`${_t}/${St.stored_name}`,Rt=Ct.files?Ct.files.getBytes(Jt):null;if(!Rt)return H(u,404,{error:"File not found"}),!0;let ae=St.name||St.stored_name,ie=St.mime_type||"application/octet-stream";return u.writeHead(200,{"Content-Type":ie,"Content-Disposition":`attachment; filename="${ae}"`,"Content-Length":Rt.length}),u.end(Rt),!0}return !1}catch(_){let D=_?.statusCode||500;return H(u,D,{error:String(_?.message||_)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleRuntimeApi:vt,buildPublishedRuntimePayload:qt,clearChatRecords:R,reportSourceFetched(s,u){let d=T[0];return d?d.board.sourceDataFetched({params:{token:s,ref:u}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(s,u){let d=T[0];return d?d.board.sourceDataFetchFailure({params:{token:s,reason:u}}):{status:"fail",error:"no board context"}},get cardStore(){return T[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function yo(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),r={...Sr,...t.corsHeaders||{}},n=t.serverMetaStore,o=t.boardRuntimeFactory,a=new Map,c="boards-config.json";function i(){let S=n.getText(c);if(!S)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(S)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function l(S){n.putText(c,JSON.stringify(S,null,2));}function h(S){let I=String(S||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return I.length>0&&I.length<=64?I:null}function E(S){if(a.has(S))return a.get(S);let p=i().boards.find(G=>G.id===S)||{},C=o(S,p);return a.set(S,C),C}function N(S,I,p){let C=JSON.stringify(p),G=typeof Buffer<"u"?Buffer.byteLength(C):new TextEncoder().encode(C).length;S.writeHead(I,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":G}),S.end(C);}async function q(S,I,p){let C=S.method||"GET",G=p.pathname;if(C==="GET"&&G===e)return N(I,200,{ok:true,boards:i().boards}),true;if(C==="POST"&&G===e){let T=[];for await(let st of S)T.push(st);let M=typeof Buffer<"u"?Buffer.concat(T).toString("utf-8").trim():new TextDecoder().decode(pn(T)).trim(),x={};try{x=M?JSON.parse(M):{};}catch{x={};}let B=h(x.id);if(!B)return N(I,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let tt=i();if(tt.boards.some(st=>st.id===B))return N(I,409,{error:`Board "${B}" is already registered`}),true;let K=typeof x.label=="string"&&x.label.trim()?x.label.trim():B,X={id:B,label:K};for(let[st,at]of Object.entries(x))st==="id"||st==="label"||at!=null&&(X[st]=at);return tt.boards.push(X),l(tt),N(I,200,{ok:true,board:X}),true}return false}async function $(S,I,p){let G=p.pathname.match(new RegExp(`^${bt(e)}/([^/]+)(/|$)`));if(!G)return false;let T=h(decodeURIComponent(G[1]));return T?i().boards.some(B=>B.id===T)?!!await E(T).handleRuntimeApi(S,I,p):(N(I,404,{error:`Board "${T}" not registered. POST ${e} with {id} to register it first.`}),true):(N(I,400,{error:"Invalid board id"}),true)}async function w(S,I,p){return !!(await q(S,I,p)||await $(S,I,p))}function v(S){if(!i().boards.some(p=>p.id===S))throw Object.assign(new Error(`Board "${S}" not registered`),{statusCode:404});return {service:E(S)}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleApi:w,requireBoardService:v}}function bt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pn(t){let e=t.reduce((o,a)=>o+a.length,0),r=new Uint8Array(e),n=0;for(let o of t)r.set(o,n),n+=o.length;return r}exports.createMultiBoardServerRuntime=yo;exports.createSingleBoardServerRuntime=ho;//# sourceMappingURL=board-live-cards-server-runtime.cjs.map
6
+ `);}catch{}},15e3);o.on("close",()=>{clearInterval(B),$e(d,i);});}async function v(o,i,d){let p=o.method||"GET",h=d,k=h.pathname;try{if(p==="GET"&&k===`${t}/init-board`)return await we(),q(i,200,De()),!0;if(p==="GET"&&k===`${t}/sse`){await we();let V=String(h.searchParams.get("clientId")||"").trim();if(!V)return q(i,400,{error:"clientId query param is required for SSE"}),!0;Rt(o,i,V);for(let M=0;M<I.length;M++)Ce(I[M]),Pe(I[M],M);return !0}if(p==="GET"&&k===`${t}/board-status`)return q(i,200,De()),!0;let j=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)$`));if(p==="GET"&&j){await le();let V=decodeURIComponent(j[1]),M=D(V);return M?(q(i,200,M),!0):(q(i,404,{error:`card not found: ${V}`}),!0)}if(p==="PATCH"&&j){await le();let V=decodeURIComponent(j[1]),M=await ne(o);return yt(V,M),q(i,200,{ok:!0}),!0}let B=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)/retrigger$`));if(p==="POST"&&B){await le();let V=decodeURIComponent(B[1]);return Xe(V),q(i,200,{ok:!0}),!0}let $=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)/actions$`));if(p==="POST"&&$){await le();let V=decodeURIComponent($[1]),M=Date.now(),ee=new Date(M).toISOString(),ce=await ne(o),de=ce?.actionType;if(de==="chat-send"&&!K(V)){let Ie=Date.now();return q(i,409,{error:`chat handler is not configured for card: ${V}`,requestReceivedAt:ee,requestReceivedAtMs:M,responseSentAt:new Date(Ie).toISOString(),responseSentAtMs:Ie,responseStatus:409}),!0}Q(V,de,ce?.payload);let me=Date.now();return q(i,200,{ok:!0,requestReceivedAt:ee,requestReceivedAtMs:M,responseSentAt:new Date(me).toISOString(),responseSentAtMs:me,responseStatus:200}),!0}let J=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)/chats$`));if(p==="GET"&&J){await le();let V=decodeURIComponent(J[1]);return q(i,200,{ok:!0,messages:w(V)}),!0}if(p==="POST"&&J){await le();let V=decodeURIComponent(J[1]),M=await ne(o),ee=typeof M?.role=="string"?M.role:"assistant",ce=typeof M?.text=="string"?M.text:"",de=Array.isArray(M?.files)?M.files:[],me=M?.done===!0,Ie=c.append(V,ee,ce,de);return me&&c.setProcessing(V,!1),Ze(V,!me),q(i,200,{ok:!0,id:Ie}),!0}let Z=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(p==="POST"&&Z){await le();let V=decodeURIComponent(Z[1]),M=await ne(o),ee=typeof M?.clientId=="string"?M.clientId.trim():"";return ee?et(ee,V)?(q(i,200,{ok:!0,clientId:ee,cardId:V,subscribed:!0}),!0):(q(i,404,{error:`SSE client not connected: ${ee}`}),!0):(q(i,400,{error:"clientId is required"}),!0)}let fe=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(p==="POST"&&fe){await le();let V=decodeURIComponent(fe[1]),M=await ne(o),ee=typeof M?.clientId=="string"?M.clientId.trim():"";return ee?St(ee,V)?(q(i,200,{ok:!0,clientId:ee,cardId:V,subscribed:!1}),!0):(q(i,404,{error:`SSE client not connected: ${ee}`}),!0):(q(i,400,{error:"clientId is required"}),!0)}let tt=k.match(new RegExp(`^${ke(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(p==="POST"&&tt){await le();let V=decodeURIComponent(tt[1]),M=tt[2]==="subscribe",ee=await ne(o),ce=typeof ee?.clientId=="string"?ee.clientId.trim():"";return ce?(Be(i,ce,V,{},M),!0):(q(i,400,{error:"clientId is required"}),!0)}let Ke=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(p==="POST"&&Ke){await le();let V=decodeURIComponent(Ke[1]),M=decodeURIComponent(Ke[2]),ee=Ke[3]==="subscribe",ce=await ne(o),de=typeof ce?.clientId=="string"?ce.clientId.trim():"";return de?(Be(i,de,M,{cardId:V},ee),!0):(q(i,400,{error:"clientId is required"}),!0)}let rt=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)/files$`));if(p==="POST"&&rt){await le();let V=decodeURIComponent(rt[1]),M=String(h.searchParams.get("inChat")||"").toLowerCase()==="true",ee=o.headers["x-file-name"],ce=String(o.headers["content-type"]||"application/octet-stream"),de=Array.isArray(ee)?ee[0]:ee,me=de?decodeURIComponent(String(de)):"upload.bin",Ie=await xe(o);if(!Ie.length)return q(i,400,{error:"Empty upload body"}),!0;let he=G(V,me,ce,Ie),Ve=null;if(Ue(V,ye=>{let nt=new Date().toISOString(),ot=ye.card_data&&typeof ye.card_data=="object"?ye.card_data:{};ye.card_data=ot;let br=H().normalizeIncoming([{name:he.name,stored_name:he.stored_name,size:he.size,mime_type:he.mime_type,uploaded_at:he.uploaded_at||nt,chat:M}],nt);return Ve=H().merge(ot,br).findIndex(wr=>wr.stored_name===he.stored_name),ye}),M){let ye=typeof Ve=="number"&&Ve>=0?` #${Ve}`:"";l(V,"system",`file uploaded: ${he.name} as ${he.stored_name}${ye}`,[]);}return q(i,200,{ok:!0,file:he}),!0}let Oe=k.match(new RegExp(`^${ke(t)}/cards/([^/]+)/files/(\\d+)$`));if(p==="GET"&&Oe){let V=decodeURIComponent(Oe[1]),M=parseInt(Oe[2],10),ee=h.searchParams.get("sn"),ce=D(V);if(!ce)return q(i,404,{error:"Card not found"}),!0;let de=H().resolve(ce.card_data,M,ee);if(!de.ok&&de.reason==="stale_reference")return q(i,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!de.ok)return q(i,404,{error:"File not found"}),!0;let me=de.file,Ie=W(V),he=E(V),Ve=`${Ie}/${me.stored_name}`,ye=he.files?he.files.getBytes(Ve):null;if(!ye)return q(i,404,{error:"File not found"}),!0;let nt=me.name||me.stored_name,ot=me.mime_type||"application/octet-stream";return i.writeHead(200,{"Content-Type":ot,"Content-Disposition":`attachment; filename="${nt}"`,"Content-Length":ye.length}),i.end(ye),!0}return !1}catch(j){let B=j?.statusCode||500;return q(i,B,{error:String(j?.message||j)}),true}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleRuntimeApi:v,buildPublishedRuntimePayload:De,clearChatRecords:C,reportSourceFetched(o,i){let d=I[0];return d?d.board.sourceDataFetched({params:{token:o,ref:i}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(o,i){let d=I[0];return d?d.board.sourceDataFetchFailure({params:{token:o,reason:i}}):{status:"fail",error:"no board context"}},get cardStore(){return I[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function ko(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...Cr,...e.corsHeaders||{}},n=e.serverMetaStore,s=e.boardRuntimeFactory,a=new Map,u="boards-config.json";function c(){let b=n.getText(u);if(!b)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(b)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function f(b){n.putText(u,JSON.stringify(b,null,2));}function g(b){let N=String(b||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return N.length>0&&N.length<=64?N:null}function m(b){if(a.has(b))return a.get(b);let L=c().boards.find(T=>T.id===b)||{},y=s(b,L);return a.set(b,y),y}function R(b,N,L){let y=JSON.stringify(L),T=typeof Buffer<"u"?Buffer.byteLength(y):new TextEncoder().encode(y).length;b.writeHead(N,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":T}),b.end(y);}async function O(b,N,L){let y=b.method||"GET",T=L.pathname;if(y==="GET"&&T===t)return R(N,200,{ok:true,boards:c().boards}),true;if(y==="POST"&&T===t){let I=[];for await(let oe of b)I.push(oe);let U=typeof Buffer<"u"?Buffer.concat(I).toString("utf-8").trim():new TextDecoder().decode(pn(I)).trim(),A={};try{A=U?JSON.parse(U):{};}catch{A={};}let E=g(A.id);if(!E)return R(N,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let z=c();if(z.boards.some(oe=>oe.id===E))return R(N,409,{error:`Board "${E}" is already registered`}),true;let H=typeof A.label=="string"&&A.label.trim()?A.label.trim():E,W={id:E,label:H};for(let[oe,se]of Object.entries(A))oe==="id"||oe==="label"||se!=null&&(W[oe]=se);return z.boards.push(W),f(z),R(N,200,{ok:true,board:W}),true}return false}async function F(b,N,L){let T=L.pathname.match(new RegExp(`^${ke(t)}/([^/]+)(/|$)`));if(!T)return false;let I=g(decodeURIComponent(T[1]));return I?c().boards.some(E=>E.id===I)?!!await m(I).handleRuntimeApi(b,N,L):(R(N,404,{error:`Board "${I}" not registered. POST ${t} with {id} to register it first.`}),true):(R(N,400,{error:"Invalid board id"}),true)}async function S(b,N,L){return !!(await O(b,N,L)||await F(b,N,L))}function x(b){if(!c().boards.some(L=>L.id===b))throw Object.assign(new Error(`Board "${b}" not registered`),{statusCode:404});return {service:m(b)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:S,requireBoardService:x}}function ke(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pn(e){let t=e.reduce((s,a)=>s+a.length,0),r=new Uint8Array(t),n=0;for(let s of e)r.set(s,n),n+=s.length;return r}exports.createMultiBoardServerRuntime=ko;exports.createSingleBoardServerRuntime=yo;//# sourceMappingURL=board-live-cards-server-runtime.cjs.map
7
7
  //# sourceMappingURL=board-live-cards-server-runtime.cjs.map
@@ -1,6 +1,6 @@
1
- export { B as BoardContextConfig, C as ChatHandlerFlowRunner, D as DescribeEnvelope, I as InvocationAdapter, a as MultiBoardRuntime, M as MultiBoardRuntimeOptions, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse, b as SingleBoardRuntime, S as SingleBoardRuntimeOptions } from './types-D1R0JHIs.cjs';
1
+ export { B as BoardContextConfig, C as ChatHandlerFlowRunner, D as DescribeEnvelope, I as InvocationAdapter, a as MultiBoardRuntime, M as MultiBoardRuntimeOptions, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse, b as SingleBoardRuntime, S as SingleBoardRuntimeOptions } from './types-D501gMQt.cjs';
2
2
  export { B as BlobStorage, K as KVStorage, a as KindValueRef } from './storage-interface-B2WD9D5n.cjs';
3
- export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardPlatformAdapter, C as CommandInput, a as CommandResult } from './board-live-cards-public-CQ82CDdS.cjs';
3
+ export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardPlatformAdapter, C as CommandInput, a as CommandResult } from './board-live-cards-public-B4RcYPC_.cjs';
4
4
  export { c as ChatStorage } from './chat-storage-lib-B1wU27y3.cjs';
5
5
  export { ExecutionRef } from './execution-refs.cjs';
6
6
  export { createMultiBoardServerRuntime, createSingleBoardServerRuntime } from './server-runtime/index.cjs';
@@ -1,6 +1,6 @@
1
- export { B as BoardContextConfig, C as ChatHandlerFlowRunner, D as DescribeEnvelope, I as InvocationAdapter, a as MultiBoardRuntime, M as MultiBoardRuntimeOptions, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse, b as SingleBoardRuntime, S as SingleBoardRuntimeOptions } from './types-vTfV-Zkn.js';
1
+ export { B as BoardContextConfig, C as ChatHandlerFlowRunner, D as DescribeEnvelope, I as InvocationAdapter, a as MultiBoardRuntime, M as MultiBoardRuntimeOptions, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse, b as SingleBoardRuntime, S as SingleBoardRuntimeOptions } from './types-1L1D33mr.js';
2
2
  export { B as BlobStorage, K as KVStorage, a as KindValueRef } from './storage-interface-B2WD9D5n.js';
3
- export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardPlatformAdapter, C as CommandInput, a as CommandResult } from './board-live-cards-public-CtlVp0L3.js';
3
+ export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardPlatformAdapter, C as CommandInput, a as CommandResult } from './board-live-cards-public-ydXuA4zh.js';
4
4
  export { c as ChatStorage } from './chat-storage-lib-DsF4kPon.js';
5
5
  export { ExecutionRef } from './execution-refs.js';
6
6
  export { createMultiBoardServerRuntime, createSingleBoardServerRuntime } from './server-runtime/index.js';