yaml-flow 8.4.14 → 8.4.16

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