yaml-flow 8.4.5 → 8.4.8

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-localstorage.js +6 -6
  3. package/browser/live-cards.js +7 -7
  4. package/cli/node/fs-board-adapter.d.ts +1 -1
  5. package/cli/node/fs-board-adapter.js +1 -1
  6. package/cli/node/step-machine-cli.d.ts +57 -1
  7. package/cli/node/step-machine-cli.js +3 -3
  8. package/examples/board/demo-shell-with-server.html +2 -2
  9. package/examples/board/doc.html +2 -2
  10. package/examples/board-local/demo-shell-localstorage.html +3 -3
  11. package/lib/{artifacts-store-lib-454TAuov.d.ts → artifacts-store-lib-CXgRA5J7.d.ts} +1 -1
  12. package/lib/{artifacts-store-lib-zsGFbBV8.d.cts → artifacts-store-lib-WdoKNAF0.d.cts} +1 -1
  13. package/lib/artifacts-store-public.d.cts +1 -1
  14. package/lib/artifacts-store-public.d.ts +1 -1
  15. package/lib/board-live-cards-node.cjs +1 -1
  16. package/lib/board-live-cards-node.d.cts +4 -4
  17. package/lib/board-live-cards-node.d.ts +4 -4
  18. package/lib/board-live-cards-node.js +1 -1
  19. package/lib/board-live-cards-server-runtime.cjs +3 -3
  20. package/lib/board-live-cards-server-runtime.d.cts +2 -2
  21. package/lib/board-live-cards-server-runtime.d.ts +2 -2
  22. package/lib/board-live-cards-server-runtime.js +3 -3
  23. package/lib/{constants-DXxsRN9y.d.cts → constants-C-iQV9ZB.d.cts} +1 -1
  24. package/lib/{constants-BPVLb3Es.d.ts → constants-dmPZTieN.d.ts} +1 -1
  25. package/lib/event-graph/index.d.cts +2 -2
  26. package/lib/event-graph/index.d.ts +2 -2
  27. package/lib/index.cjs +2 -2
  28. package/lib/index.d.cts +3 -3
  29. package/lib/index.d.ts +3 -3
  30. package/lib/index.js +2 -2
  31. package/lib/{loader-CuuLjxVA.d.cts → loader-Bw7KRzCK.d.cts} +1 -1
  32. package/lib/{loader-Zborm2pq.d.ts → loader-D6xGRDWX.d.ts} +1 -1
  33. package/lib/server-runtime/index.cjs +3 -3
  34. package/lib/server-runtime/index.d.cts +3 -3
  35. package/lib/server-runtime/index.d.ts +3 -3
  36. package/lib/server-runtime/index.js +3 -3
  37. package/lib/step-machine/index.cjs +2 -2
  38. package/lib/step-machine/index.d.cts +3 -3
  39. package/lib/step-machine/index.d.ts +3 -3
  40. package/lib/step-machine/index.js +2 -2
  41. package/lib/step-machine-public/index.cjs +1 -1
  42. package/lib/step-machine-public/index.d.cts +2 -2
  43. package/lib/step-machine-public/index.d.ts +2 -2
  44. package/lib/step-machine-public/index.js +1 -1
  45. package/lib/stores/index.d.cts +1 -1
  46. package/lib/stores/index.d.ts +1 -1
  47. package/lib/stores/kv.d.cts +1 -1
  48. package/lib/stores/kv.d.ts +1 -1
  49. package/lib/stores/memory.d.cts +1 -1
  50. package/lib/stores/memory.d.ts +1 -1
  51. package/lib/{types-DX8wXuZ0.d.cts → types-Dc70aHzf.d.cts} +1 -1
  52. package/lib/{types-DQ1bKuB1.d.ts → types-DjlwALZC.d.cts} +1 -0
  53. package/lib/{types-DQ1bKuB1.d.cts → types-DjlwALZC.d.ts} +1 -0
  54. package/lib/{types-BC8ZnA6i.d.ts → types-YXF9Oai2.d.ts} +1 -1
  55. package/package.json +1 -1
  56. package/schema/flow.schema.json +6 -1
