yaml-flow 8.4.19 → 8.4.21

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