yaml-flow 8.3.0 → 8.4.1

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 (67) hide show
  1. package/browser/asset-integrity.json +3 -3
  2. package/browser/board-livecards-localstorage.js +6 -4
  3. package/browser/live-cards.js +19 -25
  4. package/cli/browser-api/board-live-cards-browser-adapter.d.ts +2 -2
  5. package/cli/browser-api/board-live-cards-browser-adapter.js +3 -2
  6. package/cli/browser-api/card-store-browser-api.js +1 -1
  7. package/cli/{execution-interface-CrG5gzAx.d.ts → execution-interface-DCFBy4L8.d.ts} +36 -1
  8. package/cli/node/artifacts-store-cli.js +5 -5
  9. package/cli/node/batch-runner-cli.js +2 -2
  10. package/cli/node/board-live-cards-cli.js +15 -9
  11. package/cli/node/card-store-cli.js +6 -6
  12. package/cli/node/chat-store-cli.js +7 -7
  13. package/cli/node/execution-adapter.d.ts +1 -1
  14. package/cli/node/execution-adapter.js +2 -2
  15. package/cli/node/fs-board-adapter.d.ts +72 -73
  16. package/cli/node/fs-board-adapter.js +14 -10
  17. package/cli/node/step-machine-cli.js +3 -3
  18. package/cli/{types-PUfPBxc_.d.ts → types-Dc2VRMUw.d.ts} +24 -16
  19. package/examples/board/demo-shell-with-server.html +2 -2
  20. package/examples/board/doc.html +2 -2
  21. package/examples/board/server/board-server.js +10 -1
  22. package/examples/board-local/demo-shell-localstorage.html +3 -3
  23. package/lib/{artifacts-store-lib-public-ksGIExhc.d.ts → artifacts-store-lib-454TAuov.d.ts} +2 -32
  24. package/lib/{artifacts-store-lib-public-Cz8-kdXG.d.cts → artifacts-store-lib-zsGFbBV8.d.cts} +2 -32
  25. package/lib/artifacts-store-public.d.cts +34 -3
  26. package/lib/artifacts-store-public.d.ts +34 -3
  27. package/lib/board-live-cards-node.cjs +14 -10
  28. package/lib/board-live-cards-node.d.cts +24 -23
  29. package/lib/board-live-cards-node.d.ts +24 -23
  30. package/lib/board-live-cards-node.js +14 -10
  31. package/lib/{board-live-cards-public-BwZYGAsF.d.cts → board-live-cards-public-BM6jCEIa.d.cts} +24 -4
  32. package/lib/{board-live-cards-public-DWpZVDXN.d.ts → board-live-cards-public-Bz07XKRK.d.ts} +24 -4
  33. package/lib/board-live-cards-public.cjs +2 -2
  34. package/lib/board-live-cards-public.d.cts +2 -2
  35. package/lib/board-live-cards-public.d.ts +2 -2
  36. package/lib/board-live-cards-public.js +2 -2
  37. package/lib/board-live-cards-server-runtime.cjs +4 -4
  38. package/lib/board-live-cards-server-runtime.d.cts +5 -4
  39. package/lib/board-live-cards-server-runtime.d.ts +5 -4
  40. package/lib/board-live-cards-server-runtime.js +4 -4
  41. package/lib/card-store-public.d.cts +2 -2
  42. package/lib/card-store-public.d.ts +2 -2
  43. package/lib/{chat-storage-lib-BK5Njslc.d.ts → chat-storage-lib-DGaKrjVe.d.ts} +1 -1
  44. package/lib/{chat-storage-lib-C5bQ7bGe.d.cts → chat-storage-lib-OX0Q_Ttf.d.cts} +1 -1
  45. package/lib/chat-store-public.d.cts +3 -3
  46. package/lib/chat-store-public.d.ts +3 -3
  47. package/lib/execution-refs.cjs +1 -1
  48. package/lib/execution-refs.js +1 -1
  49. package/lib/index.d.cts +1 -1
  50. package/lib/index.d.ts +1 -1
  51. package/lib/server-runtime/index.cjs +4 -4
  52. package/lib/server-runtime/index.d.cts +6 -5
  53. package/lib/server-runtime/index.d.ts +6 -5
  54. package/lib/server-runtime/index.js +4 -4
  55. package/lib/step-machine-public/index.cjs +3 -3
  56. package/lib/step-machine-public/index.d.cts +1 -1
  57. package/lib/step-machine-public/index.d.ts +1 -1
  58. package/lib/step-machine-public/index.js +3 -3
  59. package/lib/{storage-interface-B6ecOulj.d.cts → storage-interface-B-7pDHwD.d.cts} +36 -1
  60. package/lib/{storage-interface-B6ecOulj.d.ts → storage-interface-B-7pDHwD.d.ts} +36 -1
  61. package/lib/stores/index.d.cts +1 -1
  62. package/lib/stores/index.d.ts +1 -1
  63. package/lib/stores/kv.d.cts +1 -1
  64. package/lib/stores/kv.d.ts +1 -1
  65. package/lib/{types-DNYhCFNJ.d.ts → types-Cn0b8G-i.d.ts} +15 -15
  66. package/lib/{types-D9B0Vrwg.d.cts → types-Dszjwfud.d.cts} +15 -15
  67. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