@@ -1,7 +1,7 @@
1
- import {createRequire}from'module';import'ajv-formats';var Xt="b64:";function fr(t){let e=new TextEncoder().encode(t),r=globalThis.Buffer,n;if(r)n=r.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function pr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),r=globalThis.Buffer;if(r)return r.from(e,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(e),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function wt(t){return `${Xt}${fr(JSON.stringify(t))}`}function me(t){if(!t.startsWith(Xt))throw new Error(`Invalid ref format (expected ${Xt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(pr(t.slice(Xt.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 he(t,e,r){let n=t.tryAcquire();if(!n)return false;try{await e();}finally{n();}return r?.(),true}var _t={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function pt(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function Tt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ye(t){return t.tasks??{}}function ce(t){return t?t.status===_t.FAILED||t.status===_t.INACTIVATED:false}function ke(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function Se(t){return t.maxExecutions}function Ce(t,e){let r=new Set;for(let[n,o]of Object.entries(e))if(o.status===_t.COMPLETED){let s=t.tasks[n];s&&pt(s).forEach(i=>r.add(i));}return Array.from(r)}function Re(t,e){let r={};return t.forEach(n=>{let o=e[n];if(!o)return;pt(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function be(t,e,r){let n=t.tasks[e]??Wt(),o={};if(r){let c=r.tasks[e],i=Tt(c);for(let d of i)for(let[m,_]of Object.entries(r.tasks))if(pt(_).includes(d)){let O=t.tasks[m];O?.lastDataHash&&(o[d]=O.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function we(t,e,r,n,o,s){let c=t.tasks[r]??Wt(),i=e.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let d;n&&i.on&&i.on[n]?d=i.on[n]:d=pt(i);let m=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let T=i.requires??[];for(let E of T)for(let[S,R]of Object.entries(e.tasks))if(pt(R).includes(E)){let C=t.tasks[S];C?.lastDataHash&&(m[E]=C.lastDataHash);break}}let _={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:m,error:void 0},O=[...new Set([...t.availableOutputs,...d])];return {...t,tasks:{...t.tasks,[r]:_},availableOutputs:O,lastUpdated:new Date().toISOString()}}function ve(t,e,r,n){let o=t.tasks[r]??Wt(),s=e.tasks[r];if(s?.retry){let d=o.retryCount+1;if(d<=s.retry.max_attempts){let m={...o,status:"not-started",retryCount:d,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:m},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(s?.on_failure&&s.on_failure.length>0&&(i=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&c.executionCount>=s.circuit_breaker.max_executions){let d=s.circuit_breaker.on_break;i=[...new Set([...i,...d])];}return {...t,tasks:{...t.tasks,[r]:c},availableOutputs:i,lastUpdated:new Date().toISOString()}}function xe(t,e,r,n){let o=t.tasks[e]??Wt(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Ae(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 Wt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Zt(t,e){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(t.tasks))n[s]=_e();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 gr(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:be(n,e.taskName,r)};case "task-completed":return {config:r,state:we(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:ve(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:xe(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:Ae(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:Rr(n,e.action)};case "task-upsert":return mr(t,e.taskName,e.taskConfig);case "task-removal":return hr(t,e.taskName);case "node-requires-add":return yr(t,e.nodeName,e.tokens);case "node-requires-remove":return kr(t,e.nodeName,e.tokens);case "node-provides-add":return Sr(t,e.nodeName,e.tokens);case "node-provides-remove":return Cr(t,e.nodeName,e.tokens);default:return t}}function Ee(t,e){return e.reduce((r,n)=>gr(r,n),t)}function mr(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]:_e()},lastUpdated:new Date().toISOString()}}}function hr(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function yr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Tt(n),s=r.filter(c=>!o.includes(c));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...o,...s]}}},state:t.state}}function kr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Tt(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:s}}},state:t.state}}function Sr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=pt(n),s=r.filter(c=>!o.includes(c));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...o,...s]}}},state:t.state}}function Cr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=pt(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:s}}},state:t.state}}function Mt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function Qt(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 _e(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Rr(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 Ut(t){let{config:e,state:r}=t,n=ye(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=br(n),c=Ce(e,r.tasks),i=new Set([...c,...r.availableOutputs]),d=[],m=[],_=[],O=[];for(let[E,S]of Object.entries(n)){let R=r.tasks[E],C=ke(S,e.settings),v=C!=="once";if(R?.status===_t.RUNNING||ce(R))continue;let h=Se(S);if(h!==void 0&&R&&R.executionCount>=h||S.circuit_breaker&&R&&R.executionCount>=S.circuit_breaker.max_executions||!v&&R?.status===_t.COMPLETED)continue;if(v&&R?.status===_t.COMPLETED){let A=Tt(S),P=false;switch(C){case "data-changed":{A.length>0&&A.some(J=>{for(let[W,et]of Object.entries(n))if(pt(et).includes(J)){let z=r.tasks[W];if(!z)continue;let vt=R.lastConsumedHashes?.[J];return z.lastDataHash==null?z.executionCount>R.lastEpoch:z.lastDataHash!==vt}return false})||(P=true);break}case "epoch-changed":{A.length>0&&A.some(J=>{for(let[W,et]of Object.entries(n))if(pt(et).includes(J)){let z=r.tasks[W];if(z&&z.executionCount>R.lastEpoch)return true}return false})||(P=true);break}case "time-based":{let Q=S.refreshInterval??0;if(Q<=0){P=true;break}let J=R.completedAt;if(!J){P=true;break}(Date.now()-Date.parse(J))/1e3<Q&&(P=true);break}case "manual":P=true;break}if(P)continue}let b=Tt(S);if(b.length===0){d.push(E);continue}let q=[],V=[],D=[];for(let A of b){if(i.has(A))continue;let P=s[A]||[];P.length===0?q.push(A):P.every(J=>ce(r.tasks[J]))?D.push({token:A,failedProducer:P[0]}):V.push(A);}q.length>0?_.push({taskName:E,missingTokens:q}):D.length>0?O.push({taskName:E,failedTokens:D.map(A=>A.token),failedProducers:[...new Set(D.map(A=>A.failedProducer))]}):V.length>0?m.push({taskName:E,waitingOn:V}):d.push(E);}let T={};if(d.length>1){let E=Re(d,n);for(let[S,R]of Object.entries(E))R.length>1&&(T[S]=R);}return {eligible:d,pending:m,unresolved:_,blocked:O,conflicts:T}}function br(t){let e={};for(let[r,n]of Object.entries(t)){for(let o of pt(n))e[o]||(e[o]=[]),e[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(r)||e[s].push(r);if(n.on_failure)for(let o of n.on_failure)e[o]||(e[o]=[]),e[o].includes(r)||e[o].push(r);}return e}var Ht=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function de(t){let e=le(t);return wr(e)}function le(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(le).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+le(e[n])).join(",")+"}"}function wr(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 vr(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 xr(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Te(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return vr(e)}function Ar(t){try{let e=JSON.parse(xr(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ie(t,e,r){let{handlers:n,onDrain:o}=e,s=new Ht,c="state"in t&&"config"in t?t:Zt(t),i=false,d=new Set,m=new Map(Object.entries(n)),_=new Ht,O=false,T=false;function E(){if(!i){if(O){T=true;return}O=true;try{do T=!1,S();while(T)}finally{O=false;}}}function S(){let h=_.drain(),b=s.drain(),q=[...h,...b];q.length>0&&(c=Ee(c,q));let V=Ut(c);q.length>0&&o?.(q,c,V);for(let D of V.eligible)v(D);for(let D of q)if(D.type==="task-progress"){let{taskName:A,update:P}=D;if(!c.config.tasks[A])continue;let J=c.state.tasks[A];if(!J||J.status!=="running")continue;let W=Te(A),et=C(A,W,P).catch(z=>{i||(_.append({type:"task-failed",taskName:A,error:z.message??String(z),timestamp:new Date().toISOString()}),E());}).finally(()=>{d.delete(et);});d.add(et);}}function R(h){let q=c.config.tasks[h].requires??[],V=new Map;for(let[A,P]of Object.entries(c.config.tasks))for(let Q of P.provides??[])V.set(Q,A);let D={};for(let A of q){let P=V.get(A);P?D[A]=c.state.tasks[P]?.data:D[A]=void 0;}return D}async function C(h,b,q){let V=c.config.tasks[h],D=V.taskHandlers??[],A=R(h);for(let P of D){let Q=m.get(P);if(!Q)throw new Error(`Handler '${P}' not found in registry (task '${h}')`);let J={nodeId:h,state:A,taskState:c.state.tasks[h],config:V,callbackToken:b,update:q};if(await Q(J)==="task-initiate-failure")throw new Error(`Handler '${P}' returned task-initiate-failure (task '${h}')`)}}function v(h){let q=c.config.tasks[h]?.taskHandlers;if(!q||q.length===0)return;_.append({type:"task-started",taskName:h,timestamp:new Date().toISOString()}),E();let V=Te(h),D=C(h,V).catch(A=>{i||(_.append({type:"task-failed",taskName:h,error:A.message??String(A),timestamp:new Date().toISOString()}),E());}).finally(()=>{d.delete(D);});d.add(D);}return {push(h){i||(h.type==="task-completed"&&h.data&&!h.dataHash&&(h={...h,dataHash:de(h.data)}),s.append(h),E());},pushAll(h){if(!i){for(let b of h)b.type==="task-completed"&&b.data&&!b.dataHash?s.append({...b,dataHash:de(b.data)}):s.append(b);E();}},resolveCallback(h,b,q){if(i)return;let V=Ar(h);if(!V)return;let{taskName:D}=V;if(c.config.tasks[D]){if(q&&q.length>0)s.append({type:"task-failed",taskName:D,error:q.join("; "),timestamp:new Date().toISOString()});else {let A=b&&Object.keys(b).length>0?de(b):void 0;s.append({type:"task-completed",taskName:D,data:b,dataHash:A,timestamp:new Date().toISOString()});}E();}},addNode(h,b){i||(s.append({type:"task-upsert",taskName:h,taskConfig:b,timestamp:new Date().toISOString()}),E());},removeNode(h){i||(s.append({type:"task-removal",taskName:h,timestamp:new Date().toISOString()}),E());},addRequires(h,b){i||(s.append({type:"node-requires-add",nodeName:h,tokens:b,timestamp:new Date().toISOString()}),E());},removeRequires(h,b){i||(s.append({type:"node-requires-remove",nodeName:h,tokens:b,timestamp:new Date().toISOString()}),E());},addProvides(h,b){i||(s.append({type:"node-provides-add",nodeName:h,tokens:b,timestamp:new Date().toISOString()}),E());},removeProvides(h,b){i||(s.append({type:"node-provides-remove",nodeName:h,tokens:b,timestamp:new Date().toISOString()}),E());},registerHandler(h,b){m.set(h,b);},unregisterHandler(h){m.delete(h);},retrigger(h){i||c.config.tasks[h]&&(s.append({type:"task-restart",taskName:h,timestamp:new Date().toISOString()}),E());},retriggerAll(h){if(!i){for(let b of h)c.config.tasks[b]&&s.append({type:"task-restart",taskName:b,timestamp:new Date().toISOString()});E();}},snapshot(){return Mt(c)},getState(){return c},getSchedule(){return Ut(c)},async waitForHandlers(){d.size>0&&await Promise.allSettled([...d]);},async dispose(h){h?.wait&&d.size>0&&await Promise.allSettled([...d]),i=true;}}}var _r=createRequire(import.meta.url);_r("./jsonata-sync.cjs");var Ir=createRequire(import.meta.url),te=Ir("./jsonata-sync.cjs"),Ne=te;function Oe(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 Fe(t,e,r){let n=e.split("."),o=t;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Or(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await te(o.expr).evaluate(n);Fe(t.computed_values,o.bindTo,s),n.computed_values=t.computed_values;}catch{}return t}function jr(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let c=Ne(s.expr).evaluate(n);Fe(t.computed_values,s.bindTo,c),n.computed_values=t.computed_values;}catch(c){let i=c instanceof Error?c.message:String(c);o.push({bindTo:s.bindTo,error:i});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function Nr(t,e,r){let n={...r??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return te(t).evaluate(n)}function Fr(t,e){return e.startsWith("fetched_sources.")?Oe(t._sourcesData??{},e.slice(16)):Oe(t,e)}var je=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),$r=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Dr(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))$r.has(n)||e.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&e.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))e.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&e.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&e.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&e.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))e.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,c)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${c}]: must be an object`);else {let i=s;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,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):je.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...je].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&e.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function Pr(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=await te(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Br(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return t.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=Ne(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Kt={run:Or,runSync:jr,eval:Nr,resolve:Fr,validate:Dr,enrichSources:Pr,enrichSourcesSync:Br};function $e(t){return JSON.stringify(t)}function De(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 ee(t,e){function r(){return t.readIndex()??{}}function n(o,s,c){let i=String(s||"").split(".").filter(Boolean);if(i.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let d={...o},m=d;for(let _=0;_<i.length-1;_++){let O=i[_],T=m[O],E=T&&typeof T=="object"&&!Array.isArray(T)?{...T}:{};m[O]=E,m=E;}return m[i[i.length-1]]=c,d}return {readCard(o){let s=r()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,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 "${s}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,c]of Object.entries(r()))o[s]=c.checksum;return o},changedSince(o){let s=r(),c=[];for(let[i,d]of Object.entries(s))o[i]!==d.checksum&&c.push(i);for(let i of Object.keys(o))s[i]||c.push(i);return c},validateUpsert(o,s){let c=r(),i=c[o],d=Object.entries(c).find(([,m])=>m.key===s);return i&&i.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${i.key}", cannot remap to "${s}"`}:d&&d[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${d[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,c){let i=r(),d=c??i[o]?.key??t.defaultCardKey(o),m=t.writeCard(d,s);i[o]={key:d,checksum:m,updatedAt:new Date().toISOString()},t.writeIndex(i);},patchCard(o,s,c){let i=r(),d=i[o];if(!d||!t.cardExists(d.key))throw new Error(`card "${o}" not found`);let m=t.readCard(d.key);if(!m||typeof m!="object"||Array.isArray(m))throw new Error(`card "${o}" is not patchable`);let _=n(m,s,c),O=t.writeCard(d.key,_);i[o]={key:d.key,checksum:O,updatedAt:new Date().toISOString()},t.writeIndex(i);},removeCard(o){let s=r(),c=s[o];c&&(t.removeCard(c.key),delete s[o],t.writeIndex(s));},readIndex(){return r()}}}function fe(t,e){return {readSourceData(r,n){let o=t.read(`${r}/${n}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,n,o,s){let c=e(o);t.write(`${r}/.staged/${s}/${n}`,c);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,c=t.read(s);return c==null?false:(t.write(`${r}/${n}`,c),t.remove(s),true)},hasSource(r,n){return t.exists(`${r}/${n}`)}}}function Ge(t){function e(r){let n=t.readAllEntries();if(!r)return n;let o=n.findIndex(s=>s.id===r);return o===-1?n:n.slice(o+1)}return {readEntriesAfterCursor(r){let n=e(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return e(r).length},appendEvent(r){t.appendEntry({id:t.generateId(),event:r});}}}function Ve(t,e){return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.read(r)??[];t.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(c){let i=c instanceof Error?c.message:String(c);try{e(s,i);}catch{}}t.delete(r);}}}}var re="v1",Ft="board/graph",Me="board/lastJournalProcessedId";function Pe(t){return `cards/${t}/runtime`}function Ue(t){return {readRuntime(e){return t.read(Pe(e))??{_sources:{}}},writeRuntime(e,r){t.write(Pe(e),r);}}}function qr(t,e){let r={...t};for(let n of e.deleteKeys)delete r[n];return {...r,...e.shallowMerge}}function He(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,r){if(r.schemaVersion!==re)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=qr(n.values,r);return {ok:true,newVersion:t.writeValues(e,o,r.deleteKeys)}}}}function Ke(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 De(r.trim())},writeTaskExecutorRef(r){t.write("task-executor",$e(r));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(r){t.write("chat-handler-flow",r);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(r){t.write("card-store-ref",r);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(r){t.write("outputs-store-ref",r);},readScratchStoreRef(){return e("scratch-store-ref")},writeScratchStoreRef(r){t.write("scratch-store-ref",r);},readArchiveStoreRef(){return e("archive-store-ref")},writeArchiveStoreRef(r){t.write("archive-store-ref",r);}}}function Je(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 Be(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Lr(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function qe(t,e){return t?.lastRequestedToken?Lr(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function Gr(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function Le(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function ne(t,e){let r=e.state.tasks,n=e.config.tasks,o=Object.keys(r),s=Ut(e),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let S of s.pending)i.set(S.taskName,S.waitingOn);for(let S of s.unresolved)i.set(S.taskName,S.missingTokens);for(let S of s.blocked)i.set(S.taskName,S.failedTokens);let d=new Map;for(let[S,R]of Object.entries(n))for(let C of R.requires??[]){let v=d.get(C)??[];v.push(S),d.set(C,v);}let m=o.sort().map(S=>{let R=r[S],C=n[S]??{requires:[],provides:[]};R.status==="completed"?c.completed+=1:R.status==="failed"?c.failed+=1:R.status==="in-progress"&&(c.in_progress+=1);let v=C.requires??[],h=C.provides??[],b=Object.keys(R.data??{}).sort(),q=v.filter(J=>e.state.availableOutputs.includes(J)),V=v.filter(J=>!e.state.availableOutputs.includes(J)),D=i.get(S)??V,A=new Set;for(let J of h)for(let W of d.get(J)??[])W!==S&&A.add(W);let P=R.failedAt,Q=R.error?{message:R.error,code:"TASK_FAILED",at:P,source:"task-runtime"}:void 0;return {name:S,status:R.status,error:Q,requires:v,requires_satisfied:q,requires_missing:V,provides_declared:h,provides_runtime:b,blocked_by:D,unblocks:Array.from(A).sort(),runtime:{attempt_count:R.executionCount??0,restart_count:R.retryCount??0,in_progress_since:R.status==="in-progress"?R.startedAt??null:null,last_transition_at:R.lastUpdated??null,last_completed_at:R.completedAt??null,last_restarted_at:R.startedAt??null,status_age_ms:R.lastUpdated?0:null}}});c.pending=s.pending.length,c.blocked=s.blocked.length,c.unresolved=s.unresolved.length;let _=m.map(S=>({name:S.name,fanOut:S.unblocks.length})).sort((S,R)=>R.fanOut-S.fanOut||S.name.localeCompare(R.name)),O=_.length>0?_[0]:{name:null,fanOut:0},T=new Set;for(let S of Object.values(n))for(let R of S.requires??[])T.add(R);let E=0;for(let[S,R]of Object.entries(n)){let C=(R.requires??[]).length===0,h=(R.provides??[]).some(b=>(d.get(b)??[]).some(q=>q!==S));C&&!h&&(E+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:c.completed,eligible:s.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:E,topology:{edge_count:Array.from(T).length,max_fan_out_card:O.name,max_fan_out:O.fanOut}},cards:m}}function Vr(){return new Date().toISOString()}function ze(t,e,r,n,o,s,c){return async i=>{let d=[],m=r.cardStore.readCard(i.nodeId);if(!m)return "task-initiate-failure";let _=m.id,O=m.card_data??{},T=m.source_defs??[],E=T.filter(B=>B.optionalForCompletionGating!==true),S=r.cardRuntimeStore.readRuntime(_),R=false,C=()=>{R&&(r.cardRuntimeStore.writeRuntime(_,S),R=false);},v=B=>Be(S._sources[B]),h=(B,L)=>{S._sources[B]=Be(L),R=true;},b=i.taskState?.executionCount??0;if(S._lastExecutionCount!==b&&(S._sources={},S._lastExecutionCount=b,R=true),i.update){let B=i.update,L=B.outputFile;if(L){let K=v(L);if(B.failure){let ot=B.rqt??K.lastRequestedToken??K.queueRequestedToken;ot&&h(L,Le(K,ot));}else {let ot=B.rqt;if(!K.lastCompletedToken||ot>K.lastCompletedToken){let ft=typeof B.deliveryToken=="string"?B.deliveryToken:void 0,k=false;ft&&(k=r.fetchedSourcesStore.commitSourceData(_,L,ft)),k?h(L,Gr(K,ot)):h(L,Le(K,ot));}}C();}}let V={};for(let B of T)if(B.outputFile){let L=r.fetchedSourcesStore.readSourceData(_,B.outputFile);L!==null&&(V[B.bindTo]=L);}let D={};for(let[B,L]of Object.entries(i.state??{}))if(L!==null&&typeof L=="object"&&!Array.isArray(L)){let K=L[B];D[B]=K!==void 0?K:L;}else D[B]=L;let A={id:_,card_data:{...O},requires:D,source_defs:T,compute:m.compute};A._sourcesData=V,m.compute&&Kt.runSync(A,{sourcesData:V}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(_,A.computed_values??{});let P={...m},Q=Kt.enrichSourcesSync(Array.isArray(m.source_defs)?m.source_defs:void 0,{card_data:m.card_data,requires:D}),J=t.value;P.source_defs=Array.isArray(Q)?Q.map(B=>({...B,boardDir:typeof B.boardDir=="string"&&B.boardDir?B.boardDir:J})):Q;let W=Vr(),et=i.update?void 0:W,z=E.filter(B=>{let L=B.outputFile;if(typeof L!="string"||!L)return true;let K=v(L);et&&(K={...K,queueRequestedToken:et},h(L,K));let ot=K.queueRequestedToken??K.lastRequestedToken??W,ft=qe(K,ot);return ft==="in-flight"?false:ft==="dispatch"});if(C(),z.length>0){let B=false,L=W;for(let K of z){let ot=K.outputFile;if(typeof ot!="string"||!ot)continue;let ft=v(ot),k=ft.queueRequestedToken??W;h(ot,{...ft,lastRequestedToken:k}),L=k,B=true;}return B&&C(),B&&(d.push({taskKind:"source-fetch",payload:{boardRef:wt(t),enrichedCard:P,callbackToken:i.callbackToken,rqt:L}}),r.executionRequestStore.appendEntries(e,d)),"task-initiated"}if(E.some(B=>{let L=B.outputFile;if(typeof L!="string"||!L)return false;let K=v(L),ot=K.queueRequestedToken??K.lastRequestedToken??W;return qe(K,ot)==="in-flight"}))return "task-initiated";let xt=m.provides??[],Ot={};for(let{bindTo:B,ref:L}of xt)Ot[B]=Kt.resolve(A,L);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(Ot),T.filter(B=>{if(B.optionalForCompletionGating!==true)return false;let L=v(B.outputFile);return !L.lastRequestedToken||!L.lastCompletedToken?true:L.lastCompletedToken<=L.lastRequestedToken}).length>0&&d.push({taskKind:"source-fetch",payload:{boardRef:wt(t),enrichedCard:P,callbackToken:i.callbackToken,rqt:W}}),n(i.nodeId,Ot),d.length>0&&r.executionRequestStore.appendEntries(e,d),"task-initiated"}}var pe={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Ye(t){return {[Ft]:t.graph,[Me]:t.lastDrainedJournalId}}function Xe(t){let e=t[Ft],r=t[Me];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Ft}`);return {graph:e,lastDrainedJournalId:typeof r=="string"?r:""}}function We(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 st(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function nt(t){return {status:"fail",error:t}}function at(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Mr(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 Qe(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function oe(t){try{let e=JSON.parse(Qe(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ur(t){return Mr(JSON.stringify(t))}function Ze(t){try{let e=JSON.parse(Qe(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function ut(){return new Date().toISOString()}function tr(t,e){let r=e.onWarn??(()=>{}),n=wt(t);function o(k){if(k.length!==0)try{let f=e.publishBoardChangeNotifications?.(k);f&&typeof f.catch=="function"&&f.catch(x=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${x instanceof Error?x.message:String(x)}`));}catch(f){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${f instanceof Error?f.message:String(f)}`);}}function s(){let k=i().readCardStoreRef();if(!k)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(k);return {readIndex(){return f.read("_index")},writeIndex(x){f.write("_index",x);},readCard(x){return f.read(x)},writeCard(x,$){return f.write(x,$),e.hashFn($)},removeCard(x){f.delete(x);},cardExists(x){return f.read(x)!==null},defaultCardKey(x){return x}}}let c={readValues(k){let f=e.kvStorage("state-snapshot"),x=f.listKeys().sort();if(x.length===0)return {version:null,values:{}};let $={};for(let Z of x)$[Z]=f.read(Z);return {version:e.hashFn($),values:$}},writeValues(k,f,x){let $=e.kvStorage("state-snapshot");for(let Z of x)$.delete(Z);for(let[Z,M]of Object.entries(f))$.write(Z,M);return e.hashFn(f)}},i=()=>Ke(e.kvStorage("config")),d=()=>He(c),m=()=>Ge(e.journalAdapter()),_=()=>ee(s(),r),O=()=>{let k=i().readOutputsStoreRef();if(!k)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Je(e.kvStorageForRef(k))},T=()=>{let k=i().readArchiveStoreRef();return k?e.archiveFactoryForRef(k):e.archiveFactory()};function E(){return !!d().readSnapshot(t.value).values[Ft]}function S(){let k=d().readSnapshot(t.value);if(!k.values[Ft])throw new Error(`Board not initialized at ${t.value}`);return Xe(k.values)}function R(k,f){let x=d().commitSnapshot(t.value,{schemaVersion:re,expectedVersion:f,commitId:e.genId(),committedAt:ut(),deleteKeys:[],shallowMerge:Ye(k)});if(!x.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${f??"null"} current=${x.currentVersion??"null"}`)}function C(k){m().appendEvent(k);}async function v(){let k=(w,N)=>{let tt=w.payload,u=(tt?.enrichedCard??{}).id??tt?.cardId??"unknown";C({type:"task-failed",taskName:u,error:N,timestamp:ut()});},f=Ve(e.kvStorage("execution-requests"),k),x=Ue(e.kvStorage("card-runtime")),$=fe(e.blobStorage("sources"),w=>e.resolveBlob(w)),Z=new Map,M={readRuntime(w){return Z.get(w)??x.readRuntime(w)},writeRuntime(w,N){Z.set(w,N);}},ct=[],it=new Map,St={readSourceData(w,N){let tt=`${w}/${N}`;return it.has(tt)?it.get(tt):$.readSourceData(w,N)},ingestSourceDataStaged(w,N,tt,a){$.ingestSourceDataStaged(w,N,tt,a);},commitSourceData(w,N,tt){let a=`${w}/.staged/${tt}/${N}`,l=e.blobStorage("sources").read(a);if(l==null)return false;let p=`${w}/${N}`,g=l.trim();try{it.set(p,JSON.parse(g));}catch{it.set(p,g);}return ct.push({cardId:w,outputFile:N,deliveryToken:tt}),true},hasSource(w,N){let tt=`${w}/${N}`;return it.has(tt)?true:$.hasSource(w,N)}},dt={cardStore:_(),cardRuntimeStore:M,fetchedSourcesStore:St,outputStore:O(),executionRequestStore:f},Rt=S(),H=Qt(Rt.graph),{events:gt,newCursor:At}=m().readEntriesAfterCursor(Rt.lastDrainedJournalId),Ct=[],$t=[],Dt=[],Gt=new Map,Vt=(w,N)=>{Ct.push({type:"task-completed",taskName:w,data:N,timestamp:ut()});try{T().stream("exec-history").append({taskName:w,status:"completed",completedAt:ut()});}catch{}},Pt=(w,N)=>{C({type:"task-failed",taskName:w,error:N,timestamp:ut()});try{T().stream("exec-history").append({taskName:w,status:"failed",error:N,completedAt:ut()});}catch{}},Et=Ie(H,{handlers:{"card-handler":ze(t,At,dt,Vt,Pt,(w,N)=>{$t.push({cardId:w,values:N});},w=>{Dt.push(w);})}});for(Ct=gt;Ct.length>0;){let w=Ct;Ct=[];for(let N of w)if(N.type==="task-restart"){let tt=dt.cardStore.readCard(N.taskName);tt&&Gt.set(N.taskName,tt);}Et.pushAll(w),await Et.waitForHandlers();}let Bt=Et.getState();await Et.dispose({wait:true});let ae=d().readSnapshot(t.value).version;R({lastDrainedJournalId:At,graph:Mt(Bt)},ae);for(let{cardId:w,values:N}of $t)dt.outputStore.writeComputedValues(w,N);for(let w of Dt)dt.outputStore.writeDataObjects(w);for(let[w,N]of Z)x.writeRuntime(w,N);for(let{cardId:w,outputFile:N,deliveryToken:tt}of ct)$.commitSourceData(w,N,tt);let qt;try{qt=ne(n,Bt),dt.outputStore.writeStatusSnapshot(qt);}catch(w){r(`[board-live-cards-public] status publish failed: ${w instanceof Error?w.message:String(w)}`);}let jt=[];for(let{cardId:w,values:N}of $t)jt.push({kind:"computed_values",cardId:w,values:N});for(let w of Dt)for(let[N,tt]of Object.entries(w))N&&jt.push({kind:"data_object",key:N,payload:tt});for(let[w,N]of Gt)jt.push({kind:"card_refreshed",cardId:w,card:N});qt!==void 0&&jt.push({kind:"status",status:qt}),o(jt);let ie=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:wt({kind:"built-in",value:"source-cli-task-executor"})};f.dispatchEntriesForJournalId(At,w=>{if(w.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${w.taskKind}" \u2014 skipping`);return}let N=w.payload,tt=N.enrichedCard?.id??"unknown",a=N.enrichedCard?.source_defs??[];for(let u of a){if(!u.outputFile){r(`[dispatch] source "${u.bindTo}" has no outputFile \u2014 skipping`);continue}let l=Ur({cbk:N.callbackToken,rg:t.value,br:wt(t),cid:tt,b:u.bindTo,d:u.outputFile,cs:void 0,rqt:N.rqt});e.dispatchExecution(ie,{source_def:u,base_ref:wt(t),callback:{token:l,via:e.selfRef}}).catch(p=>Pt(tt,p instanceof Error?p.message:String(p)));}});}async function h(){try{let k=()=>{let x=S(),{events:$}=m().readEntriesAfterCursor(x.lastDrainedJournalId);$.length<=0||(h(),e.requestProcessAccumulated?.());},f=await he(e.lock,v,k);return st({ran:f!==!1})}catch(k){return at(k)}}function b(){h(),e.requestProcessAccumulated?.();}function q(k){try{let f=k.params?.cardStoreRef;if(!f)return nt("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!E()){let it=Zt(pe);R({lastDrainedJournalId:"",graph:Mt(it)},null);}let x=k.params?.outputsStoreRef;if(!x)return nt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let $=k.params?.scratchStoreRef,Z=k.params?.archiveStoreRef,M=i();M.writeCardStoreRef(f),M.writeOutputsStoreRef(x),$&&M.writeScratchStoreRef($),Z&&M.writeArchiveStoreRef(Z);let ct=k.body??{};ct["task-executor-ref"]&&M.writeTaskExecutorRef(ct["task-executor-ref"]),Object.prototype.hasOwnProperty.call(ct,"chat-handler-flow")&&M.writeChatHandlerFlow(ct["chat-handler-flow"]);try{O().writeStatusSnapshot(ne(n,Qt(S().graph)));}catch{}return st()}catch(f){return at(f)}}function V(k){try{let f=O().readStatusSnapshot();if(!f){f=ne(n,Qt(S().graph));try{O().writeStatusSnapshot(f);}catch{}}return st(f)}catch(f){return at(f)}}function D(k){try{let f=k.params?.id;return f?(C({type:"task-removal",taskName:f,timestamp:ut()}),b(),st()):nt("removeCard requires params.id")}catch(f){return at(f)}}function A(k){try{let f=k.params?.id;return f?(C({type:"task-restart",taskName:f,timestamp:ut()}),b(),st()):nt("retrigger requires params.id")}catch(f){return at(f)}}async function P(k){return h()}function Q(k){try{let f=k.params?.cardId,x=k.params?.all,$=!!k.params?.restart;if(!f&&!x)return nt("upsertCard requires --card-id <id> or --all");let Z=x?_().readAllCards().map(M=>M.id):[f];for(let M of Z)if(!_().readCard(M))return nt(`Card "${M}" not found in board at ${t.value}`);for(let M of Z){let ct=_().readCard(M),it=We(ct),St=e.hashFn(it),dt=e.kvStorage("card-upsert"),Rt=dt.read(M),H=Rt?.taskConfigHash!==St;if(!(!H&&!$)){if(H){let gt=Rt?.blobRef??_().readCardKey(M)??M;C({type:"task-upsert",taskName:M,taskConfig:it,timestamp:ut()}),dt.write(M,{blobRef:gt,taskConfigHash:St,updatedAt:ut()});}$&&C({type:"task-restart",taskName:M,timestamp:ut()});}}return b(),st()}catch(f){return at(f)}}function J(k){try{let f=k.params?.token;if(!f)return nt("taskFailed requires params.token");let x=k.params?.error??"unknown error",$=oe(f);if(!$)return nt("Invalid callback token");C({type:"task-failed",taskName:$.taskName,error:x,timestamp:ut()});try{T().stream("exec-history").append({taskName:$.taskName,status:"failed",error:x,completedAt:ut()});}catch{}return b(),st()}catch(f){return at(f)}}function W(k){try{let f=k.params?.token;if(!f)return nt("taskProgress requires params.token");let $=(k.body??{}).update??{},Z=oe(f);return Z?(C({type:"task-progress",taskName:Z.taskName,update:$,timestamp:ut()}),b(),st()):nt("Invalid callback token")}catch(f){return at(f)}}function et(k){try{let f=k.params?.token,x=k.params?.ref;if(!f)return nt("sourceDataFetched requires params.token");if(!x)return nt("sourceDataFetched requires params.ref");let $=Ze(f);if(!$)return nt("Invalid source token");let{cbk:Z,cid:M,b:ct,d:it,cs:St,rqt:dt}=$,Rt=fe(e.blobStorage("sources"),Ct=>e.resolveBlob(Ct)),H=e.genId();Rt.ingestSourceDataStaged(M,it,me(x),H);let gt=oe(Z);if(!gt)return nt("Invalid callback token embedded in source token");let At=ut();return C({type:"task-progress",taskName:gt.taskName,update:{bindTo:ct,outputFile:it,fetchedAt:At,deliveryToken:H,sourceChecksum:St,rqt:dt},timestamp:At}),b(),st()}catch(f){return at(f)}}function z(k){try{let f=k.params?.token,x=k.params?.reason??"unknown";if(!f)return nt("sourceDataFetchFailure requires params.token");let $=Ze(f);if(!$)return nt("Invalid source token");let{cbk:Z,b:M,d:ct,cs:it,rqt:St}=$,dt=oe(Z);return dt?(C({type:"task-progress",taskName:dt.taskName,update:{bindTo:M,outputFile:ct,failure:!0,reason:x,sourceChecksum:it,rqt:St},timestamp:ut()}),b(),st()):nt("Invalid callback token embedded in source token")}catch(f){return at(f)}}function vt(k){try{let f=i().readCardStoreRef();return f?st({storeRef:f}):nt(`Board at ${t.value} has no card store configured`)}catch(f){return at(f)}}function xt(k){try{let f=i().readOutputsStoreRef();return f?st({storeRef:f}):nt(`Board at ${t.value} has no outputs store configured`)}catch(f){return at(f)}}function Ot(k){try{let f=i().readScratchStoreRef();return st({storeRef:f})}catch(f){return at(f)}}function Jt(k){try{let f=i().readArchiveStoreRef();return st({storeRef:f})}catch(f){return at(f)}}function B(k){try{let f=k.params?.key;if(!f)return nt("getConfig requires params.key");let x=i(),$;switch(f){case "task-executor":$=x.readTaskExecutorRef()??null;break;case "chat-handler-flow":$=x.readChatHandlerFlow()??null;break;case "card-store-ref":$=x.readCardStoreRef();break;case "outputs-store-ref":$=x.readOutputsStoreRef();break;case "scratch-store-ref":$=x.readScratchStoreRef();break;case "archive-store-ref":$=x.readArchiveStoreRef();break;default:return nt(`getConfig: unknown key "${f}"`)}return st({value:$})}catch(f){return at(f)}}function L(k){try{let f=k.params?.key;if(!f)return nt("getOutputsDataObject requires params.key");let x=O().readDataObject(f);return st(x)}catch(f){return at(f)}}function K(k){try{return st(O().readAllDataObjects())}catch(f){return at(f)}}function ot(k){try{let f=k.params?.key;if(!f)return nt("getOutputsComputedValues requires params.key");let x=O().readComputedValues(f);return st(x)}catch(f){return at(f)}}function ft(k){try{return st(O().readAllComputedValues())}catch(f){return at(f)}}return {init:q,status:V,getCardStoreRef:vt,getOutputsStoreRef:xt,getScratchStoreRef:Ot,getArchiveStoreRef:Jt,getConfig:B,getOutputsDataObject:L,getAllOutputsDataObjects:K,getOutputsComputedValues:ot,getAllOutputsComputedValues:ft,removeCard:D,retrigger:A,processAccumulatedEvents:P,upsertCard:Q,taskFailed:J,taskProgress:W,sourceDataFetched:et,sourceDataFetchFailure:z}}function er(t){function e(o){return {status:"success",data:o}}function r(o){return {status:"fail",error:o}}function n(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let c=t.readCard(s);return c?e({cards:[c]}):r(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return n(s)}},set(o){try{let s=o.body;if(s==null)return r("set requires a body (card object or array of cards)");let c=Array.isArray(s)?s:[s];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(s){return n(s)}},del(o){try{let s=o.body?.ids??[],c=o.params?.id,i=c?[...s,c]:s;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let d of i)t.removeCard(d);return e({count:i.length})}catch(s){return n(s)}},patch(o){try{let s=o.params?.id,c=o.params?.path;if(!s)return r("patch requires params.id");if(!c)return r("patch requires params.path");let i=o.body,d=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:o.body;return t.patchCard(s,c,d),e({count:1})}catch(s){return n(s)}}}}function rr(){return new Date().toISOString()}function nr(t){return new TextEncoder().encode(t).byteLength}function Hr(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function Kr(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function Jr(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 zr(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Yr(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Xr(t){let e=Jr(t),r=e.lastIndexOf(".");return r<=0||r===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,r),ext:e.slice(r)}}function Wr(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function or(t){function e(r){let n=t.stat?Hr(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:nr(o)}}return {exists(r){return t.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){t.write(r,n);let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??rr(),s.size=s.size??nr(n),s},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 s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??rr(),s.size=s.size??n.byteLength,s},getText(r){let n=t.read(r);if(n===null){if(!t.readBytes)return null;let o=t.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(t.readBytes){let o=t.readBytes(r);if(o!==null)return o}let n=t.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:e,list(r=""){return t.listKeys(r).map(n=>e(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){t.remove(r);}}}function sr(t){function e(o,s){let c=0,i=[];Array.isArray(s)&&i.push(...s);for(let d of t.list(`${o}/`))i.push(Wr(d.key));for(let d of i){let m=Kr(d);Number.isFinite(m)&&m>c&&(c=m);}return c+1}function r(o,s,c){let i=Number(c?.maxLen||32),{stem:d,ext:m}=Xr(o),_=Yr(m),O=zr(d),T=`${String(s).padStart(3,"0")}-`,E=_,S=i-T.length-E.length;S<1&&(E="",S=i-T.length);let R=O.slice(0,Math.max(1,S)),C=`${T}${R}${E}`;return C.length>i&&(C=C.slice(0,i).replace(/\.$/,"")),C}function n(o,s,c){let i=e(o,c?.seedNames),d=r(s,i,{maxLen:c?.maxLen});for(;t.exists(`${o}/${d}`);)i+=1,d=r(s,i,{maxLen:c?.maxLen});return d}return {nextSerial:e,buildStoredName:r,allocateStoredName:n}}function ar(){function t(o,s){if(!Array.isArray(o))return [];let c=[];for(let i of o){if(!i||typeof i!="object")continue;let d=i;typeof d.stored_name=="string"&&c.push({name:typeof d.name=="string"?d.name:d.stored_name,stored_name:d.stored_name,size:typeof d.size=="number"&&Number.isFinite(d.size)?d.size:null,mime_type:typeof d.mime_type=="string"?d.mime_type:null,path:typeof d.path=="string"?d.path:null,uploaded_at:typeof d.uploaded_at=="string"?d.uploaded_at:s||null});}return c}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function r(o,s){let c=e(o);if(s.length===0)return o.files=c,c;let i=new Set(c.map(d=>d.stored_name));for(let d of s)i.has(d.stored_name)||(c.push(d),i.add(d.stored_name));return o.files=c,c}function n(o,s,c){let i=e(o);if(!Number.isInteger(s)||s<0||s>=i.length)return {ok:false,reason:"index_out_of_range"};let d=i[s];return !d||!d.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==d.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:d}}return {read:e,normalizeIncoming:t,merge:r,resolve:n}}function Zr(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function ir(){let t=new Map,e=new Map;function r(n){return t.has(n)||t.set(n,[]),t.get(n)}return {append(n,o,s,c=[]){let i={id:Zr(),role:o,text:s,files:c,updated_at:new Date().toISOString()};return r(n).push(i),i.id},readAll(n){return r(n).slice()},readAfter(n,o){let s=r(n);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let c=s.findIndex(d=>d.id===o),i=c===-1?s.slice():s.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 s=e.get(`c:${n}`)??{};e.set(`c:${n}`,{...s,...o});}}}function ur(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,d="command envelope"){let m=typeof i.cardId=="string"?i.cardId:void 0;if(!i.command)return r(`chat-store: ${d} missing "command"`);if(!m)return r(`chat-store: ${d} missing "cardId"`);if(i.command==="append")return c.append({params:{cardId:m},body:{role:i.role,text:i.text,files:i.files}});if(i.command==="read-all")return c.readAll({params:{cardId:m}});if(i.command==="read-after")return c.readAfter({params:{cardId:m},body:{cursor:i.cursor??null}});if(i.command==="clear")return c.clear({params:{cardId:m}});if(i.command==="set-processing")return c.setProcessing({params:{cardId:m},body:{active:i.active}});if(i.command==="is-processing")return c.isProcessing({params:{cardId:m}});if(i.command==="get-config")return c.getConfig({params:{cardId:m}});if(i.command==="set-config"){let{command:_,cardId:O,...T}=i;return c.setConfig({params:{cardId:m},body:T})}return r(`chat-store: unknown command "${String(i.command)}"`)}function s(i){if(!Array.isArray(i.commands)||i.commands.length===0)return r('chat-store: command envelope must include a non-empty "commands" array');let d=[];for(let m=0;m<i.commands.length;m+=1){let _=i.commands[m];if(!_||typeof _!="object"||Array.isArray(_))return r(`chat-store: command envelope entry ${m} must be an object`);let O={cardId:i.cardId,..._},T=o(O,`command envelope entry ${m}`);if(T.status!=="success")return T;d.push({index:m,command:String(O.command),data:T.data});}return e({results:d})}let c={append(i){try{let d=i.params?.cardId;if(!d)return r("append requires params.cardId");let m=i.body??{},_=typeof m.role=="string"?m.role:"",O=typeof m.text=="string"?m.text:"",T=Array.isArray(m.files)?m.files:[];if(!_)return r("append requires body.role");let E=t.append(d,_,O,T);return e({id:E})}catch(d){return n(d)}},readAll(i){try{let d=i.params?.cardId;return d?e({records:t.readAll(d)}):r("readAll requires params.cardId")}catch(d){return n(d)}},readAfter(i){try{let d=i.params?.cardId;if(!d)return r("readAfter requires params.cardId");let _=(i.body??{}).cursor??null;return e(t.readAfter(d,_))}catch(d){return n(d)}},clear(i){try{let d=i.params?.cardId;return d?(t.clear(d),e({ok:!0})):r("clear requires params.cardId")}catch(d){return n(d)}},setProcessing(i){try{let d=i.params?.cardId;if(!d)return r("setProcessing requires params.cardId");let m=i.body??{};return typeof m.active!="boolean"?r("setProcessing requires body.active (boolean)"):(t.setProcessing(d,m.active),e({ok:!0}))}catch(d){return n(d)}},isProcessing(i){try{let d=i.params?.cardId;return d?e({active:t.isProcessing(d)}):r("isProcessing requires params.cardId")}catch(d){return n(d)}},getConfig(i){try{let d=i.params?.cardId;return d?e({config:t.getConfig(d)}):r("getConfig requires params.cardId")}catch(d){return n(d)}},setConfig(i){try{let d=i.params?.cardId;if(!d)return r("setConfig requires params.cardId");let m=i.body??{};return t.setConfig(d,m),e({ok:!0})}catch(d){return n(d)}},run:o,runBatch:s};return c}var cr={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Qr=32;function tn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function dr(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 lr(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)lr(t,n);return}r.kind==="status"&&dr(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 ro(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),r={...cr,...t.corsHeaders||{}},n=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,c=t.chatFlowRunner||null,i=t.chatStorage??ir(),d=ur(i),m=t.notificationTransport||null,_=t.serverUrl||null,O=t.executionExtra||{},T=new Map,E=new Map,S=new Map,R=null;function C(a){let u=tr(a.baseRef,a.boardAdapter),l=a.boardAdapter.kvStorageForRef(a.cardStoreRef),g=er(ee({readIndex:()=>l.read("_index"),writeIndex:I=>l.write("_index",I),readCard:I=>l.read(I),writeCard:(I,Y)=>(l.write(I,Y),I),cardExists:I=>l.read(I)!==null,defaultCardKey:I=>I},o.warn)),y=a.artifactsAdapter||a.boardAdapter,j=a.filesArtifactsStore??null,F=null;return {label:a.label,board:u,cardStore:g,get filesArtifacts(){return F??=j??or(y.blobStorage("files"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,scratchStoreRef:a.scratchStoreRef,archiveStoreRef:a.archiveStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:tn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let v=t.boards.map(C),h=new Map;function b(a){return h.get(a)??0}function q(a){let u=v[b(a)];return {files:u?u.filesArtifacts:null}}function V(a){let u=q(a);return u.files?sr(u.files):null}function D(){return ar()}function A(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function P(a){if(!a||a.notificationTeardown||!m||!a.notifyRef)return;let u=await m.subscribe(a.notifyRef,l=>{lr(a.notification,l);let p=l.kind==="notification-batch"?l.notifications:[l];w(p);});a.notificationTeardown=u;}async function Q(a){if(!a||a.initialized)return;let u={cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef};a.scratchStoreRef&&(u.scratchStoreRef=a.scratchStoreRef),a.archiveStoreRef&&(u.archiveStoreRef=a.archiveStoreRef);let l={};a.taskExecutorRef&&(l["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(l["chat-handler-flow"]=a.chatHandlerFlow),a.inferenceAdapterRef&&(l["inference-adapter-ref"]=a.inferenceAdapterRef);let p=a.board.init({params:u,body:l});if(p.status!=="success")throw Object.assign(new Error(p.error||`init failed for ${a.label}`),{statusCode:500});if(await P(a),!a.chatHandlerFlow&&a.chatHandlerRef&&s.describe)try{let g=await s.describe(a.chatHandlerRef);g&&g.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${g.kind}", expected "chat-handler" for ${a.label}`):g&&o.info(`[init] chat-handler validated: ${g.name} (protocol ${g.protocolVersion}) for ${a.label}`);}catch(g){o.warn(`[init] chat-handler describe failed for ${a.label}: ${g?.message||String(g)}`);}a.initialized=true;}function J(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let u=[],l=a.board.status({});l.status==="success"&&l.data!=null&&dr(l.data)&&u.push({kind:"status",status:l.data});let p=a.board.getAllOutputsDataObjects({});if(p.status==="success"&&p.data!=null)for(let[y,j]of Object.entries(p.data))y&&u.push({kind:"data_object",key:y,payload:j});let g=a.board.getAllOutputsComputedValues({});if(g.status==="success"&&g.data!=null)for(let[y,j]of Object.entries(g.data))y&&u.push({kind:"computed_values",cardId:y,values:j});u.length>0&&a.boardAdapter.publishBoardChangeNotifications(u);}function W(a,u){if(!a||a.cardsBootstrapped)return;let l=a.cardStore.get({}),p=l.status==="success"&&Array.isArray(l.data?.cards)?l.data.cards:[];for(let g of p)typeof g.id=="string"&&(h.set(g.id,u),a.board.upsertCard({params:{cardId:g.id}}));a.cardsBootstrapped=true;}async function et(){for(let a of v)await Q(a);}async function z(){await et();for(let a=0;a<v.length;a++)J(v[a]),W(v[a],a);}function vt(a){return v[b(a)]??null}function xt(a){let u=vt(a);if(!u)return null;let l=u.cardStore.get({params:{id:a}});if(l.status!=="success")return null;let p=Array.isArray(l.data?.cards)?l.data.cards:[];return p.length>0?p[0]:null}function Ot(){let a=l=>{if(!l||!l.cardStore)return [];let p=l.cardStore.get({});return p.status!=="success"||!Array.isArray(p.data?.cards)?[]:p.data.cards},u=[];for(let l of v)u.push(...a(l));return u}function Jt(){let a=v.map(y=>{try{let F=y.boardAdapter.kvStorageForRef(y.outputsStoreRef).read("status");if(F!=null)return F}catch{}return y.notification.status}).filter(Boolean);if(a.length===0)return null;if(a.length===1)return a[0];let u=[],l=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],p={};for(let y of l)p[y]=0;for(let y of a){let j=y,F=Array.isArray(j.cards)?j.cards:[];u.push(...F);for(let I of l)p[I]+=Number(j?.summary?.[I]||0);}let g=a[0];return {...g,cards:u,summary:{...g.summary||{},card_count:u.length,...p}}}function B(){let a={},u=l=>{for(let[p,g]of Object.entries(l.notification.computedValues)){let y=l.notification.cards[p];a[p]={schema_version:"v1",card_id:p,card_data:y?.card_data??{},computed_values:g??{}};}};for(let l of v)u(l);return a}function L(){let a={};for(let u of v)Object.assign(a,u.notification.dataObjects||{});return a}function K(){let a=Ot(),u=B(),l=L(),p={};for(let y of a){if(!y?.id)continue;let j=y.id,F=u[j]||{},I={...F.card_data&&typeof F.card_data=="object"?F.card_data:y.card_data&&typeof y.card_data=="object"?y.card_data:{}};p[j]={schema_version:F.schema_version||"v1",card_id:F.card_id||j,card_data:I,computed_values:F.computed_values&&typeof F.computed_values=="object"?F.computed_values:{}};}let g={};for(let y of a){if(!y?.id)continue;let j=y.id;try{let F=M(j),I=i.isProcessing(j);(F.length>0||I)&&(g[j]={messages:F.map(Y=>({role:String(Y.role||"system"),text:String(Y.text||""),files:Array.isArray(Y.files)?Y.files:[]})),receiving:!1,processing:I});}catch{}}return {boardId:n,cardDefinitions:a,statusSnapshot:Jt(),dataObjectsByToken:l,cardRuntimeById:p,cardChatsByCardId:g}}function ot(a,u,l){let p=l?.syncBoard!==false,g=vt(a);if(!g)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let y=xt(a);if(!y)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let j=u(y)||y,F=g.cardStore.set({body:j});if(F.status!=="success")throw Object.assign(new Error(F.error||`Failed to persist card: ${a}`),{statusCode:500});if(p){let I=g.board.upsertCard({params:{cardId:a,restart:true}});if(I.status!=="success")throw Object.assign(new Error(I.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function ft(a,u){ot(a,u,{syncBoard:true});}function k(a,u){ot(a,u,{syncBoard:false});}function f(a,u){ft(a,l=>{if(!u||typeof u!="object"||Object.keys(u).length===0)return l;function p(g,y,j){let F=String(y||"").split(".").filter(Boolean);if(!F.length)return;let I=g;for(let Y=0;Y<F.length-1;Y++){let rt=F[Y];(!I[rt]||typeof I[rt]!="object")&&(I[rt]={}),I=I[rt];}I[F[F.length-1]]=j;}if(u.fieldValues!==void 0&&u.fieldValues!==null){let g=null,y=l.view;if(y&&Array.isArray(y.elements)){for(let j of y.elements)if(j?.data&&j.data.writeTo){g=j.data.writeTo;break}}g?p(l,g,u.fieldValues):typeof u.fieldValues=="object"&&!Array.isArray(u.fieldValues)&&(l.card_data={...l.card_data||{},...u.fieldValues});}else {if(Array.isArray(u._stagedFiles)&&u._stagedFiles.length>0)return l;for(let[g,y]of Object.entries(u))g!=="_stagedFiles"&&(y!==null&&typeof y=="object"&&!Array.isArray(y)&&l[g]!==null&&typeof l[g]=="object"&&!Array.isArray(l[g])?l[g]={...l[g],...y}:l[g]=y);}return l});}function x(a){let u=String(a||"").trim();if(!u)return "upload.bin";let l=Math.max(u.lastIndexOf("/"),u.lastIndexOf("\\"));return (l>=0?u.slice(l+1):u)||"upload.bin"}function $(a){i.clear(a),i.setProcessing(a,false);}function Z(a,u,l,p){let g=typeof l=="string"?l.trim():"";return i.append(a,u,g,p)}function M(a){return i.readAll(a)}function ct(a){let u=[];try{let l=xt(a);if(!l)return u;let p=D().read(l.card_data&&typeof l.card_data=="object"?l.card_data:null);for(let g of p)u.push(g.stored_name);}catch{}return u}function it(a,u,l,p){let g=A(a),y=q(a),j=x(u),F=V(a),I=F?F.allocateStoredName(g,j,{seedNames:ct(a),maxLen:Qr}):`${String(Date.now())}-${j}`;return y.files&&y.files.putBytes(`${g}/${I}`,new Uint8Array(p),l||"application/octet-stream"),{name:j,stored_name:I,size:p.length,mime_type:l||"application/octet-stream",path:`${a}/files/${I}`,uploaded_at:new Date().toISOString()}}function St(a){let u=vt(a);if(!u)return null;let l=u.board.getConfig({params:{key:"chat-handler-flow"}}),p=l.status==="success"?l.data?.value:null,g=u.chatHandlerRef;return p==null&&(!g||typeof g!="object")?null:{ctx:u,handlerFlow:p,handlerRef:g}}function dt(a,u,l=false){let p=St(a);if(!p)return;let{ctx:g,handlerFlow:y,handlerRef:j}=p;if(!l)try{i.setProcessing(a,!0);}catch{}let F={boardId:n,cardId:String(a),lastChatEntryId:u,...O,..._?{serverUrl:_}:{}};if(!c&&y!=null){try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${a}" but no chatFlowRunner was provided`);return}if(y!=null){let Y=c;if(!Y)return;Y.run(y,F,{boardId:n,cardId:String(a),label:g.label,logger:o,serverUrl:_,executionExtra:O}).then(rt=>{if(rt.dispatched)o.info(`[chat-handler-flow] invoked for card "${a}" (boardId: "${n}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${a}": ${rt.error||"unknown"}`);}},rt=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${a}": ${rt?.message||String(rt)}`);});return}let I=j;I&&s.invoke(I,F).then(Y=>{if(Y.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${n}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${a}": ${Y.error||"unknown"}`);}},Y=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${a}": ${Y?.message||String(Y)}`);});}function Rt(a,u,l){let p=u==="chat-send"?k:ft,g;p(a,y=>{let j=new Date().toISOString(),F=y.card_data&&typeof y.card_data=="object"?y.card_data:{};if(y.card_data=F,u==="chat-send"){let I=l&&typeof l.text=="string"?l.text.trim():"",Y=[];if(Array.isArray(l?.files)){for(let rt of l.files)if(rt){if(typeof rt=="string"){Y.push({name:rt});continue}if(typeof rt=="object"){let lt=rt;typeof lt.name=="string"&&Y.push({name:lt.name,size:lt.size,mime_type:lt.mime_type,path:lt.path,uploaded_at:lt.uploaded_at,stored_name:lt.stored_name});}}}if(I||Y.length>0){let rt=d.runBatch({cardId:a,commands:[{command:"append",role:"user",text:I,files:Y},{command:"set-processing",active:true}]});if(rt.status!=="success")throw new Error(rt.error);let lt=rt.data.results[0]?.data?.id;if(typeof lt!="string"||!lt)throw new Error(`chat-send did not return an append id for card ${a}`);g={cardId:a,lastEntryId:lt,processingAlreadySet:true};for(let G of Y){if(!G||typeof G!="object")continue;let X=typeof G.name=="string"?G.name:"file",mt=typeof G.stored_name=="string"?G.stored_name:null;mt&&Z(a,"system",`File ${X} uploaded as ${mt}.`,[]);}try{let G=M(a);w([{kind:"card_chats",cardId:a,messages:G.map(X=>({role:String(X.role||"system"),text:String(X.text||""),files:Array.isArray(X.files)?X.files:[]})),receiving:!0,processing:i.isProcessing(a)}]);}catch{}}return y}if(u==="file-upload"){let I=D().normalizeIncoming(l?.files,j);return I.length>0&&D().merge(F,I),y}if(u==="action"){let I=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!I)return y;F.lastAction={buttonId:I,at:j},F.lastActionText=`${I} @ ${j}`;}return y}),g&&dt(g.cardId,g.lastEntryId,g.processingAlreadySet);}function H(a,u,l){let p=JSON.stringify(l),g=typeof Buffer<"u"?Buffer.byteLength(p):new TextEncoder().encode(p).length;a.writeHead(u,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":g}),a.end(p);}async function gt(a){let u=[];for await(let p of a)u.push(p);let l=typeof Buffer<"u"?Buffer.concat(u).toString("utf-8").trim():new TextDecoder().decode(Ct(u)).trim();return l?JSON.parse(l):{}}async function At(a){let u=[];for await(let l of a)u.push(l);return typeof Buffer<"u"?Buffer.concat(u):Ct(u)}function Ct(a){let u=a.reduce((g,y)=>g+y.length,0),l=new Uint8Array(u),p=0;for(let g of a)l.set(g,p),p+=g.length;return l}let $t=0;function Dt(a){let u=JSON.stringify(a);return $t++,`id: ${$t}
1
+ import {createRequire}from'module';import'ajv-formats';var Wt="b64:";function gr(t){let e=new TextEncoder().encode(t),r=globalThis.Buffer,n;if(r)n=r.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function mr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),r=globalThis.Buffer;if(r)return r.from(e,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(e),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function vt(t){return `${Wt}${gr(JSON.stringify(t))}`}function me(t){if(!t.startsWith(Wt))throw new Error(`Invalid ref format (expected ${Wt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(mr(t.slice(Wt.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 he(t,e,r){let n=t.tryAcquire();if(!n)return false;try{await e();}finally{n();}return r?.(),true}var Tt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function pt(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function It(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ye(t){return t.tasks??{}}function ce(t){return t?t.status===Tt.FAILED||t.status===Tt.INACTIVATED:false}function ke(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function Se(t){return t.maxExecutions}function Ce(t,e){let r=new Set;for(let[n,o]of Object.entries(e))if(o.status===Tt.COMPLETED){let s=t.tasks[n];s&&pt(s).forEach(i=>r.add(i));}return Array.from(r)}function Re(t,e){let r={};return t.forEach(n=>{let o=e[n];if(!o)return;pt(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function be(t,e,r){let n=t.tasks[e]??Zt(),o={};if(r){let c=r.tasks[e],i=It(c);for(let d of i)for(let[m,_]of Object.entries(r.tasks))if(pt(_).includes(d)){let O=t.tasks[m];O?.lastDataHash&&(o[d]=O.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function we(t,e,r,n,o,s){let c=t.tasks[r]??Zt(),i=e.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let d;n&&i.on&&i.on[n]?d=i.on[n]:d=pt(i);let m=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let T=i.requires??[];for(let E of T)for(let[S,R]of Object.entries(e.tasks))if(pt(R).includes(E)){let C=t.tasks[S];C?.lastDataHash&&(m[E]=C.lastDataHash);break}}let _={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:m,error:void 0},O=[...new Set([...t.availableOutputs,...d])];return {...t,tasks:{...t.tasks,[r]:_},availableOutputs:O,lastUpdated:new Date().toISOString()}}function ve(t,e,r,n){let o=t.tasks[r]??Zt(),s=e.tasks[r];if(s?.retry){let d=o.retryCount+1;if(d<=s.retry.max_attempts){let m={...o,status:"not-started",retryCount:d,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:m},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(s?.on_failure&&s.on_failure.length>0&&(i=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&c.executionCount>=s.circuit_breaker.max_executions){let d=s.circuit_breaker.on_break;i=[...new Set([...i,...d])];}return {...t,tasks:{...t.tasks,[r]:c},availableOutputs:i,lastUpdated:new Date().toISOString()}}function xe(t,e,r,n){let o=t.tasks[e]??Zt(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Ae(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 Zt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Qt(t,e){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(t.tasks))n[s]=_e();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 hr(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:be(n,e.taskName,r)};case "task-completed":return {config:r,state:we(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:ve(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:xe(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:Ae(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:wr(n,e.action)};case "task-upsert":return yr(t,e.taskName,e.taskConfig);case "task-removal":return kr(t,e.taskName);case "node-requires-add":return Sr(t,e.nodeName,e.tokens);case "node-requires-remove":return Cr(t,e.nodeName,e.tokens);case "node-provides-add":return Rr(t,e.nodeName,e.tokens);case "node-provides-remove":return br(t,e.nodeName,e.tokens);default:return t}}function Ee(t,e){return e.reduce((r,n)=>hr(r,n),t)}function yr(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]:_e()},lastUpdated:new Date().toISOString()}}}function kr(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function Sr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=It(n),s=r.filter(c=>!o.includes(c));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...o,...s]}}},state:t.state}}function Cr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=It(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:s}}},state:t.state}}function Rr(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=pt(n),s=r.filter(c=>!o.includes(c));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...o,...s]}}},state:t.state}}function br(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=pt(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:s}}},state:t.state}}function Mt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function te(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 _e(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function wr(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 Ut(t){let{config:e,state:r}=t,n=ye(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=vr(n),c=Ce(e,r.tasks),i=new Set([...c,...r.availableOutputs]),d=[],m=[],_=[],O=[];for(let[E,S]of Object.entries(n)){let R=r.tasks[E],C=ke(S,e.settings),v=C!=="once";if(R?.status===Tt.RUNNING||ce(R))continue;let h=Se(S);if(h!==void 0&&R&&R.executionCount>=h||S.circuit_breaker&&R&&R.executionCount>=S.circuit_breaker.max_executions||!v&&R?.status===Tt.COMPLETED)continue;if(v&&R?.status===Tt.COMPLETED){let A=It(S),P=false;switch(C){case "data-changed":{A.length>0&&A.some(J=>{for(let[X,et]of Object.entries(n))if(pt(et).includes(J)){let z=r.tasks[X];if(!z)continue;let xt=R.lastConsumedHashes?.[J];return z.lastDataHash==null?z.executionCount>R.lastEpoch:z.lastDataHash!==xt}return false})||(P=true);break}case "epoch-changed":{A.length>0&&A.some(J=>{for(let[X,et]of Object.entries(n))if(pt(et).includes(J)){let z=r.tasks[X];if(z&&z.executionCount>R.lastEpoch)return true}return false})||(P=true);break}case "time-based":{let W=S.refreshInterval??0;if(W<=0){P=true;break}let J=R.completedAt;if(!J){P=true;break}(Date.now()-Date.parse(J))/1e3<W&&(P=true);break}case "manual":P=true;break}if(P)continue}let b=It(S);if(b.length===0){d.push(E);continue}let q=[],G=[],D=[];for(let A of b){if(i.has(A))continue;let P=s[A]||[];P.length===0?q.push(A):P.every(J=>ce(r.tasks[J]))?D.push({token:A,failedProducer:P[0]}):G.push(A);}q.length>0?_.push({taskName:E,missingTokens:q}):D.length>0?O.push({taskName:E,failedTokens:D.map(A=>A.token),failedProducers:[...new Set(D.map(A=>A.failedProducer))]}):G.length>0?m.push({taskName:E,waitingOn:G}):d.push(E);}let T={};if(d.length>1){let E=Re(d,n);for(let[S,R]of Object.entries(E))R.length>1&&(T[S]=R);}return {eligible:d,pending:m,unresolved:_,blocked:O,conflicts:T}}function vr(t){let e={};for(let[r,n]of Object.entries(t)){for(let o of pt(n))e[o]||(e[o]=[]),e[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(r)||e[s].push(r);if(n.on_failure)for(let o of n.on_failure)e[o]||(e[o]=[]),e[o].includes(r)||e[o].push(r);}return e}var Ht=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function de(t){let e=le(t);return xr(e)}function le(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(le).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+le(e[n])).join(",")+"}"}function xr(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 Ar(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 Er(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Te(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Ar(e)}function _r(t){try{let e=JSON.parse(Er(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ie(t,e,r){let{handlers:n,onDrain:o}=e,s=new Ht,c="state"in t&&"config"in t?t:Qt(t),i=false,d=new Set,m=new Map(Object.entries(n)),_=new Ht,O=false,T=false;function E(){if(!i){if(O){T=true;return}O=true;try{do T=!1,S();while(T)}finally{O=false;}}}function S(){let h=_.drain(),b=s.drain(),q=[...h,...b];q.length>0&&(c=Ee(c,q));let G=Ut(c);q.length>0&&o?.(q,c,G);for(let D of G.eligible)v(D);for(let D of q)if(D.type==="task-progress"){let{taskName:A,update:P}=D;if(!c.config.tasks[A])continue;let J=c.state.tasks[A];if(!J||J.status!=="running")continue;let X=Te(A),et=C(A,X,P).catch(z=>{i||(_.append({type:"task-failed",taskName:A,error:z.message??String(z),timestamp:new Date().toISOString()}),E());}).finally(()=>{d.delete(et);});d.add(et);}}function R(h){let q=c.config.tasks[h].requires??[],G=new Map;for(let[A,P]of Object.entries(c.config.tasks))for(let W of P.provides??[])G.set(W,A);let D={};for(let A of q){let P=G.get(A);P?D[A]=c.state.tasks[P]?.data:D[A]=void 0;}return D}async function C(h,b,q){let G=c.config.tasks[h],D=G.taskHandlers??[],A=R(h);for(let P of D){let W=m.get(P);if(!W)throw new Error(`Handler '${P}' not found in registry (task '${h}')`);let J={nodeId:h,state:A,taskState:c.state.tasks[h],config:G,callbackToken:b,update:q};if(await W(J)==="task-initiate-failure")throw new Error(`Handler '${P}' returned task-initiate-failure (task '${h}')`)}}function v(h){let q=c.config.tasks[h]?.taskHandlers;if(!q||q.length===0)return;_.append({type:"task-started",taskName:h,timestamp:new Date().toISOString()}),E();let G=Te(h),D=C(h,G).catch(A=>{i||(_.append({type:"task-failed",taskName:h,error:A.message??String(A),timestamp:new Date().toISOString()}),E());}).finally(()=>{d.delete(D);});d.add(D);}return {push(h){i||(h.type==="task-completed"&&h.data&&!h.dataHash&&(h={...h,dataHash:de(h.data)}),s.append(h),E());},pushAll(h){if(!i){for(let b of h)b.type==="task-completed"&&b.data&&!b.dataHash?s.append({...b,dataHash:de(b.data)}):s.append(b);E();}},resolveCallback(h,b,q){if(i)return;let G=_r(h);if(!G)return;let{taskName:D}=G;if(c.config.tasks[D]){if(q&&q.length>0)s.append({type:"task-failed",taskName:D,error:q.join("; "),timestamp:new Date().toISOString()});else {let A=b&&Object.keys(b).length>0?de(b):void 0;s.append({type:"task-completed",taskName:D,data:b,dataHash:A,timestamp:new Date().toISOString()});}E();}},addNode(h,b){i||(s.append({type:"task-upsert",taskName:h,taskConfig:b,timestamp:new Date().toISOString()}),E());},removeNode(h){i||(s.append({type:"task-removal",taskName:h,timestamp:new Date().toISOString()}),E());},addRequires(h,b){i||(s.append({type:"node-requires-add",nodeName:h,tokens:b,timestamp:new Date().toISOString()}),E());},removeRequires(h,b){i||(s.append({type:"node-requires-remove",nodeName:h,tokens:b,timestamp:new Date().toISOString()}),E());},addProvides(h,b){i||(s.append({type:"node-provides-add",nodeName:h,tokens:b,timestamp:new Date().toISOString()}),E());},removeProvides(h,b){i||(s.append({type:"node-provides-remove",nodeName:h,tokens:b,timestamp:new Date().toISOString()}),E());},registerHandler(h,b){m.set(h,b);},unregisterHandler(h){m.delete(h);},retrigger(h){i||c.config.tasks[h]&&(s.append({type:"task-restart",taskName:h,timestamp:new Date().toISOString()}),E());},retriggerAll(h){if(!i){for(let b of h)c.config.tasks[b]&&s.append({type:"task-restart",taskName:b,timestamp:new Date().toISOString()});E();}},snapshot(){return Mt(c)},getState(){return c},getSchedule(){return Ut(c)},async waitForHandlers(){d.size>0&&await Promise.allSettled([...d]);},async dispose(h){h?.wait&&d.size>0&&await Promise.allSettled([...d]),i=true;}}}var Ir=createRequire(import.meta.url);Ir("./jsonata-sync.cjs");var jr=createRequire(import.meta.url),ee=jr("./jsonata-sync.cjs"),Ne=ee;function Oe(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 Fe(t,e,r){let n=e.split("."),o=t;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Nr(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await ee(o.expr).evaluate(n);Fe(t.computed_values,o.bindTo,s),n.computed_values=t.computed_values;}catch{}return t}function Fr(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let c=Ne(s.expr).evaluate(n);Fe(t.computed_values,s.bindTo,c),n.computed_values=t.computed_values;}catch(c){let i=c instanceof Error?c.message:String(c);o.push({bindTo:s.bindTo,error:i});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function $r(t,e,r){let n={...r??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return ee(t).evaluate(n)}function Dr(t,e){return e.startsWith("fetched_sources.")?Oe(t._sourcesData??{},e.slice(16)):Oe(t,e)}var je=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Pr=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Br(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))Pr.has(n)||e.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&e.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))e.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&e.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&e.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&e.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))e.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,c)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${c}]: must be an object`);else {let i=s;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,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):je.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...je].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&e.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function qr(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=await ee(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Lr(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return t.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=Ne(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Kt={run:Nr,runSync:Fr,eval:$r,resolve:Dr,validate:Br,enrichSources:qr,enrichSourcesSync:Lr};function $e(t){return JSON.stringify(t)}function De(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 re(t,e){function r(){return t.readIndex()??{}}function n(o,s,c){let i=String(s||"").split(".").filter(Boolean);if(i.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let d={...o},m=d;for(let _=0;_<i.length-1;_++){let O=i[_],T=m[O],E=T&&typeof T=="object"&&!Array.isArray(T)?{...T}:{};m[O]=E,m=E;}return m[i[i.length-1]]=c,d}return {readCard(o){let s=r()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,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 "${s}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,c]of Object.entries(r()))o[s]=c.checksum;return o},changedSince(o){let s=r(),c=[];for(let[i,d]of Object.entries(s))o[i]!==d.checksum&&c.push(i);for(let i of Object.keys(o))s[i]||c.push(i);return c},validateUpsert(o,s){let c=r(),i=c[o],d=Object.entries(c).find(([,m])=>m.key===s);return i&&i.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${i.key}", cannot remap to "${s}"`}:d&&d[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${d[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,c){let i=r(),d=c??i[o]?.key??t.defaultCardKey(o),m=t.writeCard(d,s);i[o]={key:d,checksum:m,updatedAt:new Date().toISOString()},t.writeIndex(i);},patchCard(o,s,c){let i=r(),d=i[o];if(!d||!t.cardExists(d.key))throw new Error(`card "${o}" not found`);let m=t.readCard(d.key);if(!m||typeof m!="object"||Array.isArray(m))throw new Error(`card "${o}" is not patchable`);let _=n(m,s,c),O=t.writeCard(d.key,_);i[o]={key:d.key,checksum:O,updatedAt:new Date().toISOString()},t.writeIndex(i);},removeCard(o){let s=r(),c=s[o];c&&(t.removeCard(c.key),delete s[o],t.writeIndex(s));},readIndex(){return r()}}}function fe(t,e){return {readSourceData(r,n){let o=t.read(`${r}/${n}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,n,o,s){let c=e(o);t.write(`${r}/.staged/${s}/${n}`,c);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,c=t.read(s);return c==null?false:(t.write(`${r}/${n}`,c),t.remove(s),true)},hasSource(r,n){return t.exists(`${r}/${n}`)}}}function Ge(t){function e(r){let n=t.readAllEntries();if(!r)return n;let o=n.findIndex(s=>s.id===r);return o===-1?n:n.slice(o+1)}return {readEntriesAfterCursor(r){let n=e(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return e(r).length},appendEvent(r){t.appendEntry({id:t.generateId(),event:r});}}}function Ve(t,e){return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.read(r)??[];t.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(c){let i=c instanceof Error?c.message:String(c);try{e(s,i);}catch{}}t.delete(r);}}}}var ne="v1",Ft="board/graph",Me="board/lastJournalProcessedId";function Pe(t){return `cards/${t}/runtime`}function Ue(t){return {readRuntime(e){return t.read(Pe(e))??{_sources:{}}},writeRuntime(e,r){t.write(Pe(e),r);}}}function Gr(t,e){let r={...t};for(let n of e.deleteKeys)delete r[n];return {...r,...e.shallowMerge}}function He(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,r){if(r.schemaVersion!==ne)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=Gr(n.values,r);return {ok:true,newVersion:t.writeValues(e,o,r.deleteKeys)}}}}function Ke(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 De(r.trim())},writeTaskExecutorRef(r){t.write("task-executor",$e(r));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(r){t.write("chat-handler-flow",r);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(r){t.write("card-store-ref",r);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(r){t.write("outputs-store-ref",r);},readScratchStoreRef(){return e("scratch-store-ref")},writeScratchStoreRef(r){t.write("scratch-store-ref",r);},readArchiveStoreRef(){return e("archive-store-ref")},writeArchiveStoreRef(r){t.write("archive-store-ref",r);}}}function Je(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 Be(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Vr(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function qe(t,e){return t?.lastRequestedToken?Vr(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function Mr(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function Le(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function oe(t,e){let r=e.state.tasks,n=e.config.tasks,o=Object.keys(r),s=Ut(e),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let S of s.pending)i.set(S.taskName,S.waitingOn);for(let S of s.unresolved)i.set(S.taskName,S.missingTokens);for(let S of s.blocked)i.set(S.taskName,S.failedTokens);let d=new Map;for(let[S,R]of Object.entries(n))for(let C of R.requires??[]){let v=d.get(C)??[];v.push(S),d.set(C,v);}let m=o.sort().map(S=>{let R=r[S],C=n[S]??{requires:[],provides:[]};R.status==="completed"?c.completed+=1:R.status==="failed"?c.failed+=1:R.status==="in-progress"&&(c.in_progress+=1);let v=C.requires??[],h=C.provides??[],b=Object.keys(R.data??{}).sort(),q=v.filter(J=>e.state.availableOutputs.includes(J)),G=v.filter(J=>!e.state.availableOutputs.includes(J)),D=i.get(S)??G,A=new Set;for(let J of h)for(let X of d.get(J)??[])X!==S&&A.add(X);let P=R.failedAt,W=R.error?{message:R.error,code:"TASK_FAILED",at:P,source:"task-runtime"}:void 0;return {name:S,status:R.status,error:W,requires:v,requires_satisfied:q,requires_missing:G,provides_declared:h,provides_runtime:b,blocked_by:D,unblocks:Array.from(A).sort(),runtime:{attempt_count:R.executionCount??0,restart_count:R.retryCount??0,in_progress_since:R.status==="in-progress"?R.startedAt??null:null,last_transition_at:R.lastUpdated??null,last_completed_at:R.completedAt??null,last_restarted_at:R.startedAt??null,status_age_ms:R.lastUpdated?0:null}}});c.pending=s.pending.length,c.blocked=s.blocked.length,c.unresolved=s.unresolved.length;let _=m.map(S=>({name:S.name,fanOut:S.unblocks.length})).sort((S,R)=>R.fanOut-S.fanOut||S.name.localeCompare(R.name)),O=_.length>0?_[0]:{name:null,fanOut:0},T=new Set;for(let S of Object.values(n))for(let R of S.requires??[])T.add(R);let E=0;for(let[S,R]of Object.entries(n)){let C=(R.requires??[]).length===0,h=(R.provides??[]).some(b=>(d.get(b)??[]).some(q=>q!==S));C&&!h&&(E+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:c.completed,eligible:s.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:E,topology:{edge_count:Array.from(T).length,max_fan_out_card:O.name,max_fan_out:O.fanOut}},cards:m}}function Ur(){return new Date().toISOString()}function ze(t,e,r,n,o,s,c){return async i=>{let d=[],m=r.cardStore.readCard(i.nodeId);if(!m)return "task-initiate-failure";let _=m.id,O=m.card_data??{},T=m.source_defs??[],E=T.filter(B=>B.optionalForCompletionGating!==true),S=r.cardRuntimeStore.readRuntime(_),R=false,C=()=>{R&&(r.cardRuntimeStore.writeRuntime(_,S),R=false);},v=B=>Be(S._sources[B]),h=(B,L)=>{S._sources[B]=Be(L),R=true;},b=i.taskState?.executionCount??0;if(S._lastExecutionCount!==b&&(S._sources={},S._lastExecutionCount=b,R=true),i.update){let B=i.update,L=B.outputFile;if(L){let K=v(L);if(B.failure){let ot=B.rqt??K.lastRequestedToken??K.queueRequestedToken;ot&&h(L,Le(K,ot));}else {let ot=B.rqt;if(!K.lastCompletedToken||ot>K.lastCompletedToken){let ft=typeof B.deliveryToken=="string"?B.deliveryToken:void 0,k=false;ft&&(k=r.fetchedSourcesStore.commitSourceData(_,L,ft)),k?h(L,Mr(K,ot)):h(L,Le(K,ot));}}C();}}let G={};for(let B of T)if(B.outputFile){let L=r.fetchedSourcesStore.readSourceData(_,B.outputFile);L!==null&&(G[B.bindTo]=L);}let D={};for(let[B,L]of Object.entries(i.state??{}))if(L!==null&&typeof L=="object"&&!Array.isArray(L)){let K=L[B];D[B]=K!==void 0?K:L;}else D[B]=L;let A={id:_,card_data:{...O},requires:D,source_defs:T,compute:m.compute};A._sourcesData=G,m.compute&&Kt.runSync(A,{sourcesData:G}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(_,A.computed_values??{});let P={...m},W=Kt.enrichSourcesSync(Array.isArray(m.source_defs)?m.source_defs:void 0,{card_data:m.card_data,requires:D}),J=t.value;P.source_defs=Array.isArray(W)?W.map(B=>({...B,boardDir:typeof B.boardDir=="string"&&B.boardDir?B.boardDir:J})):W;let X=Ur(),et=i.update?void 0:X,z=E.filter(B=>{let L=B.outputFile;if(typeof L!="string"||!L)return true;let K=v(L);et&&(K={...K,queueRequestedToken:et},h(L,K));let ot=K.queueRequestedToken??K.lastRequestedToken??X,ft=qe(K,ot);return ft==="in-flight"?false:ft==="dispatch"});if(C(),z.length>0){let B=false,L=X;for(let K of z){let ot=K.outputFile;if(typeof ot!="string"||!ot)continue;let ft=v(ot),k=ft.queueRequestedToken??X;h(ot,{...ft,lastRequestedToken:k}),L=k,B=true;}return B&&C(),B&&(d.push({taskKind:"source-fetch",payload:{boardRef:vt(t),enrichedCard:P,callbackToken:i.callbackToken,rqt:L}}),r.executionRequestStore.appendEntries(e,d)),"task-initiated"}if(E.some(B=>{let L=B.outputFile;if(typeof L!="string"||!L)return false;let K=v(L),ot=K.queueRequestedToken??K.lastRequestedToken??X;return qe(K,ot)==="in-flight"}))return "task-initiated";let At=m.provides??[],jt={};for(let{bindTo:B,ref:L}of At)jt[B]=Kt.resolve(A,L);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(jt),T.filter(B=>{if(B.optionalForCompletionGating!==true)return false;let L=v(B.outputFile);return !L.lastRequestedToken||!L.lastCompletedToken?true:L.lastCompletedToken<=L.lastRequestedToken}).length>0&&d.push({taskKind:"source-fetch",payload:{boardRef:vt(t),enrichedCard:P,callbackToken:i.callbackToken,rqt:X}}),n(i.nodeId,jt),d.length>0&&r.executionRequestStore.appendEntries(e,d),"task-initiated"}}var pe={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Ye(t){return {[Ft]:t.graph,[Me]:t.lastDrainedJournalId}}function Xe(t){let e=t[Ft],r=t[Me];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Ft}`);return {graph:e,lastDrainedJournalId:typeof r=="string"?r:""}}function We(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 st(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function nt(t){return {status:"fail",error:t}}function at(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Hr(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 Qe(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function se(t){try{let e=JSON.parse(Qe(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Kr(t){return Hr(JSON.stringify(t))}function Ze(t){try{let e=JSON.parse(Qe(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function ut(){return new Date().toISOString()}function tr(t,e){let r=e.onWarn??(()=>{}),n=vt(t);function o(k){if(k.length!==0)try{let f=e.publishBoardChangeNotifications?.(k);f&&typeof f.catch=="function"&&f.catch(x=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${x instanceof Error?x.message:String(x)}`));}catch(f){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${f instanceof Error?f.message:String(f)}`);}}function s(){let k=i().readCardStoreRef();if(!k)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(k);return {readIndex(){return f.read("_index")},writeIndex(x){f.write("_index",x);},readCard(x){return f.read(x)},writeCard(x,$){return f.write(x,$),e.hashFn($)},removeCard(x){f.delete(x);},cardExists(x){return f.read(x)!==null},defaultCardKey(x){return x}}}let c={readValues(k){let f=e.kvStorage("state-snapshot"),x=f.listKeys().sort();if(x.length===0)return {version:null,values:{}};let $={};for(let Z of x)$[Z]=f.read(Z);return {version:e.hashFn($),values:$}},writeValues(k,f,x){let $=e.kvStorage("state-snapshot");for(let Z of x)$.delete(Z);for(let[Z,M]of Object.entries(f))$.write(Z,M);return e.hashFn(f)}},i=()=>Ke(e.kvStorage("config")),d=()=>He(c),m=()=>Ge(e.journalAdapter()),_=()=>re(s(),r),O=()=>{let k=i().readOutputsStoreRef();if(!k)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Je(e.kvStorageForRef(k))},T=()=>{let k=i().readArchiveStoreRef();return k?e.archiveFactoryForRef(k):e.archiveFactory()};function E(){return !!d().readSnapshot(t.value).values[Ft]}function S(){let k=d().readSnapshot(t.value);if(!k.values[Ft])throw new Error(`Board not initialized at ${t.value}`);return Xe(k.values)}function R(k,f){let x=d().commitSnapshot(t.value,{schemaVersion:ne,expectedVersion:f,commitId:e.genId(),committedAt:ut(),deleteKeys:[],shallowMerge:Ye(k)});if(!x.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${f??"null"} current=${x.currentVersion??"null"}`)}function C(k){m().appendEvent(k);}async function v(){let k=(w,N)=>{let tt=w.payload,u=(tt?.enrichedCard??{}).id??tt?.cardId??"unknown";C({type:"task-failed",taskName:u,error:N,timestamp:ut()});},f=Ve(e.kvStorage("execution-requests"),k),x=Ue(e.kvStorage("card-runtime")),$=fe(e.blobStorage("sources"),w=>e.resolveBlob(w)),Z=new Map,M={readRuntime(w){return Z.get(w)??x.readRuntime(w)},writeRuntime(w,N){Z.set(w,N);}},ct=[],it=new Map,kt={readSourceData(w,N){let tt=`${w}/${N}`;return it.has(tt)?it.get(tt):$.readSourceData(w,N)},ingestSourceDataStaged(w,N,tt,a){$.ingestSourceDataStaged(w,N,tt,a);},commitSourceData(w,N,tt){let a=`${w}/.staged/${tt}/${N}`,l=e.blobStorage("sources").read(a);if(l==null)return false;let p=`${w}/${N}`,g=l.trim();try{it.set(p,JSON.parse(g));}catch{it.set(p,g);}return ct.push({cardId:w,outputFile:N,deliveryToken:tt}),true},hasSource(w,N){let tt=`${w}/${N}`;return it.has(tt)?true:$.hasSource(w,N)}},dt={cardStore:_(),cardRuntimeStore:M,fetchedSourcesStore:kt,outputStore:O(),executionRequestStore:f},Rt=S(),H=te(Rt.graph),{events:gt,newCursor:Et}=m().readEntriesAfterCursor(Rt.lastDrainedJournalId),Ct=[],$t=[],Dt=[],Gt=new Map,Vt=(w,N)=>{Ct.push({type:"task-completed",taskName:w,data:N,timestamp:ut()});try{T().stream("exec-history").append({taskName:w,status:"completed",completedAt:ut()});}catch{}},Pt=(w,N)=>{C({type:"task-failed",taskName:w,error:N,timestamp:ut()});try{T().stream("exec-history").append({taskName:w,status:"failed",error:N,completedAt:ut()});}catch{}},_t=Ie(H,{handlers:{"card-handler":ze(t,Et,dt,Vt,Pt,(w,N)=>{$t.push({cardId:w,values:N});},w=>{Dt.push(w);})}});for(Ct=gt;Ct.length>0;){let w=Ct;Ct=[];for(let N of w)if(N.type==="task-restart"){let tt=dt.cardStore.readCard(N.taskName);tt&&Gt.set(N.taskName,tt);}_t.pushAll(w),await _t.waitForHandlers();}let Bt=_t.getState();await _t.dispose({wait:true});let ie=d().readSnapshot(t.value).version;R({lastDrainedJournalId:Et,graph:Mt(Bt)},ie);for(let{cardId:w,values:N}of $t)dt.outputStore.writeComputedValues(w,N);for(let w of Dt)dt.outputStore.writeDataObjects(w);for(let[w,N]of Z)x.writeRuntime(w,N);for(let{cardId:w,outputFile:N,deliveryToken:tt}of ct)$.commitSourceData(w,N,tt);let qt;try{qt=oe(n,Bt),dt.outputStore.writeStatusSnapshot(qt);}catch(w){r(`[board-live-cards-public] status publish failed: ${w instanceof Error?w.message:String(w)}`);}let Nt=[];for(let{cardId:w,values:N}of $t)Nt.push({kind:"computed_values",cardId:w,values:N});for(let w of Dt)for(let[N,tt]of Object.entries(w))N&&Nt.push({kind:"data_object",key:N,payload:tt});for(let[w,N]of Gt)Nt.push({kind:"card_refreshed",cardId:w,card:N});qt!==void 0&&Nt.push({kind:"status",status:qt}),o(Nt);let ue=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:vt({kind:"built-in",value:"source-cli-task-executor"})};f.dispatchEntriesForJournalId(Et,w=>{if(w.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${w.taskKind}" \u2014 skipping`);return}let N=w.payload,tt=N.enrichedCard?.id??"unknown",a=N.enrichedCard?.source_defs??[];for(let u of a){if(!u.outputFile){r(`[dispatch] source "${u.bindTo}" has no outputFile \u2014 skipping`);continue}let l=Kr({cbk:N.callbackToken,rg:t.value,br:vt(t),cid:tt,b:u.bindTo,d:u.outputFile,cs:void 0,rqt:N.rqt});e.dispatchExecution(ue,{source_def:u,base_ref:vt(t),callback:{token:l,via:e.selfRef}}).catch(p=>Pt(tt,p instanceof Error?p.message:String(p)));}});}async function h(){try{let k=()=>{let x=S(),{events:$}=m().readEntriesAfterCursor(x.lastDrainedJournalId);$.length<=0||(h(),e.requestProcessAccumulated?.());},f=await he(e.lock,v,k);return st({ran:f!==!1})}catch(k){return at(k)}}function b(){h(),e.requestProcessAccumulated?.();}function q(k){try{let f=k.params?.cardStoreRef;if(!f)return nt("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!E()){let it=Qt(pe);R({lastDrainedJournalId:"",graph:Mt(it)},null);}let x=k.params?.outputsStoreRef;if(!x)return nt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let $=k.params?.scratchStoreRef,Z=k.params?.archiveStoreRef,M=i();M.writeCardStoreRef(f),M.writeOutputsStoreRef(x),$&&M.writeScratchStoreRef($),Z&&M.writeArchiveStoreRef(Z);let ct=k.body??{};ct["task-executor-ref"]&&M.writeTaskExecutorRef(ct["task-executor-ref"]),Object.prototype.hasOwnProperty.call(ct,"chat-handler-flow")&&M.writeChatHandlerFlow(ct["chat-handler-flow"]);try{O().writeStatusSnapshot(oe(n,te(S().graph)));}catch{}return st()}catch(f){return at(f)}}function G(k){try{let f=O().readStatusSnapshot();if(!f){f=oe(n,te(S().graph));try{O().writeStatusSnapshot(f);}catch{}}return st(f)}catch(f){return at(f)}}function D(k){try{let f=k.params?.id;return f?(C({type:"task-removal",taskName:f,timestamp:ut()}),b(),st()):nt("removeCard requires params.id")}catch(f){return at(f)}}function A(k){try{let f=k.params?.id;return f?(C({type:"task-restart",taskName:f,timestamp:ut()}),b(),st()):nt("retrigger requires params.id")}catch(f){return at(f)}}async function P(k){return h()}function W(k){try{let f=k.params?.cardId,x=k.params?.all,$=!!k.params?.restart;if(!f&&!x)return nt("upsertCard requires --card-id <id> or --all");let Z=x?_().readAllCards().map(M=>M.id):[f];for(let M of Z)if(!_().readCard(M))return nt(`Card "${M}" not found in board at ${t.value}`);for(let M of Z){let ct=_().readCard(M),it=We(ct),kt=e.hashFn(it),dt=e.kvStorage("card-upsert"),Rt=dt.read(M),H=Rt?.taskConfigHash!==kt;if(!(!H&&!$)){if(H){let gt=Rt?.blobRef??_().readCardKey(M)??M;C({type:"task-upsert",taskName:M,taskConfig:it,timestamp:ut()}),dt.write(M,{blobRef:gt,taskConfigHash:kt,updatedAt:ut()});}$&&C({type:"task-restart",taskName:M,timestamp:ut()});}}return b(),st()}catch(f){return at(f)}}function J(k){try{let f=k.params?.token;if(!f)return nt("taskFailed requires params.token");let x=k.params?.error??"unknown error",$=se(f);if(!$)return nt("Invalid callback token");C({type:"task-failed",taskName:$.taskName,error:x,timestamp:ut()});try{T().stream("exec-history").append({taskName:$.taskName,status:"failed",error:x,completedAt:ut()});}catch{}return b(),st()}catch(f){return at(f)}}function X(k){try{let f=k.params?.token;if(!f)return nt("taskProgress requires params.token");let $=(k.body??{}).update??{},Z=se(f);return Z?(C({type:"task-progress",taskName:Z.taskName,update:$,timestamp:ut()}),b(),st()):nt("Invalid callback token")}catch(f){return at(f)}}function et(k){try{let f=k.params?.token,x=k.params?.ref;if(!f)return nt("sourceDataFetched requires params.token");if(!x)return nt("sourceDataFetched requires params.ref");let $=Ze(f);if(!$)return nt("Invalid source token");let{cbk:Z,cid:M,b:ct,d:it,cs:kt,rqt:dt}=$,Rt=fe(e.blobStorage("sources"),Ct=>e.resolveBlob(Ct)),H=e.genId();Rt.ingestSourceDataStaged(M,it,me(x),H);let gt=se(Z);if(!gt)return nt("Invalid callback token embedded in source token");let Et=ut();return C({type:"task-progress",taskName:gt.taskName,update:{bindTo:ct,outputFile:it,fetchedAt:Et,deliveryToken:H,sourceChecksum:kt,rqt:dt},timestamp:Et}),b(),st()}catch(f){return at(f)}}function z(k){try{let f=k.params?.token,x=k.params?.reason??"unknown";if(!f)return nt("sourceDataFetchFailure requires params.token");let $=Ze(f);if(!$)return nt("Invalid source token");let{cbk:Z,b:M,d:ct,cs:it,rqt:kt}=$,dt=se(Z);return dt?(C({type:"task-progress",taskName:dt.taskName,update:{bindTo:M,outputFile:ct,failure:!0,reason:x,sourceChecksum:it,rqt:kt},timestamp:ut()}),b(),st()):nt("Invalid callback token embedded in source token")}catch(f){return at(f)}}function xt(k){try{let f=i().readCardStoreRef();return f?st({storeRef:f}):nt(`Board at ${t.value} has no card store configured`)}catch(f){return at(f)}}function At(k){try{let f=i().readOutputsStoreRef();return f?st({storeRef:f}):nt(`Board at ${t.value} has no outputs store configured`)}catch(f){return at(f)}}function jt(k){try{let f=i().readScratchStoreRef();return st({storeRef:f})}catch(f){return at(f)}}function Jt(k){try{let f=i().readArchiveStoreRef();return st({storeRef:f})}catch(f){return at(f)}}function B(k){try{let f=k.params?.key;if(!f)return nt("getConfig requires params.key");let x=i(),$;switch(f){case "task-executor":$=x.readTaskExecutorRef()??null;break;case "chat-handler-flow":$=x.readChatHandlerFlow()??null;break;case "card-store-ref":$=x.readCardStoreRef();break;case "outputs-store-ref":$=x.readOutputsStoreRef();break;case "scratch-store-ref":$=x.readScratchStoreRef();break;case "archive-store-ref":$=x.readArchiveStoreRef();break;default:return nt(`getConfig: unknown key "${f}"`)}return st({value:$})}catch(f){return at(f)}}function L(k){try{let f=k.params?.key;if(!f)return nt("getOutputsDataObject requires params.key");let x=O().readDataObject(f);return st(x)}catch(f){return at(f)}}function K(k){try{return st(O().readAllDataObjects())}catch(f){return at(f)}}function ot(k){try{let f=k.params?.key;if(!f)return nt("getOutputsComputedValues requires params.key");let x=O().readComputedValues(f);return st(x)}catch(f){return at(f)}}function ft(k){try{return st(O().readAllComputedValues())}catch(f){return at(f)}}return {init:q,status:G,getCardStoreRef:xt,getOutputsStoreRef:At,getScratchStoreRef:jt,getArchiveStoreRef:Jt,getConfig:B,getOutputsDataObject:L,getAllOutputsDataObjects:K,getOutputsComputedValues:ot,getAllOutputsComputedValues:ft,removeCard:D,retrigger:A,processAccumulatedEvents:P,upsertCard:W,taskFailed:J,taskProgress:X,sourceDataFetched:et,sourceDataFetchFailure:z}}function er(t){function e(o){return {status:"success",data:o}}function r(o){return {status:"fail",error:o}}function n(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let c=t.readCard(s);return c?e({cards:[c]}):r(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return n(s)}},set(o){try{let s=o.body;if(s==null)return r("set requires a body (card object or array of cards)");let c=Array.isArray(s)?s:[s];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(s){return n(s)}},del(o){try{let s=o.body?.ids??[],c=o.params?.id,i=c?[...s,c]:s;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let d of i)t.removeCard(d);return e({count:i.length})}catch(s){return n(s)}},patch(o){try{let s=o.params?.id,c=o.params?.path;if(!s)return r("patch requires params.id");if(!c)return r("patch requires params.path");let i=o.body,d=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:o.body;return t.patchCard(s,c,d),e({count:1})}catch(s){return n(s)}}}}function rr(){return new Date().toISOString()}function nr(t){return new TextEncoder().encode(t).byteLength}function Jr(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function zr(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function Yr(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 Xr(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Wr(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Zr(t){let e=Yr(t),r=e.lastIndexOf(".");return r<=0||r===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,r),ext:e.slice(r)}}function Qr(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function or(t){function e(r){let n=t.stat?Jr(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:nr(o)}}return {exists(r){return t.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){t.write(r,n);let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??rr(),s.size=s.size??nr(n),s},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 s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??rr(),s.size=s.size??n.byteLength,s},getText(r){let n=t.read(r);if(n===null){if(!t.readBytes)return null;let o=t.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(t.readBytes){let o=t.readBytes(r);if(o!==null)return o}let n=t.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:e,list(r=""){return t.listKeys(r).map(n=>e(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){t.remove(r);}}}function sr(t){function e(o,s){let c=0,i=[];Array.isArray(s)&&i.push(...s);for(let d of t.list(`${o}/`))i.push(Qr(d.key));for(let d of i){let m=zr(d);Number.isFinite(m)&&m>c&&(c=m);}return c+1}function r(o,s,c){let i=Number(c?.maxLen||32),{stem:d,ext:m}=Zr(o),_=Wr(m),O=Xr(d),T=`${String(s).padStart(3,"0")}-`,E=_,S=i-T.length-E.length;S<1&&(E="",S=i-T.length);let R=O.slice(0,Math.max(1,S)),C=`${T}${R}${E}`;return C.length>i&&(C=C.slice(0,i).replace(/\.$/,"")),C}function n(o,s,c){let i=e(o,c?.seedNames),d=r(s,i,{maxLen:c?.maxLen});for(;t.exists(`${o}/${d}`);)i+=1,d=r(s,i,{maxLen:c?.maxLen});return d}return {nextSerial:e,buildStoredName:r,allocateStoredName:n}}function ar(){function t(o,s){if(!Array.isArray(o))return [];let c=[];for(let i of o){if(!i||typeof i!="object")continue;let d=i;typeof d.stored_name=="string"&&c.push({name:typeof d.name=="string"?d.name:d.stored_name,stored_name:d.stored_name,size:typeof d.size=="number"&&Number.isFinite(d.size)?d.size:null,mime_type:typeof d.mime_type=="string"?d.mime_type:null,uploaded_at:typeof d.uploaded_at=="string"?d.uploaded_at:s||null,chat:d.chat===true});}return c}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function r(o,s){let c=e(o);if(s.length===0)return o.files=c,c;let i=new Set(c.map(d=>d.stored_name));for(let d of s)i.has(d.stored_name)||(c.push(d),i.add(d.stored_name));return o.files=c,c}function n(o,s,c){let i=e(o);if(!Number.isInteger(s)||s<0||s>=i.length)return {ok:false,reason:"index_out_of_range"};let d=i[s];return !d||!d.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==d.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:d}}return {read:e,normalizeIncoming:t,merge:r,resolve:n}}function tn(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function ir(){let t=new Map,e=new Map;function r(n){return t.has(n)||t.set(n,[]),t.get(n)}return {append(n,o,s,c=[]){let i={id:tn(),role:o,text:s,files:c,updated_at:new Date().toISOString()};return r(n).push(i),i.id},readAll(n){return r(n).slice()},readAfter(n,o){let s=r(n);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let c=s.findIndex(d=>d.id===o),i=c===-1?s.slice():s.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 s=e.get(`c:${n}`)??{};e.set(`c:${n}`,{...s,...o});}}}function ur(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,d="command envelope"){let m=typeof i.cardId=="string"?i.cardId:void 0;if(!i.command)return r(`chat-store: ${d} missing "command"`);if(!m)return r(`chat-store: ${d} missing "cardId"`);if(i.command==="append")return c.append({params:{cardId:m},body:{role:i.role,text:i.text,files:i.files}});if(i.command==="read-all")return c.readAll({params:{cardId:m}});if(i.command==="read-after")return c.readAfter({params:{cardId:m},body:{cursor:i.cursor??null}});if(i.command==="clear")return c.clear({params:{cardId:m}});if(i.command==="set-processing")return c.setProcessing({params:{cardId:m},body:{active:i.active}});if(i.command==="is-processing")return c.isProcessing({params:{cardId:m}});if(i.command==="get-config")return c.getConfig({params:{cardId:m}});if(i.command==="set-config"){let{command:_,cardId:O,...T}=i;return c.setConfig({params:{cardId:m},body:T})}return r(`chat-store: unknown command "${String(i.command)}"`)}function s(i){if(!Array.isArray(i.commands)||i.commands.length===0)return r('chat-store: command envelope must include a non-empty "commands" array');let d=[];for(let m=0;m<i.commands.length;m+=1){let _=i.commands[m];if(!_||typeof _!="object"||Array.isArray(_))return r(`chat-store: command envelope entry ${m} must be an object`);let O={cardId:i.cardId,..._},T=o(O,`command envelope entry ${m}`);if(T.status!=="success")return T;d.push({index:m,command:String(O.command),data:T.data});}return e({results:d})}let c={append(i){try{let d=i.params?.cardId;if(!d)return r("append requires params.cardId");let m=i.body??{},_=typeof m.role=="string"?m.role:"",O=typeof m.text=="string"?m.text:"",T=Array.isArray(m.files)?m.files:[];if(!_)return r("append requires body.role");let E=t.append(d,_,O,T);return e({id:E})}catch(d){return n(d)}},readAll(i){try{let d=i.params?.cardId;return d?e({records:t.readAll(d)}):r("readAll requires params.cardId")}catch(d){return n(d)}},readAfter(i){try{let d=i.params?.cardId;if(!d)return r("readAfter requires params.cardId");let _=(i.body??{}).cursor??null;return e(t.readAfter(d,_))}catch(d){return n(d)}},clear(i){try{let d=i.params?.cardId;return d?(t.clear(d),e({ok:!0})):r("clear requires params.cardId")}catch(d){return n(d)}},setProcessing(i){try{let d=i.params?.cardId;if(!d)return r("setProcessing requires params.cardId");let m=i.body??{};return typeof m.active!="boolean"?r("setProcessing requires body.active (boolean)"):(t.setProcessing(d,m.active),e({ok:!0}))}catch(d){return n(d)}},isProcessing(i){try{let d=i.params?.cardId;return d?e({active:t.isProcessing(d)}):r("isProcessing requires params.cardId")}catch(d){return n(d)}},getConfig(i){try{let d=i.params?.cardId;return d?e({config:t.getConfig(d)}):r("getConfig requires params.cardId")}catch(d){return n(d)}},setConfig(i){try{let d=i.params?.cardId;if(!d)return r("setConfig requires params.cardId");let m=i.body??{};return t.setConfig(d,m),e({ok:!0})}catch(d){return n(d)}},run:o,runBatch:s};return c}var cr={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},en=32;function rn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function dr(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 lr(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)lr(t,n);return}r.kind==="status"&&dr(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 so(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),r={...cr,...t.corsHeaders||{}},n=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,c=t.chatFlowRunner||null,i=t.chatStorage??ir(),d=ur(i),m=t.notificationTransport||null,_=t.serverUrl||null,O=t.executionExtra||{},T=new Map,E=new Map,S=new Map,R=null;function C(a){let u=tr(a.baseRef,a.boardAdapter),l=a.boardAdapter.kvStorageForRef(a.cardStoreRef),g=er(re({readIndex:()=>l.read("_index"),writeIndex:I=>l.write("_index",I),readCard:I=>l.read(I),writeCard:(I,Y)=>(l.write(I,Y),I),cardExists:I=>l.read(I)!==null,defaultCardKey:I=>I},o.warn)),y=a.artifactsAdapter||a.boardAdapter,j=a.filesArtifactsStore??null,F=null;return {label:a.label,board:u,cardStore:g,get filesArtifacts(){return F??=j??or(y.blobStorage("files"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,scratchStoreRef:a.scratchStoreRef,archiveStoreRef:a.archiveStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:rn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let v=t.boards.map(C),h=new Map;function b(a){return h.get(a)??0}function q(a){let u=v[b(a)];return {files:u?u.filesArtifacts:null}}function G(a){let u=q(a);return u.files?sr(u.files):null}function D(){return ar()}function A(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function P(a){if(!a||a.notificationTeardown||!m||!a.notifyRef)return;let u=await m.subscribe(a.notifyRef,l=>{lr(a.notification,l);let p=l.kind==="notification-batch"?l.notifications:[l];w(p);});a.notificationTeardown=u;}async function W(a){if(!a||a.initialized)return;let u={cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef};a.scratchStoreRef&&(u.scratchStoreRef=a.scratchStoreRef),a.archiveStoreRef&&(u.archiveStoreRef=a.archiveStoreRef);let l={};a.taskExecutorRef&&(l["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(l["chat-handler-flow"]=a.chatHandlerFlow),a.inferenceAdapterRef&&(l["inference-adapter-ref"]=a.inferenceAdapterRef);let p=a.board.init({params:u,body:l});if(p.status!=="success")throw Object.assign(new Error(p.error||`init failed for ${a.label}`),{statusCode:500});if(await P(a),!a.chatHandlerFlow&&a.chatHandlerRef&&s.describe)try{let g=await s.describe(a.chatHandlerRef);g&&g.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${g.kind}", expected "chat-handler" for ${a.label}`):g&&o.info(`[init] chat-handler validated: ${g.name} (protocol ${g.protocolVersion}) for ${a.label}`);}catch(g){o.warn(`[init] chat-handler describe failed for ${a.label}: ${g?.message||String(g)}`);}a.initialized=true;}function J(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let u=[],l=a.board.status({});l.status==="success"&&l.data!=null&&dr(l.data)&&u.push({kind:"status",status:l.data});let p=a.board.getAllOutputsDataObjects({});if(p.status==="success"&&p.data!=null)for(let[y,j]of Object.entries(p.data))y&&u.push({kind:"data_object",key:y,payload:j});let g=a.board.getAllOutputsComputedValues({});if(g.status==="success"&&g.data!=null)for(let[y,j]of Object.entries(g.data))y&&u.push({kind:"computed_values",cardId:y,values:j});u.length>0&&a.boardAdapter.publishBoardChangeNotifications(u);}function X(a,u){if(!a||a.cardsBootstrapped)return;let l=a.cardStore.get({}),p=l.status==="success"&&Array.isArray(l.data?.cards)?l.data.cards:[];for(let g of p)typeof g.id=="string"&&(h.set(g.id,u),a.board.upsertCard({params:{cardId:g.id}}));a.cardsBootstrapped=true;}async function et(){for(let a of v)await W(a);}async function z(){await et();for(let a=0;a<v.length;a++)J(v[a]),X(v[a],a);}function xt(a){return v[b(a)]??null}function At(a){let u=xt(a);if(!u)return null;let l=u.cardStore.get({params:{id:a}});if(l.status!=="success")return null;let p=Array.isArray(l.data?.cards)?l.data.cards:[];return p.length>0?p[0]:null}function jt(){let a=l=>{if(!l||!l.cardStore)return [];let p=l.cardStore.get({});return p.status!=="success"||!Array.isArray(p.data?.cards)?[]:p.data.cards},u=[];for(let l of v)u.push(...a(l));return u}function Jt(){let a=v.map(y=>{try{let F=y.boardAdapter.kvStorageForRef(y.outputsStoreRef).read("status");if(F!=null)return F}catch{}return y.notification.status}).filter(Boolean);if(a.length===0)return null;if(a.length===1)return a[0];let u=[],l=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],p={};for(let y of l)p[y]=0;for(let y of a){let j=y,F=Array.isArray(j.cards)?j.cards:[];u.push(...F);for(let I of l)p[I]+=Number(j?.summary?.[I]||0);}let g=a[0];return {...g,cards:u,summary:{...g.summary||{},card_count:u.length,...p}}}function B(){let a={},u=l=>{for(let[p,g]of Object.entries(l.notification.computedValues)){let y=l.notification.cards[p];a[p]={schema_version:"v1",card_id:p,card_data:y?.card_data??{},computed_values:g??{}};}};for(let l of v)u(l);return a}function L(){let a={};for(let u of v)Object.assign(a,u.notification.dataObjects||{});return a}function K(){let a=jt(),u=B(),l=L(),p={};for(let y of a){if(!y?.id)continue;let j=y.id,F=u[j]||{},I={...F.card_data&&typeof F.card_data=="object"?F.card_data:y.card_data&&typeof y.card_data=="object"?y.card_data:{}};p[j]={schema_version:F.schema_version||"v1",card_id:F.card_id||j,card_data:I,computed_values:F.computed_values&&typeof F.computed_values=="object"?F.computed_values:{}};}let g={};for(let y of a){if(!y?.id)continue;let j=y.id;try{let F=M(j),I=i.isProcessing(j);(F.length>0||I)&&(g[j]={messages:F.map(Y=>({role:String(Y.role||"system"),text:String(Y.text||""),files:Array.isArray(Y.files)?Y.files:[]})),receiving:!1,processing:I});}catch{}}return {boardId:n,cardDefinitions:a,statusSnapshot:Jt(),dataObjectsByToken:l,cardRuntimeById:p,cardChatsByCardId:g}}function ot(a,u,l){let p=l?.syncBoard!==false,g=xt(a);if(!g)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let y=At(a);if(!y)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let j=u(y)||y,F=g.cardStore.set({body:j});if(F.status!=="success")throw Object.assign(new Error(F.error||`Failed to persist card: ${a}`),{statusCode:500});if(p){let I=g.board.upsertCard({params:{cardId:a,restart:true}});if(I.status!=="success")throw Object.assign(new Error(I.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function ft(a,u){ot(a,u,{syncBoard:true});}function k(a,u){ot(a,u,{syncBoard:false});}function f(a,u){ft(a,l=>{if(!u||typeof u!="object"||Object.keys(u).length===0)return l;function p(g,y,j){let F=String(y||"").split(".").filter(Boolean);if(!F.length)return;let I=g;for(let Y=0;Y<F.length-1;Y++){let rt=F[Y];(!I[rt]||typeof I[rt]!="object")&&(I[rt]={}),I=I[rt];}I[F[F.length-1]]=j;}if(u.fieldValues!==void 0&&u.fieldValues!==null){let g=null,y=l.view;if(y&&Array.isArray(y.elements)){for(let j of y.elements)if(j?.data&&j.data.writeTo){g=j.data.writeTo;break}}g?p(l,g,u.fieldValues):typeof u.fieldValues=="object"&&!Array.isArray(u.fieldValues)&&(l.card_data={...l.card_data||{},...u.fieldValues});}else {if(Array.isArray(u._stagedFiles)&&u._stagedFiles.length>0)return l;for(let[g,y]of Object.entries(u))g!=="_stagedFiles"&&(y!==null&&typeof y=="object"&&!Array.isArray(y)&&l[g]!==null&&typeof l[g]=="object"&&!Array.isArray(l[g])?l[g]={...l[g],...y}:l[g]=y);}return l});}function x(a){let u=String(a||"").trim();if(!u)return "upload.bin";let l=Math.max(u.lastIndexOf("/"),u.lastIndexOf("\\"));return (l>=0?u.slice(l+1):u)||"upload.bin"}function $(a){i.clear(a),i.setProcessing(a,false);}function Z(a,u,l,p){let g=typeof l=="string"?l.trim():"";return i.append(a,u,g,p)}function M(a){return i.readAll(a)}function ct(a){let u=[];try{let l=At(a);if(!l)return u;let p=D().read(l.card_data&&typeof l.card_data=="object"?l.card_data:null);for(let g of p)u.push(g.stored_name);}catch{}return u}function it(a,u,l,p){let g=A(a),y=q(a),j=x(u),F=G(a),I=F?F.allocateStoredName(g,j,{seedNames:ct(a),maxLen:en}):`${String(Date.now())}-${j}`;return y.files&&y.files.putBytes(`${g}/${I}`,new Uint8Array(p),l||"application/octet-stream"),{name:j,stored_name:I,size:p.length,mime_type:l||"application/octet-stream",uploaded_at:new Date().toISOString()}}function kt(a){let u=xt(a);if(!u)return null;let l=u.board.getConfig({params:{key:"chat-handler-flow"}}),p=l.status==="success"?l.data?.value:null,g=u.chatHandlerRef;return p==null&&(!g||typeof g!="object")?null:{ctx:u,handlerFlow:p,handlerRef:g}}function dt(a,u,l=false){let p=kt(a);if(!p)return;let{ctx:g,handlerFlow:y,handlerRef:j}=p;if(!l)try{i.setProcessing(a,!0);}catch{}let F={boardId:n,cardId:String(a),lastChatEntryId:u,...O,..._?{serverUrl:_}:{}};if(!c&&y!=null){try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${a}" but no chatFlowRunner was provided`);return}if(y!=null){let Y=c;if(!Y)return;Y.run(y,F,{boardId:n,cardId:String(a),label:g.label,logger:o,serverUrl:_,executionExtra:O}).then(rt=>{if(rt.dispatched)o.info(`[chat-handler-flow] invoked for card "${a}" (boardId: "${n}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${a}": ${rt.error||"unknown"}`);}},rt=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${a}": ${rt?.message||String(rt)}`);});return}let I=j;I&&s.invoke(I,F).then(Y=>{if(Y.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${n}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${a}": ${Y.error||"unknown"}`);}},Y=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${a}": ${Y?.message||String(Y)}`);});}function Rt(a,u,l){let p=u==="chat-send"?k:ft,g;p(a,y=>{let j=new Date().toISOString(),F=y.card_data&&typeof y.card_data=="object"?y.card_data:{};if(y.card_data=F,u==="chat-send"){let I=l&&typeof l.text=="string"?l.text.trim():"",Y=[];if(Array.isArray(l?.files)){for(let rt of l.files)if(rt){if(typeof rt=="string"){Y.push({name:rt});continue}if(typeof rt=="object"){let lt=rt;typeof lt.name=="string"&&Y.push({name:lt.name,size:lt.size,mime_type:lt.mime_type,uploaded_at:lt.uploaded_at,stored_name:lt.stored_name,chat:lt.chat===true});}}}if(I||Y.length>0){let rt=d.runBatch({cardId:a,commands:[{command:"append",role:"user",text:I,files:Y},{command:"set-processing",active:true}]});if(rt.status!=="success")throw new Error(rt.error);let lt=rt.data.results[0]?.data?.id;if(typeof lt!="string"||!lt)throw new Error(`chat-send did not return an append id for card ${a}`);g={cardId:a,lastEntryId:lt,processingAlreadySet:true};try{let V=M(a);w([{kind:"card_chats",cardId:a,messages:V.map(Q=>({role:String(Q.role||"system"),text:String(Q.text||""),files:Array.isArray(Q.files)?Q.files:[]})),receiving:!0,processing:i.isProcessing(a)}]);}catch{}}return y}if(u==="file-upload"){let I=D().normalizeIncoming(l?.files,j);return I.length>0&&D().merge(F,I),y}if(u==="action"){let I=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!I)return y;F.lastAction={buttonId:I,at:j},F.lastActionText=`${I} @ ${j}`;}return y}),g&&dt(g.cardId,g.lastEntryId,g.processingAlreadySet);}function H(a,u,l){let p=JSON.stringify(l),g=typeof Buffer<"u"?Buffer.byteLength(p):new TextEncoder().encode(p).length;a.writeHead(u,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":g}),a.end(p);}async function gt(a){let u=[];for await(let p of a)u.push(p);let l=typeof Buffer<"u"?Buffer.concat(u).toString("utf-8").trim():new TextDecoder().decode(Ct(u)).trim();return l?JSON.parse(l):{}}async function Et(a){let u=[];for await(let l of a)u.push(l);return typeof Buffer<"u"?Buffer.concat(u):Ct(u)}function Ct(a){let u=a.reduce((g,y)=>g+y.length,0),l=new Uint8Array(u),p=0;for(let g of a)l.set(g,p),p+=g.length;return l}let $t=0;function Dt(a){let u=JSON.stringify(a);return $t++,`id: ${$t}
2
2
  data: ${u}
3
3
 
4
- `}function Gt(a){let u=a;try{u.flushHeaders?.();}catch{}try{u.flush?.();}catch{}try{u.socket?.setNoDelay?.(!0);}catch{}try{u.socket?.uncork?.();}catch{}}function Vt(a,u){let l=T.get(a);if(!l)return;let p=Dt(u);try{l.res.write(p),Gt(l.res);}catch{T.delete(a);}}function Pt(){let a=new Set;for(let u of T.values())for(let l of u.subscribedChatCardIds)a.add(l);return Array.from(a)}function ge(a){let u=E.has(a)?E.get(a):null,{cursor:l}=i.readAfter(a,u),p=i.isProcessing(a),g=p!==(S.get(a)??false),y=l!==u;return y&&E.set(a,l),S.set(a,p),y||g}function se(a,u=true){let l=M(a),p=Date.now();return {kind:"card_chats",cardId:a,sentAt:new Date(p).toISOString(),sentAtMs:p,messages:l.map(g=>({role:String(g.role||"system"),text:String(g.text||""),files:Array.isArray(g.files)?g.files:[]})),receiving:u,processing:i.isProcessing(a)}}function Et(a,u=true){let l={kind:"notification-batch",notifications:[se(a,u)]};for(let[p,g]of T.entries())g.subscribedChatCardIds.has(a)&&Vt(p,l);}function Bt(){Pt().length>0||(R&&(clearInterval(R),R=null),E.clear(),S.clear());}function ae(){if(R)return;let a=()=>{let u=Pt();if(u.length===0){Bt();return}let l=new Set(u);for(let p of Array.from(E.keys()))l.has(p)||E.delete(p);for(let p of Array.from(S.keys()))l.has(p)||S.delete(p);for(let p of u)ge(p)&&Et(p,true);};a(),R=setInterval(a,1e3);}function qt(a,u){let l=T.get(a);if(!l)return false;l.subscribedChatCardIds.add(u);let{cursor:p}=i.readAfter(u,null);return E.set(u,p),S.set(u,i.isProcessing(u)),ae(),Vt(a,{kind:"notification-batch",notifications:[se(u,true)]}),true}function jt(a,u){let l=T.get(a);return l?(l.subscribedChatCardIds.delete(u),Pt().includes(u)||(E.delete(u),S.delete(u)),Bt(),true):false}function ie(a){if(!a||typeof a!="object")return false;let u=a.kind;return u==="card_chats"||u==="chat_messages"}function w(a){if(!a||a.length===0)return;let u=[],l=new Set;for(let p of a)ie(p)&&typeof p.cardId=="string"?l.add(String(p.cardId)):u.push(p);if(u.length>0){let p={kind:"notification-batch",notifications:u};for(let g of T.keys())Vt(g,p);}for(let p of l)Et(p,true);}function N(a,u,l){let p=T.get(l),g=p?new Set(p.subscribedChatCardIds):new Set;if(p)try{p.res.end();}catch{}u.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),Gt(u),T.set(l,{res:u,subscribedChatCardIds:g});let y=K(),j=Dt(y);u.write(j);let F=setInterval(()=>{try{u.write(`: keepalive
4
+ `}function Gt(a){let u=a;try{u.flushHeaders?.();}catch{}try{u.flush?.();}catch{}try{u.socket?.setNoDelay?.(!0);}catch{}try{u.socket?.uncork?.();}catch{}}function Vt(a,u){let l=T.get(a);if(!l)return;let p=Dt(u);try{l.res.write(p),Gt(l.res);}catch{T.delete(a);}}function Pt(){let a=new Set;for(let u of T.values())for(let l of u.subscribedChatCardIds)a.add(l);return Array.from(a)}function ge(a){let u=E.has(a)?E.get(a):null,{cursor:l}=i.readAfter(a,u),p=i.isProcessing(a),g=p!==(S.get(a)??false),y=l!==u;return y&&E.set(a,l),S.set(a,p),y||g}function ae(a,u=true){let l=M(a),p=Date.now();return {kind:"card_chats",cardId:a,sentAt:new Date(p).toISOString(),sentAtMs:p,messages:l.map(g=>({role:String(g.role||"system"),text:String(g.text||""),files:Array.isArray(g.files)?g.files:[]})),receiving:u,processing:i.isProcessing(a)}}function _t(a,u=true){let l={kind:"notification-batch",notifications:[ae(a,u)]};for(let[p,g]of T.entries())g.subscribedChatCardIds.has(a)&&Vt(p,l);}function Bt(){Pt().length>0||(R&&(clearInterval(R),R=null),E.clear(),S.clear());}function ie(){if(R)return;let a=()=>{let u=Pt();if(u.length===0){Bt();return}let l=new Set(u);for(let p of Array.from(E.keys()))l.has(p)||E.delete(p);for(let p of Array.from(S.keys()))l.has(p)||S.delete(p);for(let p of u)ge(p)&&_t(p,true);};a(),R=setInterval(a,1e3);}function qt(a,u){let l=T.get(a);if(!l)return false;l.subscribedChatCardIds.add(u);let{cursor:p}=i.readAfter(u,null);return E.set(u,p),S.set(u,i.isProcessing(u)),ie(),Vt(a,{kind:"notification-batch",notifications:[ae(u,true)]}),true}function Nt(a,u){let l=T.get(a);return l?(l.subscribedChatCardIds.delete(u),Pt().includes(u)||(E.delete(u),S.delete(u)),Bt(),true):false}function ue(a){if(!a||typeof a!="object")return false;let u=a.kind;return u==="card_chats"||u==="chat_messages"}function w(a){if(!a||a.length===0)return;let u=[],l=new Set;for(let p of a)ue(p)&&typeof p.cardId=="string"?l.add(String(p.cardId)):u.push(p);if(u.length>0){let p={kind:"notification-batch",notifications:u};for(let g of T.keys())Vt(g,p);}for(let p of l)_t(p,true);}function N(a,u,l){let p=T.get(l),g=p?new Set(p.subscribedChatCardIds):new Set;if(p)try{p.res.end();}catch{}u.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),Gt(u),T.set(l,{res:u,subscribedChatCardIds:g});let y=K(),j=Dt(y);u.write(j);let F=setInterval(()=>{try{u.write(`: keepalive
5
5
 
6
- `);}catch{}},15e3);a.on("close",()=>{clearInterval(F),T.get(l)?.res===u&&(T.delete(l),Bt());try{u.end();}catch{}});}async function tt(a,u,l){let p=a.method||"GET",g=l,y=g.pathname;try{if(p==="GET"&&y===`${e}/init-board`)return await et(),H(u,200,K()),!0;if(p==="GET"&&y===`${e}/sse`){await et();let U=String(g.searchParams.get("clientId")||"").trim();if(!U)return H(u,400,{error:"clientId query param is required for SSE"}),!0;N(a,u,U);for(let G=0;G<v.length;G++)J(v[G]),W(v[G],G);return !0}if(p==="GET"&&y===`${e}/board-status`)return H(u,200,K()),!0;let j=y.match(new RegExp(`^${It(e)}/cards/([^/]+)$`));if(p==="GET"&&j){await z();let U=decodeURIComponent(j[1]),G=xt(U);return G?(H(u,200,G),!0):(H(u,404,{error:`card not found: ${U}`}),!0)}if(p==="PATCH"&&j){await z();let U=decodeURIComponent(j[1]),G=await gt(a);return f(U,G),H(u,200,{ok:!0}),!0}let F=y.match(new RegExp(`^${It(e)}/cards/([^/]+)/actions$`));if(p==="POST"&&F){await z();let U=decodeURIComponent(F[1]),G=Date.now(),X=new Date(G).toISOString(),mt=await gt(a),ht=mt?.actionType;if(ht==="chat-send"&&!St(U)){let bt=Date.now();return H(u,409,{error:`chat handler is not configured for card: ${U}`,requestReceivedAt:X,requestReceivedAtMs:G,responseSentAt:new Date(bt).toISOString(),responseSentAtMs:bt,responseStatus:409}),!0}Rt(U,ht,mt?.payload);let yt=Date.now();return H(u,200,{ok:!0,requestReceivedAt:X,requestReceivedAtMs:G,responseSentAt:new Date(yt).toISOString(),responseSentAtMs:yt,responseStatus:200}),!0}let I=y.match(new RegExp(`^${It(e)}/cards/([^/]+)/chats$`));if(p==="GET"&&I){await z();let U=decodeURIComponent(I[1]);return H(u,200,{ok:!0,messages:M(U)}),!0}if(p==="POST"&&I){await z();let U=decodeURIComponent(I[1]),G=await gt(a),X=typeof G?.role=="string"?G.role:"assistant",mt=typeof G?.text=="string"?G.text:"",ht=Array.isArray(G?.files)?G.files:[],yt=G?.done===!0,bt=i.append(U,X,mt,ht);return yt&&i.setProcessing(U,!1),Et(U,!yt),H(u,200,{ok:!0,id:bt}),!0}let Y=y.match(new RegExp(`^${It(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(p==="POST"&&Y){await z();let U=decodeURIComponent(Y[1]),G=await gt(a),X=typeof G?.clientId=="string"?G.clientId.trim():"";return X?qt(X,U)?(H(u,200,{ok:!0,clientId:X,cardId:U,subscribed:!0}),!0):(H(u,404,{error:`SSE client not connected: ${X}`}),!0):(H(u,400,{error:"clientId is required"}),!0)}let rt=y.match(new RegExp(`^${It(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(p==="POST"&&rt){await z();let U=decodeURIComponent(rt[1]),G=await gt(a),X=typeof G?.clientId=="string"?G.clientId.trim():"";return X?jt(X,U)?(H(u,200,{ok:!0,clientId:X,cardId:U,subscribed:!1}),!0):(H(u,404,{error:`SSE client not connected: ${X}`}),!0):(H(u,400,{error:"clientId is required"}),!0)}let lt=y.match(new RegExp(`^${It(e)}/cards/([^/]+)/files$`));if(p==="POST"&&lt){await z();let U=decodeURIComponent(lt[1]),G=String(g.searchParams.get("inChat")||"").toLowerCase()==="true",X=a.headers["x-file-name"],mt=String(a.headers["content-type"]||"application/octet-stream"),ht=Array.isArray(X)?X[0]:X,yt=ht?decodeURIComponent(String(ht)):"upload.bin",bt=await At(a);if(!bt.length)return H(u,400,{error:"Empty upload body"}),!0;let kt=it(U,yt,mt,bt);return k(U,Nt=>{let Lt=new Date().toISOString(),Yt=Nt.card_data&&typeof Nt.card_data=="object"?Nt.card_data:{};Nt.card_data=Yt;let ue=D().normalizeIncoming([{name:kt.name,stored_name:kt.stored_name,size:kt.size,mime_type:kt.mime_type,path:kt.path,uploaded_at:kt.uploaded_at||Lt}],Lt);return D().merge(Yt,ue),Nt}),G&&Z(U,"system",`file uploaded: ${kt.name} as ${kt.stored_name}`,[]),H(u,200,{ok:!0,file:kt}),!0}let zt=y.match(new RegExp(`^${It(e)}/cards/([^/]+)/files/(\\d+)$`));if(p==="GET"&&zt){let U=decodeURIComponent(zt[1]),G=parseInt(zt[2],10),X=g.searchParams.get("sn"),mt=xt(U);if(!mt)return H(u,404,{error:"Card not found"}),!0;let ht=D().resolve(mt.card_data,G,X);if(!ht.ok&&ht.reason==="stale_reference")return H(u,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ht.ok)return H(u,404,{error:"File not found"}),!0;let yt=ht.file,bt=A(U),kt=q(U),Nt=`${bt}/${yt.stored_name}`,Lt=kt.files?kt.files.getBytes(Nt):null;if(!Lt)return H(u,404,{error:"File not found"}),!0;let Yt=yt.name||yt.stored_name,ue=yt.mime_type||"application/octet-stream";return u.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${Yt}"`,"Content-Length":Lt.length}),u.end(Lt),!0}return !1}catch(j){let F=j?.statusCode||500;return H(u,F,{error:String(j?.message||j)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleRuntimeApi:tt,buildPublishedRuntimePayload:K,clearChatRecords:$,reportSourceFetched(a,u){let l=v[0];return l?l.board.sourceDataFetched({params:{token:a,ref:u}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,u){let l=v[0];return l?l.board.sourceDataFetchFailure({params:{token:a,reason:u}}):{status:"fail",error:"no board context"}},get cardStore(){return v[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function no(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),r={...cr,...t.corsHeaders||{}},n=t.serverMetaStore,o=t.boardRuntimeFactory,s=new Map,c="boards-config.json";function i(){let C=n.getText(c);if(!C)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(C)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function d(C){n.putText(c,JSON.stringify(C,null,2));}function m(C){let v=String(C||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return v.length>0&&v.length<=64?v:null}function _(C){if(s.has(C))return s.get(C);let h=i().boards.find(q=>q.id===C)||{},b=o(C,h);return s.set(C,b),b}function O(C,v,h){let b=JSON.stringify(h),q=typeof Buffer<"u"?Buffer.byteLength(b):new TextEncoder().encode(b).length;C.writeHead(v,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":q}),C.end(b);}async function T(C,v,h){let b=C.method||"GET",q=h.pathname;if(b==="GET"&&q===e)return O(v,200,{ok:true,boards:i().boards}),true;if(b==="POST"&&q===e){let V=[];for await(let et of C)V.push(et);let D=typeof Buffer<"u"?Buffer.concat(V).toString("utf-8").trim():new TextDecoder().decode(en(V)).trim(),A={};try{A=D?JSON.parse(D):{};}catch{A={};}let P=m(A.id);if(!P)return O(v,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let Q=i();if(Q.boards.some(et=>et.id===P))return O(v,409,{error:`Board "${P}" is already registered`}),true;let J=typeof A.label=="string"&&A.label.trim()?A.label.trim():P,W={id:P,label:J};for(let[et,z]of Object.entries(A))et==="id"||et==="label"||z!=null&&(W[et]=z);return Q.boards.push(W),d(Q),O(v,200,{ok:true,board:W}),true}return false}async function E(C,v,h){let q=h.pathname.match(new RegExp(`^${It(e)}/([^/]+)(/|$)`));if(!q)return false;let V=m(decodeURIComponent(q[1]));return V?i().boards.some(P=>P.id===V)?!!await _(V).handleRuntimeApi(C,v,h):(O(v,404,{error:`Board "${V}" not registered. POST ${e} with {id} to register it first.`}),true):(O(v,400,{error:"Invalid board id"}),true)}async function S(C,v,h){return !!(await T(C,v,h)||await E(C,v,h))}function R(C){if(!i().boards.some(h=>h.id===C))throw Object.assign(new Error(`Board "${C}" not registered`),{statusCode:404});return {service:_(C)}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleApi:S,requireBoardService:R}}function It(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function en(t){let e=t.reduce((o,s)=>o+s.length,0),r=new Uint8Array(e),n=0;for(let o of t)r.set(o,n),n+=o.length;return r}export{no as createMultiBoardServerRuntime,ro as createSingleBoardServerRuntime};//# sourceMappingURL=board-live-cards-server-runtime.js.map
6
+ `);}catch{}},15e3);a.on("close",()=>{clearInterval(F),T.get(l)?.res===u&&(T.delete(l),Bt());try{u.end();}catch{}});}async function tt(a,u,l){let p=a.method||"GET",g=l,y=g.pathname;try{if(p==="GET"&&y===`${e}/init-board`)return await et(),H(u,200,K()),!0;if(p==="GET"&&y===`${e}/sse`){await et();let U=String(g.searchParams.get("clientId")||"").trim();if(!U)return H(u,400,{error:"clientId query param is required for SSE"}),!0;N(a,u,U);for(let V=0;V<v.length;V++)J(v[V]),X(v[V],V);return !0}if(p==="GET"&&y===`${e}/board-status`)return H(u,200,K()),!0;let j=y.match(new RegExp(`^${Ot(e)}/cards/([^/]+)$`));if(p==="GET"&&j){await z();let U=decodeURIComponent(j[1]),V=At(U);return V?(H(u,200,V),!0):(H(u,404,{error:`card not found: ${U}`}),!0)}if(p==="PATCH"&&j){await z();let U=decodeURIComponent(j[1]),V=await gt(a);return f(U,V),H(u,200,{ok:!0}),!0}let F=y.match(new RegExp(`^${Ot(e)}/cards/([^/]+)/actions$`));if(p==="POST"&&F){await z();let U=decodeURIComponent(F[1]),V=Date.now(),Q=new Date(V).toISOString(),bt=await gt(a),mt=bt?.actionType;if(mt==="chat-send"&&!kt(U)){let wt=Date.now();return H(u,409,{error:`chat handler is not configured for card: ${U}`,requestReceivedAt:Q,requestReceivedAtMs:V,responseSentAt:new Date(wt).toISOString(),responseSentAtMs:wt,responseStatus:409}),!0}Rt(U,mt,bt?.payload);let ht=Date.now();return H(u,200,{ok:!0,requestReceivedAt:Q,requestReceivedAtMs:V,responseSentAt:new Date(ht).toISOString(),responseSentAtMs:ht,responseStatus:200}),!0}let I=y.match(new RegExp(`^${Ot(e)}/cards/([^/]+)/chats$`));if(p==="GET"&&I){await z();let U=decodeURIComponent(I[1]);return H(u,200,{ok:!0,messages:M(U)}),!0}if(p==="POST"&&I){await z();let U=decodeURIComponent(I[1]),V=await gt(a),Q=typeof V?.role=="string"?V.role:"assistant",bt=typeof V?.text=="string"?V.text:"",mt=Array.isArray(V?.files)?V.files:[],ht=V?.done===!0,wt=i.append(U,Q,bt,mt);return ht&&i.setProcessing(U,!1),_t(U,!ht),H(u,200,{ok:!0,id:wt}),!0}let Y=y.match(new RegExp(`^${Ot(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(p==="POST"&&Y){await z();let U=decodeURIComponent(Y[1]),V=await gt(a),Q=typeof V?.clientId=="string"?V.clientId.trim():"";return Q?qt(Q,U)?(H(u,200,{ok:!0,clientId:Q,cardId:U,subscribed:!0}),!0):(H(u,404,{error:`SSE client not connected: ${Q}`}),!0):(H(u,400,{error:"clientId is required"}),!0)}let rt=y.match(new RegExp(`^${Ot(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(p==="POST"&&rt){await z();let U=decodeURIComponent(rt[1]),V=await gt(a),Q=typeof V?.clientId=="string"?V.clientId.trim():"";return Q?Nt(Q,U)?(H(u,200,{ok:!0,clientId:Q,cardId:U,subscribed:!1}),!0):(H(u,404,{error:`SSE client not connected: ${Q}`}),!0):(H(u,400,{error:"clientId is required"}),!0)}let lt=y.match(new RegExp(`^${Ot(e)}/cards/([^/]+)/files$`));if(p==="POST"&&lt){await z();let U=decodeURIComponent(lt[1]),V=String(g.searchParams.get("inChat")||"").toLowerCase()==="true",Q=a.headers["x-file-name"],bt=String(a.headers["content-type"]||"application/octet-stream"),mt=Array.isArray(Q)?Q[0]:Q,ht=mt?decodeURIComponent(String(mt)):"upload.bin",wt=await Et(a);if(!wt.length)return H(u,400,{error:"Empty upload body"}),!0;let yt=it(U,ht,bt,wt),Lt=null;if(k(U,St=>{let Yt=new Date().toISOString(),Xt=St.card_data&&typeof St.card_data=="object"?St.card_data:{};St.card_data=Xt;let fr=D().normalizeIncoming([{name:yt.name,stored_name:yt.stored_name,size:yt.size,mime_type:yt.mime_type,uploaded_at:yt.uploaded_at||Yt,chat:V}],Yt);return Lt=D().merge(Xt,fr).findIndex(pr=>pr.stored_name===yt.stored_name),St}),V){let St=typeof Lt=="number"&&Lt>=0?` #${Lt}`:"";Z(U,"system",`file uploaded: ${yt.name} as ${yt.stored_name}${St}`,[]);}return H(u,200,{ok:!0,file:yt}),!0}let zt=y.match(new RegExp(`^${Ot(e)}/cards/([^/]+)/files/(\\d+)$`));if(p==="GET"&&zt){let U=decodeURIComponent(zt[1]),V=parseInt(zt[2],10),Q=g.searchParams.get("sn"),bt=At(U);if(!bt)return H(u,404,{error:"Card not found"}),!0;let mt=D().resolve(bt.card_data,V,Q);if(!mt.ok&&mt.reason==="stale_reference")return H(u,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!mt.ok)return H(u,404,{error:"File not found"}),!0;let ht=mt.file,wt=A(U),yt=q(U),Lt=`${wt}/${ht.stored_name}`,St=yt.files?yt.files.getBytes(Lt):null;if(!St)return H(u,404,{error:"File not found"}),!0;let Yt=ht.name||ht.stored_name,Xt=ht.mime_type||"application/octet-stream";return u.writeHead(200,{"Content-Type":Xt,"Content-Disposition":`attachment; filename="${Yt}"`,"Content-Length":St.length}),u.end(St),!0}return !1}catch(j){let F=j?.statusCode||500;return H(u,F,{error:String(j?.message||j)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleRuntimeApi:tt,buildPublishedRuntimePayload:K,clearChatRecords:$,reportSourceFetched(a,u){let l=v[0];return l?l.board.sourceDataFetched({params:{token:a,ref:u}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,u){let l=v[0];return l?l.board.sourceDataFetchFailure({params:{token:a,reason:u}}):{status:"fail",error:"no board context"}},get cardStore(){return v[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function ao(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),r={...cr,...t.corsHeaders||{}},n=t.serverMetaStore,o=t.boardRuntimeFactory,s=new Map,c="boards-config.json";function i(){let C=n.getText(c);if(!C)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(C)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function d(C){n.putText(c,JSON.stringify(C,null,2));}function m(C){let v=String(C||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return v.length>0&&v.length<=64?v:null}function _(C){if(s.has(C))return s.get(C);let h=i().boards.find(q=>q.id===C)||{},b=o(C,h);return s.set(C,b),b}function O(C,v,h){let b=JSON.stringify(h),q=typeof Buffer<"u"?Buffer.byteLength(b):new TextEncoder().encode(b).length;C.writeHead(v,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":q}),C.end(b);}async function T(C,v,h){let b=C.method||"GET",q=h.pathname;if(b==="GET"&&q===e)return O(v,200,{ok:true,boards:i().boards}),true;if(b==="POST"&&q===e){let G=[];for await(let et of C)G.push(et);let D=typeof Buffer<"u"?Buffer.concat(G).toString("utf-8").trim():new TextDecoder().decode(nn(G)).trim(),A={};try{A=D?JSON.parse(D):{};}catch{A={};}let P=m(A.id);if(!P)return O(v,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let W=i();if(W.boards.some(et=>et.id===P))return O(v,409,{error:`Board "${P}" is already registered`}),true;let J=typeof A.label=="string"&&A.label.trim()?A.label.trim():P,X={id:P,label:J};for(let[et,z]of Object.entries(A))et==="id"||et==="label"||z!=null&&(X[et]=z);return W.boards.push(X),d(W),O(v,200,{ok:true,board:X}),true}return false}async function E(C,v,h){let q=h.pathname.match(new RegExp(`^${Ot(e)}/([^/]+)(/|$)`));if(!q)return false;let G=m(decodeURIComponent(q[1]));return G?i().boards.some(P=>P.id===G)?!!await _(G).handleRuntimeApi(C,v,h):(O(v,404,{error:`Board "${G}" not registered. POST ${e} with {id} to register it first.`}),true):(O(v,400,{error:"Invalid board id"}),true)}async function S(C,v,h){return !!(await T(C,v,h)||await E(C,v,h))}function R(C){if(!i().boards.some(h=>h.id===C))throw Object.assign(new Error(`Board "${C}" not registered`),{statusCode:404});return {service:_(C)}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleApi:S,requireBoardService:R}}function Ot(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function nn(t){let e=t.reduce((o,s)=>o+s.length,0),r=new Uint8Array(e),n=0;for(let o of t)r.set(o,n),n+=o.length;return r}export{ao as createMultiBoardServerRuntime,so as createSingleBoardServerRuntime};//# sourceMappingURL=board-live-cards-server-runtime.js.map
7
7
  //# sourceMappingURL=board-live-cards-server-runtime.js.map
@@ -1,5 +1,5 @@
1
1
  import { G as GraphConfig, c as ExecutionState, S as SchedulerResult, f as GraphEvent, T as TaskConfig, e as GraphEngineStore, R as RefreshStrategy, h as StuckDetection, C as CompletionStrategy, a as ConflictStrategy, b as ExecutionMode, d as ExecutionStatus, l as TaskStatus } from './types-BBhqYGhE.cjs';
2
- import { e as StepFlowConfig } from './types-DQ1bKuB1.cjs';
2
+ import { e as StepFlowConfig } from './types-DjlwALZC.cjs';
3
3
 
4
4
  /**
5
5
  * Event Graph — Scheduler
@@ -1,5 +1,5 @@
1
1
  import { G as GraphConfig, c as ExecutionState, S as SchedulerResult, f as GraphEvent, T as TaskConfig, e as GraphEngineStore, R as RefreshStrategy, h as StuckDetection, C as CompletionStrategy, a as ConflictStrategy, b as ExecutionMode, d as ExecutionStatus, l as TaskStatus } from './types-BBhqYGhE.js';
2
- import { e as StepFlowConfig } from './types-DQ1bKuB1.js';
2
+ import { e as StepFlowConfig } from './types-DjlwALZC.js';
3
3
 
4
4
  /**
5
5
  * Event Graph — Scheduler
@@ -1,8 +1,8 @@
1
- export { C as COMPLETION_STRATEGIES, a as CONFLICT_STRATEGIES, b as CompletionResult, D as DEFAULTS, E as EXECUTION_MODES, c as EXECUTION_STATUS, d as ExecutionPlan, e as ExportOptions, M as MermaidOptions, T as TASK_STATUS, f as addDynamicTask, L as addKeyToProvides, N as addKeyToRequires, g as apply, h as applyAll, i as computeAvailableOutputs, j as createDefaultGraphEngineStore, k as createInitialExecutionState, l as detectStuckState, m as exportGraphConfig, n as exportGraphConfigToFile, o as flowToMermaid, p as getAllTasks, q as getCandidateTasks, r as getMaxExecutions, s as getProvides, t as getRefreshStrategy, u as getRequires, v as getTask, w as graphToMermaid, O as groupTasksByProvides, P as hasOutputConflict, x as hasTask, y as isExecutionComplete, z as isNonActiveTask, A as isRerunnable, B as isTaskCompleted, F as isTaskRunning, G as loadGraphConfig, H as next, I as planExecution, Q as removeKeyFromProvides, R as removeKeyFromRequires, J as validateGraphConfig, K as validateGraphSchema } from '../constants-DXxsRN9y.cjs';
1
+ export { C as COMPLETION_STRATEGIES, a as CONFLICT_STRATEGIES, b as CompletionResult, D as DEFAULTS, E as EXECUTION_MODES, c as EXECUTION_STATUS, d as ExecutionPlan, e as ExportOptions, M as MermaidOptions, T as TASK_STATUS, f as addDynamicTask, L as addKeyToProvides, N as addKeyToRequires, g as apply, h as applyAll, i as computeAvailableOutputs, j as createDefaultGraphEngineStore, k as createInitialExecutionState, l as detectStuckState, m as exportGraphConfig, n as exportGraphConfigToFile, o as flowToMermaid, p as getAllTasks, q as getCandidateTasks, r as getMaxExecutions, s as getProvides, t as getRefreshStrategy, u as getRequires, v as getTask, w as graphToMermaid, O as groupTasksByProvides, P as hasOutputConflict, x as hasTask, y as isExecutionComplete, z as isNonActiveTask, A as isRerunnable, B as isTaskCompleted, F as isTaskRunning, G as loadGraphConfig, H as next, I as planExecution, Q as removeKeyFromProvides, R as removeKeyFromRequires, J as validateGraphConfig, K as validateGraphSchema } from '../constants-C-iQV9ZB.cjs';
2
2
  export { G as GraphIssue, a as GraphValidationResult, I as IssueSeverity, v as validateGraph } from '../validate-Dbu7ygys.cjs';
3
3
  import { T as TaskConfig, c as ExecutionState, a as ConflictStrategy, G as GraphConfig } from '../types-BBhqYGhE.cjs';
4
4
  export { A as AgentActionEvent, C as CompletionStrategy, E as ExecutionConfig, b as ExecutionMode, d as ExecutionStatus, e as GraphEngineStore, f as GraphEvent, g as GraphSettings, I as InjectTokensEvent, R as RefreshStrategy, S as SchedulerResult, h as StuckDetection, m as TaskCircuitBreakerConfig, i as TaskCompletedEvent, j as TaskFailedEvent, n as TaskMessage, o as TaskProgressEvent, p as TaskRestartEvent, q as TaskRetryConfig, k as TaskStartedEvent, l as TaskStatus } from '../types-BBhqYGhE.cjs';
5
- import '../types-DQ1bKuB1.cjs';
5
+ import '../types-DjlwALZC.cjs';
6
6
 
7
7
  /**
8
8
  * Event Graph — Conflict Resolution Strategies
@@ -1,8 +1,8 @@
1
- export { C as COMPLETION_STRATEGIES, a as CONFLICT_STRATEGIES, b as CompletionResult, D as DEFAULTS, E as EXECUTION_MODES, c as EXECUTION_STATUS, d as ExecutionPlan, e as ExportOptions, M as MermaidOptions, T as TASK_STATUS, f as addDynamicTask, L as addKeyToProvides, N as addKeyToRequires, g as apply, h as applyAll, i as computeAvailableOutputs, j as createDefaultGraphEngineStore, k as createInitialExecutionState, l as detectStuckState, m as exportGraphConfig, n as exportGraphConfigToFile, o as flowToMermaid, p as getAllTasks, q as getCandidateTasks, r as getMaxExecutions, s as getProvides, t as getRefreshStrategy, u as getRequires, v as getTask, w as graphToMermaid, O as groupTasksByProvides, P as hasOutputConflict, x as hasTask, y as isExecutionComplete, z as isNonActiveTask, A as isRerunnable, B as isTaskCompleted, F as isTaskRunning, G as loadGraphConfig, H as next, I as planExecution, Q as removeKeyFromProvides, R as removeKeyFromRequires, J as validateGraphConfig, K as validateGraphSchema } from '../constants-BPVLb3Es.js';
1
+ export { C as COMPLETION_STRATEGIES, a as CONFLICT_STRATEGIES, b as CompletionResult, D as DEFAULTS, E as EXECUTION_MODES, c as EXECUTION_STATUS, d as ExecutionPlan, e as ExportOptions, M as MermaidOptions, T as TASK_STATUS, f as addDynamicTask, L as addKeyToProvides, N as addKeyToRequires, g as apply, h as applyAll, i as computeAvailableOutputs, j as createDefaultGraphEngineStore, k as createInitialExecutionState, l as detectStuckState, m as exportGraphConfig, n as exportGraphConfigToFile, o as flowToMermaid, p as getAllTasks, q as getCandidateTasks, r as getMaxExecutions, s as getProvides, t as getRefreshStrategy, u as getRequires, v as getTask, w as graphToMermaid, O as groupTasksByProvides, P as hasOutputConflict, x as hasTask, y as isExecutionComplete, z as isNonActiveTask, A as isRerunnable, B as isTaskCompleted, F as isTaskRunning, G as loadGraphConfig, H as next, I as planExecution, Q as removeKeyFromProvides, R as removeKeyFromRequires, J as validateGraphConfig, K as validateGraphSchema } from '../constants-dmPZTieN.js';
2
2
  export { G as GraphIssue, a as GraphValidationResult, I as IssueSeverity, v as validateGraph } from '../validate-BAVzUJWa.js';
3
3
  import { T as TaskConfig, c as ExecutionState, a as ConflictStrategy, G as GraphConfig } from '../types-BBhqYGhE.js';
4
4
  export { A as AgentActionEvent, C as CompletionStrategy, E as ExecutionConfig, b as ExecutionMode, d as ExecutionStatus, e as GraphEngineStore, f as GraphEvent, g as GraphSettings, I as InjectTokensEvent, R as RefreshStrategy, S as SchedulerResult, h as StuckDetection, m as TaskCircuitBreakerConfig, i as TaskCompletedEvent, j as TaskFailedEvent, n as TaskMessage, o as TaskProgressEvent, p as TaskRestartEvent, q as TaskRetryConfig, k as TaskStartedEvent, l as TaskStatus } from '../types-BBhqYGhE.js';
5
- import '../types-DQ1bKuB1.js';
5
+ import '../types-DjlwALZC.js';
6
6
 
7
7
  /**
8
8
  * Event Graph — Conflict Resolution Strategies