- import {createRequire}from'module';import'ajv-formats';var Wt="b64:";function pn(t){let e=new TextEncoder().encode(t),n=globalThis.Buffer,r;if(n)r=n.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);r=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function gn(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),n=globalThis.Buffer;if(n)return n.from(e,"base64").toString("utf8");if(typeof atob=="function"){let r=atob(e),o=new Uint8Array(r.length);for(let s=0;s<r.length;s+=1)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function wt(t){return `${Wt}${pn(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(gn(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 n=e;if(typeof n.kind!="string"||typeof n.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:n.kind,value:n.value}}async function he(t,e,n){let r=t.tryAcquire();if(!r)return false;try{await e();}finally{r();}return n?.(),true}var It={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function it(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function Ot(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ye(t){return t.tasks??{}}function de(t){return t?t.status===It.FAILED||t.status===It.INACTIVATED:false}function ke(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function Ce(t){return t.maxExecutions}function Se(t,e){let n=new Set;for(let[r,o]of Object.entries(e))if(o.status===It.COMPLETED){let s=t.tasks[r];s&&it(s).forEach(i=>n.add(i));}return Array.from(n)}function be(t,e){let n={};return t.forEach(r=>{let o=e[r];if(!o)return;it(o).forEach(u=>{n[u]||(n[u]=[]),n[u].push(r);});}),n}function Re(t,e,n){let r=t.tasks[e]??Zt(),o={};if(n){let u=n.tasks[e],i=Ot(u);for(let d of i)for(let[h,T]of Object.entries(n.tasks))if(it(T).includes(d)){let j=t.tasks[h];j?.lastDataHash&&(o[d]=j.lastDataHash);break}}let s={...r,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,n,r,o,s){let u=t.tasks[n]??Zt(),i=e.tasks[n];if(!i)throw new Error(`Task "${n}" not found in graph`);let d;r&&i.on&&i.on[r]?d=i.on[r]:d=it(i);let h=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let O=i.requires??[];for(let v of O)for(let[R,C]of Object.entries(e.tasks))if(it(C).includes(v)){let x=t.tasks[R];x?.lastDataHash&&(h[v]=x.lastDataHash);break}}let T={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:h,error:void 0},j=[...new Set([...t.availableOutputs,...d])];return {...t,tasks:{...t.tasks,[n]:T},availableOutputs:j,lastUpdated:new Date().toISOString()}}function ve(t,e,n,r){let o=t.tasks[n]??Zt(),s=e.tasks[n];if(s?.retry){let d=o.retryCount+1;if(d<=s.retry.max_attempts){let h={...o,status:"not-started",retryCount:d,lastUpdated:new Date().toISOString(),error:r};return {...t,tasks:{...t.tasks,[n]:h},lastUpdated:new Date().toISOString()}}}let u={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:r,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&&u.executionCount>=s.circuit_breaker.max_executions){let d=s.circuit_breaker.on_break;i=[...new Set([...i,...d])];}return {...t,tasks:{...t.tasks,[n]:u},availableOutputs:i,lastUpdated:new Date().toISOString()}}function xe(t,e,n,r){let o=t.tasks[e]??Zt(),s={...o,progress:typeof r=="number"?r:o.progress,messages:[...o.messages??[],...n?[{message:n,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 n=t.tasks[e];if(!n)return t;let r={...n,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]:r},lastUpdated:new Date().toISOString()}}function Zt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Qt(t,e){let n=`live-${Date.now()}`,r={};for(let s of Object.keys(t.tasks))r[s]=_e();let o={status:"running",tasks:r,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:n,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function mn(t,e){let{config:n,state:r}=t;if("executionId"in e&&e.executionId&&e.executionId!==r.executionId)return t;switch(e.type){case "task-started":return {config:n,state:Re(r,e.taskName,n)};case "task-completed":return {config:n,state:we(r,n,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:n,state:ve(r,n,e.taskName,e.error)};case "task-progress":return {config:n,state:xe(r,e.taskName,e.message,e.progress)};case "task-restart":return {config:n,state:Ae(r,e.taskName)};case "inject-tokens":return {config:n,state:{...r,availableOutputs:[...new Set([...r.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:n,state:Rn(r,e.action)};case "task-upsert":return hn(t,e.taskName,e.taskConfig);case "task-removal":return yn(t,e.taskName);case "node-requires-add":return kn(t,e.nodeName,e.tokens);case "node-requires-remove":return Cn(t,e.nodeName,e.tokens);case "node-provides-add":return Sn(t,e.nodeName,e.tokens);case "node-provides-remove":return bn(t,e.nodeName,e.tokens);default:return t}}function Ee(t,e){return e.reduce((n,r)=>mn(n,r),t)}function hn(t,e,n){let r=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:n}},state:{...t.state,tasks:{...t.state.tasks,[e]:r?t.state.tasks[e]:_e()},lastUpdated:new Date().toISOString()}}}function yn(t,e){if(!t.config.tasks[e])return t;let{[e]:n,...r}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:r},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function kn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=Ot(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:[...o,...s]}}},state:t.state}}function Cn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=Ot(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:s}}},state:t.state}}function Sn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=it(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:[...o,...s]}}},state:t.state}}function bn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=it(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:s}}},state:t.state}}function Vt(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 n=e.config,r=e.state;if(!n.settings||typeof n.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(r.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:n,state:r}}function _e(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Rn(t,e){let n=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:n};case "pause":return {...t,status:"paused",lastUpdated:n};case "resume":return {...t,status:"running",lastUpdated:n};default:return t}}function Mt(t){let{config:e,state:n}=t,r=ye(e);if(Object.keys(r).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=wn(r),u=Se(e,n.tasks),i=new Set([...u,...n.availableOutputs]),d=[],h=[],T=[],j=[];for(let[v,R]of Object.entries(r)){let C=n.tasks[v],x=ke(R,e.settings),b=x!=="once";if(C?.status===It.RUNNING||de(C))continue;let y=Ce(R);if(y!==void 0&&C&&C.executionCount>=y||R.circuit_breaker&&C&&C.executionCount>=R.circuit_breaker.max_executions||!b&&C?.status===It.COMPLETED)continue;if(b&&C?.status===It.COMPLETED){let A=Ot(R),P=false;switch(x){case "data-changed":{A.length>0&&A.some(U=>{for(let[z,Q]of Object.entries(r))if(it(Q).includes(U)){let H=n.tasks[z];if(!H)continue;let vt=C.lastConsumedHashes?.[U];return H.lastDataHash==null?H.executionCount>C.lastEpoch:H.lastDataHash!==vt}return false})||(P=true);break}case "epoch-changed":{A.length>0&&A.some(U=>{for(let[z,Q]of Object.entries(r))if(it(Q).includes(U)){let H=n.tasks[z];if(H&&H.executionCount>C.lastEpoch)return true}return false})||(P=true);break}case "time-based":{let X=R.refreshInterval??0;if(X<=0){P=true;break}let U=C.completedAt;if(!U){P=true;break}(Date.now()-Date.parse(U))/1e3<X&&(P=true);break}case "manual":P=true;break}if(P)continue}let w=Ot(R);if(w.length===0){d.push(v);continue}let q=[],G=[],D=[];for(let A of w){if(i.has(A))continue;let P=s[A]||[];P.length===0?q.push(A):P.every(U=>de(n.tasks[U]))?D.push({token:A,failedProducer:P[0]}):G.push(A);}q.length>0?T.push({taskName:v,missingTokens:q}):D.length>0?j.push({taskName:v,failedTokens:D.map(A=>A.token),failedProducers:[...new Set(D.map(A=>A.failedProducer))]}):G.length>0?h.push({taskName:v,waitingOn:G}):d.push(v);}let O={};if(d.length>1){let v=be(d,r);for(let[R,C]of Object.entries(v))C.length>1&&(O[R]=C);}return {eligible:d,pending:h,unresolved:T,blocked:j,conflicts:O}}function wn(t){let e={};for(let[n,r]of Object.entries(t)){for(let o of it(r))e[o]||(e[o]=[]),e[o].push(n);if(r.on)for(let o of Object.values(r.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(n)||e[s].push(n);if(r.on_failure)for(let o of r.on_failure)e[o]||(e[o]=[]),e[o].includes(n)||e[o].push(n);}return e}var Ut=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function le(t){let e=fe(t);return vn(e)}function fe(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(fe).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+fe(e[r])).join(",")+"}"}function vn(t){let e=0xcbf29ce484222325n,n=0x100000001b3n,r=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*n&r;return e.toString(16).padStart(16,"0")}function xn(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),n="";for(let r of e)n+=String.fromCharCode(r);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function An(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=new Uint8Array(r.length);for(let s=0;s<r.length;s++)o[s]=r.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 xn(e)}function En(t){try{let e=JSON.parse(An(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ie(t,e,n){let{handlers:r,onDrain:o}=e,s=new Ut,u="state"in t&&"config"in t?t:Qt(t),i=false,d=new Set,h=new Map(Object.entries(r)),T=new Ut,j=false,O=false;function v(){if(!i){if(j){O=true;return}j=true;try{do O=!1,R();while(O)}finally{j=false;}}}function R(){let y=T.drain(),w=s.drain(),q=[...y,...w];q.length>0&&(u=Ee(u,q));let G=Mt(u);q.length>0&&o?.(q,u,G);for(let D of G.eligible)b(D);for(let D of q)if(D.type==="task-progress"){let{taskName:A,update:P}=D;if(!u.config.tasks[A])continue;let U=u.state.tasks[A];if(!U||U.status!=="running")continue;let z=Te(A),Q=x(A,z,P).catch(H=>{i||(T.append({type:"task-failed",taskName:A,error:H.message??String(H),timestamp:new Date().toISOString()}),v());}).finally(()=>{d.delete(Q);});d.add(Q);}}function C(y){let q=u.config.tasks[y].requires??[],G=new Map;for(let[A,P]of Object.entries(u.config.tasks))for(let X of P.provides??[])G.set(X,A);let D={};for(let A of q){let P=G.get(A);P?D[A]=u.state.tasks[P]?.data:D[A]=void 0;}return D}async function x(y,w,q){let G=u.config.tasks[y],D=G.taskHandlers??[],A=C(y);for(let P of D){let X=h.get(P);if(!X)throw new Error(`Handler '${P}' not found in registry (task '${y}')`);let U={nodeId:y,state:A,taskState:u.state.tasks[y],config:G,callbackToken:w,update:q};if(await X(U)==="task-initiate-failure")throw new Error(`Handler '${P}' returned task-initiate-failure (task '${y}')`)}}function b(y){let q=u.config.tasks[y]?.taskHandlers;if(!q||q.length===0)return;T.append({type:"task-started",taskName:y,timestamp:new Date().toISOString()}),v();let G=Te(y),D=x(y,G).catch(A=>{i||(T.append({type:"task-failed",taskName:y,error:A.message??String(A),timestamp:new Date().toISOString()}),v());}).finally(()=>{d.delete(D);});d.add(D);}return {push(y){i||(y.type==="task-completed"&&y.data&&!y.dataHash&&(y={...y,dataHash:le(y.data)}),s.append(y),v());},pushAll(y){if(!i){for(let w of y)w.type==="task-completed"&&w.data&&!w.dataHash?s.append({...w,dataHash:le(w.data)}):s.append(w);v();}},resolveCallback(y,w,q){if(i)return;let G=En(y);if(!G)return;let{taskName:D}=G;if(u.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=w&&Object.keys(w).length>0?le(w):void 0;s.append({type:"task-completed",taskName:D,data:w,dataHash:A,timestamp:new Date().toISOString()});}v();}},addNode(y,w){i||(s.append({type:"task-upsert",taskName:y,taskConfig:w,timestamp:new Date().toISOString()}),v());},removeNode(y){i||(s.append({type:"task-removal",taskName:y,timestamp:new Date().toISOString()}),v());},addRequires(y,w){i||(s.append({type:"node-requires-add",nodeName:y,tokens:w,timestamp:new Date().toISOString()}),v());},removeRequires(y,w){i||(s.append({type:"node-requires-remove",nodeName:y,tokens:w,timestamp:new Date().toISOString()}),v());},addProvides(y,w){i||(s.append({type:"node-provides-add",nodeName:y,tokens:w,timestamp:new Date().toISOString()}),v());},removeProvides(y,w){i||(s.append({type:"node-provides-remove",nodeName:y,tokens:w,timestamp:new Date().toISOString()}),v());},registerHandler(y,w){h.set(y,w);},unregisterHandler(y){h.delete(y);},retrigger(y){i||u.config.tasks[y]&&(s.append({type:"task-restart",taskName:y,timestamp:new Date().toISOString()}),v());},retriggerAll(y){if(!i){for(let w of y)u.config.tasks[w]&&s.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()});v();}},snapshot(){return Vt(u)},getState(){return u},getSchedule(){return Mt(u)},async waitForHandlers(){d.size>0&&await Promise.allSettled([...d]);},async dispose(y){y?.wait&&d.size>0&&await Promise.allSettled([...d]),i=true;}}}var Tn=createRequire(import.meta.url);Tn("./jsonata-sync.cjs");var On=createRequire(import.meta.url),ee=On("./jsonata-sync.cjs"),Ne=ee;function Oe(t,e){if(!e||!t)return;let n=e.split("."),r=t;for(let o=0;o<n.length;o++){if(r==null)return;r=r[n[o]];}return r}function $e(t,e,n){let r=e.split("."),o=t;for(let s=0;s<r.length-1;s++)(o[r[s]]==null||typeof o[r[s]]!="object")&&(o[r[s]]={}),o=o[r[s]];o[r[r.length-1]]=n;}async function jn(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,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(r);$e(t.computed_values,o.bindTo,s),r.computed_values=t.computed_values;}catch{}return t}function Nn(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 n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let u=Ne(s.expr).evaluate(r);$e(t.computed_values,s.bindTo,u),r.computed_values=t.computed_values;}catch(u){let i=u instanceof Error?u.message:String(u);o.push({bindTo:s.bindTo,error:i});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function $n(t,e,n){let r={...n??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return ee(t).evaluate(r)}function Dn(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"]),Pn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Bn(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let n=t;(typeof n.id!="string"||!n.id)&&e.push("id: required, must be a non-empty string");for(let r of Object.keys(n))Pn.has(r)||e.push(`Unknown top-level key: "${r}"`);if((n.card_data==null||typeof n.card_data!="object"||Array.isArray(n.card_data))&&e.push("card_data: required, must be an object"),n.meta!=null)if(typeof n.meta!="object"||Array.isArray(n.meta))e.push("meta: must be an object");else {let r=n.meta;r.title!=null&&typeof r.title!="string"&&e.push("meta.title: must be a string"),r.tags!=null&&!Array.isArray(r.tags)&&e.push("meta.tags: must be an array");}if(n.requires!=null&&!Array.isArray(n.requires)&&e.push("requires: must be an array of strings"),n.provides!=null&&(Array.isArray(n.provides)?n.provides.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=r;(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")),n.compute!=null&&(Array.isArray(n.compute)?n.compute.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`compute[${o}]: must be a compute step object`);else {let s=r;(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")),n.source_defs!=null)if(!Array.isArray(n.source_defs))e.push("source_defs: must be an array");else {let r=new Set,o=new Set;n.source_defs.forEach((s,u)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${u}]: must be an object`);else {let i=s;typeof i.bindTo!="string"||!i.bindTo?e.push(`source_defs[${u}]: missing required "bindTo" property`):(r.has(i.bindTo)&&e.push(`source_defs[${u}]: bindTo "${i.bindTo}" is not unique across source_defs`),r.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?e.push(`source_defs[${u}]: missing required "outputFile" property`):(o.has(i.outputFile)&&e.push(`source_defs[${u}]: outputFile "${i.outputFile}" is not unique across source_defs`),o.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${u}]: optionalForCompletionGating must be a boolean`);}});}if(n.view!=null)if(typeof n.view!="object"||Array.isArray(n.view))e.push("view: must be an object");else {let r=n.view;!Array.isArray(r.elements)||r.elements.length===0?e.push("view.elements: required, must be a non-empty array"):r.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`);}),r.layout!=null&&(typeof r.layout!="object"||Array.isArray(r.layout))&&e.push("view.layout: must be an object"),r.features!=null&&(typeof r.features!="object"||Array.isArray(r.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function Fn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=await ee(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function qn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return t.map(r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=Ne(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}})}var Ht={run:jn,runSync:Nn,eval:$n,resolve:Dn,validate:Bn,enrichSources:Fn,enrichSourcesSync:qn};function De(t){return JSON.stringify(t)}function Pe(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 ne(t,e){function n(){return t.readIndex()??{}}function r(o,s,u){let i=String(s||"").split(".").filter(Boolean);if(i.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let d={...o},h=d;for(let T=0;T<i.length-1;T++){let j=i[T],O=h[j],v=O&&typeof O=="object"&&!Array.isArray(O)?{...O}:{};h[j]=v,h=v;}return h[i[i.length-1]]=u,d}return {readCard(o){let s=n()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return n()[o]?.key??null},readAllCards(){let o=[];for(let[s,u]of Object.entries(n())){if(!t.cardExists(u.key))continue;let i=t.readCard(u.key);i?o.push(i):e?.(`[card-store] could not read card "${s}" at key "${u.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,u]of Object.entries(n()))o[s]=u.checksum;return o},changedSince(o){let s=n(),u=[];for(let[i,d]of Object.entries(s))o[i]!==d.checksum&&u.push(i);for(let i of Object.keys(o))s[i]||u.push(i);return u},validateUpsert(o,s){let u=n(),i=u[o],d=Object.entries(u).find(([,h])=>h.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,u){let i=n(),d=u??i[o]?.key??t.defaultCardKey(o),h=t.writeCard(d,s);i[o]={key:d,checksum:h,updatedAt:new Date().toISOString()},t.writeIndex(i);},patchCard(o,s,u){let i=n(),d=i[o];if(!d||!t.cardExists(d.key))throw new Error(`card "${o}" not found`);let h=t.readCard(d.key);if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`card "${o}" is not patchable`);let T=r(h,s,u),j=t.writeCard(d.key,T);i[o]={key:d.key,checksum:j,updatedAt:new Date().toISOString()},t.writeIndex(i);},removeCard(o){let s=n();s[o]&&(delete s[o],t.writeIndex(s));},readIndex(){return n()}}}function pe(t,e){return {readSourceData(n,r){let o=t.read(`${n}/${r}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(n,r,o,s){let u=e(o);t.write(`${n}/.staged/${s}/${r}`,u);},commitSourceData(n,r,o){let s=`${n}/.staged/${o}/${r}`,u=t.read(s);return u==null?false:(t.write(`${n}/${r}`,u),t.remove(s),true)},hasSource(n,r){return t.exists(`${n}/${r}`)}}}function Ge(t){function e(n){let r=t.readAllEntries();if(!n)return r;let o=r.findIndex(s=>s.id===n);return o===-1?r:r.slice(o+1)}return {readEntriesAfterCursor(n){let r=e(n);return r.length===0?{events:[],newCursor:n}:{events:r.map(o=>o.event),newCursor:r[r.length-1].id}},pendingCount(n){return e(n).length},appendEvent(n){t.appendEntry({id:t.generateId(),event:n});}}}function Ve(t,e){return {appendEntries(n,r){if(!n||r.length===0)return;let o=t.read(n)??[];t.write(n,[...o,...r]);},dispatchEntriesForJournalId(n,r){if(!n)return;let o=t.read(n);if(!(!o||o.length===0)){for(let s of o)try{r(s);}catch(u){let i=u instanceof Error?u.message:String(u);try{e(s,i);}catch{}}t.delete(n);}}}}var re="v1",Pt="board/graph",Me="board/lastJournalProcessedId";function Be(t){return `cards/${t}/runtime`}function Ue(t){return {readRuntime(e){return t.read(Be(e))??{_sources:{}}},writeRuntime(e,n){t.write(Be(e),n);}}}function Ln(t,e){let n={...t};for(let r of e.deleteKeys)delete n[r];return {...n,...e.shallowMerge}}function He(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,n){if(n.schemaVersion!==re)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);let r=t.readValues(e);if(r.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:r.version};let o=Ln(r.values,n);return {ok:true,newVersion:t.writeValues(e,o,n.deleteKeys)}}}}function Ke(t){function e(n){let r=t.read(n);return r==null?null:typeof r=="string"?r:JSON.stringify(r)}return {readTaskExecutorRef(){let n=e("task-executor");if(n?.trim())return Pe(n.trim())},writeTaskExecutorRef(n){t.write("task-executor",De(n));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(n){t.write("chat-handler-flow",n);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(n){t.write("card-store-ref",n);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(n){t.write("outputs-store-ref",n);}}}function Je(t){return {writeComputedValues(e,n){t.write(`cards/${e}/computed_values`,n);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let n of t.listKeys("cards/")){let r=n.match(/^cards\/([^/]+)\/computed_values$/);r&&(e[r[1]]=t.read(n));}return e},writeDataObjects(e){for(let[n,r]of Object.entries(e))n&&t.write(`data-objects/${n}`,r);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let n of t.listKeys("data-objects/"))e[n.slice(13)]=t.read(n);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function Fe(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Gn(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function qe(t,e){return t?.lastRequestedToken?Gn(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function Vn(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function Le(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function oe(t,e){let n=e.state.tasks,r=e.config.tasks,o=Object.keys(n),s=Mt(e),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let R of s.pending)i.set(R.taskName,R.waitingOn);for(let R of s.unresolved)i.set(R.taskName,R.missingTokens);for(let R of s.blocked)i.set(R.taskName,R.failedTokens);let d=new Map;for(let[R,C]of Object.entries(r))for(let x of C.requires??[]){let b=d.get(x)??[];b.push(R),d.set(x,b);}let h=o.sort().map(R=>{let C=n[R],x=r[R]??{requires:[],provides:[]};C.status==="completed"?u.completed+=1:C.status==="failed"?u.failed+=1:C.status==="in-progress"&&(u.in_progress+=1);let b=x.requires??[],y=x.provides??[],w=Object.keys(C.data??{}).sort(),q=b.filter(U=>e.state.availableOutputs.includes(U)),G=b.filter(U=>!e.state.availableOutputs.includes(U)),D=i.get(R)??G,A=new Set;for(let U of y)for(let z of d.get(U)??[])z!==R&&A.add(z);let P=C.failedAt,X=C.error?{message:C.error,code:"TASK_FAILED",at:P,source:"task-runtime"}:void 0;return {name:R,status:C.status,error:X,requires:b,requires_satisfied:q,requires_missing:G,provides_declared:y,provides_runtime:w,blocked_by:D,unblocks:Array.from(A).sort(),runtime:{attempt_count:C.executionCount??0,restart_count:C.retryCount??0,in_progress_since:C.status==="in-progress"?C.startedAt??null:null,last_transition_at:C.lastUpdated??null,last_completed_at:C.completedAt??null,last_restarted_at:C.startedAt??null,status_age_ms:C.lastUpdated?0:null}}});u.pending=s.pending.length,u.blocked=s.blocked.length,u.unresolved=s.unresolved.length;let T=h.map(R=>({name:R.name,fanOut:R.unblocks.length})).sort((R,C)=>C.fanOut-R.fanOut||R.name.localeCompare(C.name)),j=T.length>0?T[0]:{name:null,fanOut:0},O=new Set;for(let R of Object.values(r))for(let C of R.requires??[])O.add(C);let v=0;for(let[R,C]of Object.entries(r)){let x=(C.requires??[]).length===0,y=(C.provides??[]).some(w=>(d.get(w)??[]).some(q=>q!==R));x&&!y&&(v+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:u.completed,eligible:s.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:v,topology:{edge_count:Array.from(O).length,max_fan_out_card:j.name,max_fan_out:j.fanOut}},cards:h}}function Mn(){return new Date().toISOString()}function ze(t,e,n,r,o,s,u){return async i=>{let d=[],h=n.cardStore.readCard(i.nodeId);if(!h)return "task-initiate-failure";let T=h.id,j=h.card_data??{},O=h.source_defs??[],v=O.filter(B=>B.optionalForCompletionGating!==true),R=n.cardRuntimeStore.readRuntime(T),C=false,x=()=>{C&&(n.cardRuntimeStore.writeRuntime(T,R),C=false);},b=B=>Fe(R._sources[B]),y=(B,g)=>{R._sources[B]=Fe(g),C=true;},w=i.taskState?.executionCount??0;if(R._lastExecutionCount!==w&&(R._sources={},R._lastExecutionCount=w,C=true),i.update){let B=i.update,g=B.outputFile;if(g){let f=b(g);if(B.failure){let S=B.rqt??f.lastRequestedToken??f.queueRequestedToken;S&&y(g,Le(f,S));}else {let S=B.rqt;if(!f.lastCompletedToken||S>f.lastCompletedToken){let I=typeof B.deliveryToken=="string"?B.deliveryToken:void 0,V=false;I&&(V=n.fetchedSourcesStore.commitSourceData(T,g,I)),V?y(g,Vn(f,S)):y(g,Le(f,S));}}x();}}let G={};for(let B of O)if(B.outputFile){let g=n.fetchedSourcesStore.readSourceData(T,B.outputFile);g!==null&&(G[B.bindTo]=g);}let D={};for(let[B,g]of Object.entries(i.state??{}))if(g!==null&&typeof g=="object"&&!Array.isArray(g)){let f=g[B];D[B]=f!==void 0?f:g;}else D[B]=g;let A={id:T,card_data:{...j},requires:D,source_defs:O,compute:h.compute};A._sourcesData=G,h.compute&&Ht.runSync(A,{sourcesData:G}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))(T,A.computed_values??{});let P={...h},X=Ht.enrichSourcesSync(Array.isArray(h.source_defs)?h.source_defs:void 0,{card_data:h.card_data,requires:D}),U=t.value;P.source_defs=Array.isArray(X)?X.map(B=>({...B,boardDir:typeof B.boardDir=="string"&&B.boardDir?B.boardDir:U})):X;let z=Mn(),Q=i.update?void 0:z,H=v.filter(B=>{let g=B.outputFile;if(typeof g!="string"||!g)return true;let f=b(g);Q&&(f={...f,queueRequestedToken:Q},y(g,f));let S=f.queueRequestedToken??f.lastRequestedToken??z,I=qe(f,S);return I==="in-flight"?false:I==="dispatch"});if(x(),H.length>0){let B=false,g=z;for(let f of H){let S=f.outputFile;if(typeof S!="string"||!S)continue;let I=b(S),V=I.queueRequestedToken??z;y(S,{...I,lastRequestedToken:V}),g=V,B=true;}return B&&x(),B&&(d.push({taskKind:"source-fetch",payload:{boardRef:wt(t),enrichedCard:P,callbackToken:i.callbackToken,rqt:g}}),n.executionRequestStore.appendEntries(e,d)),"task-initiated"}if(v.some(B=>{let g=B.outputFile;if(typeof g!="string"||!g)return false;let f=b(g),S=f.queueRequestedToken??f.lastRequestedToken??z;return qe(f,S)==="in-flight"}))return "task-initiated";let xt=h.provides??[],Nt={};for(let{bindTo:B,ref:g}of xt)Nt[B]=Ht.resolve(A,g);return (u??n.outputStore.writeDataObjects.bind(n.outputStore))(Nt),O.filter(B=>{if(B.optionalForCompletionGating!==true)return false;let g=b(B.outputFile);return !g.lastRequestedToken||!g.lastCompletedToken?true:g.lastCompletedToken<=g.lastRequestedToken}).length>0&&d.push({taskKind:"source-fetch",payload:{boardRef:wt(t),enrichedCard:P,callbackToken:i.callbackToken,rqt:z}}),r(i.nodeId,Nt),d.length>0&&n.executionRequestStore.appendEntries(e,d),"task-initiated"}}var ge={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Ye(t){return {[Pt]:t.graph,[Me]:t.lastDrainedJournalId}}function Xe(t){let e=t[Pt],n=t[Me];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Pt}`);return {graph:e,lastDrainedJournalId:typeof n=="string"?n:""}}function We(t){let e=t.requires,n=t.provides?.map(r=>r.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:n,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function rt(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function et(t){return {status:"fail",error:t}}function ot(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Un(t){let e=new TextEncoder().encode(t),n=Array.from(e,r=>String.fromCharCode(r)).join("");return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Qe(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=Uint8Array.from(r,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 Hn(t){return Un(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 tn(t,e){let n=e.onWarn??(()=>{}),r=wt(t);function o(g){if(g.length!==0)try{let f=e.publishBoardChangeNotifications?.(g);f&&typeof f.catch=="function"&&f.catch(S=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${S instanceof Error?S.message:String(S)}`));}catch(f){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${f instanceof Error?f.message:String(f)}`);}}function s(){let g=i().readCardStoreRef();if(!g)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(g);return {readIndex(){return f.read("_index")},writeIndex(S){f.write("_index",S);},readCard(S){return f.read(S)},writeCard(S,I){return f.write(S,I),e.hashFn(I)},cardExists(S){return f.read(S)!==null},defaultCardKey(S){return S}}}let u={readValues(g){let f=e.kvStorage("state-snapshot"),S=f.listKeys().sort();if(S.length===0)return {version:null,values:{}};let I={};for(let V of S)I[V]=f.read(V);return {version:e.hashFn(I),values:I}},writeValues(g,f,S){let I=e.kvStorage("state-snapshot");for(let V of S)I.delete(V);for(let[V,W]of Object.entries(f))I.write(V,W);return e.hashFn(f)}},i=()=>Ke(e.kvStorage("config")),d=()=>He(u),h=()=>Ge(e.journalAdapter()),T=()=>ne(s(),n),j=()=>{let g=i().readOutputsStoreRef();if(!g)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Je(e.kvStorageForRef(g))};function O(){return !!d().readSnapshot(t.value).values[Pt]}function v(){let g=d().readSnapshot(t.value);if(!g.values[Pt])throw new Error(`Board not initialized at ${t.value}`);return Xe(g.values)}function R(g,f){let S=d().commitSnapshot(t.value,{schemaVersion:re,expectedVersion:f,commitId:e.genId(),committedAt:ut(),deleteKeys:[],shallowMerge:Ye(g)});if(!S.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${f??"null"} current=${S.currentVersion??"null"}`)}function C(g){h().appendEvent(g);}async function x(){let g=(E,$)=>{let Z=E.payload,gt=(Z?.enrichedCard??{}).id??Z?.cardId??"unknown";C({type:"task-failed",taskName:gt,error:$,timestamp:ut()});},f=Ve(e.kvStorage("execution-requests"),g),S=Ue(e.kvStorage("card-runtime")),I=pe(e.blobStorage("sources"),E=>e.resolveBlob(E)),V=new Map,W={readRuntime(E){return V.get(E)??S.readRuntime(E)},writeRuntime(E,$){V.set(E,$);}},mt=[],st=new Map,pt={readSourceData(E,$){let Z=`${E}/${$}`;return st.has(Z)?st.get(Z):I.readSourceData(E,$)},ingestSourceDataStaged(E,$,Z,_t){I.ingestSourceDataStaged(E,$,Z,_t);},commitSourceData(E,$,Z){let _t=`${E}/.staged/${Z}/${$}`,Ft=e.blobStorage("sources").read(_t);if(Ft==null)return false;let Tt=`${E}/${$}`,a=Ft.trim();try{st.set(Tt,JSON.parse(a));}catch{st.set(Tt,a);}return mt.push({cardId:E,outputFile:$,deliveryToken:Z}),true},hasSource(E,$){let Z=`${E}/${$}`;return st.has(Z)?true:I.hasSource(E,$)}},nt={cardStore:T(),cardRuntimeStore:W,fetchedSourcesStore:pt,outputStore:j(),executionRequestStore:f},ht=v(),yt=te(ht.graph),{events:kt,newCursor:At}=h().readEntriesAfterCursor(ht.lastDrainedJournalId),Ct=[],K=[],St=[],Jt=new Map,zt=(E,$)=>{Ct.push({type:"task-completed",taskName:E,data:$,timestamp:ut()});},Lt=(E,$)=>C({type:"task-failed",taskName:E,error:$,timestamp:ut()}),Et=Ie(yt,{handlers:{"card-handler":ze(t,At,nt,zt,Lt,(E,$)=>{K.push({cardId:E,values:$});},E=>{St.push(E);})}});for(Ct=kt;Ct.length>0;){let E=Ct;Ct=[];for(let $ of E)if($.type==="task-restart"){let Z=nt.cardStore.readCard($.taskName);Z&&Jt.set($.taskName,Z);}Et.pushAll(E),await Et.waitForHandlers();}let Bt=Et.getState();await Et.dispose({wait:true});let ue=d().readSnapshot(t.value).version;R({lastDrainedJournalId:At,graph:Vt(Bt)},ue);for(let{cardId:E,values:$}of K)nt.outputStore.writeComputedValues(E,$);for(let E of St)nt.outputStore.writeDataObjects(E);for(let[E,$]of V)S.writeRuntime(E,$);for(let{cardId:E,outputFile:$,deliveryToken:Z}of mt)I.commitSourceData(E,$,Z);let $t;try{$t=oe(r,Bt),nt.outputStore.writeStatusSnapshot($t);}catch(E){n(`[board-live-cards-public] status publish failed: ${E instanceof Error?E.message:String(E)}`);}let bt=[];for(let{cardId:E,values:$}of K)bt.push({kind:"computed_values",cardId:E,values:$});for(let E of St)for(let[$,Z]of Object.entries(E))$&&bt.push({kind:"data_object",key:$,payload:Z});for(let[E,$]of Jt)bt.push({kind:"card_refreshed",cardId:E,card:$});$t!==void 0&&bt.push({kind:"status",status:$t}),o(bt);let Gt=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:wt({kind:"built-in",value:"source-cli-task-executor"})};f.dispatchEntriesForJournalId(At,E=>{if(E.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${E.taskKind}" \u2014 skipping`);return}let $=E.payload,Z=$.enrichedCard?.id??"unknown",_t=$.enrichedCard?.source_defs??[];for(let gt of _t){if(!gt.outputFile){n(`[dispatch] source "${gt.bindTo}" has no outputFile \u2014 skipping`);continue}let Ft=Hn({cbk:$.callbackToken,rg:t.value,br:wt(t),cid:Z,b:gt.bindTo,d:gt.outputFile,cs:void 0,rqt:$.rqt});e.dispatchExecution(Gt,{source_def:gt,base_ref:wt(t),callback:{token:Ft,via:e.selfRef}}).catch(Tt=>Lt(Z,Tt instanceof Error?Tt.message:String(Tt)));}});}async function b(){try{let g=()=>{let S=v(),{events:I}=h().readEntriesAfterCursor(S.lastDrainedJournalId);I.length<=0||(b(),e.requestProcessAccumulated?.());},f=await he(e.lock,x,g);return rt({ran:f!==!1})}catch(g){return ot(g)}}function y(g){try{let f=g.params?.cardStoreRef;if(!f)return et("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!O()){let W=Qt(ge);R({lastDrainedJournalId:"",graph:Vt(W)},null);}let S=g.params?.outputsStoreRef;if(!S)return et("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let I=i();I.writeCardStoreRef(f),I.writeOutputsStoreRef(S);let V=g.body??{};V["task-executor-ref"]&&I.writeTaskExecutorRef(V["task-executor-ref"]),Object.prototype.hasOwnProperty.call(V,"chat-handler-flow")&&I.writeChatHandlerFlow(V["chat-handler-flow"]);try{j().writeStatusSnapshot(oe(r,te(v().graph)));}catch{}return rt()}catch(f){return ot(f)}}function w(g){try{let f=j().readStatusSnapshot();if(!f){f=oe(r,te(v().graph));try{j().writeStatusSnapshot(f);}catch{}}return rt(f)}catch(f){return ot(f)}}function q(g){try{let f=g.params?.id;return f?(C({type:"task-removal",taskName:f,timestamp:ut()}),b(),rt()):et("removeCard requires params.id")}catch(f){return ot(f)}}function G(g){try{let f=g.params?.id;return f?(C({type:"task-restart",taskName:f,timestamp:ut()}),b(),rt()):et("retrigger requires params.id")}catch(f){return ot(f)}}async function D(g){return b()}function A(g){try{let f=g.params?.cardId,S=g.params?.all,I=!!g.params?.restart;if(!f&&!S)return et("upsertCard requires --card-id <id> or --all");let V=S?T().readAllCards().map(W=>W.id):[f];for(let W of V)if(!T().readCard(W))return et(`Card "${W}" not found in board at ${t.value}`);for(let W of V){let mt=T().readCard(W),st=We(mt),pt=e.hashFn(st),nt=e.kvStorage("card-upsert"),ht=nt.read(W),yt=ht?.taskConfigHash!==pt;if(!(!yt&&!I)){if(yt){let kt=ht?.blobRef??T().readCardKey(W)??W;C({type:"task-upsert",taskName:W,taskConfig:st,timestamp:ut()}),nt.write(W,{blobRef:kt,taskConfigHash:pt,updatedAt:ut()});}I&&C({type:"task-restart",taskName:W,timestamp:ut()});}}return b(),rt()}catch(f){return ot(f)}}function P(g){try{let f=g.params?.token;if(!f)return et("taskFailed requires params.token");let S=g.params?.error??"unknown error",I=se(f);return I?(C({type:"task-failed",taskName:I.taskName,error:S,timestamp:ut()}),b(),rt()):et("Invalid callback token")}catch(f){return ot(f)}}function X(g){try{let f=g.params?.token;if(!f)return et("taskProgress requires params.token");let I=(g.body??{}).update??{},V=se(f);return V?(C({type:"task-progress",taskName:V.taskName,update:I,timestamp:ut()}),b(),rt()):et("Invalid callback token")}catch(f){return ot(f)}}function U(g){try{let f=g.params?.token,S=g.params?.ref;if(!f)return et("sourceDataFetched requires params.token");if(!S)return et("sourceDataFetched requires params.ref");let I=Ze(f);if(!I)return et("Invalid source token");let{cbk:V,cid:W,b:mt,d:st,cs:pt,rqt:nt}=I,ht=pe(e.blobStorage("sources"),Ct=>e.resolveBlob(Ct)),yt=e.genId();ht.ingestSourceDataStaged(W,st,me(S),yt);let kt=se(V);if(!kt)return et("Invalid callback token embedded in source token");let At=ut();return C({type:"task-progress",taskName:kt.taskName,update:{bindTo:mt,outputFile:st,fetchedAt:At,deliveryToken:yt,sourceChecksum:pt,rqt:nt},timestamp:At}),b(),rt()}catch(f){return ot(f)}}function z(g){try{let f=g.params?.token,S=g.params?.reason??"unknown";if(!f)return et("sourceDataFetchFailure requires params.token");let I=Ze(f);if(!I)return et("Invalid source token");let{cbk:V,b:W,d:mt,cs:st,rqt:pt}=I,nt=se(V);return nt?(C({type:"task-progress",taskName:nt.taskName,update:{bindTo:W,outputFile:mt,failure:!0,reason:S,sourceChecksum:st,rqt:pt},timestamp:ut()}),b(),rt()):et("Invalid callback token embedded in source token")}catch(f){return ot(f)}}function Q(g){try{let f=i().readCardStoreRef();return f?rt({storeRef:f}):et(`Board at ${t.value} has no card store configured`)}catch(f){return ot(f)}}function H(g){try{let f=i().readOutputsStoreRef();return f?rt({storeRef:f}):et(`Board at ${t.value} has no outputs store configured`)}catch(f){return ot(f)}}function vt(g){try{let f=g.params?.key;if(!f)return et("getConfig requires params.key");let S=i(),I;switch(f){case "task-executor":I=S.readTaskExecutorRef()??null;break;case "chat-handler-flow":I=S.readChatHandlerFlow()??null;break;case "card-store-ref":I=S.readCardStoreRef();break;case "outputs-store-ref":I=S.readOutputsStoreRef();break;default:return et(`getConfig: unknown key "${f}"`)}return rt({value:I})}catch(f){return ot(f)}}function xt(g){try{let f=g.params?.key;if(!f)return et("getOutputsDataObject requires params.key");let S=j().readDataObject(f);return rt(S)}catch(f){return ot(f)}}function Nt(g){try{return rt(j().readAllDataObjects())}catch(f){return ot(f)}}function Kt(g){try{let f=g.params?.key;if(!f)return et("getOutputsComputedValues requires params.key");let S=j().readComputedValues(f);return rt(S)}catch(f){return ot(f)}}function B(g){try{return rt(j().readAllComputedValues())}catch(f){return ot(f)}}return {init:y,status:w,getCardStoreRef:Q,getOutputsStoreRef:H,getConfig:vt,getOutputsDataObject:xt,getAllOutputsDataObjects:Nt,getOutputsComputedValues:Kt,getAllOutputsComputedValues:B,removeCard:q,retrigger:G,processAccumulatedEvents:D,upsertCard:A,taskFailed:P,taskProgress:X,sourceDataFetched:U,sourceDataFetchFailure:z}}function en(t){function e(o){return {status:"success",data:o}}function n(o){return {status:"fail",error:o}}function r(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let u=t.readCard(s);return u?e({cards:[u]}):n(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return r(s)}},set(o){try{let s=o.body;if(s==null)return n("set requires a body (card object or array of cards)");let u=Array.isArray(s)?s:[s];for(let i of u){if(typeof i.id!="string")return n("each card must have a string `id` field");t.writeCard(i.id,i);}return e({count:u.length})}catch(s){return r(s)}},del(o){try{let s=o.body?.ids??[],u=o.params?.id,i=u?[...s,u]:s;if(i.length===0)return n("del requires body.ids (string[]) or params.id");for(let d of i)t.removeCard(d);return e({count:i.length})}catch(s){return r(s)}},patch(o){try{let s=o.params?.id,u=o.params?.path;if(!s)return n("patch requires params.id");if(!u)return n("patch requires params.path");let i=o.body,d=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:o.body;return t.patchCard(s,u,d),e({count:1})}catch(s){return r(s)}}}}function nn(){return new Date().toISOString()}function rn(t){return new TextEncoder().encode(t).byteLength}function Kn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function Jn(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function zn(t){let e=String(t||"").trim();if(!e)return "upload.bin";let n=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (n>=0?e.slice(n+1):e)||"upload.bin"}function Yn(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Xn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Wn(t){let e=zn(t),n=e.lastIndexOf(".");return n<=0||n===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,n),ext:e.slice(n)}}function Zn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function on(t){function e(n){let r=t.stat?Kn(t.stat(n)):null;if(r)return r;if(!t.exists(n))return null;let o=t.read(n);return o===null?{key:n}:{key:n,size:rn(o)}}return {exists(n){return t.exists(n)},putText(n,r,o="text/plain; charset=utf-8"){t.write(n,r);let s=e(n)??{key:n};return s.contentType=o,s.updatedAt=s.updatedAt??nn(),s.size=s.size??rn(r),s},putBytes(n,r,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(n,r);else {let u=JSON.stringify({__kind:"bytes-array",data:[...r]});t.write(n,u);}let s=e(n)??{key:n};return s.contentType=o,s.updatedAt=s.updatedAt??nn(),s.size=s.size??r.byteLength,s},getText(n){let r=t.read(n);if(r===null){if(!t.readBytes)return null;let o=t.readBytes(n);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return r},getBytes(n){if(t.readBytes){let o=t.readBytes(n);if(o!==null)return o}let r=t.read(n);if(r===null)return null;try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(r)},head:e,list(n=""){return t.listKeys(n).map(r=>e(r)??{key:r}).sort((r,o)=>r.key.localeCompare(o.key))},remove(n){t.remove(n);}}}function sn(t){function e(o,s){let u=0,i=[];Array.isArray(s)&&i.push(...s);for(let d of t.list(`${o}/`))i.push(Zn(d.key));for(let d of i){let h=Jn(d);Number.isFinite(h)&&h>u&&(u=h);}return u+1}function n(o,s,u){let i=Number(u?.maxLen||32),{stem:d,ext:h}=Wn(o),T=Xn(h),j=Yn(d),O=`${String(s).padStart(3,"0")}-`,v=T,R=i-O.length-v.length;R<1&&(v="",R=i-O.length);let C=j.slice(0,Math.max(1,R)),x=`${O}${C}${v}`;return x.length>i&&(x=x.slice(0,i).replace(/\.$/,"")),x}function r(o,s,u){let i=e(o,u?.seedNames),d=n(s,i,{maxLen:u?.maxLen});for(;t.exists(`${o}/${d}`);)i+=1,d=n(s,i,{maxLen:u?.maxLen});return d}return {nextSerial:e,buildStoredName:n,allocateStoredName:r}}function an(){function t(o,s){if(!Array.isArray(o))return [];let u=[];for(let i of o){if(!i||typeof i!="object")continue;let d=i;typeof d.stored_name=="string"&&u.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 u}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function n(o,s){let u=e(o);if(s.length===0)return o.files=u,u;let i=new Set(u.map(d=>d.stored_name));for(let d of s)i.has(d.stored_name)||(u.push(d),i.add(d.stored_name));return o.files=u,u}function r(o,s,u){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"}:u&&u!==d.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:d}}return {read:e,normalizeIncoming:t,merge:n,resolve:r}}function Qn(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function un(){let t=new Map,e=new Map;function n(r){return t.has(r)||t.set(r,[]),t.get(r)}return {append(r,o,s,u=[]){let i={id:Qn(),role:o,text:s,files:u,updated_at:new Date().toISOString()};return n(r).push(i),i.id},readAll(r){return n(r).slice()},readAfter(r,o){let s=n(r);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let u=s.findIndex(d=>d.id===o),i=u===-1?s.slice():s.slice(u+1);return {records:i,cursor:i.length>0?i[i.length-1].id:o}},clear(r){t.set(r,[]);},setProcessing(r,o){o?e.set(`p:${r}`,true):e.delete(`p:${r}`);},isProcessing(r){return e.get(`p:${r}`)===true},getConfig(r){return e.get(`c:${r}`)??{}},setConfig(r,o){let s=e.get(`c:${r}`)??{};e.set(`c:${r}`,{...s,...o});}}}function cn(t){function e(i){return {status:"success",data:i}}function n(i){return {status:"fail",error:i}}function r(i){return {status:"error",error:i instanceof Error?i.message:String(i)}}function o(i,d="command envelope"){let h=typeof i.cardId=="string"?i.cardId:void 0;if(!i.command)return n(`chat-store: ${d} missing "command"`);if(!h)return n(`chat-store: ${d} missing "cardId"`);if(i.command==="append")return u.append({params:{cardId:h},body:{role:i.role,text:i.text,files:i.files}});if(i.command==="read-all")return u.readAll({params:{cardId:h}});if(i.command==="read-after")return u.readAfter({params:{cardId:h},body:{cursor:i.cursor??null}});if(i.command==="clear")return u.clear({params:{cardId:h}});if(i.command==="set-processing")return u.setProcessing({params:{cardId:h},body:{active:i.active}});if(i.command==="is-processing")return u.isProcessing({params:{cardId:h}});if(i.command==="get-config")return u.getConfig({params:{cardId:h}});if(i.command==="set-config"){let{command:T,cardId:j,...O}=i;return u.setConfig({params:{cardId:h},body:O})}return n(`chat-store: unknown command "${String(i.command)}"`)}function s(i){if(!Array.isArray(i.commands)||i.commands.length===0)return n('chat-store: command envelope must include a non-empty "commands" array');let d=[];for(let h=0;h<i.commands.length;h+=1){let T=i.commands[h];if(!T||typeof T!="object"||Array.isArray(T))return n(`chat-store: command envelope entry ${h} must be an object`);let j={cardId:i.cardId,...T},O=o(j,`command envelope entry ${h}`);if(O.status!=="success")return O;d.push({index:h,command:String(j.command),data:O.data});}return e({results:d})}let u={append(i){try{let d=i.params?.cardId;if(!d)return n("append requires params.cardId");let h=i.body??{},T=typeof h.role=="string"?h.role:"",j=typeof h.text=="string"?h.text:"",O=Array.isArray(h.files)?h.files:[];if(!T)return n("append requires body.role");let v=t.append(d,T,j,O);return e({id:v})}catch(d){return r(d)}},readAll(i){try{let d=i.params?.cardId;return d?e({records:t.readAll(d)}):n("readAll requires params.cardId")}catch(d){return r(d)}},readAfter(i){try{let d=i.params?.cardId;if(!d)return n("readAfter requires params.cardId");let T=(i.body??{}).cursor??null;return e(t.readAfter(d,T))}catch(d){return r(d)}},clear(i){try{let d=i.params?.cardId;return d?(t.clear(d),e({ok:!0})):n("clear requires params.cardId")}catch(d){return r(d)}},setProcessing(i){try{let d=i.params?.cardId;if(!d)return n("setProcessing requires params.cardId");let h=i.body??{};return typeof h.active!="boolean"?n("setProcessing requires body.active (boolean)"):(t.setProcessing(d,h.active),e({ok:!0}))}catch(d){return r(d)}},isProcessing(i){try{let d=i.params?.cardId;return d?e({active:t.isProcessing(d)}):n("isProcessing requires params.cardId")}catch(d){return r(d)}},getConfig(i){try{let d=i.params?.cardId;return d?e({config:t.getConfig(d)}):n("getConfig requires params.cardId")}catch(d){return r(d)}},setConfig(i){try{let d=i.params?.cardId;if(!d)return n("setConfig requires params.cardId");let h=i.body??{};return t.setConfig(d,h),e({ok:!0})}catch(d){return r(d)}},run:o,runBatch:s};return u}var dn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},tr=32;function er(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function ln(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 fn(t,e){if(!e||typeof e!="object")return;let n=e;if(n.kind==="notification-batch"&&Array.isArray(n.notifications)){for(let r of n.notifications)fn(t,r);return}n.kind==="status"&&ln(n.status)&&(t.status=n.status),n.kind==="computed_values"&&n.cardId&&(t.computedValues[n.cardId]=n.values),n.kind==="data_object"&&n.key&&(t.dataObjects[n.key]=n.payload),n.kind==="card_refreshed"&&n.cardId&&(t.cards[n.cardId]=n.card);}function no(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),n={...dn,...t.corsHeaders||{}},r=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,u=t.chatFlowRunner||null,i=t.chatStorage??un(),d=cn(i),h=t.notificationTransport||null,T=t.serverUrl||null,j=t.executionExtra||{},O=new Map,v=new Map,R=new Map,C=null;function x(a){let c=tn(a.baseRef,a.boardAdapter),l=a.boardAdapter.kvStorageForRef(a.cardStoreRef),m=en(ne({readIndex:()=>l.read("_index"),writeIndex:_=>l.write("_index",_),readCard:_=>l.read(_),writeCard:(_,F)=>(l.write(_,F),_),cardExists:_=>l.read(_)!==null,defaultCardKey:_=>_},o.warn)),k=a.artifactsAdapter||a.boardAdapter,N=null;return {label:a.label,board:c,cardStore:m,get filesArtifacts(){return N??=on(k.blobStorage("files"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:er(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let b=t.boards.map(x),y=new Map;function w(a){return y.get(a)??0}function q(a){let c=b[w(a)];return {files:c?c.filesArtifacts:null}}function G(a){let c=q(a);return c.files?sn(c.files):null}function D(){return an()}function A(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function P(a){if(!a||a.notificationTeardown||!h||!a.notifyRef)return;let c=await h.subscribe(a.notifyRef,l=>{fn(a.notification,l);let p=l.kind==="notification-batch"?l.notifications:[l];gt(p);});a.notificationTeardown=c;}async function X(a){if(!a||a.initialized)return;let c={cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef},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:c,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 m=await s.describe(a.chatHandlerRef);m&&m.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${m.kind}", expected "chat-handler" for ${a.label}`):m&&o.info(`[init] chat-handler validated: ${m.name} (protocol ${m.protocolVersion}) for ${a.label}`);}catch(m){o.warn(`[init] chat-handler describe failed for ${a.label}: ${m?.message||String(m)}`);}a.initialized=true;}function U(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let c=[],l=a.board.status({});l.status==="success"&&l.data!=null&&ln(l.data)&&c.push({kind:"status",status:l.data});let p=a.board.getAllOutputsDataObjects({});if(p.status==="success"&&p.data!=null)for(let[k,N]of Object.entries(p.data))k&&c.push({kind:"data_object",key:k,payload:N});let m=a.board.getAllOutputsComputedValues({});if(m.status==="success"&&m.data!=null)for(let[k,N]of Object.entries(m.data))k&&c.push({kind:"computed_values",cardId:k,values:N});c.length>0&&a.boardAdapter.publishBoardChangeNotifications(c);}function z(a,c){if(!a||a.cardsBootstrapped)return;let l=a.cardStore.get({}),p=l.status==="success"&&Array.isArray(l.data?.cards)?l.data.cards:[];for(let m of p)typeof m.id=="string"&&(y.set(m.id,c),a.board.upsertCard({params:{cardId:m.id}}));a.cardsBootstrapped=true;}async function Q(){for(let a of b)await X(a);}async function H(){await Q();for(let a=0;a<b.length;a++)U(b[a]),z(b[a],a);}function vt(a){return b[w(a)]??null}function xt(a){let c=vt(a);if(!c)return null;let l=c.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 Nt(){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},c=[];for(let l of b)c.push(...a(l));return c}function Kt(){let a=b.map(k=>{try{let _=k.boardAdapter.kvStorageForRef(k.outputsStoreRef).read("status");if(_!=null)return _}catch{}return k.notification.status}).filter(Boolean);if(a.length===0)return null;if(a.length===1)return a[0];let c=[],l=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],p={};for(let k of l)p[k]=0;for(let k of a){let N=k,_=Array.isArray(N.cards)?N.cards:[];c.push(..._);for(let F of l)p[F]+=Number(N?.summary?.[F]||0);}let m=a[0];return {...m,cards:c,summary:{...m.summary||{},card_count:c.length,...p}}}function B(){let a={},c=l=>{for(let[p,m]of Object.entries(l.notification.computedValues)){let k=l.notification.cards[p];a[p]={schema_version:"v1",card_id:p,card_data:k?.card_data??{},computed_values:m??{}};}};for(let l of b)c(l);return a}function g(){let a={};for(let c of b)Object.assign(a,c.notification.dataObjects||{});return a}function f(){let a=Nt(),c=B(),l=g(),p={};for(let k of a){if(!k?.id)continue;let N=k.id,_=c[N]||{},F={..._.card_data&&typeof _.card_data=="object"?_.card_data:k.card_data&&typeof k.card_data=="object"?k.card_data:{}};p[N]={schema_version:_.schema_version||"v1",card_id:_.card_id||N,card_data:F,computed_values:_.computed_values&&typeof _.computed_values=="object"?_.computed_values:{}};}let m={};for(let k of a){if(!k?.id)continue;let N=k.id;try{let _=nt(N),F=i.isProcessing(N);(_.length>0||F)&&(m[N]={messages:_.map(Y=>({role:String(Y.role||"system"),text:String(Y.text||""),files:Array.isArray(Y.files)?Y.files:[]})),receiving:!1,processing:F});}catch{}}return {boardId:r,cardDefinitions:a,statusSnapshot:Kt(),dataObjectsByToken:l,cardRuntimeById:p,cardChatsByCardId:m}}function S(a,c,l){let p=l?.syncBoard!==false,m=vt(a);if(!m)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let k=xt(a);if(!k)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let N=c(k)||k,_=m.cardStore.set({body:N});if(_.status!=="success")throw Object.assign(new Error(_.error||`Failed to persist card: ${a}`),{statusCode:500});if(p){let F=m.board.upsertCard({params:{cardId:a,restart:true}});if(F.status!=="success")throw Object.assign(new Error(F.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function I(a,c){S(a,c,{syncBoard:true});}function V(a,c){S(a,c,{syncBoard:false});}function W(a,c){I(a,l=>{if(!c||typeof c!="object"||Object.keys(c).length===0)return l;function p(m,k,N){let _=String(k||"").split(".").filter(Boolean);if(!_.length)return;let F=m;for(let Y=0;Y<_.length-1;Y++){let tt=_[Y];(!F[tt]||typeof F[tt]!="object")&&(F[tt]={}),F=F[tt];}F[_[_.length-1]]=N;}if(c.fieldValues!==void 0&&c.fieldValues!==null){let m=null,k=l.view;if(k&&Array.isArray(k.elements)){for(let N of k.elements)if(N?.data&&N.data.writeTo){m=N.data.writeTo;break}}m?p(l,m,c.fieldValues):typeof c.fieldValues=="object"&&!Array.isArray(c.fieldValues)&&(l.card_data={...l.card_data||{},...c.fieldValues});}else {if(Array.isArray(c._stagedFiles)&&c._stagedFiles.length>0)return l;for(let[m,k]of Object.entries(c))m!=="_stagedFiles"&&(k!==null&&typeof k=="object"&&!Array.isArray(k)&&l[m]!==null&&typeof l[m]=="object"&&!Array.isArray(l[m])?l[m]={...l[m],...k}:l[m]=k);}return l});}function mt(a){let c=String(a||"").trim();if(!c)return "upload.bin";let l=Math.max(c.lastIndexOf("/"),c.lastIndexOf("\\"));return (l>=0?c.slice(l+1):c)||"upload.bin"}function st(a){i.clear(a),i.setProcessing(a,false);}function pt(a,c,l,p){let m=typeof l=="string"?l.trim():"";return i.append(a,c,m,p)}function nt(a){return i.readAll(a)}function ht(a){let c=[];try{let l=xt(a);if(!l)return c;let p=D().read(l.card_data&&typeof l.card_data=="object"?l.card_data:null);for(let m of p)c.push(m.stored_name);}catch{}return c}function yt(a,c,l,p){let m=A(a),k=q(a),N=mt(c),_=G(a),F=_?_.allocateStoredName(m,N,{seedNames:ht(a),maxLen:tr}):`${String(Date.now())}-${N}`;return k.files&&k.files.putBytes(`${m}/${F}`,new Uint8Array(p),l||"application/octet-stream"),{name:N,stored_name:F,size:p.length,mime_type:l||"application/octet-stream",path:`${a}/files/${F}`,uploaded_at:new Date().toISOString()}}function kt(a){let c=vt(a);if(!c)return null;let l=c.board.getConfig({params:{key:"chat-handler-flow"}}),p=l.status==="success"?l.data?.value:null,m=c.chatHandlerRef;return p==null&&(!m||typeof m!="object")?null:{ctx:c,handlerFlow:p,handlerRef:m}}function At(a,c,l=false){let p=kt(a);if(!p)return;let{ctx:m,handlerFlow:k,handlerRef:N}=p;if(!l)try{i.setProcessing(a,!0);}catch{}let _={boardId:r,cardId:String(a),lastChatEntryId:c,...j,...T?{serverUrl:T}:{}};if(!u&&k!=null){try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${a}" but no chatFlowRunner was provided`);return}if(k!=null){let Y=u;if(!Y)return;Y.run(k,_,{boardId:r,cardId:String(a),label:m.label,logger:o,serverUrl:T,executionExtra:j}).then(tt=>{if(tt.dispatched)o.info(`[chat-handler-flow] invoked for card "${a}" (boardId: "${r}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${a}": ${tt.error||"unknown"}`);}},tt=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${a}": ${tt?.message||String(tt)}`);});return}let F=N;F&&s.invoke(F,_).then(Y=>{if(Y.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${r}")`);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 Ct(a,c,l){let p=c==="chat-send"?V:I,m;p(a,k=>{let N=new Date().toISOString(),_=k.card_data&&typeof k.card_data=="object"?k.card_data:{};if(k.card_data=_,c==="chat-send"){let F=l&&typeof l.text=="string"?l.text.trim():"",Y=[];if(Array.isArray(l?.files)){for(let tt of l.files)if(tt){if(typeof tt=="string"){Y.push({name:tt});continue}if(typeof tt=="object"){let at=tt;typeof at.name=="string"&&Y.push({name:at.name,size:at.size,mime_type:at.mime_type,path:at.path,uploaded_at:at.uploaded_at,stored_name:at.stored_name});}}}if(F||Y.length>0){let tt=d.runBatch({cardId:a,commands:[{command:"append",role:"user",text:F,files:Y},{command:"set-processing",active:true}]});if(tt.status!=="success")throw new Error(tt.error);let at=tt.data.results[0]?.data?.id;if(typeof at!="string"||!at)throw new Error(`chat-send did not return an append id for card ${a}`);m={cardId:a,lastEntryId:at,processingAlreadySet:true};for(let L of Y){if(!L||typeof L!="object")continue;let J=typeof L.name=="string"?L.name:"file",ct=typeof L.stored_name=="string"?L.stored_name:null;ct&&pt(a,"system",`File ${J} uploaded as ${ct}.`,[]);}try{let L=nt(a);gt([{kind:"card_chats",cardId:a,messages:L.map(J=>({role:String(J.role||"system"),text:String(J.text||""),files:Array.isArray(J.files)?J.files:[]})),receiving:!0,processing:i.isProcessing(a)}]);}catch{}}return k}if(c==="file-upload"){let F=D().normalizeIncoming(l?.files,N);return F.length>0&&D().merge(_,F),k}if(c==="action"){let F=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!F)return k;_.lastAction={buttonId:F,at:N},_.lastActionText=`${F} @ ${N}`;}return k}),m&&At(m.cardId,m.lastEntryId,m.processingAlreadySet);}function K(a,c,l){let p=JSON.stringify(l),m=typeof Buffer<"u"?Buffer.byteLength(p):new TextEncoder().encode(p).length;a.writeHead(c,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":m}),a.end(p);}async function St(a){let c=[];for await(let p of a)c.push(p);let l=typeof Buffer<"u"?Buffer.concat(c).toString("utf-8").trim():new TextDecoder().decode(zt(c)).trim();return l?JSON.parse(l):{}}async function Jt(a){let c=[];for await(let l of a)c.push(l);return typeof Buffer<"u"?Buffer.concat(c):zt(c)}function zt(a){let c=a.reduce((m,k)=>m+k.length,0),l=new Uint8Array(c),p=0;for(let m of a)l.set(m,p),p+=m.length;return l}let Lt=0;function ae(a){let c=JSON.stringify(a);return Lt++,`id: ${Lt}
2
- data: ${c}
1
+ import {createRequire}from'module';import'ajv-formats';var Zt="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 `${Zt}${fr(JSON.stringify(t))}`}function me(t){if(!t.startsWith(Zt))throw new Error(`Invalid ref format (expected ${Zt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(pr(t.slice(Zt.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 Et={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ft(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function _t(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ye(t){return t.tasks??{}}function ce(t){return t?t.status===Et.FAILED||t.status===Et.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===Et.COMPLETED){let s=t.tasks[n];s&&ft(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;ft(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function be(t,e,r){let n=t.tasks[e]??Qt(),o={};if(r){let c=r.tasks[e],i=_t(c);for(let d of i)for(let[h,_]of Object.entries(r.tasks))if(ft(_).includes(d)){let O=t.tasks[h];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]??Qt(),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=ft(i);let h=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let T=i.requires??[];for(let A of T)for(let[S,R]of Object.entries(e.tasks))if(ft(R).includes(A)){let C=t.tasks[S];C?.lastDataHash&&(h[A]=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:h,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]??Qt(),s=e.tasks[r];if(s?.retry){let d=o.retryCount+1;if(d<=s.retry.max_attempts){let h={...o,status:"not-started",retryCount:d,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:h},lastUpdated:new Date().toISOString()}}}let c={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},i=t.availableOutputs;if(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]??Qt(),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 Qt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function te(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=_t(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=_t(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=ft(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=ft(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 ee(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=[],h=[],_=[],O=[];for(let[A,S]of Object.entries(n)){let R=r.tasks[A],C=ke(S,e.settings),w=C!=="once";if(R?.status===Et.RUNNING||ce(R))continue;let g=Se(S);if(g!==void 0&&R&&R.executionCount>=g||S.circuit_breaker&&R&&R.executionCount>=S.circuit_breaker.max_executions||!w&&R?.status===Et.COMPLETED)continue;if(w&&R?.status===Et.COMPLETED){let x=_t(S),P=false;switch(C){case "data-changed":{x.length>0&&x.some(J=>{for(let[W,et]of Object.entries(n))if(ft(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":{x.length>0&&x.some(J=>{for(let[W,et]of Object.entries(n))if(ft(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 Z=S.refreshInterval??0;if(Z<=0){P=true;break}let J=R.completedAt;if(!J){P=true;break}(Date.now()-Date.parse(J))/1e3<Z&&(P=true);break}case "manual":P=true;break}if(P)continue}let b=_t(S);if(b.length===0){d.push(A);continue}let q=[],V=[],D=[];for(let x of b){if(i.has(x))continue;let P=s[x]||[];P.length===0?q.push(x):P.every(J=>ce(r.tasks[J]))?D.push({token:x,failedProducer:P[0]}):V.push(x);}q.length>0?_.push({taskName:A,missingTokens:q}):D.length>0?O.push({taskName:A,failedTokens:D.map(x=>x.token),failedProducers:[...new Set(D.map(x=>x.failedProducer))]}):V.length>0?h.push({taskName:A,waitingOn:V}):d.push(A);}let T={};if(d.length>1){let A=Re(d,n);for(let[S,R]of Object.entries(A))R.length>1&&(T[S]=R);}return {eligible:d,pending:h,unresolved:_,blocked:O,conflicts:T}}function br(t){let e={};for(let[r,n]of Object.entries(t)){for(let o of ft(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:te(t),i=false,d=new Set,h=new Map(Object.entries(n)),_=new Ht,O=false,T=false;function A(){if(!i){if(O){T=true;return}O=true;try{do T=!1,S();while(T)}finally{O=false;}}}function S(){let g=_.drain(),b=s.drain(),q=[...g,...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)w(D);for(let D of q)if(D.type==="task-progress"){let{taskName:x,update:P}=D;if(!c.config.tasks[x])continue;let J=c.state.tasks[x];if(!J||J.status!=="running")continue;let W=Te(x),et=C(x,W,P).catch(z=>{i||(_.append({type:"task-failed",taskName:x,error:z.message??String(z),timestamp:new Date().toISOString()}),A());}).finally(()=>{d.delete(et);});d.add(et);}}function R(g){let q=c.config.tasks[g].requires??[],V=new Map;for(let[x,P]of Object.entries(c.config.tasks))for(let Z of P.provides??[])V.set(Z,x);let D={};for(let x of q){let P=V.get(x);P?D[x]=c.state.tasks[P]?.data:D[x]=void 0;}return D}async function C(g,b,q){let V=c.config.tasks[g],D=V.taskHandlers??[],x=R(g);for(let P of D){let Z=h.get(P);if(!Z)throw new Error(`Handler '${P}' not found in registry (task '${g}')`);let J={nodeId:g,state:x,taskState:c.state.tasks[g],config:V,callbackToken:b,update:q};if(await Z(J)==="task-initiate-failure")throw new Error(`Handler '${P}' returned task-initiate-failure (task '${g}')`)}}function w(g){let q=c.config.tasks[g]?.taskHandlers;if(!q||q.length===0)return;_.append({type:"task-started",taskName:g,timestamp:new Date().toISOString()}),A();let V=Te(g),D=C(g,V).catch(x=>{i||(_.append({type:"task-failed",taskName:g,error:x.message??String(x),timestamp:new Date().toISOString()}),A());}).finally(()=>{d.delete(D);});d.add(D);}return {push(g){i||(g.type==="task-completed"&&g.data&&!g.dataHash&&(g={...g,dataHash:de(g.data)}),s.append(g),A());},pushAll(g){if(!i){for(let b of g)b.type==="task-completed"&&b.data&&!b.dataHash?s.append({...b,dataHash:de(b.data)}):s.append(b);A();}},resolveCallback(g,b,q){if(i)return;let V=Ar(g);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 x=b&&Object.keys(b).length>0?de(b):void 0;s.append({type:"task-completed",taskName:D,data:b,dataHash:x,timestamp:new Date().toISOString()});}A();}},addNode(g,b){i||(s.append({type:"task-upsert",taskName:g,taskConfig:b,timestamp:new Date().toISOString()}),A());},removeNode(g){i||(s.append({type:"task-removal",taskName:g,timestamp:new Date().toISOString()}),A());},addRequires(g,b){i||(s.append({type:"node-requires-add",nodeName:g,tokens:b,timestamp:new Date().toISOString()}),A());},removeRequires(g,b){i||(s.append({type:"node-requires-remove",nodeName:g,tokens:b,timestamp:new Date().toISOString()}),A());},addProvides(g,b){i||(s.append({type:"node-provides-add",nodeName:g,tokens:b,timestamp:new Date().toISOString()}),A());},removeProvides(g,b){i||(s.append({type:"node-provides-remove",nodeName:g,tokens:b,timestamp:new Date().toISOString()}),A());},registerHandler(g,b){h.set(g,b);},unregisterHandler(g){h.delete(g);},retrigger(g){i||c.config.tasks[g]&&(s.append({type:"task-restart",taskName:g,timestamp:new Date().toISOString()}),A());},retriggerAll(g){if(!i){for(let b of g)c.config.tasks[b]&&s.append({type:"task-restart",taskName:b,timestamp:new Date().toISOString()});A();}},snapshot(){return Mt(c)},getState(){return c},getSchedule(){return Ut(c)},async waitForHandlers(){d.size>0&&await Promise.allSettled([...d]);},async dispose(g){g?.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),re=Ir("./jsonata-sync.cjs"),Ne=re;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 $e(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 re(o.expr).evaluate(n);$e(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);$e(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 re(t).evaluate(n)}function $r(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"]),Fr=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))Fr.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 re(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:$r,validate:Dr,enrichSources:Pr,enrichSourcesSync:Br};function Fe(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 ne(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},h=d;for(let _=0;_<i.length-1;_++){let O=i[_],T=h[O],A=T&&typeof T=="object"&&!Array.isArray(T)?{...T}:{};h[O]=A,h=A;}return h[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(([,h])=>h.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),h=t.writeCard(d,s);i[o]={key:d,checksum:h,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 h=t.readCard(d.key);if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`card "${o}" is not patchable`);let _=n(h,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();s[o]&&(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 oe="v1",$t="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!==oe)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",Fe(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 se(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 w=d.get(C)??[];w.push(S),d.set(C,w);}let h=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 w=C.requires??[],g=C.provides??[],b=Object.keys(R.data??{}).sort(),q=w.filter(J=>e.state.availableOutputs.includes(J)),V=w.filter(J=>!e.state.availableOutputs.includes(J)),D=i.get(S)??V,x=new Set;for(let J of g)for(let W of d.get(J)??[])W!==S&&x.add(W);let P=R.failedAt,Z=R.error?{message:R.error,code:"TASK_FAILED",at:P,source:"task-runtime"}:void 0;return {name:S,status:R.status,error:Z,requires:w,requires_satisfied:q,requires_missing:V,provides_declared:g,provides_runtime:b,blocked_by:D,unblocks:Array.from(x).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 _=h.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 A=0;for(let[S,R]of Object.entries(n)){let C=(R.requires??[]).length===0,g=(R.provides??[]).some(b=>(d.get(b)??[]).some(q=>q!==S));C&&!g&&(A+=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:A,topology:{edge_count:Array.from(T).length,max_fan_out_card:O.name,max_fan_out:O.fanOut}},cards:h}}function Vr(){return new Date().toISOString()}function ze(t,e,r,n,o,s,c){return async i=>{let d=[],h=r.cardStore.readCard(i.nodeId);if(!h)return "task-initiate-failure";let _=h.id,O=h.card_data??{},T=h.source_defs??[],A=T.filter(B=>B.optionalForCompletionGating!==true),S=r.cardRuntimeStore.readRuntime(_),R=false,C=()=>{R&&(r.cardRuntimeStore.writeRuntime(_,S),R=false);},w=B=>Be(S._sources[B]),g=(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 U=w(L);if(B.failure){let ot=B.rqt??U.lastRequestedToken??U.queueRequestedToken;ot&&g(L,Le(U,ot));}else {let ot=B.rqt;if(!U.lastCompletedToken||ot>U.lastCompletedToken){let y=typeof B.deliveryToken=="string"?B.deliveryToken:void 0,f=false;y&&(f=r.fetchedSourcesStore.commitSourceData(_,L,y)),f?g(L,Gr(U,ot)):g(L,Le(U,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 U=L[B];D[B]=U!==void 0?U:L;}else D[B]=L;let x={id:_,card_data:{...O},requires:D,source_defs:T,compute:h.compute};x._sourcesData=V,h.compute&&Kt.runSync(x,{sourcesData:V}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(_,x.computed_values??{});let P={...h},Z=Kt.enrichSourcesSync(Array.isArray(h.source_defs)?h.source_defs:void 0,{card_data:h.card_data,requires:D}),J=t.value;P.source_defs=Array.isArray(Z)?Z.map(B=>({...B,boardDir:typeof B.boardDir=="string"&&B.boardDir?B.boardDir:J})):Z;let W=Vr(),et=i.update?void 0:W,z=A.filter(B=>{let L=B.outputFile;if(typeof L!="string"||!L)return true;let U=w(L);et&&(U={...U,queueRequestedToken:et},g(L,U));let ot=U.queueRequestedToken??U.lastRequestedToken??W,y=qe(U,ot);return y==="in-flight"?false:y==="dispatch"});if(C(),z.length>0){let B=false,L=W;for(let U of z){let ot=U.outputFile;if(typeof ot!="string"||!ot)continue;let y=w(ot),f=y.queueRequestedToken??W;g(ot,{...y,lastRequestedToken:f}),L=f,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(A.some(B=>{let L=B.outputFile;if(typeof L!="string"||!L)return false;let U=w(L),ot=U.queueRequestedToken??U.lastRequestedToken??W;return qe(U,ot)==="in-flight"}))return "task-initiated";let xt=h.provides??[],It={};for(let{bindTo:B,ref:L}of xt)It[B]=Kt.resolve(x,L);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(It),T.filter(B=>{if(B.optionalForCompletionGating!==true)return false;let L=w(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,It),d.length>0&&r.executionRequestStore.appendEntries(e,d),"task-initiated"}}var pe={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Ye(t){return {[$t]:t.graph,[Me]:t.lastDrainedJournalId}}function Xe(t){let e=t[$t],r=t[Me];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${$t}`);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 ae(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 dt(){return new Date().toISOString()}function tr(t,e){let r=e.onWarn??(()=>{}),n=wt(t);function o(y){if(y.length!==0)try{let f=e.publishBoardChangeNotifications?.(y);f&&typeof f.catch=="function"&&f.catch(E=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${E instanceof Error?E.message:String(E)}`));}catch(f){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${f instanceof Error?f.message:String(f)}`);}}function s(){let y=i().readCardStoreRef();if(!y)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let f=e.kvStorageForRef(y);return {readIndex(){return f.read("_index")},writeIndex(E){f.write("_index",E);},readCard(E){return f.read(E)},writeCard(E,F){return f.write(E,F),e.hashFn(F)},cardExists(E){return f.read(E)!==null},defaultCardKey(E){return E}}}let c={readValues(y){let f=e.kvStorage("state-snapshot"),E=f.listKeys().sort();if(E.length===0)return {version:null,values:{}};let F={};for(let Q of E)F[Q]=f.read(Q);return {version:e.hashFn(F),values:F}},writeValues(y,f,E){let F=e.kvStorage("state-snapshot");for(let Q of E)F.delete(Q);for(let[Q,H]of Object.entries(f))F.write(Q,H);return e.hashFn(f)}},i=()=>Ke(e.kvStorage("config")),d=()=>He(c),h=()=>Ge(e.journalAdapter()),_=()=>ne(s(),r),O=()=>{let y=i().readOutputsStoreRef();if(!y)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Je(e.kvStorageForRef(y))},T=()=>{let y=i().readArchiveStoreRef();return y?e.archiveFactoryForRef(y):e.archiveFactory()};function A(){return !!d().readSnapshot(t.value).values[$t]}function S(){let y=d().readSnapshot(t.value);if(!y.values[$t])throw new Error(`Board not initialized at ${t.value}`);return Xe(y.values)}function R(y,f){let E=d().commitSnapshot(t.value,{schemaVersion:oe,expectedVersion:f,commitId:e.genId(),committedAt:dt(),deleteKeys:[],shallowMerge:Ye(y)});if(!E.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${f??"null"} current=${E.currentVersion??"null"}`)}function C(y){h().appendEvent(y);}async function w(){let y=(v,j)=>{let tt=v.payload,a=(tt?.enrichedCard??{}).id??tt?.cardId??"unknown";C({type:"task-failed",taskName:a,error:j,timestamp:dt()});},f=Ve(e.kvStorage("execution-requests"),y),E=Ue(e.kvStorage("card-runtime")),F=fe(e.blobStorage("sources"),v=>e.resolveBlob(v)),Q=new Map,H={readRuntime(v){return Q.get(v)??E.readRuntime(v)},writeRuntime(v,j){Q.set(v,j);}},it=[],ut=new Map,kt={readSourceData(v,j){let tt=`${v}/${j}`;return ut.has(tt)?ut.get(tt):F.readSourceData(v,j)},ingestSourceDataStaged(v,j,tt,At){F.ingestSourceDataStaged(v,j,tt,At);},commitSourceData(v,j,tt){let At=`${v}/.staged/${tt}/${j}`,u=e.blobStorage("sources").read(At);if(u==null)return false;let l=`${v}/${j}`,p=u.trim();try{ut.set(l,JSON.parse(p));}catch{ut.set(l,p);}return it.push({cardId:v,outputFile:j,deliveryToken:tt}),true},hasSource(v,j){let tt=`${v}/${j}`;return ut.has(tt)?true:F.hasSource(v,j)}},ct={cardStore:_(),cardRuntimeStore:H,fetchedSourcesStore:kt,outputStore:O(),executionRequestStore:f},St=S(),Ct=ee(St.graph),{events:K,newCursor:pt}=h().readEntriesAfterCursor(St.lastDrainedJournalId),Rt=[],Ft=[],Dt=[],Gt=new Map,zt=(v,j)=>{Rt.push({type:"task-completed",taskName:v,data:j,timestamp:dt()});try{T().stream("exec-history").append({taskName:v,status:"completed",completedAt:dt()});}catch{}},Pt=(v,j)=>{C({type:"task-failed",taskName:v,error:j,timestamp:dt()});try{T().stream("exec-history").append({taskName:v,status:"failed",error:j,completedAt:dt()});}catch{}},Ot=Ie(Ct,{handlers:{"card-handler":ze(t,pt,ct,zt,Pt,(v,j)=>{Ft.push({cardId:v,values:j});},v=>{Dt.push(v);})}});for(Rt=K;Rt.length>0;){let v=Rt;Rt=[];for(let j of v)if(j.type==="task-restart"){let tt=ct.cardStore.readCard(j.taskName);tt&&Gt.set(j.taskName,tt);}Ot.pushAll(v),await Ot.waitForHandlers();}let Bt=Ot.getState();await Ot.dispose({wait:true});let Vt=d().readSnapshot(t.value).version;R({lastDrainedJournalId:pt,graph:Mt(Bt)},Vt);for(let{cardId:v,values:j}of Ft)ct.outputStore.writeComputedValues(v,j);for(let v of Dt)ct.outputStore.writeDataObjects(v);for(let[v,j]of Q)E.writeRuntime(v,j);for(let{cardId:v,outputFile:j,deliveryToken:tt}of it)F.commitSourceData(v,j,tt);let qt;try{qt=se(n,Bt),ct.outputStore.writeStatusSnapshot(qt);}catch(v){r(`[board-live-cards-public] status publish failed: ${v instanceof Error?v.message:String(v)}`);}let jt=[];for(let{cardId:v,values:j}of Ft)jt.push({kind:"computed_values",cardId:v,values:j});for(let v of Dt)for(let[j,tt]of Object.entries(v))j&&jt.push({kind:"data_object",key:j,payload:tt});for(let[v,j]of Gt)jt.push({kind:"card_refreshed",cardId:v,card:j});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(pt,v=>{if(v.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${v.taskKind}" \u2014 skipping`);return}let j=v.payload,tt=j.enrichedCard?.id??"unknown",At=j.enrichedCard?.source_defs??[];for(let a of At){if(!a.outputFile){r(`[dispatch] source "${a.bindTo}" has no outputFile \u2014 skipping`);continue}let u=Ur({cbk:j.callbackToken,rg:t.value,br:wt(t),cid:tt,b:a.bindTo,d:a.outputFile,cs:void 0,rqt:j.rqt});e.dispatchExecution(ie,{source_def:a,base_ref:wt(t),callback:{token:u,via:e.selfRef}}).catch(l=>Pt(tt,l instanceof Error?l.message:String(l)));}});}async function g(){try{let y=()=>{let E=S(),{events:F}=h().readEntriesAfterCursor(E.lastDrainedJournalId);F.length<=0||(g(),e.requestProcessAccumulated?.());},f=await he(e.lock,w,y);return st({ran:f!==!1})}catch(y){return at(y)}}function b(y){try{let f=y.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(!A()){let ut=te(pe);R({lastDrainedJournalId:"",graph:Mt(ut)},null);}let E=y.params?.outputsStoreRef;if(!E)return nt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let F=y.params?.scratchStoreRef,Q=y.params?.archiveStoreRef,H=i();H.writeCardStoreRef(f),H.writeOutputsStoreRef(E),F&&H.writeScratchStoreRef(F),Q&&H.writeArchiveStoreRef(Q);let it=y.body??{};it["task-executor-ref"]&&H.writeTaskExecutorRef(it["task-executor-ref"]),Object.prototype.hasOwnProperty.call(it,"chat-handler-flow")&&H.writeChatHandlerFlow(it["chat-handler-flow"]);try{O().writeStatusSnapshot(se(n,ee(S().graph)));}catch{}return st()}catch(f){return at(f)}}function q(y){try{let f=O().readStatusSnapshot();if(!f){f=se(n,ee(S().graph));try{O().writeStatusSnapshot(f);}catch{}}return st(f)}catch(f){return at(f)}}function V(y){try{let f=y.params?.id;return f?(C({type:"task-removal",taskName:f,timestamp:dt()}),g(),st()):nt("removeCard requires params.id")}catch(f){return at(f)}}function D(y){try{let f=y.params?.id;return f?(C({type:"task-restart",taskName:f,timestamp:dt()}),g(),st()):nt("retrigger requires params.id")}catch(f){return at(f)}}async function x(y){return g()}function P(y){try{let f=y.params?.cardId,E=y.params?.all,F=!!y.params?.restart;if(!f&&!E)return nt("upsertCard requires --card-id <id> or --all");let Q=E?_().readAllCards().map(H=>H.id):[f];for(let H of Q)if(!_().readCard(H))return nt(`Card "${H}" not found in board at ${t.value}`);for(let H of Q){let it=_().readCard(H),ut=We(it),kt=e.hashFn(ut),ct=e.kvStorage("card-upsert"),St=ct.read(H),Ct=St?.taskConfigHash!==kt;if(!(!Ct&&!F)){if(Ct){let K=St?.blobRef??_().readCardKey(H)??H;C({type:"task-upsert",taskName:H,taskConfig:ut,timestamp:dt()}),ct.write(H,{blobRef:K,taskConfigHash:kt,updatedAt:dt()});}F&&C({type:"task-restart",taskName:H,timestamp:dt()});}}return g(),st()}catch(f){return at(f)}}function Z(y){try{let f=y.params?.token;if(!f)return nt("taskFailed requires params.token");let E=y.params?.error??"unknown error",F=ae(f);if(!F)return nt("Invalid callback token");C({type:"task-failed",taskName:F.taskName,error:E,timestamp:dt()});try{T().stream("exec-history").append({taskName:F.taskName,status:"failed",error:E,completedAt:dt()});}catch{}return g(),st()}catch(f){return at(f)}}function J(y){try{let f=y.params?.token;if(!f)return nt("taskProgress requires params.token");let F=(y.body??{}).update??{},Q=ae(f);return Q?(C({type:"task-progress",taskName:Q.taskName,update:F,timestamp:dt()}),g(),st()):nt("Invalid callback token")}catch(f){return at(f)}}function W(y){try{let f=y.params?.token,E=y.params?.ref;if(!f)return nt("sourceDataFetched requires params.token");if(!E)return nt("sourceDataFetched requires params.ref");let F=Ze(f);if(!F)return nt("Invalid source token");let{cbk:Q,cid:H,b:it,d:ut,cs:kt,rqt:ct}=F,St=fe(e.blobStorage("sources"),Rt=>e.resolveBlob(Rt)),Ct=e.genId();St.ingestSourceDataStaged(H,ut,me(E),Ct);let K=ae(Q);if(!K)return nt("Invalid callback token embedded in source token");let pt=dt();return C({type:"task-progress",taskName:K.taskName,update:{bindTo:it,outputFile:ut,fetchedAt:pt,deliveryToken:Ct,sourceChecksum:kt,rqt:ct},timestamp:pt}),g(),st()}catch(f){return at(f)}}function et(y){try{let f=y.params?.token,E=y.params?.reason??"unknown";if(!f)return nt("sourceDataFetchFailure requires params.token");let F=Ze(f);if(!F)return nt("Invalid source token");let{cbk:Q,b:H,d:it,cs:ut,rqt:kt}=F,ct=ae(Q);return ct?(C({type:"task-progress",taskName:ct.taskName,update:{bindTo:H,outputFile:it,failure:!0,reason:E,sourceChecksum:ut,rqt:kt},timestamp:dt()}),g(),st()):nt("Invalid callback token embedded in source token")}catch(f){return at(f)}}function z(y){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 vt(y){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 xt(y){try{let f=i().readScratchStoreRef();return st({storeRef:f})}catch(f){return at(f)}}function It(y){try{let f=i().readArchiveStoreRef();return st({storeRef:f})}catch(f){return at(f)}}function Jt(y){try{let f=y.params?.key;if(!f)return nt("getConfig requires params.key");let E=i(),F;switch(f){case "task-executor":F=E.readTaskExecutorRef()??null;break;case "chat-handler-flow":F=E.readChatHandlerFlow()??null;break;case "card-store-ref":F=E.readCardStoreRef();break;case "outputs-store-ref":F=E.readOutputsStoreRef();break;case "scratch-store-ref":F=E.readScratchStoreRef();break;case "archive-store-ref":F=E.readArchiveStoreRef();break;default:return nt(`getConfig: unknown key "${f}"`)}return st({value:F})}catch(f){return at(f)}}function B(y){try{let f=y.params?.key;if(!f)return nt("getOutputsDataObject requires params.key");let E=O().readDataObject(f);return st(E)}catch(f){return at(f)}}function L(y){try{return st(O().readAllDataObjects())}catch(f){return at(f)}}function U(y){try{let f=y.params?.key;if(!f)return nt("getOutputsComputedValues requires params.key");let E=O().readComputedValues(f);return st(E)}catch(f){return at(f)}}function ot(y){try{return st(O().readAllComputedValues())}catch(f){return at(f)}}return {init:b,status:q,getCardStoreRef:z,getOutputsStoreRef:vt,getScratchStoreRef:xt,getArchiveStoreRef:It,getConfig:Jt,getOutputsDataObject:B,getAllOutputsDataObjects:L,getOutputsComputedValues:U,getAllOutputsComputedValues:ot,removeCard:V,retrigger:D,processAccumulatedEvents:x,upsertCard:P,taskFailed:Z,taskProgress:J,sourceDataFetched:W,sourceDataFetchFailure:et}}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 h=Kr(d);Number.isFinite(h)&&h>c&&(c=h);}return c+1}function r(o,s,c){let i=Number(c?.maxLen||32),{stem:d,ext:h}=Xr(o),_=Yr(h),O=zr(d),T=`${String(s).padStart(3,"0")}-`,A=_,S=i-T.length-A.length;S<1&&(A="",S=i-T.length);let R=O.slice(0,Math.max(1,S)),C=`${T}${R}${A}`;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 h=typeof i.cardId=="string"?i.cardId:void 0;if(!i.command)return r(`chat-store: ${d} missing "command"`);if(!h)return r(`chat-store: ${d} missing "cardId"`);if(i.command==="append")return c.append({params:{cardId:h},body:{role:i.role,text:i.text,files:i.files}});if(i.command==="read-all")return c.readAll({params:{cardId:h}});if(i.command==="read-after")return c.readAfter({params:{cardId:h},body:{cursor:i.cursor??null}});if(i.command==="clear")return c.clear({params:{cardId:h}});if(i.command==="set-processing")return c.setProcessing({params:{cardId:h},body:{active:i.active}});if(i.command==="is-processing")return c.isProcessing({params:{cardId:h}});if(i.command==="get-config")return c.getConfig({params:{cardId:h}});if(i.command==="set-config"){let{command:_,cardId:O,...T}=i;return c.setConfig({params:{cardId:h},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 h=0;h<i.commands.length;h+=1){let _=i.commands[h];if(!_||typeof _!="object"||Array.isArray(_))return r(`chat-store: command envelope entry ${h} must be an object`);let O={cardId:i.cardId,..._},T=o(O,`command envelope entry ${h}`);if(T.status!=="success")return T;d.push({index:h,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 h=i.body??{},_=typeof h.role=="string"?h.role:"",O=typeof h.text=="string"?h.text:"",T=Array.isArray(h.files)?h.files:[];if(!_)return r("append requires body.role");let A=t.append(d,_,O,T);return e({id:A})}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 h=i.body??{};return typeof h.active!="boolean"?r("setProcessing requires body.active (boolean)"):(t.setProcessing(d,h.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 h=i.body??{};return t.setConfig(d,h),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),h=t.notificationTransport||null,_=t.serverUrl||null,O=t.executionExtra||{},T=new Map,A=new Map,S=new Map,R=null;function C(a){let u=tr(a.baseRef,a.boardAdapter),l=a.boardAdapter.kvStorageForRef(a.cardStoreRef),m=er(ne({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)),k=a.artifactsAdapter||a.boardAdapter,N=a.filesArtifactsStore??null,$=null;return {label:a.label,board:u,cardStore:m,get filesArtifacts(){return $??=N??or(k.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 w=t.boards.map(C),g=new Map;function b(a){return g.get(a)??0}function q(a){let u=w[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 x(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function P(a){if(!a||a.notificationTeardown||!h||!a.notifyRef)return;let u=await h.subscribe(a.notifyRef,l=>{lr(a.notification,l);let p=l.kind==="notification-batch"?l.notifications:[l];j(p);});a.notificationTeardown=u;}async function Z(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 m=await s.describe(a.chatHandlerRef);m&&m.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${m.kind}", expected "chat-handler" for ${a.label}`):m&&o.info(`[init] chat-handler validated: ${m.name} (protocol ${m.protocolVersion}) for ${a.label}`);}catch(m){o.warn(`[init] chat-handler describe failed for ${a.label}: ${m?.message||String(m)}`);}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[k,N]of Object.entries(p.data))k&&u.push({kind:"data_object",key:k,payload:N});let m=a.board.getAllOutputsComputedValues({});if(m.status==="success"&&m.data!=null)for(let[k,N]of Object.entries(m.data))k&&u.push({kind:"computed_values",cardId:k,values:N});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 m of p)typeof m.id=="string"&&(g.set(m.id,u),a.board.upsertCard({params:{cardId:m.id}}));a.cardsBootstrapped=true;}async function et(){for(let a of w)await Z(a);}async function z(){await et();for(let a=0;a<w.length;a++)J(w[a]),W(w[a],a);}function vt(a){return w[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 It(){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 w)u.push(...a(l));return u}function Jt(){let a=w.map(k=>{try{let $=k.boardAdapter.kvStorageForRef(k.outputsStoreRef).read("status");if($!=null)return $}catch{}return k.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 k of l)p[k]=0;for(let k of a){let N=k,$=Array.isArray(N.cards)?N.cards:[];u.push(...$);for(let I of l)p[I]+=Number(N?.summary?.[I]||0);}let m=a[0];return {...m,cards:u,summary:{...m.summary||{},card_count:u.length,...p}}}function B(){let a={},u=l=>{for(let[p,m]of Object.entries(l.notification.computedValues)){let k=l.notification.cards[p];a[p]={schema_version:"v1",card_id:p,card_data:k?.card_data??{},computed_values:m??{}};}};for(let l of w)u(l);return a}function L(){let a={};for(let u of w)Object.assign(a,u.notification.dataObjects||{});return a}function U(){let a=It(),u=B(),l=L(),p={};for(let k of a){if(!k?.id)continue;let N=k.id,$=u[N]||{},I={...$.card_data&&typeof $.card_data=="object"?$.card_data:k.card_data&&typeof k.card_data=="object"?k.card_data:{}};p[N]={schema_version:$.schema_version||"v1",card_id:$.card_id||N,card_data:I,computed_values:$.computed_values&&typeof $.computed_values=="object"?$.computed_values:{}};}let m={};for(let k of a){if(!k?.id)continue;let N=k.id;try{let $=it(N),I=i.isProcessing(N);($.length>0||I)&&(m[N]={messages:$.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:m}}function ot(a,u,l){let p=l?.syncBoard!==false,m=vt(a);if(!m)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let k=xt(a);if(!k)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let N=u(k)||k,$=m.cardStore.set({body:N});if($.status!=="success")throw Object.assign(new Error($.error||`Failed to persist card: ${a}`),{statusCode:500});if(p){let I=m.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 y(a,u){ot(a,u,{syncBoard:true});}function f(a,u){ot(a,u,{syncBoard:false});}function E(a,u){y(a,l=>{if(!u||typeof u!="object"||Object.keys(u).length===0)return l;function p(m,k,N){let $=String(k||"").split(".").filter(Boolean);if(!$.length)return;let I=m;for(let Y=0;Y<$.length-1;Y++){let rt=$[Y];(!I[rt]||typeof I[rt]!="object")&&(I[rt]={}),I=I[rt];}I[$[$.length-1]]=N;}if(u.fieldValues!==void 0&&u.fieldValues!==null){let m=null,k=l.view;if(k&&Array.isArray(k.elements)){for(let N of k.elements)if(N?.data&&N.data.writeTo){m=N.data.writeTo;break}}m?p(l,m,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[m,k]of Object.entries(u))m!=="_stagedFiles"&&(k!==null&&typeof k=="object"&&!Array.isArray(k)&&l[m]!==null&&typeof l[m]=="object"&&!Array.isArray(l[m])?l[m]={...l[m],...k}:l[m]=k);}return l});}function F(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 Q(a){i.clear(a),i.setProcessing(a,false);}function H(a,u,l,p){let m=typeof l=="string"?l.trim():"";return i.append(a,u,m,p)}function it(a){return i.readAll(a)}function ut(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 m of p)u.push(m.stored_name);}catch{}return u}function kt(a,u,l,p){let m=x(a),k=q(a),N=F(u),$=V(a),I=$?$.allocateStoredName(m,N,{seedNames:ut(a),maxLen:Qr}):`${String(Date.now())}-${N}`;return k.files&&k.files.putBytes(`${m}/${I}`,new Uint8Array(p),l||"application/octet-stream"),{name:N,stored_name:I,size:p.length,mime_type:l||"application/octet-stream",path:`${a}/files/${I}`,uploaded_at:new Date().toISOString()}}function ct(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,m=u.chatHandlerRef;return p==null&&(!m||typeof m!="object")?null:{ctx:u,handlerFlow:p,handlerRef:m}}function St(a,u,l=false){let p=ct(a);if(!p)return;let{ctx:m,handlerFlow:k,handlerRef:N}=p;if(!l)try{i.setProcessing(a,!0);}catch{}let $={boardId:n,cardId:String(a),lastChatEntryId:u,...O,..._?{serverUrl:_}:{}};if(!c&&k!=null){try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${a}" but no chatFlowRunner was provided`);return}if(k!=null){let Y=c;if(!Y)return;Y.run(k,$,{boardId:n,cardId:String(a),label:m.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=N;I&&s.invoke(I,$).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 Ct(a,u,l){let p=u==="chat-send"?f:y,m;p(a,k=>{let N=new Date().toISOString(),$=k.card_data&&typeof k.card_data=="object"?k.card_data:{};if(k.card_data=$,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}`);m={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",gt=typeof G.stored_name=="string"?G.stored_name:null;gt&&H(a,"system",`File ${X} uploaded as ${gt}.`,[]);}try{let G=it(a);j([{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 k}if(u==="file-upload"){let I=D().normalizeIncoming(l?.files,N);return I.length>0&&D().merge($,I),k}if(u==="action"){let I=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!I)return k;$.lastAction={buttonId:I,at:N},$.lastActionText=`${I} @ ${N}`;}return k}),m&&St(m.cardId,m.lastEntryId,m.processingAlreadySet);}function K(a,u,l){let p=JSON.stringify(l),m=typeof Buffer<"u"?Buffer.byteLength(p):new TextEncoder().encode(p).length;a.writeHead(u,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":m}),a.end(p);}async function pt(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(Ft(u)).trim();return l?JSON.parse(l):{}}async function Rt(a){let u=[];for await(let l of a)u.push(l);return typeof Buffer<"u"?Buffer.concat(u):Ft(u)}function Ft(a){let u=a.reduce((m,k)=>m+k.length,0),l=new Uint8Array(u),p=0;for(let m of a)l.set(m,p),p+=m.length;return l}let Dt=0;function Gt(a){let u=JSON.stringify(a);return Dt++,`id: ${Dt}
2
+ data: ${u}
3
3
 
4
- `}function ie(a){let c=a;try{c.flushHeaders?.();}catch{}try{c.flush?.();}catch{}try{c.socket?.setNoDelay?.(!0);}catch{}try{c.socket?.uncork?.();}catch{}}function Et(a,c){let l=O.get(a);if(!l)return;let p=ae(c);try{l.res.write(p),ie(l.res);}catch{O.delete(a);}}function Bt(){let a=new Set;for(let c of O.values())for(let l of c.subscribedChatCardIds)a.add(l);return Array.from(a)}function ue(a){let c=v.has(a)?v.get(a):null,{cursor:l}=i.readAfter(a,c),p=i.isProcessing(a),m=p!==(R.get(a)??false),k=l!==c;return k&&v.set(a,l),R.set(a,p),k||m}function $t(a,c=true){let l=nt(a),p=Date.now();return {kind:"card_chats",cardId:a,sentAt:new Date(p).toISOString(),sentAtMs:p,messages:l.map(m=>({role:String(m.role||"system"),text:String(m.text||""),files:Array.isArray(m.files)?m.files:[]})),receiving:c,processing:i.isProcessing(a)}}function bt(a,c=true){let l={kind:"notification-batch",notifications:[$t(a,c)]};for(let[p,m]of O.entries())m.subscribedChatCardIds.has(a)&&Et(p,l);}function Gt(){Bt().length>0||(C&&(clearInterval(C),C=null),v.clear(),R.clear());}function E(){if(C)return;let a=()=>{let c=Bt();if(c.length===0){Gt();return}let l=new Set(c);for(let p of Array.from(v.keys()))l.has(p)||v.delete(p);for(let p of Array.from(R.keys()))l.has(p)||R.delete(p);for(let p of c)ue(p)&&bt(p,true);};a(),C=setInterval(a,1e3);}function $(a,c){let l=O.get(a);if(!l)return false;l.subscribedChatCardIds.add(c);let{cursor:p}=i.readAfter(c,null);return v.set(c,p),R.set(c,i.isProcessing(c)),E(),Et(a,{kind:"notification-batch",notifications:[$t(c,true)]}),true}function Z(a,c){let l=O.get(a);return l?(l.subscribedChatCardIds.delete(c),Bt().includes(c)||(v.delete(c),R.delete(c)),Gt(),true):false}function _t(a){if(!a||typeof a!="object")return false;let c=a.kind;return c==="card_chats"||c==="chat_messages"}function gt(a){if(!a||a.length===0)return;let c=[],l=new Set;for(let p of a)_t(p)&&typeof p.cardId=="string"?l.add(String(p.cardId)):c.push(p);if(c.length>0){let p={kind:"notification-batch",notifications:c};for(let m of O.keys())Et(m,p);}for(let p of l)bt(p,true);}function Ft(a,c,l){let p=O.get(l),m=p?new Set(p.subscribedChatCardIds):new Set;if(p)try{p.res.end();}catch{}c.writeHead(200,{...n,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),ie(c),O.set(l,{res:c,subscribedChatCardIds:m});let k=f(),N=ae(k);c.write(N);let _=setInterval(()=>{try{c.write(`: keepalive
4
+ `}function zt(a){let u=a;try{u.flushHeaders?.();}catch{}try{u.flush?.();}catch{}try{u.socket?.setNoDelay?.(!0);}catch{}try{u.socket?.uncork?.();}catch{}}function Pt(a,u){let l=T.get(a);if(!l)return;let p=Gt(u);try{l.res.write(p),zt(l.res);}catch{T.delete(a);}}function Yt(){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=A.has(a)?A.get(a):null,{cursor:l}=i.readAfter(a,u),p=i.isProcessing(a),m=p!==(S.get(a)??false),k=l!==u;return k&&A.set(a,l),S.set(a,p),k||m}function Ot(a,u=true){let l=it(a),p=Date.now();return {kind:"card_chats",cardId:a,sentAt:new Date(p).toISOString(),sentAtMs:p,messages:l.map(m=>({role:String(m.role||"system"),text:String(m.text||""),files:Array.isArray(m.files)?m.files:[]})),receiving:u,processing:i.isProcessing(a)}}function Bt(a,u=true){let l={kind:"notification-batch",notifications:[Ot(a,u)]};for(let[p,m]of T.entries())m.subscribedChatCardIds.has(a)&&Pt(p,l);}function Vt(){Yt().length>0||(R&&(clearInterval(R),R=null),A.clear(),S.clear());}function qt(){if(R)return;let a=()=>{let u=Yt();if(u.length===0){Vt();return}let l=new Set(u);for(let p of Array.from(A.keys()))l.has(p)||A.delete(p);for(let p of Array.from(S.keys()))l.has(p)||S.delete(p);for(let p of u)ge(p)&&Bt(p,true);};a(),R=setInterval(a,1e3);}function jt(a,u){let l=T.get(a);if(!l)return false;l.subscribedChatCardIds.add(u);let{cursor:p}=i.readAfter(u,null);return A.set(u,p),S.set(u,i.isProcessing(u)),qt(),Pt(a,{kind:"notification-batch",notifications:[Ot(u,true)]}),true}function ie(a,u){let l=T.get(a);return l?(l.subscribedChatCardIds.delete(u),Yt().includes(u)||(A.delete(u),S.delete(u)),Vt(),true):false}function v(a){if(!a||typeof a!="object")return false;let u=a.kind;return u==="card_chats"||u==="chat_messages"}function j(a){if(!a||a.length===0)return;let u=[],l=new Set;for(let p of a)v(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 m of T.keys())Pt(m,p);}for(let p of l)Bt(p,true);}function tt(a,u,l){let p=T.get(l),m=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"}),zt(u),T.set(l,{res:u,subscribedChatCardIds:m});let k=U(),N=Gt(k);u.write(N);let $=setInterval(()=>{try{u.write(`: keepalive
5
5
 
6
- `);}catch{}},15e3);a.on("close",()=>{clearInterval(_),O.get(l)?.res===c&&(O.delete(l),Gt());try{c.end();}catch{}});}async function Tt(a,c,l){let p=a.method||"GET",m=l,k=m.pathname;try{if(p==="GET"&&k===`${e}/init-board`)return await Q(),K(c,200,f()),!0;if(p==="GET"&&k===`${e}/sse`){await Q();let M=String(m.searchParams.get("clientId")||"").trim();if(!M)return K(c,400,{error:"clientId query param is required for SSE"}),!0;Ft(a,c,M);for(let L=0;L<b.length;L++)U(b[L]),z(b[L],L);return !0}if(p==="GET"&&k===`${e}/board-status`)return K(c,200,f()),!0;let N=k.match(new RegExp(`^${jt(e)}/cards/([^/]+)$`));if(p==="GET"&&N){await H();let M=decodeURIComponent(N[1]),L=xt(M);return L?(K(c,200,L),!0):(K(c,404,{error:`card not found: ${M}`}),!0)}if(p==="PATCH"&&N){await H();let M=decodeURIComponent(N[1]),L=await St(a);return W(M,L),K(c,200,{ok:!0}),!0}let _=k.match(new RegExp(`^${jt(e)}/cards/([^/]+)/actions$`));if(p==="POST"&&_){await H();let M=decodeURIComponent(_[1]),L=Date.now(),J=new Date(L).toISOString(),ct=await St(a),dt=ct?.actionType;if(dt==="chat-send"&&!kt(M)){let Rt=Date.now();return K(c,409,{error:`chat handler is not configured for card: ${M}`,requestReceivedAt:J,requestReceivedAtMs:L,responseSentAt:new Date(Rt).toISOString(),responseSentAtMs:Rt,responseStatus:409}),!0}Ct(M,dt,ct?.payload);let lt=Date.now();return K(c,200,{ok:!0,requestReceivedAt:J,requestReceivedAtMs:L,responseSentAt:new Date(lt).toISOString(),responseSentAtMs:lt,responseStatus:200}),!0}let F=k.match(new RegExp(`^${jt(e)}/cards/([^/]+)/chats$`));if(p==="GET"&&F){await H();let M=decodeURIComponent(F[1]);return K(c,200,{ok:!0,messages:nt(M)}),!0}if(p==="POST"&&F){await H();let M=decodeURIComponent(F[1]),L=await St(a),J=typeof L?.role=="string"?L.role:"assistant",ct=typeof L?.text=="string"?L.text:"",dt=Array.isArray(L?.files)?L.files:[],lt=L?.done===!0,Rt=i.append(M,J,ct,dt);return lt&&i.setProcessing(M,!1),bt(M,!lt),K(c,200,{ok:!0,id:Rt}),!0}let Y=k.match(new RegExp(`^${jt(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(p==="POST"&&Y){await H();let M=decodeURIComponent(Y[1]),L=await St(a),J=typeof L?.clientId=="string"?L.clientId.trim():"";return J?$(J,M)?(K(c,200,{ok:!0,clientId:J,cardId:M,subscribed:!0}),!0):(K(c,404,{error:`SSE client not connected: ${J}`}),!0):(K(c,400,{error:"clientId is required"}),!0)}let tt=k.match(new RegExp(`^${jt(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(p==="POST"&&tt){await H();let M=decodeURIComponent(tt[1]),L=await St(a),J=typeof L?.clientId=="string"?L.clientId.trim():"";return J?Z(J,M)?(K(c,200,{ok:!0,clientId:J,cardId:M,subscribed:!1}),!0):(K(c,404,{error:`SSE client not connected: ${J}`}),!0):(K(c,400,{error:"clientId is required"}),!0)}let at=k.match(new RegExp(`^${jt(e)}/cards/([^/]+)/files$`));if(p==="POST"&&at){await H();let M=decodeURIComponent(at[1]),L=String(m.searchParams.get("inChat")||"").toLowerCase()==="true",J=a.headers["x-file-name"],ct=String(a.headers["content-type"]||"application/octet-stream"),dt=Array.isArray(J)?J[0]:J,lt=dt?decodeURIComponent(String(dt)):"upload.bin",Rt=await Jt(a);if(!Rt.length)return K(c,400,{error:"Empty upload body"}),!0;let ft=yt(M,lt,ct,Rt);return V(M,Dt=>{let qt=new Date().toISOString(),Xt=Dt.card_data&&typeof Dt.card_data=="object"?Dt.card_data:{};Dt.card_data=Xt;let ce=D().normalizeIncoming([{name:ft.name,stored_name:ft.stored_name,size:ft.size,mime_type:ft.mime_type,path:ft.path,uploaded_at:ft.uploaded_at||qt}],qt);return D().merge(Xt,ce),Dt}),L&&pt(M,"system",`file uploaded: ${ft.name} as ${ft.stored_name}`,[]),K(c,200,{ok:!0,file:ft}),!0}let Yt=k.match(new RegExp(`^${jt(e)}/cards/([^/]+)/files/(\\d+)$`));if(p==="GET"&&Yt){let M=decodeURIComponent(Yt[1]),L=parseInt(Yt[2],10),J=m.searchParams.get("sn"),ct=xt(M);if(!ct)return K(c,404,{error:"Card not found"}),!0;let dt=D().resolve(ct.card_data,L,J);if(!dt.ok&&dt.reason==="stale_reference")return K(c,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!dt.ok)return K(c,404,{error:"File not found"}),!0;let lt=dt.file,Rt=A(M),ft=q(M),Dt=`${Rt}/${lt.stored_name}`,qt=ft.files?ft.files.getBytes(Dt):null;if(!qt)return K(c,404,{error:"File not found"}),!0;let Xt=lt.name||lt.stored_name,ce=lt.mime_type||"application/octet-stream";return c.writeHead(200,{"Content-Type":ce,"Content-Disposition":`attachment; filename="${Xt}"`,"Content-Length":qt.length}),c.end(qt),!0}return !1}catch(N){let _=N?.statusCode||500;return K(c,_,{error:String(N?.message||N)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleRuntimeApi:Tt,buildPublishedRuntimePayload:f,clearChatRecords:st,reportSourceFetched(a,c){let l=b[0];return l?l.board.sourceDataFetched({params:{token:a,ref:c}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,c){let l=b[0];return l?l.board.sourceDataFetchFailure({params:{token:a,reason:c}}):{status:"fail",error:"no board context"}},get cardStore(){return b[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function ro(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),n={...dn,...t.corsHeaders||{}},r=t.serverMetaStore,o=t.boardRuntimeFactory,s=new Map,u="boards-config.json";function i(){let x=r.getText(u);if(!x)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(x)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function d(x){r.putText(u,JSON.stringify(x,null,2));}function h(x){let b=String(x||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return b.length>0&&b.length<=64?b:null}function T(x){if(s.has(x))return s.get(x);let y=i().boards.find(q=>q.id===x)||{},w=o(x,y);return s.set(x,w),w}function j(x,b,y){let w=JSON.stringify(y),q=typeof Buffer<"u"?Buffer.byteLength(w):new TextEncoder().encode(w).length;x.writeHead(b,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":q}),x.end(w);}async function O(x,b,y){let w=x.method||"GET",q=y.pathname;if(w==="GET"&&q===e)return j(b,200,{ok:true,boards:i().boards}),true;if(w==="POST"&&q===e){let G=[];for await(let Q of x)G.push(Q);let D=typeof Buffer<"u"?Buffer.concat(G).toString("utf-8").trim():new TextDecoder().decode(nr(G)).trim(),A={};try{A=D?JSON.parse(D):{};}catch{A={};}let P=h(A.id);if(!P)return j(b,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let X=i();if(X.boards.some(Q=>Q.id===P))return j(b,409,{error:`Board "${P}" is already registered`}),true;let U=typeof A.label=="string"&&A.label.trim()?A.label.trim():P,z={id:P,label:U};for(let[Q,H]of Object.entries(A))Q==="id"||Q==="label"||H!=null&&(z[Q]=H);return X.boards.push(z),d(X),j(b,200,{ok:true,board:z}),true}return false}async function v(x,b,y){let q=y.pathname.match(new RegExp(`^${jt(e)}/([^/]+)(/|$)`));if(!q)return false;let G=h(decodeURIComponent(q[1]));return G?i().boards.some(P=>P.id===G)?!!await T(G).handleRuntimeApi(x,b,y):(j(b,404,{error:`Board "${G}" not registered. POST ${e} with {id} to register it first.`}),true):(j(b,400,{error:"Invalid board id"}),true)}async function R(x,b,y){return !!(await O(x,b,y)||await v(x,b,y))}function C(x){if(!i().boards.some(y=>y.id===x))throw Object.assign(new Error(`Board "${x}" not registered`),{statusCode:404});return {service:T(x)}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleApi:R,requireBoardService:C}}function jt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function nr(t){let e=t.reduce((o,s)=>o+s.length,0),n=new Uint8Array(e),r=0;for(let o of t)n.set(o,r),r+=o.length;return n}export{ro as createMultiBoardServerRuntime,no as createSingleBoardServerRuntime};//# sourceMappingURL=index.js.map
6
+ `);}catch{}},15e3);a.on("close",()=>{clearInterval($),T.get(l)?.res===u&&(T.delete(l),Vt());try{u.end();}catch{}});}async function At(a,u,l){let p=a.method||"GET",m=l,k=m.pathname;try{if(p==="GET"&&k===`${e}/init-board`)return await et(),K(u,200,U()),!0;if(p==="GET"&&k===`${e}/sse`){await et();let M=String(m.searchParams.get("clientId")||"").trim();if(!M)return K(u,400,{error:"clientId query param is required for SSE"}),!0;tt(a,u,M);for(let G=0;G<w.length;G++)J(w[G]),W(w[G],G);return !0}if(p==="GET"&&k===`${e}/board-status`)return K(u,200,U()),!0;let N=k.match(new RegExp(`^${Tt(e)}/cards/([^/]+)$`));if(p==="GET"&&N){await z();let M=decodeURIComponent(N[1]),G=xt(M);return G?(K(u,200,G),!0):(K(u,404,{error:`card not found: ${M}`}),!0)}if(p==="PATCH"&&N){await z();let M=decodeURIComponent(N[1]),G=await pt(a);return E(M,G),K(u,200,{ok:!0}),!0}let $=k.match(new RegExp(`^${Tt(e)}/cards/([^/]+)/actions$`));if(p==="POST"&&$){await z();let M=decodeURIComponent($[1]),G=Date.now(),X=new Date(G).toISOString(),gt=await pt(a),mt=gt?.actionType;if(mt==="chat-send"&&!ct(M)){let bt=Date.now();return K(u,409,{error:`chat handler is not configured for card: ${M}`,requestReceivedAt:X,requestReceivedAtMs:G,responseSentAt:new Date(bt).toISOString(),responseSentAtMs:bt,responseStatus:409}),!0}Ct(M,mt,gt?.payload);let ht=Date.now();return K(u,200,{ok:!0,requestReceivedAt:X,requestReceivedAtMs:G,responseSentAt:new Date(ht).toISOString(),responseSentAtMs:ht,responseStatus:200}),!0}let I=k.match(new RegExp(`^${Tt(e)}/cards/([^/]+)/chats$`));if(p==="GET"&&I){await z();let M=decodeURIComponent(I[1]);return K(u,200,{ok:!0,messages:it(M)}),!0}if(p==="POST"&&I){await z();let M=decodeURIComponent(I[1]),G=await pt(a),X=typeof G?.role=="string"?G.role:"assistant",gt=typeof G?.text=="string"?G.text:"",mt=Array.isArray(G?.files)?G.files:[],ht=G?.done===!0,bt=i.append(M,X,gt,mt);return ht&&i.setProcessing(M,!1),Bt(M,!ht),K(u,200,{ok:!0,id:bt}),!0}let Y=k.match(new RegExp(`^${Tt(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(p==="POST"&&Y){await z();let M=decodeURIComponent(Y[1]),G=await pt(a),X=typeof G?.clientId=="string"?G.clientId.trim():"";return X?jt(X,M)?(K(u,200,{ok:!0,clientId:X,cardId:M,subscribed:!0}),!0):(K(u,404,{error:`SSE client not connected: ${X}`}),!0):(K(u,400,{error:"clientId is required"}),!0)}let rt=k.match(new RegExp(`^${Tt(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(p==="POST"&&rt){await z();let M=decodeURIComponent(rt[1]),G=await pt(a),X=typeof G?.clientId=="string"?G.clientId.trim():"";return X?ie(X,M)?(K(u,200,{ok:!0,clientId:X,cardId:M,subscribed:!1}),!0):(K(u,404,{error:`SSE client not connected: ${X}`}),!0):(K(u,400,{error:"clientId is required"}),!0)}let lt=k.match(new RegExp(`^${Tt(e)}/cards/([^/]+)/files$`));if(p==="POST"&&lt){await z();let M=decodeURIComponent(lt[1]),G=String(m.searchParams.get("inChat")||"").toLowerCase()==="true",X=a.headers["x-file-name"],gt=String(a.headers["content-type"]||"application/octet-stream"),mt=Array.isArray(X)?X[0]:X,ht=mt?decodeURIComponent(String(mt)):"upload.bin",bt=await Rt(a);if(!bt.length)return K(u,400,{error:"Empty upload body"}),!0;let yt=kt(M,ht,gt,bt);return f(M,Nt=>{let Lt=new Date().toISOString(),Wt=Nt.card_data&&typeof Nt.card_data=="object"?Nt.card_data:{};Nt.card_data=Wt;let ue=D().normalizeIncoming([{name:yt.name,stored_name:yt.stored_name,size:yt.size,mime_type:yt.mime_type,path:yt.path,uploaded_at:yt.uploaded_at||Lt}],Lt);return D().merge(Wt,ue),Nt}),G&&H(M,"system",`file uploaded: ${yt.name} as ${yt.stored_name}`,[]),K(u,200,{ok:!0,file:yt}),!0}let Xt=k.match(new RegExp(`^${Tt(e)}/cards/([^/]+)/files/(\\d+)$`));if(p==="GET"&&Xt){let M=decodeURIComponent(Xt[1]),G=parseInt(Xt[2],10),X=m.searchParams.get("sn"),gt=xt(M);if(!gt)return K(u,404,{error:"Card not found"}),!0;let mt=D().resolve(gt.card_data,G,X);if(!mt.ok&&mt.reason==="stale_reference")return K(u,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!mt.ok)return K(u,404,{error:"File not found"}),!0;let ht=mt.file,bt=x(M),yt=q(M),Nt=`${bt}/${ht.stored_name}`,Lt=yt.files?yt.files.getBytes(Nt):null;if(!Lt)return K(u,404,{error:"File not found"}),!0;let Wt=ht.name||ht.stored_name,ue=ht.mime_type||"application/octet-stream";return u.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${Wt}"`,"Content-Length":Lt.length}),u.end(Lt),!0}return !1}catch(N){let $=N?.statusCode||500;return K(u,$,{error:String(N?.message||N)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleRuntimeApi:At,buildPublishedRuntimePayload:U,clearChatRecords:Q,reportSourceFetched(a,u){let l=w[0];return l?l.board.sourceDataFetched({params:{token:a,ref:u}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,u){let l=w[0];return l?l.board.sourceDataFetchFailure({params:{token:a,reason:u}}):{status:"fail",error:"no board context"}},get cardStore(){return w[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 h(C){let w=String(C||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return w.length>0&&w.length<=64?w:null}function _(C){if(s.has(C))return s.get(C);let g=i().boards.find(q=>q.id===C)||{},b=o(C,g);return s.set(C,b),b}function O(C,w,g){let b=JSON.stringify(g),q=typeof Buffer<"u"?Buffer.byteLength(b):new TextEncoder().encode(b).length;C.writeHead(w,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":q}),C.end(b);}async function T(C,w,g){let b=C.method||"GET",q=g.pathname;if(b==="GET"&&q===e)return O(w,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(),x={};try{x=D?JSON.parse(D):{};}catch{x={};}let P=h(x.id);if(!P)return O(w,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let Z=i();if(Z.boards.some(et=>et.id===P))return O(w,409,{error:`Board "${P}" is already registered`}),true;let J=typeof x.label=="string"&&x.label.trim()?x.label.trim():P,W={id:P,label:J};for(let[et,z]of Object.entries(x))et==="id"||et==="label"||z!=null&&(W[et]=z);return Z.boards.push(W),d(Z),O(w,200,{ok:true,board:W}),true}return false}async function A(C,w,g){let q=g.pathname.match(new RegExp(`^${Tt(e)}/([^/]+)(/|$)`));if(!q)return false;let V=h(decodeURIComponent(q[1]));return V?i().boards.some(P=>P.id===V)?!!await _(V).handleRuntimeApi(C,w,g):(O(w,404,{error:`Board "${V}" not registered. POST ${e} with {id} to register it first.`}),true):(O(w,400,{error:"Invalid board id"}),true)}async function S(C,w,g){return !!(await T(C,w,g)||await A(C,w,g))}function R(C){if(!i().boards.some(g=>g.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 Tt(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=index.js.map
7
7
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
- 'use strict';require('ajv-formats');var module$1=require('module'),url=require('url'),path=require('path'),fs=require('fs');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function b(r,t,e,n){let s=r.steps[e];if(!s)throw new Error(`Step "${e}" not found in flow configuration`);if(n.result==="failure"&&s.retry){let a=t.retryCounts[e]??0;if(a<s.retry.max_attempts)return {newState:{...t,retryCounts:{...t.retryCounts,[e]:a+1},updatedAt:Date.now()},nextStep:e,isTerminal:false,isCircuitBroken:false,shouldRetry:true}}let o=s.failure_transitions?.[n.result]??s.transitions[n.result];if(!o)throw new Error(`No transition defined for result "${n.result}" in step "${e}"`);let i=!!r.terminal_states[o];return {newState:{...t,currentStep:o,stepHistory:[...t.stepHistory,e],retryCounts:{...t.retryCounts,[e]:0},updatedAt:Date.now()},nextStep:o,isTerminal:i,isCircuitBroken:false,shouldRetry:false}}function j(r,t,e){let n=r.steps[e];if(!n?.circuit_breaker)return {broken:false,newState:{...t,iterationCounts:{...t.iterationCounts,[e]:(t.iterationCounts[e]??0)+1},updatedAt:Date.now()}};let s=t.iterationCounts[e]??0;return s>=n.circuit_breaker.max_iterations?{broken:true,redirectStep:n.circuit_breaker.on_open,newState:{...t,currentStep:n.circuit_breaker.on_open,updatedAt:Date.now()}}:{broken:false,newState:{...t,iterationCounts:{...t.iterationCounts,[e]:s+1},updatedAt:Date.now()}}}function F(r,t,e){let n=r.steps[t];if(!n)throw new Error(`Step "${t}" not found`);if(n.expects_data){let s={};for(let o of n.expects_data)s[o]=e[o];return s}return {...e}}function C(r,t){if(r===false||r===void 0)return {};if(typeof r=="string")return {[r]:t[r]};if(Array.isArray(r)){let e={};for(let n of r)e[n]=t[n];return e}return {}}function E(r,t){let e=Date.now();return {runId:t,flowId:r.id??"unnamed",currentStep:r.settings.start_step,status:"running",stepHistory:[],iterationCounts:{},retryCounts:{},startedAt:e,updatedAt:e}}var h=class{runs=new Map;data=new Map;async saveRunState(t,e){this.runs.set(t,{...e});}async loadRunState(t){let e=this.runs.get(t);return e?{...e}:null}async deleteRunState(t){this.runs.delete(t),this.data.delete(t);}async setData(t,e,n){this.data.has(t)||this.data.set(t,{});let s=this.data.get(t);s[e]=n;}async getData(t,e){return this.data.get(t)?.[e]}async getAllData(t){return {...this.data.get(t)??{}}}async clearData(t){this.data.delete(t);}async listRuns(){return Array.from(this.runs.keys())}clear(){this.runs.clear(),this.data.clear();}};function et(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let t=Math.random()*16|0;return (r==="x"?t:t&3|8).toString(16)})}var k=class{flow;handlers;store;components;options;listeners=new Map;aborted=false;constructor(t,e,n={}){this.flow=t,this.handlers=new Map(Object.entries(e)),this.store=n.store??new h,this.components=n.components??{},this.options=n,n.signal&&n.signal.addEventListener("abort",()=>{this.aborted=true;}),this.validateFlow();}validateFlow(){let{settings:t,steps:e,terminal_states:n}=this.flow;if(!t?.start_step)throw new Error("Flow must have settings.start_step defined");if(!e||Object.keys(e).length===0)throw new Error("Flow must have at least one step defined");if(!n||Object.keys(n).length===0)throw new Error("Flow must have at least one terminal_state defined");if(!e[t.start_step]&&!n[t.start_step])throw new Error(`Start step "${t.start_step}" not found`);for(let[s,o]of Object.entries(e)){for(let[i,a]of Object.entries(o.transitions))if(!e[a]&&!n[a])throw new Error(`Step "${s}" transition "${i}" points to unknown step "${a}"`);if(o.failure_transitions){for(let[i,a]of Object.entries(o.failure_transitions))if(!e[a]&&!n[a])throw new Error(`Step "${s}" failure_transition "${i}" points to unknown step "${a}"`)}}}on(t,e){this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e);}off(t,e){this.listeners.get(t)?.delete(e);}emit(t){let e=this.listeners.get(t.type);if(e)for(let n of e)try{n(t);}catch{}}sleep(t){return new Promise(e=>setTimeout(e,t))}async run(t){let e=et(),n=E(this.flow,e);if(await this.store.saveRunState(e,n),t)for(let[s,o]of Object.entries(t))await this.store.setData(e,s,o);this.emit({type:"flow:start",runId:e,timestamp:n.startedAt,data:{initialData:t??{}}});try{return await this.executeLoop(e,n)}catch(s){let o=s instanceof Error?s:new Error(String(s));return this.emit({type:"flow:error",runId:e,timestamp:Date.now(),data:{error:o.message}}),this.options.onError?.(o),n={...n,status:"failed",updatedAt:Date.now()},await this.store.saveRunState(e,n),{runId:e,status:"failed",data:await this.store.getAllData(e),finalStep:n.currentStep,stepHistory:n.stepHistory,durationMs:Date.now()-n.startedAt,error:o}}}async resume(t){let e=await this.store.loadRunState(t);if(!e)throw new Error(`No run found with ID: ${t}`);if(e.status==="completed"||e.status==="failed")throw new Error(`Cannot resume a ${e.status} run`);let n={...e,status:"running",pausedAt:void 0,updatedAt:Date.now()};return await this.store.saveRunState(t,n),this.emit({type:"flow:resumed",runId:t,timestamp:Date.now(),data:{currentStep:n.currentStep}}),this.executeLoop(t,n)}async pause(t){let e=await this.store.loadRunState(t);if(!e)throw new Error(`No run found with ID: ${t}`);let n={...e,status:"paused",pausedAt:Date.now(),updatedAt:Date.now()};await this.store.saveRunState(t,n),this.emit({type:"flow:paused",runId:t,timestamp:Date.now(),data:{currentStep:n.currentStep}});}async executeLoop(t,e){let n=this.flow.settings.max_total_steps??100,s=this.flow.settings.timeout_ms,o=e,i=0;for(;i<n;){if(this.aborted)return o={...o,status:"cancelled",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"cancelled",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};if(s&&Date.now()-o.startedAt>s)return o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"timeout",intent:"timeout",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};let a=o.currentStep,c=this.flow.terminal_states[a];if(c){o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o);let p=await this.store.getAllData(t),l={runId:t,status:"completed",intent:c.return_intent,data:C(c.return_artifacts,p),finalStep:a,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};return this.emit({type:"flow:complete",runId:t,timestamp:Date.now(),data:{...l}}),this.options.onComplete?.(l),l}let d=j(this.flow,o,a);if(d.broken){o=d.newState,await this.store.saveRunState(t,o),i++;continue}o=d.newState;let f=await this.store.getAllData(t),u=F(this.flow,a,f),m={runId:t,stepName:a,components:this.components,store:this.store,signal:this.options.signal,emit:(p,l)=>{this.emit({type:"step:complete",runId:t,timestamp:Date.now(),data:{event:p,payload:l}});}};this.emit({type:"step:start",runId:t,timestamp:Date.now(),data:{step:a,input:u}});let g;try{let p=this.handlers.get(a);if(!p)throw new Error(`No handler registered for step "${a}"`);g=await p(u,m);}catch(p){let l=p instanceof Error?p:new Error(String(p));this.emit({type:"step:error",runId:t,timestamp:Date.now(),data:{step:a,error:l.message}}),g={result:"failure",data:{error:l.message}};}if(g.data)for(let[p,l]of Object.entries(g.data))await this.store.setData(t,p,l);this.emit({type:"step:complete",runId:t,timestamp:Date.now(),data:{step:a,result:g.result}}),this.options.onStep?.(a,g);let w=b(this.flow,o,a,g);if(o=w.newState,w.shouldRetry){await this.store.saveRunState(t,o);let p=this.flow.steps[a];if(p.retry?.delay_ms){let l=o.retryCounts[a]??0,S=p.retry.backoff_multiplier?p.retry.delay_ms*Math.pow(p.retry.backoff_multiplier,l-1):p.retry.delay_ms;await this.sleep(S);}i++;continue}await this.store.saveRunState(t,o),this.emit({type:"transition",runId:t,timestamp:Date.now(),data:{from:a,to:o.currentStep,result:g.result}}),this.options.onTransition?.(a,o.currentStep),i++;}return o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"max_iterations",intent:"max_iterations",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt}}};function v(r,t,e){return new k(r,t,e)}async function $(r){return (await import('yaml')).parse(r)}async function rt(r){let t=await fetch(r);if(!t.ok)throw new Error(`Failed to load flow from ${r}: ${t.statusText}`);let e=t.headers.get("content-type")??"",n=await t.text();return e.includes("json")||r.endsWith(".json")?JSON.parse(n):$(n)}async function nt(r){let e=await(await import('fs/promises')).readFile(r,"utf-8");return r.endsWith(".json")?JSON.parse(e):$(e)}function D(r){let t=[];if(!r||typeof r!="object")return ["Flow must be an object"];let e=r;if(!e.settings||typeof e.settings!="object"?t.push('Flow must have a "settings" object'):typeof e.settings.start_step!="string"&&t.push("settings.start_step must be a string"),!e.steps||typeof e.steps!="object")t.push('Flow must have a "steps" object');else {let n=e.steps;for(let[s,o]of Object.entries(n)){if(!o||typeof o!="object"){t.push(`Step "${s}" must be an object`);continue}let i=o;(!i.transitions||typeof i.transitions!="object")&&t.push(`Step "${s}" must have a "transitions" object`),i.failure_transitions!==void 0&&typeof i.failure_transitions!="object"&&t.push(`Step "${s}" failure_transitions must be an object when provided`);}}if(!e.terminal_states||typeof e.terminal_states!="object")t.push('Flow must have a "terminal_states" object');else {let n=e.terminal_states;for(let[s,o]of Object.entries(n)){if(!o||typeof o!="object"){t.push(`Terminal state "${s}" must be an object`);continue}typeof o.return_intent!="string"&&t.push(`Terminal state "${s}" must have a "return_intent" string`);}}return t}async function P(r){let t;typeof r=="string"?r.startsWith("http://")||r.startsWith("https://")?t=await rt(r):r.includes("{")?t=JSON.parse(r):t=await nt(r):t=r;let e=D(t);if(e.length>0)throw new Error(`Invalid step flow configuration:
1
+ 'use strict';require('ajv-formats');var module$1=require('module'),url=require('url'),path=require('path'),fs=require('fs');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function b(r,t,e,n){let s=r.steps[e];if(!s)throw new Error(`Step "${e}" not found in flow configuration`);if(n.result==="failure"&&s.retry){let a=t.retryCounts[e]??0;if(a<s.retry.max_attempts)return {newState:{...t,retryCounts:{...t.retryCounts,[e]:a+1},updatedAt:Date.now()},nextStep:e,isTerminal:false,isCircuitBroken:false,shouldRetry:true}}let o=s.failure_transitions?.[n.result]??s.transitions[n.result];if(!o)throw new Error(`No transition defined for result "${n.result}" in step "${e}"`);let i=!!r.terminal_states[o];return {newState:{...t,currentStep:o,stepHistory:[...t.stepHistory,e],retryCounts:{...t.retryCounts,[e]:0},updatedAt:Date.now()},nextStep:o,isTerminal:i,isCircuitBroken:false,shouldRetry:false}}function j(r,t,e){let n=r.steps[e];if(!n?.circuit_breaker)return {broken:false,newState:{...t,iterationCounts:{...t.iterationCounts,[e]:(t.iterationCounts[e]??0)+1},updatedAt:Date.now()}};let s=t.iterationCounts[e]??0;return s>=n.circuit_breaker.max_iterations?{broken:true,redirectStep:n.circuit_breaker.on_open,newState:{...t,currentStep:n.circuit_breaker.on_open,updatedAt:Date.now()}}:{broken:false,newState:{...t,iterationCounts:{...t.iterationCounts,[e]:s+1},updatedAt:Date.now()}}}function F(r,t,e){let n=r.steps[t];if(!n)throw new Error(`Step "${t}" not found`);if(n.expects_data){let s={};for(let o of n.expects_data)s[o]=e[o];return s}return {...e}}function C(r,t){if(r===false||r===void 0)return {};if(typeof r=="string")return {[r]:t[r]};if(Array.isArray(r)){let e={};for(let n of r)e[n]=t[n];return e}return {}}function E(r,t){let e=Date.now();return {runId:t,flowId:r.id??"unnamed",currentStep:r.settings.start_step,status:"running",stepHistory:[],iterationCounts:{},retryCounts:{},startedAt:e,updatedAt:e}}var h=class{runs=new Map;data=new Map;async saveRunState(t,e){this.runs.set(t,{...e});}async loadRunState(t){let e=this.runs.get(t);return e?{...e}:null}async deleteRunState(t){this.runs.delete(t),this.data.delete(t);}async setData(t,e,n){this.data.has(t)||this.data.set(t,{});let s=this.data.get(t);s[e]=n;}async getData(t,e){return this.data.get(t)?.[e]}async getAllData(t){return {...this.data.get(t)??{}}}async clearData(t){this.data.delete(t);}async listRuns(){return Array.from(this.runs.keys())}clear(){this.runs.clear(),this.data.clear();}};function et(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let t=Math.random()*16|0;return (r==="x"?t:t&3|8).toString(16)})}var x=class{flow;handlers;store;components;options;listeners=new Map;aborted=false;constructor(t,e,n={}){this.flow=t,this.handlers=new Map(Object.entries(e)),this.store=n.store??new h,this.components=n.components??{},this.options=n,n.signal&&n.signal.addEventListener("abort",()=>{this.aborted=true;}),this.validateFlow();}validateFlow(){let{settings:t,steps:e,terminal_states:n}=this.flow;if(!t?.start_step)throw new Error("Flow must have settings.start_step defined");if(!e||Object.keys(e).length===0)throw new Error("Flow must have at least one step defined");if(!n||Object.keys(n).length===0)throw new Error("Flow must have at least one terminal_state defined");if(!e[t.start_step]&&!n[t.start_step])throw new Error(`Start step "${t.start_step}" not found`);for(let[s,o]of Object.entries(e)){for(let[i,a]of Object.entries(o.transitions))if(!e[a]&&!n[a])throw new Error(`Step "${s}" transition "${i}" points to unknown step "${a}"`);if(o.failure_transitions){for(let[i,a]of Object.entries(o.failure_transitions))if(!e[a]&&!n[a])throw new Error(`Step "${s}" failure_transition "${i}" points to unknown step "${a}"`)}}}on(t,e){this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e);}off(t,e){this.listeners.get(t)?.delete(e);}emit(t){let e=this.listeners.get(t.type);if(e)for(let n of e)try{n(t);}catch{}}sleep(t){return new Promise(e=>setTimeout(e,t))}async run(t){let e=et(),n=E(this.flow,e);if(await this.store.saveRunState(e,n),t)for(let[s,o]of Object.entries(t))await this.store.setData(e,s,o);this.emit({type:"flow:start",runId:e,timestamp:n.startedAt,data:{initialData:t??{}}});try{return await this.executeLoop(e,n)}catch(s){let o=s instanceof Error?s:new Error(String(s));return this.emit({type:"flow:error",runId:e,timestamp:Date.now(),data:{error:o.message}}),this.options.onError?.(o),n={...n,status:"failed",updatedAt:Date.now()},await this.store.saveRunState(e,n),{runId:e,status:"failed",data:await this.store.getAllData(e),finalStep:n.currentStep,stepHistory:n.stepHistory,durationMs:Date.now()-n.startedAt,error:o}}}async resume(t){let e=await this.store.loadRunState(t);if(!e)throw new Error(`No run found with ID: ${t}`);if(e.status==="completed"||e.status==="failed")throw new Error(`Cannot resume a ${e.status} run`);let n={...e,status:"running",pausedAt:void 0,updatedAt:Date.now()};return await this.store.saveRunState(t,n),this.emit({type:"flow:resumed",runId:t,timestamp:Date.now(),data:{currentStep:n.currentStep}}),this.executeLoop(t,n)}async pause(t){let e=await this.store.loadRunState(t);if(!e)throw new Error(`No run found with ID: ${t}`);let n={...e,status:"paused",pausedAt:Date.now(),updatedAt:Date.now()};await this.store.saveRunState(t,n),this.emit({type:"flow:paused",runId:t,timestamp:Date.now(),data:{currentStep:n.currentStep}});}async executeLoop(t,e){let n=this.flow.settings.max_total_steps??100,s=this.flow.settings.timeout_ms,o=e,i=0;for(;i<n;){if(this.aborted)return o={...o,status:"cancelled",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"cancelled",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};if(s&&Date.now()-o.startedAt>s)return o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"timeout",intent:"timeout",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};let a=o.currentStep,c=this.flow.terminal_states[a];if(c){o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o);let p=await this.store.getAllData(t),l={runId:t,status:"completed",intent:c.return_intent,data:C(c.return_artifacts,p),finalStep:a,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};return this.emit({type:"flow:complete",runId:t,timestamp:Date.now(),data:{...l}}),this.options.onComplete?.(l),l}let d=j(this.flow,o,a);if(d.broken){o=d.newState,await this.store.saveRunState(t,o),i++;continue}o=d.newState;let f=await this.store.getAllData(t),u=F(this.flow,a,f),m={runId:t,stepName:a,components:this.components,store:this.store,signal:this.options.signal,emit:(p,l)=>{this.emit({type:"step:complete",runId:t,timestamp:Date.now(),data:{event:p,payload:l}});}};this.emit({type:"step:start",runId:t,timestamp:Date.now(),data:{step:a,input:u}});let g;try{let p=this.handlers.get(a);if(!p)throw new Error(`No handler registered for step "${a}"`);g=await p(u,m);}catch(p){let l=p instanceof Error?p:new Error(String(p));this.emit({type:"step:error",runId:t,timestamp:Date.now(),data:{step:a,error:l.message}}),g={result:"failure",data:{error:l.message}};}if(g.data)for(let[p,l]of Object.entries(g.data))await this.store.setData(t,p,l);this.emit({type:"step:complete",runId:t,timestamp:Date.now(),data:{step:a,result:g.result}}),this.options.onStep?.(a,g);let w=b(this.flow,o,a,g);if(o=w.newState,w.shouldRetry){await this.store.saveRunState(t,o);let p=this.flow.steps[a];if(p.retry?.delay_ms){let l=o.retryCounts[a]??0,S=p.retry.backoff_multiplier?p.retry.delay_ms*Math.pow(p.retry.backoff_multiplier,l-1):p.retry.delay_ms;await this.sleep(S);}i++;continue}await this.store.saveRunState(t,o),this.emit({type:"transition",runId:t,timestamp:Date.now(),data:{from:a,to:o.currentStep,result:g.result}}),this.options.onTransition?.(a,o.currentStep),i++;}return o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"max_iterations",intent:"max_iterations",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt}}};function v(r,t,e){return new x(r,t,e)}async function $(r){return (await import('yaml')).parse(r)}async function rt(r){let t=await fetch(r);if(!t.ok)throw new Error(`Failed to load flow from ${r}: ${t.statusText}`);let e=t.headers.get("content-type")??"",n=await t.text();return e.includes("json")||r.endsWith(".json")?JSON.parse(n):$(n)}async function nt(r){let e=await(await import('fs/promises')).readFile(r,"utf-8");return r.endsWith(".json")?JSON.parse(e):$(e)}function D(r){let t=[];if(!r||typeof r!="object")return ["Flow must be an object"];let e=r;if(!e.settings||typeof e.settings!="object"?t.push('Flow must have a "settings" object'):typeof e.settings.start_step!="string"&&t.push("settings.start_step must be a string"),!e.steps||typeof e.steps!="object")t.push('Flow must have a "steps" object');else {let n=e.steps;for(let[s,o]of Object.entries(n)){if(!o||typeof o!="object"){t.push(`Step "${s}" must be an object`);continue}let i=o;(!i.transitions||typeof i.transitions!="object")&&t.push(`Step "${s}" must have a "transitions" object`),i.failure_transitions!==void 0&&typeof i.failure_transitions!="object"&&t.push(`Step "${s}" failure_transitions must be an object when provided`);}}if(!e.terminal_states||typeof e.terminal_states!="object")t.push('Flow must have a "terminal_states" object');else {let n=e.terminal_states;for(let[s,o]of Object.entries(n)){if(!o||typeof o!="object"){t.push(`Terminal state "${s}" must be an object`);continue}typeof o.return_intent!="string"&&t.push(`Terminal state "${s}" must have a "return_intent" string`);}}return t}async function P(r){let t;typeof r=="string"?r.startsWith("http://")||r.startsWith("https://")?t=await rt(r):r.includes("{")?t=JSON.parse(r):t=await nt(r):t=r;let e=D(t);if(e.length>0)throw new Error(`Invalid step flow configuration:
2
2
  - ${e.join(`
3
- - `)}`);return t}function M(r){return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function O(r){return atob(r.replace(/-/g,"+").replace(/_/g,"/"))}var A=class{constructor(t){this.kv=t;}kv;stateKey(t){return `state_${M(t)}`}dataPrefix(t){return `data_${M(t)}_`}dataKey(t,e){return `${this.dataPrefix(t)}${M(e)}`}async saveRunState(t,e){this.kv.write(this.stateKey(t),e);}async loadRunState(t){let e=this.kv.read(this.stateKey(t));return e!=null&&typeof e=="object"?e:null}async deleteRunState(t){this.kv.delete(this.stateKey(t));for(let e of this.kv.listKeys(this.dataPrefix(t)))this.kv.delete(e);}async setData(t,e,n){this.kv.write(this.dataKey(t,e),n);}async getData(t,e){return this.kv.read(this.dataKey(t,e))}async getAllData(t){let e=this.dataPrefix(t),n={};for(let s of this.kv.listKeys(e))n[O(s.slice(e.length))]=this.kv.read(s);return n}async clearData(t){for(let e of this.kv.listKeys(this.dataPrefix(t)))this.kv.delete(e);}async listRuns(){return this.kv.listKeys("state_").map(t=>O(t.slice(6)))}};var K=path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),pt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));function ut(){let r=path.resolve(K,"./jsonata-sync.cjs");return fs.existsSync(r)?r:path.resolve(K,"../card-compute/jsonata-sync.cjs")}var R=pt(ut());function B(r,t){if(!r||typeof r!="object")throw new Error(`[step-machine-public] Step "${t}" returned a non-object result.`);let e=r,n=e.result??e.status;if(typeof n=="string"&&n.trim().length>0){let s=e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?{...e.data}:{},o=typeof e.error=="string"?e.error:void 0;return o&&!("error"in s)&&(s.error=o),{result:n,data:s,...o?{error:o}:{}}}return {result:"success",data:{...e}}}function z(r,t){if(!t||t.length===0)return r;let e={};for(let n of t)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n]);return e}function _(r,t){return async(e,n)=>{let s=await r(e,n),o=B(s,n?.stepName??"unknown");return {result:o.result,data:z(o.data,t),...o.error?{error:o.error}:{}}}}function V(r,t,e){if(!t||t.length===0)return null;for(let n of t)try{if(!R(n).evaluate(r))return {result:"failure",data:{error:`[${e}] input validation failed: ${n}`}}}catch(s){let o=s instanceof Error?s.message:String(s);return {result:"failure",data:{error:`[${e}] input validation error on "${n}": ${o}`}}}return null}function T(r,t,e){return !t||t.length===0?r:async(n,s)=>{let o=V(n,t,e);return o||r(n,s)}}var N=path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),gt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));function mt(){let r=path.resolve(N,"./jsonata-sync.cjs");return fs.existsSync(r)?r:path.resolve(N,"../../card-compute/jsonata-sync.cjs")}var x=gt(mt());function U(r,t,e){if(!r||typeof r!="object")return t;let n={output:t},s=t.result,o=t.data,i=t.error;if(typeof r.resultExpr=="string")try{let a=x(r.resultExpr).evaluate(n);if(typeof a!="string"||!a.trim())throw new Error(`resultExpr did not produce a non-empty string (got ${JSON.stringify(a)})`);s=a;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.resultExpr failed: ${c}`)}if(typeof r.dataTemplate=="string")try{let a=x(r.dataTemplate).evaluate(n);if(!a||typeof a!="object"||Array.isArray(a))throw new Error(`dataTemplate did not produce an object (got ${JSON.stringify(a)})`);o=a;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.dataTemplate failed: ${c}`)}if(typeof r.errorExpr=="string")try{let a=x(r.errorExpr).evaluate(n);i=a!=null?String(a):void 0;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.errorExpr failed: ${c}`)}return i!==void 0?{result:s,data:o,error:i}:{result:s,data:o}}var ht="b64:";function wt(r){let t=new TextEncoder().encode(r),e=globalThis.Buffer,n;if(e)n=e.from(t).toString("base64");else if(typeof btoa=="function"){let s="";for(let o of t)s+=String.fromCharCode(o);n=btoa(s);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function W(r){return `${ht}${wt(JSON.stringify(r))}`}function q(r){return !!r&&typeof r=="object"&&r.type==="compute-jsonata"&&Array.isArray(r.expr)&&r.expr.length>0}function I(r){if(!r||typeof r!="object")return false;let t=r;if(t.type!=="ref"||typeof t.howToRun!="string")return false;if(typeof t.whatToRun=="string")return true;if(t.whatToRun&&typeof t.whatToRun=="object"){let e=t.whatToRun;return typeof e.kind=="string"&&typeof e.value=="string"}return false}function St(r){if(typeof r=="string"){let t=r.indexOf("=");if(t<1)throw new Error(`[step-machine-public] Invalid compute expression (missing "="): "${r}"`);return {bindTo:r.slice(0,t).trim(),expr:r.slice(t+1).trim()}}if(r&&typeof r=="object"&&typeof r.bindTo=="string"&&typeof r.expr=="string")return r;throw new Error(`[step-machine-public] Invalid compute step: ${JSON.stringify(r)}`)}function yt(r,t,e){let n=t.split("."),s=r;for(let o=0;o<n.length-1;o++){let i=n[o];(s[i]==null||typeof s[i]!="object")&&(s[i]={}),s=s[i];}s[n[n.length-1]]=e;}function Y(r,t,e){let n=r.expr.map(St);return async s=>{let o=s&&typeof s=="object"&&!Array.isArray(s)?{...s}:{},i={},a={expects_data:o,data:i,...e?{config:e}:{}},c,d;for(let f of n)try{let u=R(f.expr).evaluate(a);if(f.bindTo==="result")c=u!=null?String(u):"success";else if(f.bindTo==="error")d=u!=null?String(u):void 0;else if(f.bindTo.startsWith("data."))yt(i,f.bindTo.slice(5),u);else return {result:"failure",data:{},error:`[${t}] invalid bindTo "${f.bindTo}": must be "result", "error", or start with "data."`}}catch(u){let m=u instanceof Error?u.message:String(u);return {result:"failure",data:{},error:`[${t}] compute "${f.bindTo}" failed: ${m}`}}return c===void 0?{result:"failure",data:{},error:`[${t}] compute-jsonata: no "result" binding declared \u2014 add '- result = "success"' to expr`}:d?{result:c,data:i,error:d}:{result:c,data:i}}}function X(r,t,e,n){let{type:s,...o}=r,i={...o,whatToRun:typeof o.whatToRun=="object"?W(o.whatToRun):o.whatToRun};return async a=>{let c=a&&typeof a=="object"&&!Array.isArray(a)?{...a}:{};n&&(c.config=n);try{let d=await e(i,c);if(!r.outputTransforms)return d;try{return U(r.outputTransforms,d,t)}catch(f){let u=f instanceof Error?f.message:String(f);return {result:"failure",data:{},error:u}}}catch(d){let f=d instanceof Error?d.message:String(d);return {result:"failure",data:{error:`[step-machine-public] step "${t}" invoke threw: ${f}`}}}}}function G(){return async r=>({result:"success",data:r&&typeof r=="object"&&!Array.isArray(r)?r:{}})}function Rt(r,t,e){return async(n,s)=>{let o=n?.[t.items];if(!Array.isArray(o))return {result:"failure",data:{},error:`[${e}] forEach: "${t.items}" is not an array (got ${typeof o})`};let i=o,a=t.collectAs??`${t.items}_results`;if(i.length===0)return {result:"success",data:{[a]:[]}};let{[t.items]:c,...d}=n,f=Math.max(1,t.concurrency??1),u=new Array(i.length),m=0,g=0,w=0;return await new Promise(p=>{function l(){for(;m<f&&g<i.length;){let S=g++;m++;let Z={...d,[t.as]:i[S]};r(Z,s).then(y=>{u[S]=y;}).catch(y=>{let tt=y instanceof Error?y.message:String(y);u[S]={result:"failure",data:{},error:tt};}).finally(()=>{m--,u[S]?.result==="failure"&&w++,g>=i.length&&m===0?p():l();});}m===0&&g>=i.length&&p();}l();}),w>0?{result:"failure",data:{errors:u.filter(l=>l.result==="failure").map(l=>l.error)},error:`[${e}] forEach: ${w}/${i.length} items failed`}:{result:"success",data:{[a]:u.map(p=>p.data)}}}}function Q(r,t,e){let n=Array.isArray(t?.produces_data)?t?.produces_data:void 0,s=Array.isArray(t?.input_validations)?t?.input_validations:void 0,o=t?.config??void 0,i=t?.handler,a;return q(i)?a=Y(i,r,o):I(i)?a=X(i,r,e.invoke,o):a=G(),t?.forEach&&(a=Rt(a,t.forEach,r)),T(_(a,n),s,r)}function H(r,t){let e={};for(let[n,s]of Object.entries(r.steps??{}))e[n]=Q(n,s,t);return e}function kt(r){let t=r.storeFactory||(()=>new h);return {async run(e,n){try{let s=H(e,{invoke:r.invokeRef}),i=await v(e,s,{store:t()}).run(n);return i.status!=="completed"?{dispatched:!1,error:i.error?.message||i.status}:{dispatched:!0}}catch(s){return {dispatched:false,error:s instanceof Error?s.message:String(s)}}}}}
4
- exports.KVStorageStore=A;exports.MemoryStore=h;exports.buildStepHandlersForFlow=H;exports.createComputeJsonataHandler=Y;exports.createPassthroughHandler=G;exports.createRefStepHandler=X;exports.createStepMachine=v;exports.createStepMachineChatFlowRunner=kt;exports.filterProducedData=z;exports.isComputeJsonataSpec=q;exports.isRefSpec=I;exports.jsonata=R;exports.loadStepFlow=P;exports.normalizeHandlerResult=B;exports.resolveStepHandler=Q;exports.runInputValidations=V;exports.wrapWithInputValidations=T;exports.wrapWithOutputFiltering=_;//# sourceMappingURL=index.cjs.map
3
+ - `)}`);return t}function A(r){return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function O(r){return atob(r.replace(/-/g,"+").replace(/_/g,"/"))}var M=class{constructor(t){this.kv=t;}kv;stateKey(t){return `state_${A(t)}`}dataPrefix(t){return `data_${A(t)}_`}dataKey(t,e){return `${this.dataPrefix(t)}${A(e)}`}async saveRunState(t,e){this.kv.write(this.stateKey(t),e);}async loadRunState(t){let e=this.kv.read(this.stateKey(t));return e!=null&&typeof e=="object"?e:null}async deleteRunState(t){this.kv.delete(this.stateKey(t));for(let e of this.kv.listKeys(this.dataPrefix(t)))this.kv.delete(e);}async setData(t,e,n){this.kv.write(this.dataKey(t,e),n);}async getData(t,e){return this.kv.read(this.dataKey(t,e))}async getAllData(t){let e=this.dataPrefix(t),n={};for(let s of this.kv.listKeys(e))n[O(s.slice(e.length))]=this.kv.read(s);return n}async clearData(t){for(let e of this.kv.listKeys(this.dataPrefix(t)))this.kv.delete(e);}async listRuns(){return this.kv.listKeys("state_").map(t=>O(t.slice(6)))}};var B=path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),pt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));function ut(){let r=path.resolve(B,"./jsonata-sync.cjs");return fs.existsSync(r)?r:path.resolve(B,"../card-compute/jsonata-sync.cjs")}var k=pt(ut());function K(r,t){if(!r||typeof r!="object")throw new Error(`[step-machine-public] Step "${t}" returned a non-object result.`);let e=r,n=e.result??e.status;if(typeof n=="string"&&n.trim().length>0){let s=e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?{...e.data}:{},o=typeof e.error=="string"?e.error:void 0;return o&&!("error"in s)&&(s.error=o),{result:n,data:s,...o?{error:o}:{}}}return {result:"success",data:{...e}}}function V(r,t){if(!t||t.length===0)return r;let e={};for(let n of t)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n]);return e}function _(r,t){return async(e,n)=>{let s=await r(e,n),o=K(s,n?.stepName??"unknown");return {result:o.result,data:V(o.data,t),...o.error?{error:o.error}:{}}}}function z(r,t,e){if(!t||t.length===0)return null;for(let n of t)try{if(!k(n).evaluate(r))return {result:"failure",data:{error:`[${e}] input validation failed: ${n}`}}}catch(s){let o=s instanceof Error?s.message:String(s);return {result:"failure",data:{error:`[${e}] input validation error on "${n}": ${o}`}}}return null}function T(r,t,e){return !t||t.length===0?r:async(n,s)=>{let o=z(n,t,e);return o||r(n,s)}}var N=path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),gt=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));function mt(){let r=path.resolve(N,"./jsonata-sync.cjs");return fs.existsSync(r)?r:path.resolve(N,"../../card-compute/jsonata-sync.cjs")}var R=gt(mt());function U(r,t,e){if(!r||typeof r!="object")return t;let n={output:t},s=t.result,o=t.data,i=t.error;if(typeof r.resultExpr=="string")try{let a=R(r.resultExpr).evaluate(n);if(typeof a!="string"||!a.trim())throw new Error(`resultExpr did not produce a non-empty string (got ${JSON.stringify(a)})`);s=a;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.resultExpr failed: ${c}`)}if(typeof r.dataTemplate=="string")try{let a=R(r.dataTemplate).evaluate(n);if(!a||typeof a!="object"||Array.isArray(a))throw new Error(`dataTemplate did not produce an object (got ${JSON.stringify(a)})`);o=a;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.dataTemplate failed: ${c}`)}if(typeof r.errorExpr=="string")try{let a=R(r.errorExpr).evaluate(n);i=a!=null?String(a):void 0;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.errorExpr failed: ${c}`)}return i!==void 0?{result:s,data:o,error:i}:{result:s,data:o}}var ht="b64:";function wt(r){let t=new TextEncoder().encode(r),e=globalThis.Buffer,n;if(e)n=e.from(t).toString("base64");else if(typeof btoa=="function"){let s="";for(let o of t)s+=String.fromCharCode(o);n=btoa(s);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function W(r){return `${ht}${wt(JSON.stringify(r))}`}function q(r){return !!r&&typeof r=="object"&&r.type==="compute-jsonata"&&Array.isArray(r.expr)&&r.expr.length>0}function I(r){if(!r||typeof r!="object")return false;let t=r;if(t.type!=="ref"||typeof t.howToRun!="string")return false;if(typeof t.whatToRun=="string")return true;if(t.whatToRun&&typeof t.whatToRun=="object"){let e=t.whatToRun;return typeof e.kind=="string"&&typeof e.value=="string"}return false}function St(r){if(typeof r=="string"){let t=r.indexOf("=");if(t<1)throw new Error(`[step-machine-public] Invalid compute expression (missing "="): "${r}"`);return {bindTo:r.slice(0,t).trim(),expr:r.slice(t+1).trim()}}if(r&&typeof r=="object"&&typeof r.bindTo=="string"&&typeof r.expr=="string")return r;throw new Error(`[step-machine-public] Invalid compute step: ${JSON.stringify(r)}`)}function yt(r,t,e){let n=t.split("."),s=r;for(let o=0;o<n.length-1;o++){let i=n[o];(s[i]==null||typeof s[i]!="object")&&(s[i]={}),s=s[i];}s[n[n.length-1]]=e;}function Y(r,t,e){let n=r.expr.map(St);return async s=>{let o=s&&typeof s=="object"&&!Array.isArray(s)?{...s}:{},i={},a={expects_data:o,data:i,...e?{config:e}:{}},c,d;for(let f of n)try{let u=k(f.expr).evaluate(a);if(f.bindTo==="result")c=u!=null?String(u):"success";else if(f.bindTo==="error")d=u!=null?String(u):void 0;else if(f.bindTo.startsWith("data."))yt(i,f.bindTo.slice(5),u);else return {result:"failure",data:{},error:`[${t}] invalid bindTo "${f.bindTo}": must be "result", "error", or start with "data."`}}catch(u){let m=u instanceof Error?u.message:String(u);return {result:"failure",data:{},error:`[${t}] compute "${f.bindTo}" failed: ${m}`}}return c===void 0?{result:"failure",data:{},error:`[${t}] compute-jsonata: no "result" binding declared \u2014 add '- result = "success"' to expr`}:d?{result:c,data:i,error:d}:{result:c,data:i}}}function X(r,t,e,n){let{type:s,...o}=r,i={...o,whatToRun:typeof o.whatToRun=="object"?W(o.whatToRun):o.whatToRun};return async a=>{let c=a&&typeof a=="object"&&!Array.isArray(a)?{...a}:{};n&&(c.config=n);try{let d=await e(i,c);if(!r.outputTransforms)return d;try{return U(r.outputTransforms,d,t)}catch(f){let u=f instanceof Error?f.message:String(f);return {result:"failure",data:{},error:u}}}catch(d){let f=d instanceof Error?d.message:String(d);return {result:"failure",data:{error:`[step-machine-public] step "${t}" invoke threw: ${f}`}}}}}function G(){return async r=>({result:"success",data:r&&typeof r=="object"&&!Array.isArray(r)?r:{}})}function kt(r,t,e){return async(n,s)=>{let o=n?.[t.items];if(!Array.isArray(o))return {result:"failure",data:{},error:`[${e}] forEach: "${t.items}" is not an array (got ${typeof o})`};let i=o,a=t.collectAs??`${t.items}_results`;if(i.length===0)return {result:"success",data:{[a]:[]}};let{[t.items]:c,...d}=n,f=Math.max(1,t.concurrency??1),u=new Array(i.length),m=0,g=0,w=0;return await new Promise(p=>{function l(){for(;m<f&&g<i.length;){let S=g++;m++;let Z={...d,[t.as]:i[S]};r(Z,s).then(y=>{u[S]=y;}).catch(y=>{let tt=y instanceof Error?y.message:String(y);u[S]={result:"failure",data:{},error:tt};}).finally(()=>{m--,u[S]?.result==="failure"&&w++,g>=i.length&&m===0?p():l();});}m===0&&g>=i.length&&p();}l();}),w>0?{result:"failure",data:{errors:u.filter(l=>l.result==="failure").map(l=>l.error)},error:`[${e}] forEach: ${w}/${i.length} items failed`}:{result:"success",data:{[a]:u.map(p=>p.data)}}}}function Q(r,t,e){let n=Array.isArray(t?.produces_data)?t?.produces_data:void 0,s=Array.isArray(t?.input_validations)?t?.input_validations:void 0,o=t?.config??void 0,i=t?.handler,a;return q(i)?a=Y(i,r,o):I(i)?a=X(i,r,e.invoke,o):a=G(),t?.forEach&&(a=kt(a,t.forEach,r)),T(_(a,n),s,r)}function H(r,t){let e={};for(let[n,s]of Object.entries(r.steps??{}))e[n]=Q(n,s,t);return e}function xt(r){let t=r.storeFactory||(()=>new h);return {async run(e,n){try{let s=H(e,{invoke:r.invokeRef}),i=await v(e,s,{store:t()}).run(n);return i.status!=="completed"?{dispatched:!1,error:i.error?.message||i.status}:{dispatched:!0}}catch(s){return {dispatched:false,error:s instanceof Error?s.message:String(s)}}}}}
4
+ exports.KVStorageStore=M;exports.MemoryStore=h;exports.buildStepHandlersForFlow=H;exports.createComputeJsonataHandler=Y;exports.createPassthroughHandler=G;exports.createRefStepHandler=X;exports.createStepMachine=v;exports.createStepMachineChatFlowRunner=xt;exports.filterProducedData=V;exports.isComputeJsonataSpec=q;exports.isRefSpec=I;exports.jsonata=k;exports.loadStepFlow=P;exports.normalizeHandlerResult=K;exports.resolveStepHandler=Q;exports.runInputValidations=z;exports.wrapWithInputValidations=T;exports.wrapWithOutputFiltering=_;//# sourceMappingURL=index.cjs.map
5
5
  //# sourceMappingURL=index.cjs.map
@@ -3,7 +3,7 @@ import { l as StepMachineStore } from '../types-DQ1bKuB1.cjs';
3
3
  export { MemoryStore } from '../stores/memory.cjs';
4
4
  export { KVStorageStore } from '../stores/kv.cjs';
5
5
  import { ExecutionRef } from '../execution-refs.cjs';
6
- import '../storage-interface-B6ecOulj.cjs';
6
+ import '../storage-interface-B-7pDHwD.cjs';
7
7
 
8
8
  /**
9
9
  * The single normalized shape the engine consumes.
@@ -3,7 +3,7 @@ import { l as StepMachineStore } from '../types-DQ1bKuB1.js';
3
3
  export { MemoryStore } from '../stores/memory.js';
4
4
  export { KVStorageStore } from '../stores/kv.js';
5
5
  import { ExecutionRef } from '../execution-refs.js';
6
- import '../storage-interface-B6ecOulj.js';
6
+ import '../storage-interface-B-7pDHwD.js';
7
7
 
8
8
  /**
9
9
  * The single normalized shape the engine consumes.