yaml-flow 8.2.4 → 8.2.5

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.
@@ -1,7 +1,7 @@
1
- import {createRequire}from'module';import'ajv-formats';var Yt="b64:";function un(t){let e=new TextEncoder().encode(t),n=globalThis.Buffer,r;if(n)r=n.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);r=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function cn(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),n=globalThis.Buffer;if(n)return n.from(e,"base64").toString("utf8");if(typeof atob=="function"){let r=atob(e),o=new Uint8Array(r.length);for(let s=0;s<r.length;s+=1)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function St(t){return `${Yt}${un(JSON.stringify(t))}`}function fe(t){if(!t.startsWith(Yt))throw new Error(`Invalid ref format (expected ${Yt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(cn(t.slice(Yt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!e||typeof e!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let n=e;if(typeof n.kind!="string"||typeof n.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:n.kind,value:n.value}}async function pe(t,e,n){let r=t.tryAcquire();if(!r)return false;try{await e();}finally{r();}return n?.(),true}var Rt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ut(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function wt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ge(t){return t.tasks??{}}function ae(t){return t?t.status===Rt.FAILED||t.status===Rt.INACTIVATED:false}function me(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function he(t){return t.maxExecutions}function ye(t,e){let n=new Set;for(let[r,o]of Object.entries(e))if(o.status===Rt.COMPLETED){let s=t.tasks[r];s&&ut(s).forEach(i=>n.add(i));}return Array.from(n)}function ke(t,e){let n={};return t.forEach(r=>{let o=e[r];if(!o)return;ut(o).forEach(u=>{n[u]||(n[u]=[]),n[u].push(r);});}),n}function Se(t,e,n){let r=t.tasks[e]??Xt(),o={};if(n){let u=n.tasks[e],i=wt(u);for(let f of i)for(let[R,B]of Object.entries(n.tasks))if(ut(B).includes(f)){let I=t.tasks[R];I?.lastDataHash&&(o[f]=I.lastDataHash);break}}let s={...r,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Ce(t,e,n,r,o,s){let u=t.tasks[n]??Xt(),i=e.tasks[n];if(!i)throw new Error(`Task "${n}" not found in graph`);let f;r&&i.on&&i.on[r]?f=i.on[r]:f=ut(i);let R=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let q=i.requires??[];for(let A of q)for(let[b,S]of Object.entries(e.tasks))if(ut(S).includes(A)){let k=t.tasks[b];k?.lastDataHash&&(R[A]=k.lastDataHash);break}}let B={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:R,error:void 0},I=[...new Set([...t.availableOutputs,...f])];return {...t,tasks:{...t.tasks,[n]:B},availableOutputs:I,lastUpdated:new Date().toISOString()}}function be(t,e,n,r){let o=t.tasks[n]??Xt(),s=e.tasks[n];if(s?.retry){let f=o.retryCount+1;if(f<=s.retry.max_attempts){let R={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:r};return {...t,tasks:{...t.tasks,[n]:R},lastUpdated:new Date().toISOString()}}}let u={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:r,executionCount:o.executionCount+1},i=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(i=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&u.executionCount>=s.circuit_breaker.max_executions){let f=s.circuit_breaker.on_break;i=[...new Set([...i,...f])];}return {...t,tasks:{...t.tasks,[n]:u},availableOutputs:i,lastUpdated:new Date().toISOString()}}function Re(t,e,n,r){let o=t.tasks[e]??Xt(),s={...o,progress:typeof r=="number"?r:o.progress,messages:[...o.messages??[],...n?[{message:n,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function we(t,e){let n=t.tasks[e];if(!n)return t;let r={...n,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:r},lastUpdated:new Date().toISOString()}}function Xt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Wt(t,e){let n=`live-${Date.now()}`,r={};for(let s of Object.keys(t.tasks))r[s]=xe();let o={status:"running",tasks:r,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:n,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function dn(t,e){let{config:n,state:r}=t;if("executionId"in e&&e.executionId&&e.executionId!==r.executionId)return t;switch(e.type){case "task-started":return {config:n,state:Se(r,e.taskName,n)};case "task-completed":return {config:n,state:Ce(r,n,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:n,state:be(r,n,e.taskName,e.error)};case "task-progress":return {config:n,state:Re(r,e.taskName,e.message,e.progress)};case "task-restart":return {config:n,state:we(r,e.taskName)};case "inject-tokens":return {config:n,state:{...r,availableOutputs:[...new Set([...r.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:n,state:yn(r,e.action)};case "task-upsert":return ln(t,e.taskName,e.taskConfig);case "task-removal":return fn(t,e.taskName);case "node-requires-add":return pn(t,e.nodeName,e.tokens);case "node-requires-remove":return gn(t,e.nodeName,e.tokens);case "node-provides-add":return mn(t,e.nodeName,e.tokens);case "node-provides-remove":return hn(t,e.nodeName,e.tokens);default:return t}}function ve(t,e){return e.reduce((n,r)=>dn(n,r),t)}function ln(t,e,n){let r=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:n}},state:{...t.state,tasks:{...t.state.tasks,[e]:r?t.state.tasks[e]:xe()},lastUpdated:new Date().toISOString()}}}function fn(t,e){if(!t.config.tasks[e])return t;let{[e]:n,...r}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:r},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function pn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=wt(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:[...o,...s]}}},state:t.state}}function gn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=wt(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:s}}},state:t.state}}function mn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ut(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:[...o,...s]}}},state:t.state}}function hn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ut(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:s}}},state:t.state}}function Gt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function Zt(t){if(!t||typeof t!="object")throw new Error("Invalid snapshot: expected an object");let e=t;if(!e.config||typeof e.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!e.state||typeof e.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let n=e.config,r=e.state;if(!n.settings||typeof n.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(r.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:n,state:r}}function xe(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function yn(t,e){let n=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:n};case "pause":return {...t,status:"paused",lastUpdated:n};case "resume":return {...t,status:"running",lastUpdated:n};default:return t}}function Vt(t){let{config:e,state:n}=t,r=ge(e);if(Object.keys(r).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=kn(r),u=ye(e,n.tasks),i=new Set([...u,...n.availableOutputs]),f=[],R=[],B=[],I=[];for(let[A,b]of Object.entries(r)){let S=n.tasks[A],k=me(b,e.settings),T=k!=="once";if(S?.status===Rt.RUNNING||ae(S))continue;let m=he(b);if(m!==void 0&&S&&S.executionCount>=m||b.circuit_breaker&&S&&S.executionCount>=b.circuit_breaker.max_executions||!T&&S?.status===Rt.COMPLETED)continue;if(T&&S?.status===Rt.COMPLETED){let E=wt(b),$=false;switch(k){case "data-changed":{E.length>0&&E.some(U=>{for(let[J,K]of Object.entries(r))if(ut(K).includes(U)){let W=n.tasks[J];if(!W)continue;let gt=S.lastConsumedHashes?.[U];return W.lastDataHash==null?W.executionCount>S.lastEpoch:W.lastDataHash!==gt}return false})||($=true);break}case "epoch-changed":{E.length>0&&E.some(U=>{for(let[J,K]of Object.entries(r))if(ut(K).includes(U)){let W=n.tasks[J];if(W&&W.executionCount>S.lastEpoch)return true}return false})||($=true);break}case "time-based":{let z=b.refreshInterval??0;if(z<=0){$=true;break}let U=S.completedAt;if(!U){$=true;break}(Date.now()-Date.parse(U))/1e3<z&&($=true);break}case "manual":$=true;break}if($)continue}let w=wt(b);if(w.length===0){f.push(A);continue}let P=[],F=[],L=[];for(let E of w){if(i.has(E))continue;let $=s[E]||[];$.length===0?P.push(E):$.every(U=>ae(n.tasks[U]))?L.push({token:E,failedProducer:$[0]}):F.push(E);}P.length>0?B.push({taskName:A,missingTokens:P}):L.length>0?I.push({taskName:A,failedTokens:L.map(E=>E.token),failedProducers:[...new Set(L.map(E=>E.failedProducer))]}):F.length>0?R.push({taskName:A,waitingOn:F}):f.push(A);}let q={};if(f.length>1){let A=ke(f,r);for(let[b,S]of Object.entries(A))S.length>1&&(q[b]=S);}return {eligible:f,pending:R,unresolved:B,blocked:I,conflicts:q}}function kn(t){let e={};for(let[n,r]of Object.entries(t)){for(let o of ut(r))e[o]||(e[o]=[]),e[o].push(n);if(r.on)for(let o of Object.values(r.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(n)||e[s].push(n);if(r.on_failure)for(let o of r.on_failure)e[o]||(e[o]=[]),e[o].includes(n)||e[o].push(n);}return e}var Mt=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function ie(t){let e=ue(t);return Sn(e)}function ue(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(ue).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+ue(e[r])).join(",")+"}"}function Sn(t){let e=0xcbf29ce484222325n,n=0x100000001b3n,r=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*n&r;return e.toString(16).padStart(16,"0")}function Cn(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),n="";for(let r of e)n+=String.fromCharCode(r);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function bn(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=new Uint8Array(r.length);for(let s=0;s<r.length;s++)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Ae(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Cn(e)}function Rn(t){try{let e=JSON.parse(bn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ee(t,e,n){let{handlers:r,onDrain:o}=e,s=new Mt,u="state"in t&&"config"in t?t:Wt(t),i=false,f=new Set,R=new Map(Object.entries(r)),B=new Mt,I=false,q=false;function A(){if(!i){if(I){q=true;return}I=true;try{do q=!1,b();while(q)}finally{I=false;}}}function b(){let m=B.drain(),w=s.drain(),P=[...m,...w];P.length>0&&(u=ve(u,P));let F=Vt(u);P.length>0&&o?.(P,u,F);for(let L of F.eligible)T(L);for(let L of P)if(L.type==="task-progress"){let{taskName:E,update:$}=L;if(!u.config.tasks[E])continue;let U=u.state.tasks[E];if(!U||U.status!=="running")continue;let J=Ae(E),K=k(E,J,$).catch(W=>{i||(B.append({type:"task-failed",taskName:E,error:W.message??String(W),timestamp:new Date().toISOString()}),A());}).finally(()=>{f.delete(K);});f.add(K);}}function S(m){let P=u.config.tasks[m].requires??[],F=new Map;for(let[E,$]of Object.entries(u.config.tasks))for(let z of $.provides??[])F.set(z,E);let L={};for(let E of P){let $=F.get(E);$?L[E]=u.state.tasks[$]?.data:L[E]=void 0;}return L}async function k(m,w,P){let F=u.config.tasks[m],L=F.taskHandlers??[],E=S(m);for(let $ of L){let z=R.get($);if(!z)throw new Error(`Handler '${$}' not found in registry (task '${m}')`);let U={nodeId:m,state:E,taskState:u.state.tasks[m],config:F,callbackToken:w,update:P};if(await z(U)==="task-initiate-failure")throw new Error(`Handler '${$}' returned task-initiate-failure (task '${m}')`)}}function T(m){let P=u.config.tasks[m]?.taskHandlers;if(!P||P.length===0)return;B.append({type:"task-started",taskName:m,timestamp:new Date().toISOString()}),A();let F=Ae(m),L=k(m,F).catch(E=>{i||(B.append({type:"task-failed",taskName:m,error:E.message??String(E),timestamp:new Date().toISOString()}),A());}).finally(()=>{f.delete(L);});f.add(L);}return {push(m){i||(m.type==="task-completed"&&m.data&&!m.dataHash&&(m={...m,dataHash:ie(m.data)}),s.append(m),A());},pushAll(m){if(!i){for(let w of m)w.type==="task-completed"&&w.data&&!w.dataHash?s.append({...w,dataHash:ie(w.data)}):s.append(w);A();}},resolveCallback(m,w,P){if(i)return;let F=Rn(m);if(!F)return;let{taskName:L}=F;if(u.config.tasks[L]){if(P&&P.length>0)s.append({type:"task-failed",taskName:L,error:P.join("; "),timestamp:new Date().toISOString()});else {let E=w&&Object.keys(w).length>0?ie(w):void 0;s.append({type:"task-completed",taskName:L,data:w,dataHash:E,timestamp:new Date().toISOString()});}A();}},addNode(m,w){i||(s.append({type:"task-upsert",taskName:m,taskConfig:w,timestamp:new Date().toISOString()}),A());},removeNode(m){i||(s.append({type:"task-removal",taskName:m,timestamp:new Date().toISOString()}),A());},addRequires(m,w){i||(s.append({type:"node-requires-add",nodeName:m,tokens:w,timestamp:new Date().toISOString()}),A());},removeRequires(m,w){i||(s.append({type:"node-requires-remove",nodeName:m,tokens:w,timestamp:new Date().toISOString()}),A());},addProvides(m,w){i||(s.append({type:"node-provides-add",nodeName:m,tokens:w,timestamp:new Date().toISOString()}),A());},removeProvides(m,w){i||(s.append({type:"node-provides-remove",nodeName:m,tokens:w,timestamp:new Date().toISOString()}),A());},registerHandler(m,w){R.set(m,w);},unregisterHandler(m){R.delete(m);},retrigger(m){i||u.config.tasks[m]&&(s.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()}),A());},retriggerAll(m){if(!i){for(let w of m)u.config.tasks[w]&&s.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()});A();}},snapshot(){return Gt(u)},getState(){return u},getSchedule(){return Vt(u)},async waitForHandlers(){f.size>0&&await Promise.allSettled([...f]);},async dispose(m){m?.wait&&f.size>0&&await Promise.allSettled([...f]),i=true;}}}var vn=createRequire(import.meta.url);vn("./jsonata-sync.cjs");var An=createRequire(import.meta.url),Qt=An("./jsonata-sync.cjs"),Ie=Qt;function _e(t,e){if(!e||!t)return;let n=e.split("."),r=t;for(let o=0;o<n.length;o++){if(r==null)return;r=r[n[o]];}return r}function Oe(t,e,n){let r=e.split("."),o=t;for(let s=0;s<r.length-1;s++)(o[r[s]]==null||typeof o[r[s]]!="object")&&(o[r[s]]={}),o=o[r[s]];o[r[r.length-1]]=n;}async function En(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await Qt(o.expr).evaluate(r);Oe(t.computed_values,o.bindTo,s),r.computed_values=t.computed_values;}catch{}return t}function _n(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let u=Ie(s.expr).evaluate(r);Oe(t.computed_values,s.bindTo,u),r.computed_values=t.computed_values;}catch(u){let i=u instanceof Error?u.message:String(u);o.push({bindTo:s.bindTo,error:i});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function Tn(t,e,n){let r={...n??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return Qt(t).evaluate(r)}function In(t,e){return e.startsWith("fetched_sources.")?_e(t._sourcesData??{},e.slice(16)):_e(t,e)}var Te=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),On=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function jn(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let n=t;(typeof n.id!="string"||!n.id)&&e.push("id: required, must be a non-empty string");for(let r of Object.keys(n))On.has(r)||e.push(`Unknown top-level key: "${r}"`);if((n.card_data==null||typeof n.card_data!="object"||Array.isArray(n.card_data))&&e.push("card_data: required, must be an object"),n.meta!=null)if(typeof n.meta!="object"||Array.isArray(n.meta))e.push("meta: must be an object");else {let r=n.meta;r.title!=null&&typeof r.title!="string"&&e.push("meta.title: must be a string"),r.tags!=null&&!Array.isArray(r.tags)&&e.push("meta.tags: must be an array");}if(n.requires!=null&&!Array.isArray(n.requires)&&e.push("requires: must be an array of strings"),n.provides!=null&&(Array.isArray(n.provides)?n.provides.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=r;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),n.compute!=null&&(Array.isArray(n.compute)?n.compute.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`compute[${o}]: must be a compute step object`);else {let s=r;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),n.source_defs!=null)if(!Array.isArray(n.source_defs))e.push("source_defs: must be an array");else {let r=new Set,o=new Set;n.source_defs.forEach((s,u)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${u}]: must be an object`);else {let i=s;typeof i.bindTo!="string"||!i.bindTo?e.push(`source_defs[${u}]: missing required "bindTo" property`):(r.has(i.bindTo)&&e.push(`source_defs[${u}]: bindTo "${i.bindTo}" is not unique across source_defs`),r.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?e.push(`source_defs[${u}]: missing required "outputFile" property`):(o.has(i.outputFile)&&e.push(`source_defs[${u}]: outputFile "${i.outputFile}" is not unique across source_defs`),o.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${u}]: optionalForCompletionGating must be a boolean`);}});}if(n.view!=null)if(typeof n.view!="object"||Array.isArray(n.view))e.push("view: must be an object");else {let r=n.view;!Array.isArray(r.elements)||r.elements.length===0?e.push("view.elements: required, must be a non-empty array"):r.elements.forEach((o,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):Te.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...Te].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),r.layout!=null&&(typeof r.layout!="object"||Array.isArray(r.layout))&&e.push("view.layout: must be an object"),r.features!=null&&(typeof r.features!="object"||Array.isArray(r.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function Nn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=await Qt(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function Fn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return t.map(r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=Ie(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}})}var Ut={run:En,runSync:_n,eval:Tn,resolve:In,validate:jn,enrichSources:Nn,enrichSourcesSync:Fn};function je(t){return JSON.stringify(t)}function Ne(t){let e;try{e=JSON.parse(t);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${t}`)}if(typeof e!="object"||e===null||typeof e.howToRun!="string"||typeof e.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${t}`);return e}function te(t,e){function n(){return t.readIndex()??{}}function r(o,s,u){let i=String(s||"").split(".").filter(Boolean);if(i.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let f={...o},R=f;for(let B=0;B<i.length-1;B++){let I=i[B],q=R[I],A=q&&typeof q=="object"&&!Array.isArray(q)?{...q}:{};R[I]=A,R=A;}return R[i[i.length-1]]=u,f}return {readCard(o){let s=n()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return n()[o]?.key??null},readAllCards(){let o=[];for(let[s,u]of Object.entries(n())){if(!t.cardExists(u.key))continue;let i=t.readCard(u.key);i?o.push(i):e?.(`[card-store] could not read card "${s}" at key "${u.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,u]of Object.entries(n()))o[s]=u.checksum;return o},changedSince(o){let s=n(),u=[];for(let[i,f]of Object.entries(s))o[i]!==f.checksum&&u.push(i);for(let i of Object.keys(o))s[i]||u.push(i);return u},validateUpsert(o,s){let u=n(),i=u[o],f=Object.entries(u).find(([,R])=>R.key===s);return i&&i.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${i.key}", cannot remap to "${s}"`}:f&&f[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${f[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,u){let i=n(),f=u??i[o]?.key??t.defaultCardKey(o),R=t.writeCard(f,s);i[o]={key:f,checksum:R,updatedAt:new Date().toISOString()},t.writeIndex(i);},patchCard(o,s,u){let i=n(),f=i[o];if(!f||!t.cardExists(f.key))throw new Error(`card "${o}" not found`);let R=t.readCard(f.key);if(!R||typeof R!="object"||Array.isArray(R))throw new Error(`card "${o}" is not patchable`);let B=r(R,s,u),I=t.writeCard(f.key,B);i[o]={key:f.key,checksum:I,updatedAt:new Date().toISOString()},t.writeIndex(i);},removeCard(o){let s=n();s[o]&&(delete s[o],t.writeIndex(s));},readIndex(){return n()}}}function ce(t,e){return {readSourceData(n,r){let o=t.read(`${n}/${r}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(n,r,o,s){let u=e(o);t.write(`${n}/.staged/${s}/${r}`,u);},commitSourceData(n,r,o){let s=`${n}/.staged/${o}/${r}`,u=t.read(s);return u==null?false:(t.write(`${n}/${r}`,u),t.remove(s),true)},hasSource(n,r){return t.exists(`${n}/${r}`)}}}function Be(t){function e(n){let r=t.readAllEntries();if(!n)return r;let o=r.findIndex(s=>s.id===n);return o===-1?r:r.slice(o+1)}return {readEntriesAfterCursor(n){let r=e(n);return r.length===0?{events:[],newCursor:n}:{events:r.map(o=>o.event),newCursor:r[r.length-1].id}},pendingCount(n){return e(n).length},appendEvent(n){t.appendEntry({id:t.generateId(),event:n});}}}function Pe(t,e){return {appendEntries(n,r){if(!n||r.length===0)return;let o=t.read(n)??[];t.write(n,[...o,...r]);},dispatchEntriesForJournalId(n,r){if(!n)return;let o=t.read(n);if(!(!o||o.length===0)){for(let s of o)try{r(s);}catch(u){let i=u instanceof Error?u.message:String(u);try{e(s,i);}catch{}}t.delete(n);}}}}var ee="v1",Tt="board/graph",qe="board/lastJournalProcessedId";function Fe(t){return `cards/${t}/runtime`}function Le(t){return {readRuntime(e){return t.read(Fe(e))??{_sources:{}}},writeRuntime(e,n){t.write(Fe(e),n);}}}function $n(t,e){let n={...t};for(let r of e.deleteKeys)delete n[r];return {...n,...e.shallowMerge}}function Ge(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,n){if(n.schemaVersion!==ee)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);let r=t.readValues(e);if(r.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:r.version};let o=$n(r.values,n);return {ok:true,newVersion:t.writeValues(e,o,n.deleteKeys)}}}}function Ve(t){function e(n){let r=t.read(n);return r==null?null:typeof r=="string"?r:JSON.stringify(r)}return {readTaskExecutorRef(){let n=e("task-executor");if(n?.trim())return Ne(n.trim())},writeTaskExecutorRef(n){t.write("task-executor",je(n));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(n){t.write("chat-handler-flow",n);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(n){t.write("card-store-ref",n);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(n){t.write("outputs-store-ref",n);}}}function Me(t){return {writeComputedValues(e,n){t.write(`cards/${e}/computed_values`,n);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let n of t.listKeys("cards/")){let r=n.match(/^cards\/([^/]+)\/computed_values$/);r&&(e[r[1]]=t.read(n));}return e},writeDataObjects(e){for(let[n,r]of Object.entries(e))n&&t.write(`data-objects/${n}`,r);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let n of t.listKeys("data-objects/"))e[n.slice(13)]=t.read(n);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function Dn(t){return t?.lastRequestedAt?!t.lastFetchedAt||t.lastFetchedAt<t.lastRequestedAt:false}function $e(t,e){return t?.lastRequestedAt?Dn(t)?"in-flight":!t.lastFetchedAt||t.lastFetchedAt<e?"dispatch":"idle":"dispatch"}function Bn(t,e){let n={...t,lastFetchedAt:e};return delete n.lastError,n}function De(t,e){let n={...t,lastError:e};return delete n.lastFetchedAt,n}function ne(t,e){let n=e.state.tasks,r=e.config.tasks,o=Object.keys(n),s=Vt(e),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let b of s.pending)i.set(b.taskName,b.waitingOn);for(let b of s.unresolved)i.set(b.taskName,b.missingTokens);for(let b of s.blocked)i.set(b.taskName,b.failedTokens);let f=new Map;for(let[b,S]of Object.entries(r))for(let k of S.requires??[]){let T=f.get(k)??[];T.push(b),f.set(k,T);}let R=o.sort().map(b=>{let S=n[b],k=r[b]??{requires:[],provides:[]};S.status==="completed"?u.completed+=1:S.status==="failed"?u.failed+=1:S.status==="in-progress"&&(u.in_progress+=1);let T=k.requires??[],m=k.provides??[],w=Object.keys(S.data??{}).sort(),P=T.filter(U=>e.state.availableOutputs.includes(U)),F=T.filter(U=>!e.state.availableOutputs.includes(U)),L=i.get(b)??F,E=new Set;for(let U of m)for(let J of f.get(U)??[])J!==b&&E.add(J);let $=S.failedAt,z=S.error?{message:S.error,code:"TASK_FAILED",at:$,source:"task-runtime"}:void 0;return {name:b,status:S.status,error:z,requires:T,requires_satisfied:P,requires_missing:F,provides_declared:m,provides_runtime:w,blocked_by:L,unblocks:Array.from(E).sort(),runtime:{attempt_count:S.executionCount??0,restart_count:S.retryCount??0,in_progress_since:S.status==="in-progress"?S.startedAt??null:null,last_transition_at:S.lastUpdated??null,last_completed_at:S.completedAt??null,last_restarted_at:S.startedAt??null,status_age_ms:S.lastUpdated?0:null}}});u.pending=s.pending.length,u.blocked=s.blocked.length,u.unresolved=s.unresolved.length;let B=R.map(b=>({name:b.name,fanOut:b.unblocks.length})).sort((b,S)=>S.fanOut-b.fanOut||b.name.localeCompare(S.name)),I=B.length>0?B[0]:{name:null,fanOut:0},q=new Set;for(let b of Object.values(r))for(let S of b.requires??[])q.add(S);let A=0;for(let[b,S]of Object.entries(r)){let k=(S.requires??[]).length===0,m=(S.provides??[]).some(w=>(f.get(w)??[]).some(P=>P!==b));k&&!m&&(A+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:u.completed,eligible:s.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:A,topology:{edge_count:Array.from(q).length,max_fan_out_card:I.name,max_fan_out:I.fanOut}},cards:R}}function Pn(){return new Date().toISOString()}function Ue(t,e,n,r,o,s,u){return async i=>{let f=[],R=n.cardStore.readCard(i.nodeId);if(!R)return "task-initiate-failure";let B=R.id,I=R.card_data??{},q=R.source_defs??[],A=q.filter(D=>D.optionalForCompletionGating!==true),b=n.cardRuntimeStore.readRuntime(B),S=false,k=()=>{S&&(n.cardRuntimeStore.writeRuntime(B,b),S=false);},T=D=>({...b._sources[D]??{}}),m=(D,p)=>{b._sources[D]=p,S=true;},w=i.taskState?.executionCount??0;if(b._lastExecutionCount!==w&&(b._sources={},b._lastExecutionCount=w,S=true),i.update){let D=i.update,p=D.outputFile;if(p){let l=T(p);if(D.failure)m(p,De(l,D.reason??"unknown"));else {let C=D.rqt;if(!l.lastFetchedAt||C>l.lastFetchedAt){let _=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,G=false;_&&(G=n.fetchedSourcesStore.commitSourceData(B,p,_)),G?m(p,Bn(l,C)):m(p,De(l,`source delivery commit failed for ${p} token=${String(_)}`));}}k();}}let F={};for(let D of q)if(D.outputFile){let p=n.fetchedSourcesStore.readSourceData(B,D.outputFile);p!==null&&(F[D.bindTo]=p);}let L={};for(let[D,p]of Object.entries(i.state??{}))if(p!==null&&typeof p=="object"&&!Array.isArray(p)){let l=p[D];L[D]=l!==void 0?l:p;}else L[D]=p;let E={id:B,card_data:{...I},requires:L,source_defs:q,compute:R.compute};E._sourcesData=F,R.compute&&Ut.runSync(E,{sourcesData:F}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))(B,E.computed_values??{});let $={...R},z=Ut.enrichSourcesSync(Array.isArray(R.source_defs)?R.source_defs:void 0,{card_data:R.card_data,requires:L}),U=t.value;$.source_defs=Array.isArray(z)?z.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:U})):z;let J=Pn(),K=i.update?void 0:J,W=A.filter(D=>{let p=D.outputFile;if(typeof p!="string"||!p)return true;let l=T(p);K&&(l={...l,queueRequestedAt:K},m(p,l));let C=l.queueRequestedAt??l.lastRequestedAt??J,_=$e(l,C);return _==="in-flight"?false:_==="dispatch"});if(k(),W.length>0){let D=false,p=J;for(let l of W){let C=l.outputFile;if(typeof C!="string"||!C)continue;let _=T(C),G=_.queueRequestedAt??J;m(C,{..._,lastRequestedAt:G}),p=G,D=true;}return D&&k(),D&&(f.push({taskKind:"source-fetch",payload:{boardRef:St(t),enrichedCard:$,callbackToken:i.callbackToken,rqt:p}}),n.executionRequestStore.appendEntries(e,f)),"task-initiated"}if(A.some(D=>{let p=D.outputFile;if(typeof p!="string"||!p)return false;let l=T(p);if(l.lastError)return false;let C=l.queueRequestedAt??l.lastRequestedAt??J;return $e(l,C)==="in-flight"}))return "task-initiated";let Bt=R.provides??[],xt={};for(let{bindTo:D,ref:p}of Bt)xt[D]=Ut.resolve(E,p);return (u??n.outputStore.writeDataObjects.bind(n.outputStore))(xt),q.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let p=T(D.outputFile);return !p.lastRequestedAt||!p.lastFetchedAt?true:p.lastFetchedAt<=p.lastRequestedAt}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:St(t),enrichedCard:$,callbackToken:i.callbackToken,rqt:J}}),r(i.nodeId,xt),f.length>0&&n.executionRequestStore.appendEntries(e,f),"task-initiated"}}var de={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function He(t){return {[Tt]:t.graph,[qe]:t.lastDrainedJournalId}}function Ke(t){let e=t[Tt],n=t[qe];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Tt}`);return {graph:e,lastDrainedJournalId:typeof n=="string"?n:""}}function Je(t){let e=t.requires,n=t.provides?.map(r=>r.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:n,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function rt(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function Q(t){return {status:"fail",error:t}}function ot(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function qn(t){let e=new TextEncoder().encode(t),n=Array.from(e,r=>String.fromCharCode(r)).join("");return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Ye(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=Uint8Array.from(r,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function re(t){try{let e=JSON.parse(Ye(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ln(t){return qn(JSON.stringify(t))}function ze(t){try{let e=JSON.parse(Ye(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function ct(){return new Date().toISOString()}function Xe(t,e){let n=e.onWarn??(()=>{}),r=St(t);function o(p){if(p.length!==0)try{let l=e.publishBoardChangeNotifications?.(p);l&&typeof l.catch=="function"&&l.catch(C=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${C instanceof Error?C.message:String(C)}`));}catch(l){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${l instanceof Error?l.message:String(l)}`);}}function s(){let p=i().readCardStoreRef();if(!p)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let l=e.kvStorageForRef(p);return {readIndex(){return l.read("_index")},writeIndex(C){l.write("_index",C);},readCard(C){return l.read(C)},writeCard(C,_){return l.write(C,_),e.hashFn(_)},cardExists(C){return l.read(C)!==null},defaultCardKey(C){return C}}}let u={readValues(p){let l=e.kvStorage("state-snapshot"),C=l.listKeys().sort();if(C.length===0)return {version:null,values:{}};let _={};for(let G of C)_[G]=l.read(G);return {version:e.hashFn(_),values:_}},writeValues(p,l,C){let _=e.kvStorage("state-snapshot");for(let G of C)_.delete(G);for(let[G,Y]of Object.entries(l))_.write(G,Y);return e.hashFn(l)}},i=()=>Ve(e.kvStorage("config")),f=()=>Ge(u),R=()=>Be(e.journalAdapter()),B=()=>te(s(),n),I=()=>{let p=i().readOutputsStoreRef();if(!p)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Me(e.kvStorageForRef(p))};function q(){return !!f().readSnapshot(t.value).values[Tt]}function A(){let p=f().readSnapshot(t.value);if(!p.values[Tt])throw new Error(`Board not initialized at ${t.value}`);return Ke(p.values)}function b(p,l){let C=f().commitSnapshot(t.value,{schemaVersion:ee,expectedVersion:l,commitId:e.genId(),committedAt:ct(),deleteKeys:[],shallowMerge:He(p)});if(!C.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${l??"null"} current=${C.currentVersion??"null"}`)}function S(p){R().appendEvent(p);}async function k(){let p=(v,N)=>{let X=v.payload,a=(X?.enrichedCard??{}).id??X?.cardId??"unknown";S({type:"task-failed",taskName:a,error:N,timestamp:ct()});},l=Pe(e.kvStorage("execution-requests"),p),C=Le(e.kvStorage("card-runtime")),_=ce(e.blobStorage("sources"),v=>e.resolveBlob(v)),G=new Map,Y={readRuntime(v){return G.get(v)??C.readRuntime(v)},writeRuntime(v,N){G.set(v,N);}},ft=[],et=new Map,at={readSourceData(v,N){let X=`${v}/${N}`;return et.has(X)?et.get(X):_.readSourceData(v,N)},ingestSourceDataStaged(v,N,X,bt){_.ingestSourceDataStaged(v,N,X,bt);},commitSourceData(v,N,X){let bt=`${v}/.staged/${X}/${N}`,c=e.blobStorage("sources").read(bt);if(c==null)return false;let d=`${v}/${N}`,g=c.trim();try{et.set(d,JSON.parse(g));}catch{et.set(d,g);}return ft.push({cardId:v,outputFile:N,deliveryToken:X}),true},hasSource(v,N){let X=`${v}/${N}`;return et.has(X)?true:_.hasSource(v,N)}},dt={cardStore:B(),cardRuntimeStore:Y,fetchedSourcesStore:at,outputStore:I(),executionRequestStore:l},mt=A(),ht=Zt(mt.graph),{events:Ct,newCursor:H}=R().readEntriesAfterCursor(mt.lastDrainedJournalId),it=[],Pt=[],It=[],qt=new Map,Kt=(v,N)=>{it.push({type:"task-completed",taskName:v,data:N,timestamp:ct()});},Ot=(v,N)=>S({type:"task-failed",taskName:v,error:N,timestamp:ct()}),At=Ee(ht,{handlers:{"card-handler":Ue(t,H,dt,Kt,Ot,(v,N)=>{Pt.push({cardId:v,values:N});},v=>{It.push(v);})}});for(it=Ct;it.length>0;){let v=it;it=[];for(let N of v)if(N.type==="task-restart"){let X=dt.cardStore.readCard(N.taskName);X&&qt.set(N.taskName,X);}At.pushAll(v),await At.waitForHandlers();}let jt=At.getState();await At.dispose({wait:true});let Lt=f().readSnapshot(t.value).version;b({lastDrainedJournalId:H,graph:Gt(jt)},Lt);for(let{cardId:v,values:N}of Pt)dt.outputStore.writeComputedValues(v,N);for(let v of It)dt.outputStore.writeDataObjects(v);for(let[v,N]of G)C.writeRuntime(v,N);for(let{cardId:v,outputFile:N,deliveryToken:X}of ft)_.commitSourceData(v,N,X);let Nt;try{Nt=ne(r,jt),dt.outputStore.writeStatusSnapshot(Nt);}catch(v){n(`[board-live-cards-public] status publish failed: ${v instanceof Error?v.message:String(v)}`);}let Et=[];for(let{cardId:v,values:N}of Pt)Et.push({kind:"computed_values",cardId:v,values:N});for(let v of It)for(let[N,X]of Object.entries(v))N&&Et.push({kind:"data_object",key:N,payload:X});for(let[v,N]of qt)Et.push({kind:"card_refreshed",cardId:v,card:N});Nt!==void 0&&Et.push({kind:"status",status:Nt}),o(Et);let oe=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:St({kind:"built-in",value:"source-cli-task-executor"})};l.dispatchEntriesForJournalId(H,v=>{if(v.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${v.taskKind}" \u2014 skipping`);return}let N=v.payload,X=N.enrichedCard?.id??"unknown",bt=N.enrichedCard?.source_defs??[];for(let a of bt){if(!a.outputFile){n(`[dispatch] source "${a.bindTo}" has no outputFile \u2014 skipping`);continue}let c=Ln({cbk:N.callbackToken,rg:t.value,br:St(t),cid:X,b:a.bindTo,d:a.outputFile,cs:void 0,rqt:N.rqt});e.dispatchExecution(oe,{source_def:a,base_ref:St(t),callback:{token:c,via:e.selfRef}}).catch(d=>Ot(X,d instanceof Error?d.message:String(d)));}});}async function T(){try{let p=()=>{let C=A(),{events:_}=R().readEntriesAfterCursor(C.lastDrainedJournalId);_.length<=0||(T(),e.requestProcessAccumulated?.());},l=await pe(e.lock,k,p);return rt({ran:l!==!1})}catch(p){return ot(p)}}function m(p){try{let l=p.params?.cardStoreRef;if(!l)return Q("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!q()){let Y=Wt(de);b({lastDrainedJournalId:"",graph:Gt(Y)},null);}let C=p.params?.outputsStoreRef;if(!C)return Q("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let _=i();_.writeCardStoreRef(l),_.writeOutputsStoreRef(C);let G=p.body??{};G["task-executor-ref"]&&_.writeTaskExecutorRef(G["task-executor-ref"]),Object.prototype.hasOwnProperty.call(G,"chat-handler-flow")&&_.writeChatHandlerFlow(G["chat-handler-flow"]);try{I().writeStatusSnapshot(ne(r,Zt(A().graph)));}catch{}return rt()}catch(l){return ot(l)}}function w(p){try{let l=I().readStatusSnapshot();if(!l){l=ne(r,Zt(A().graph));try{I().writeStatusSnapshot(l);}catch{}}return rt(l)}catch(l){return ot(l)}}function P(p){try{let l=p.params?.id;return l?(S({type:"task-removal",taskName:l,timestamp:ct()}),T(),rt()):Q("removeCard requires params.id")}catch(l){return ot(l)}}function F(p){try{let l=p.params?.id;return l?(S({type:"task-restart",taskName:l,timestamp:ct()}),T(),rt()):Q("retrigger requires params.id")}catch(l){return ot(l)}}async function L(p){return T()}function E(p){try{let l=p.params?.cardId,C=p.params?.all,_=!!p.params?.restart;if(!l&&!C)return Q("upsertCard requires --card-id <id> or --all");let G=C?B().readAllCards().map(Y=>Y.id):[l];for(let Y of G)if(!B().readCard(Y))return Q(`Card "${Y}" not found in board at ${t.value}`);for(let Y of G){let ft=B().readCard(Y),et=Je(ft),at=e.hashFn(et),dt=e.kvStorage("card-upsert"),mt=dt.read(Y),ht=mt?.taskConfigHash!==at;if(!(!ht&&!_)){if(ht){let Ct=mt?.blobRef??B().readCardKey(Y)??Y;S({type:"task-upsert",taskName:Y,taskConfig:et,timestamp:ct()}),dt.write(Y,{blobRef:Ct,taskConfigHash:at,updatedAt:ct()});}_&&S({type:"task-restart",taskName:Y,timestamp:ct()});}}return T(),rt()}catch(l){return ot(l)}}function $(p){try{let l=p.params?.token;if(!l)return Q("taskFailed requires params.token");let C=p.params?.error??"unknown error",_=re(l);return _?(S({type:"task-failed",taskName:_.taskName,error:C,timestamp:ct()}),T(),rt()):Q("Invalid callback token")}catch(l){return ot(l)}}function z(p){try{let l=p.params?.token;if(!l)return Q("taskProgress requires params.token");let _=(p.body??{}).update??{},G=re(l);return G?(S({type:"task-progress",taskName:G.taskName,update:_,timestamp:ct()}),T(),rt()):Q("Invalid callback token")}catch(l){return ot(l)}}function U(p){try{let l=p.params?.token,C=p.params?.ref;if(!l)return Q("sourceDataFetched requires params.token");if(!C)return Q("sourceDataFetched requires params.ref");let _=ze(l);if(!_)return Q("Invalid source token");let{cbk:G,cid:Y,b:ft,d:et,cs:at,rqt:dt}=_,mt=ce(e.blobStorage("sources"),it=>e.resolveBlob(it)),ht=e.genId();mt.ingestSourceDataStaged(Y,et,fe(C),ht);let Ct=re(G);if(!Ct)return Q("Invalid callback token embedded in source token");let H=ct();return S({type:"task-progress",taskName:Ct.taskName,update:{bindTo:ft,outputFile:et,fetchedAt:H,deliveryToken:ht,sourceChecksum:at,rqt:dt},timestamp:H}),T(),rt()}catch(l){return ot(l)}}function J(p){try{let l=p.params?.token,C=p.params?.reason??"unknown";if(!l)return Q("sourceDataFetchFailure requires params.token");let _=ze(l);if(!_)return Q("Invalid source token");let{cbk:G,b:Y,d:ft,cs:et}=_,at=re(G);return at?(S({type:"task-progress",taskName:at.taskName,update:{bindTo:Y,outputFile:ft,failure:!0,reason:C,sourceChecksum:et},timestamp:ct()}),T(),rt()):Q("Invalid callback token embedded in source token")}catch(l){return ot(l)}}function K(p){try{let l=i().readCardStoreRef();return l?rt({storeRef:l}):Q(`Board at ${t.value} has no card store configured`)}catch(l){return ot(l)}}function W(p){try{let l=i().readOutputsStoreRef();return l?rt({storeRef:l}):Q(`Board at ${t.value} has no outputs store configured`)}catch(l){return ot(l)}}function gt(p){try{let l=p.params?.key;if(!l)return Q("getConfig requires params.key");let C=i(),_;switch(l){case "task-executor":_=C.readTaskExecutorRef()??null;break;case "chat-handler-flow":_=C.readChatHandlerFlow()??null;break;case "card-store-ref":_=C.readCardStoreRef();break;case "outputs-store-ref":_=C.readOutputsStoreRef();break;default:return Q(`getConfig: unknown key "${l}"`)}return rt({value:_})}catch(l){return ot(l)}}function Bt(p){try{let l=p.params?.key;if(!l)return Q("getOutputsDataObject requires params.key");let C=I().readDataObject(l);return rt(C)}catch(l){return ot(l)}}function xt(p){try{return rt(I().readAllDataObjects())}catch(l){return ot(l)}}function Ht(p){try{let l=p.params?.key;if(!l)return Q("getOutputsComputedValues requires params.key");let C=I().readComputedValues(l);return rt(C)}catch(l){return ot(l)}}function D(p){try{return rt(I().readAllComputedValues())}catch(l){return ot(l)}}return {init:m,status:w,getCardStoreRef:K,getOutputsStoreRef:W,getConfig:gt,getOutputsDataObject:Bt,getAllOutputsDataObjects:xt,getOutputsComputedValues:Ht,getAllOutputsComputedValues:D,removeCard:P,retrigger:F,processAccumulatedEvents:L,upsertCard:E,taskFailed:$,taskProgress:z,sourceDataFetched:U,sourceDataFetchFailure:J}}function We(t){function e(o){return {status:"success",data:o}}function n(o){return {status:"fail",error:o}}function r(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let u=t.readCard(s);return u?e({cards:[u]}):n(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return r(s)}},set(o){try{let s=o.body;if(s==null)return n("set requires a body (card object or array of cards)");let u=Array.isArray(s)?s:[s];for(let i of u){if(typeof i.id!="string")return n("each card must have a string `id` field");t.writeCard(i.id,i);}return e({count:u.length})}catch(s){return r(s)}},del(o){try{let s=o.body?.ids??[],u=o.params?.id,i=u?[...s,u]:s;if(i.length===0)return n("del requires body.ids (string[]) or params.id");for(let f of i)t.removeCard(f);return e({count:i.length})}catch(s){return r(s)}},patch(o){try{let s=o.params?.id,u=o.params?.path;if(!s)return n("patch requires params.id");if(!u)return n("patch requires params.path");let i=o.body,f=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:o.body;return t.patchCard(s,u,f),e({count:1})}catch(s){return r(s)}}}}function Ze(){return new Date().toISOString()}function Qe(t){return new TextEncoder().encode(t).byteLength}function Gn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function Vn(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function Mn(t){let e=String(t||"").trim();if(!e)return "upload.bin";let n=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (n>=0?e.slice(n+1):e)||"upload.bin"}function Un(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Hn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Kn(t){let e=Mn(t),n=e.lastIndexOf(".");return n<=0||n===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,n),ext:e.slice(n)}}function Jn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function tn(t){function e(n){let r=t.stat?Gn(t.stat(n)):null;if(r)return r;if(!t.exists(n))return null;let o=t.read(n);return o===null?{key:n}:{key:n,size:Qe(o)}}return {exists(n){return t.exists(n)},putText(n,r,o="text/plain; charset=utf-8"){t.write(n,r);let s=e(n)??{key:n};return s.contentType=o,s.updatedAt=s.updatedAt??Ze(),s.size=s.size??Qe(r),s},putBytes(n,r,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(n,r);else {let u=JSON.stringify({__kind:"bytes-array",data:[...r]});t.write(n,u);}let s=e(n)??{key:n};return s.contentType=o,s.updatedAt=s.updatedAt??Ze(),s.size=s.size??r.byteLength,s},getText(n){let r=t.read(n);if(r===null){if(!t.readBytes)return null;let o=t.readBytes(n);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return r},getBytes(n){if(t.readBytes){let o=t.readBytes(n);if(o!==null)return o}let r=t.read(n);if(r===null)return null;try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(r)},head:e,list(n=""){return t.listKeys(n).map(r=>e(r)??{key:r}).sort((r,o)=>r.key.localeCompare(o.key))},remove(n){t.remove(n);}}}function en(t){function e(o,s){let u=0,i=[];Array.isArray(s)&&i.push(...s);for(let f of t.list(`${o}/`))i.push(Jn(f.key));for(let f of i){let R=Vn(f);Number.isFinite(R)&&R>u&&(u=R);}return u+1}function n(o,s,u){let i=Number(u?.maxLen||32),{stem:f,ext:R}=Kn(o),B=Hn(R),I=Un(f),q=`${String(s).padStart(3,"0")}-`,A=B,b=i-q.length-A.length;b<1&&(A="",b=i-q.length);let S=I.slice(0,Math.max(1,b)),k=`${q}${S}${A}`;return k.length>i&&(k=k.slice(0,i).replace(/\.$/,"")),k}function r(o,s,u){let i=e(o,u?.seedNames),f=n(s,i,{maxLen:u?.maxLen});for(;t.exists(`${o}/${f}`);)i+=1,f=n(s,i,{maxLen:u?.maxLen});return f}return {nextSerial:e,buildStoredName:n,allocateStoredName:r}}function nn(){function t(o,s){if(!Array.isArray(o))return [];let u=[];for(let i of o){if(!i||typeof i!="object")continue;let f=i;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,path:typeof f.path=="string"?f.path:null,uploaded_at:typeof f.uploaded_at=="string"?f.uploaded_at:s||null});}return u}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function n(o,s){let u=e(o);if(s.length===0)return o.files=u,u;let i=new Set(u.map(f=>f.stored_name));for(let f of s)i.has(f.stored_name)||(u.push(f),i.add(f.stored_name));return o.files=u,u}function r(o,s,u){let i=e(o);if(!Number.isInteger(s)||s<0||s>=i.length)return {ok:false,reason:"index_out_of_range"};let f=i[s];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:e,normalizeIncoming:t,merge:n,resolve:r}}function zn(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function rn(){let t=new Map,e=new Map;function n(r){return t.has(r)||t.set(r,[]),t.get(r)}return {append(r,o,s,u=[]){let i={id:zn(),role:o,text:s,files:u,updated_at:new Date().toISOString()};return n(r).push(i),i.id},readAll(r){return n(r).slice()},readAfter(r,o){let s=n(r);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let u=s.findIndex(f=>f.id===o),i=u===-1?s.slice():s.slice(u+1);return {records:i,cursor:i.length>0?i[i.length-1].id:o}},clear(r){t.set(r,[]);},setProcessing(r,o){o?e.set(`p:${r}`,true):e.delete(`p:${r}`);},isProcessing(r){return e.get(`p:${r}`)===true},getConfig(r){return e.get(`c:${r}`)??{}},setConfig(r,o){let s=e.get(`c:${r}`)??{};e.set(`c:${r}`,{...s,...o});}}}var on={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Yn=32;function Xn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function sn(t){if(!t||typeof t!="object")return false;let e=t.summary;return !e||typeof e!="object"?false:Number(e.card_count||0)>0}function an(t,e){if(!e||typeof e!="object")return;let n=e;if(n.kind==="notification-batch"&&Array.isArray(n.notifications)){for(let r of n.notifications)an(t,r);return}n.kind==="status"&&sn(n.status)&&(t.status=n.status),n.kind==="computed_values"&&n.cardId&&(t.computedValues[n.cardId]=n.values),n.kind==="data_object"&&n.key&&(t.dataObjects[n.key]=n.payload),n.kind==="card_refreshed"&&n.cardId&&(t.cards[n.cardId]=n.card);}function Yr(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),n={...on,...t.corsHeaders||{}},r=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,u=t.chatFlowRunner||null,i=t.chatStorage??rn(),f=t.notificationTransport||null,R=t.serverUrl||null,B=t.executionExtra||{},I=new Map,q=new Map,A=new Map,b=null;function S(a){let c=Xe(a.baseRef,a.boardAdapter),d=a.boardAdapter.kvStorageForRef(a.cardStoreRef),h=We(te({readIndex:()=>d.read("_index"),writeIndex:x=>d.write("_index",x),readCard:x=>d.read(x),writeCard:(x,j)=>(d.write(x,j),x),cardExists:x=>d.read(x)!==null,defaultCardKey:x=>x},o.warn)),y=a.artifactsAdapter||a.boardAdapter,O=null;return {label:a.label,board:c,cardStore:h,get filesArtifacts(){return O??=tn(y.blobStorage("files"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:Xn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let k=t.boards.map(S),T=new Map;function m(a){return T.get(a)??0}function w(a){let c=k[m(a)];return {files:c?c.filesArtifacts:null}}function P(a){let c=w(a);return c.files?en(c.files):null}function F(){return nn()}function L(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function E(a){if(!a||a.notificationTeardown||!f||!a.notifyRef)return;let c=await f.subscribe(a.notifyRef,d=>{an(a.notification,d);let g=d.kind==="notification-batch"?d.notifications:[d];N(g);});a.notificationTeardown=c;}async function $(a){if(!a||a.initialized)return;let c={cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef},d={};a.taskExecutorRef&&(d["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(d["chat-handler-flow"]=a.chatHandlerFlow),a.inferenceAdapterRef&&(d["inference-adapter-ref"]=a.inferenceAdapterRef);let g=a.board.init({params:c,body:d});if(g.status!=="success")throw Object.assign(new Error(g.error||`init failed for ${a.label}`),{statusCode:500});if(await E(a),!a.chatHandlerFlow&&a.chatHandlerRef&&s.describe)try{let h=await s.describe(a.chatHandlerRef);h&&h.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${h.kind}", expected "chat-handler" for ${a.label}`):h&&o.info(`[init] chat-handler validated: ${h.name} (protocol ${h.protocolVersion}) for ${a.label}`);}catch(h){o.warn(`[init] chat-handler describe failed for ${a.label}: ${h?.message||String(h)}`);}a.initialized=true;}function z(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let c=[],d=a.board.status({});d.status==="success"&&d.data!=null&&sn(d.data)&&c.push({kind:"status",status:d.data});let g=a.board.getAllOutputsDataObjects({});if(g.status==="success"&&g.data!=null)for(let[y,O]of Object.entries(g.data))y&&c.push({kind:"data_object",key:y,payload:O});let h=a.board.getAllOutputsComputedValues({});if(h.status==="success"&&h.data!=null)for(let[y,O]of Object.entries(h.data))y&&c.push({kind:"computed_values",cardId:y,values:O});c.length>0&&a.boardAdapter.publishBoardChangeNotifications(c);}function U(a,c){if(!a||a.cardsBootstrapped)return;let d=a.cardStore.get({}),g=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let h of g)typeof h.id=="string"&&(T.set(h.id,c),a.board.upsertCard({params:{cardId:h.id}}));a.cardsBootstrapped=true;}async function J(){for(let a of k)await $(a);}async function K(){await J();for(let a=0;a<k.length;a++)z(k[a]),U(k[a],a);}function W(a){return k[m(a)]??null}function gt(a){let c=W(a);if(!c)return null;let d=c.cardStore.get({params:{id:a}});if(d.status!=="success")return null;let g=Array.isArray(d.data?.cards)?d.data.cards:[];return g.length>0?g[0]:null}function Bt(){let a=d=>{if(!d||!d.cardStore)return [];let g=d.cardStore.get({});return g.status!=="success"||!Array.isArray(g.data?.cards)?[]:g.data.cards},c=[];for(let d of k)c.push(...a(d));return c}function xt(){let a=k.map(y=>{try{let x=y.boardAdapter.kvStorageForRef(y.outputsStoreRef).read("status");if(x!=null)return x}catch{}return y.notification.status}).filter(Boolean);if(a.length===0)return null;if(a.length===1)return a[0];let c=[],d=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],g={};for(let y of d)g[y]=0;for(let y of a){let O=y,x=Array.isArray(O.cards)?O.cards:[];c.push(...x);for(let j of d)g[j]+=Number(O?.summary?.[j]||0);}let h=a[0];return {...h,cards:c,summary:{...h.summary||{},card_count:c.length,...g}}}function Ht(){let a={},c=d=>{for(let[g,h]of Object.entries(d.notification.computedValues)){let y=d.notification.cards[g];a[g]={schema_version:"v1",card_id:g,card_data:y?.card_data??{},computed_values:h??{}};}};for(let d of k)c(d);return a}function D(){let a={};for(let c of k)Object.assign(a,c.notification.dataObjects||{});return a}function p(){let a=Bt(),c=Ht(),d=D(),g={};for(let y of a){if(!y?.id)continue;let O=y.id,x=c[O]||{},j={...x.card_data&&typeof x.card_data=="object"?x.card_data:y.card_data&&typeof y.card_data=="object"?y.card_data:{}};g[O]={schema_version:x.schema_version||"v1",card_id:x.card_id||O,card_data:j,computed_values:x.computed_values&&typeof x.computed_values=="object"?x.computed_values:{}};}let h={};for(let y of a){if(!y?.id)continue;let O=y.id;try{let x=at(O),j=i.isProcessing(O);(x.length>0||j)&&(h[O]={messages:x.map(Z=>({role:String(Z.role||"system"),text:String(Z.text||""),files:Array.isArray(Z.files)?Z.files:[]})),receiving:!1,processing:j});}catch{}}return {boardId:r,cardDefinitions:a,statusSnapshot:xt(),dataObjectsByToken:d,cardRuntimeById:g,cardChatsByCardId:h}}function l(a,c,d){let g=d?.syncBoard!==false,h=W(a);if(!h)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let y=gt(a);if(!y)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let O=c(y)||y,x=h.cardStore.set({body:O});if(x.status!=="success")throw Object.assign(new Error(x.error||`Failed to persist card: ${a}`),{statusCode:500});if(g){let j=h.board.upsertCard({params:{cardId:a,restart:true}});if(j.status!=="success")throw Object.assign(new Error(j.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function C(a,c){l(a,c,{syncBoard:true});}function _(a,c){l(a,c,{syncBoard:false});}function G(a,c){C(a,d=>{if(!c||typeof c!="object"||Object.keys(c).length===0)return d;function g(h,y,O){let x=String(y||"").split(".").filter(Boolean);if(!x.length)return;let j=h;for(let Z=0;Z<x.length-1;Z++){let st=x[Z];(!j[st]||typeof j[st]!="object")&&(j[st]={}),j=j[st];}j[x[x.length-1]]=O;}if(c.fieldValues!==void 0&&c.fieldValues!==null){let h=null,y=d.view;if(y&&Array.isArray(y.elements)){for(let O of y.elements)if(O?.data&&O.data.writeTo){h=O.data.writeTo;break}}h?g(d,h,c.fieldValues):typeof c.fieldValues=="object"&&!Array.isArray(c.fieldValues)&&(d.card_data={...d.card_data||{},...c.fieldValues});}else {if(Array.isArray(c._stagedFiles)&&c._stagedFiles.length>0)return d;for(let[h,y]of Object.entries(c))h!=="_stagedFiles"&&(y!==null&&typeof y=="object"&&!Array.isArray(y)&&d[h]!==null&&typeof d[h]=="object"&&!Array.isArray(d[h])?d[h]={...d[h],...y}:d[h]=y);}return d});}function Y(a){let c=String(a||"").trim();if(!c)return "upload.bin";let d=Math.max(c.lastIndexOf("/"),c.lastIndexOf("\\"));return (d>=0?c.slice(d+1):c)||"upload.bin"}function ft(a){i.clear(a),i.setProcessing(a,false);}function et(a,c,d,g){let h=typeof d=="string"?d.trim():"";return i.append(a,c||"system",h,g)}function at(a){return i.readAll(a)}function dt(a){let c=[];try{let d=gt(a);if(!d)return c;let g=F().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let h of g)c.push(h.stored_name);}catch{}return c}function mt(a,c,d,g){let h=L(a),y=w(a),O=Y(c),x=P(a),j=x?x.allocateStoredName(h,O,{seedNames:dt(a),maxLen:Yn}):`${String(Date.now())}-${O}`;return y.files&&y.files.putBytes(`${h}/${j}`,new Uint8Array(g),d||"application/octet-stream"),{name:O,stored_name:j,size:g.length,mime_type:d||"application/octet-stream",path:`${a}/files/${j}`,uploaded_at:new Date().toISOString()}}function ht(a,c){let d=W(a);if(!d)return;let g=d.board.getConfig({params:{key:"chat-handler-flow"}});if(g.status!=="success")return;let h=g.data?.value,y=d.chatHandlerRef;if(h==null&&(!y||typeof y!="object"))return;try{i.setProcessing(a,!0);}catch{}let O={boardId:r,cardId:String(a),lastChatEntryId:c,...B,...R?{serverUrl:R}:{}};if(!u&&h!=null){try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${a}" but no chatFlowRunner was provided`);return}if(h!=null){let j=u;if(!j)return;j.run(h,O,{boardId:r,cardId:String(a),label:d.label,logger:o,serverUrl:R,executionExtra:B}).then(Z=>{if(Z.dispatched)o.info(`[chat-handler-flow] invoked for card "${a}" (boardId: "${r}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${a}": ${Z.error||"unknown"}`);}},Z=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${a}": ${Z?.message||String(Z)}`);});return}let x=y;x&&s.invoke(x,O).then(j=>{if(j.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${r}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${a}": ${j.error||"unknown"}`);}},j=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${a}": ${j?.message||String(j)}`);});}function Ct(a,c,d){let g=c==="chat-send"?_:C,h;g(a,y=>{let O=new Date().toISOString(),x=y.card_data&&typeof y.card_data=="object"?y.card_data:{};if(y.card_data=x,c==="chat-send"){let j=d&&typeof d.text=="string"?d.text.trim():"",Z=[];if(Array.isArray(d?.files)){for(let st of d.files)if(st){if(typeof st=="string"){Z.push({name:st});continue}if(typeof st=="object"){let tt=st;typeof tt.name=="string"&&Z.push({name:tt.name,size:tt.size,mime_type:tt.mime_type,path:tt.path,uploaded_at:tt.uploaded_at,stored_name:tt.stored_name});}}}if(j||Z.length>0){let st=et(a,"user",j,Z);h={cardId:a,lastEntryId:st};for(let tt of Z){if(!tt||typeof tt!="object")continue;let pt=typeof tt.name=="string"?tt.name:"file",V=typeof tt.stored_name=="string"?tt.stored_name:null;V&&et(a,"system",`File ${pt} uploaded as ${V}.`,[]);}try{let tt=at(a);N([{kind:"card_chats",cardId:a,messages:tt.map(pt=>({role:String(pt.role||"system"),text:String(pt.text||""),files:Array.isArray(pt.files)?pt.files:[]})),receiving:!0,processing:i.isProcessing(a)}]);}catch{}}return y}if(c==="file-upload"){let j=F().normalizeIncoming(d?.files,O);return j.length>0&&F().merge(x,j),y}if(c==="action"){let j=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!j)return y;x.lastAction={buttonId:j,at:O},x.lastActionText=`${j} @ ${O}`;}return y}),h&&ht(h.cardId,h.lastEntryId);}function H(a,c,d){let g=JSON.stringify(d),h=typeof Buffer<"u"?Buffer.byteLength(g):new TextEncoder().encode(g).length;a.writeHead(c,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":h}),a.end(g);}async function it(a){let c=[];for await(let g of a)c.push(g);let d=typeof Buffer<"u"?Buffer.concat(c).toString("utf-8").trim():new TextDecoder().decode(It(c)).trim();return d?JSON.parse(d):{}}async function Pt(a){let c=[];for await(let d of a)c.push(d);return typeof Buffer<"u"?Buffer.concat(c):It(c)}function It(a){let c=a.reduce((h,y)=>h+y.length,0),d=new Uint8Array(c),g=0;for(let h of a)d.set(h,g),g+=h.length;return d}let qt=0;function Kt(a){let c=JSON.stringify(a);return qt++,`id: ${qt}
1
+ import {createRequire}from'module';import'ajv-formats';var Yt="b64:";function cn(t){let e=new TextEncoder().encode(t),n=globalThis.Buffer,r;if(n)r=n.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);r=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function dn(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),n=globalThis.Buffer;if(n)return n.from(e,"base64").toString("utf8");if(typeof atob=="function"){let r=atob(e),o=new Uint8Array(r.length);for(let s=0;s<r.length;s+=1)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function St(t){return `${Yt}${cn(JSON.stringify(t))}`}function fe(t){if(!t.startsWith(Yt))throw new Error(`Invalid ref format (expected ${Yt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(dn(t.slice(Yt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!e||typeof e!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let n=e;if(typeof n.kind!="string"||typeof n.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:n.kind,value:n.value}}async function pe(t,e,n){let r=t.tryAcquire();if(!r)return false;try{await e();}finally{r();}return n?.(),true}var Rt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ct(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function wt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ge(t){return t.tasks??{}}function ae(t){return t?t.status===Rt.FAILED||t.status===Rt.INACTIVATED:false}function me(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function he(t){return t.maxExecutions}function ye(t,e){let n=new Set;for(let[r,o]of Object.entries(e))if(o.status===Rt.COMPLETED){let s=t.tasks[r];s&&ct(s).forEach(i=>n.add(i));}return Array.from(n)}function ke(t,e){let n={};return t.forEach(r=>{let o=e[r];if(!o)return;ct(o).forEach(u=>{n[u]||(n[u]=[]),n[u].push(r);});}),n}function Se(t,e,n){let r=t.tasks[e]??Xt(),o={};if(n){let u=n.tasks[e],i=wt(u);for(let f of i)for(let[R,B]of Object.entries(n.tasks))if(ct(B).includes(f)){let I=t.tasks[R];I?.lastDataHash&&(o[f]=I.lastDataHash);break}}let s={...r,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Ce(t,e,n,r,o,s){let u=t.tasks[n]??Xt(),i=e.tasks[n];if(!i)throw new Error(`Task "${n}" not found in graph`);let f;r&&i.on&&i.on[r]?f=i.on[r]:f=ct(i);let R=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let q=i.requires??[];for(let A of q)for(let[b,S]of Object.entries(e.tasks))if(ct(S).includes(A)){let k=t.tasks[b];k?.lastDataHash&&(R[A]=k.lastDataHash);break}}let B={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:R,error:void 0},I=[...new Set([...t.availableOutputs,...f])];return {...t,tasks:{...t.tasks,[n]:B},availableOutputs:I,lastUpdated:new Date().toISOString()}}function be(t,e,n,r){let o=t.tasks[n]??Xt(),s=e.tasks[n];if(s?.retry){let f=o.retryCount+1;if(f<=s.retry.max_attempts){let R={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:r};return {...t,tasks:{...t.tasks,[n]:R},lastUpdated:new Date().toISOString()}}}let u={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:r,executionCount:o.executionCount+1},i=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(i=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&u.executionCount>=s.circuit_breaker.max_executions){let f=s.circuit_breaker.on_break;i=[...new Set([...i,...f])];}return {...t,tasks:{...t.tasks,[n]:u},availableOutputs:i,lastUpdated:new Date().toISOString()}}function Re(t,e,n,r){let o=t.tasks[e]??Xt(),s={...o,progress:typeof r=="number"?r:o.progress,messages:[...o.messages??[],...n?[{message:n,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function we(t,e){let n=t.tasks[e];if(!n)return t;let r={...n,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:r},lastUpdated:new Date().toISOString()}}function Xt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Wt(t,e){let n=`live-${Date.now()}`,r={};for(let s of Object.keys(t.tasks))r[s]=xe();let o={status:"running",tasks:r,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:n,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function ln(t,e){let{config:n,state:r}=t;if("executionId"in e&&e.executionId&&e.executionId!==r.executionId)return t;switch(e.type){case "task-started":return {config:n,state:Se(r,e.taskName,n)};case "task-completed":return {config:n,state:Ce(r,n,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:n,state:be(r,n,e.taskName,e.error)};case "task-progress":return {config:n,state:Re(r,e.taskName,e.message,e.progress)};case "task-restart":return {config:n,state:we(r,e.taskName)};case "inject-tokens":return {config:n,state:{...r,availableOutputs:[...new Set([...r.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:n,state:kn(r,e.action)};case "task-upsert":return fn(t,e.taskName,e.taskConfig);case "task-removal":return pn(t,e.taskName);case "node-requires-add":return gn(t,e.nodeName,e.tokens);case "node-requires-remove":return mn(t,e.nodeName,e.tokens);case "node-provides-add":return hn(t,e.nodeName,e.tokens);case "node-provides-remove":return yn(t,e.nodeName,e.tokens);default:return t}}function ve(t,e){return e.reduce((n,r)=>ln(n,r),t)}function fn(t,e,n){let r=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:n}},state:{...t.state,tasks:{...t.state.tasks,[e]:r?t.state.tasks[e]:xe()},lastUpdated:new Date().toISOString()}}}function pn(t,e){if(!t.config.tasks[e])return t;let{[e]:n,...r}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:r},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function gn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=wt(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:[...o,...s]}}},state:t.state}}function mn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=wt(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:s}}},state:t.state}}function hn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ct(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:[...o,...s]}}},state:t.state}}function yn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ct(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:s}}},state:t.state}}function Gt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function Zt(t){if(!t||typeof t!="object")throw new Error("Invalid snapshot: expected an object");let e=t;if(!e.config||typeof e.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!e.state||typeof e.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let n=e.config,r=e.state;if(!n.settings||typeof n.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(r.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:n,state:r}}function xe(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function kn(t,e){let n=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:n};case "pause":return {...t,status:"paused",lastUpdated:n};case "resume":return {...t,status:"running",lastUpdated:n};default:return t}}function Vt(t){let{config:e,state:n}=t,r=ge(e);if(Object.keys(r).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=Sn(r),u=ye(e,n.tasks),i=new Set([...u,...n.availableOutputs]),f=[],R=[],B=[],I=[];for(let[A,b]of Object.entries(r)){let S=n.tasks[A],k=me(b,e.settings),T=k!=="once";if(S?.status===Rt.RUNNING||ae(S))continue;let m=he(b);if(m!==void 0&&S&&S.executionCount>=m||b.circuit_breaker&&S&&S.executionCount>=b.circuit_breaker.max_executions||!T&&S?.status===Rt.COMPLETED)continue;if(T&&S?.status===Rt.COMPLETED){let E=wt(b),F=false;switch(k){case "data-changed":{E.length>0&&E.some(U=>{for(let[J,K]of Object.entries(r))if(ct(K).includes(U)){let W=n.tasks[J];if(!W)continue;let gt=S.lastConsumedHashes?.[U];return W.lastDataHash==null?W.executionCount>S.lastEpoch:W.lastDataHash!==gt}return false})||(F=true);break}case "epoch-changed":{E.length>0&&E.some(U=>{for(let[J,K]of Object.entries(r))if(ct(K).includes(U)){let W=n.tasks[J];if(W&&W.executionCount>S.lastEpoch)return true}return false})||(F=true);break}case "time-based":{let z=b.refreshInterval??0;if(z<=0){F=true;break}let U=S.completedAt;if(!U){F=true;break}(Date.now()-Date.parse(U))/1e3<z&&(F=true);break}case "manual":F=true;break}if(F)continue}let w=wt(b);if(w.length===0){f.push(A);continue}let P=[],$=[],L=[];for(let E of w){if(i.has(E))continue;let F=s[E]||[];F.length===0?P.push(E):F.every(U=>ae(n.tasks[U]))?L.push({token:E,failedProducer:F[0]}):$.push(E);}P.length>0?B.push({taskName:A,missingTokens:P}):L.length>0?I.push({taskName:A,failedTokens:L.map(E=>E.token),failedProducers:[...new Set(L.map(E=>E.failedProducer))]}):$.length>0?R.push({taskName:A,waitingOn:$}):f.push(A);}let q={};if(f.length>1){let A=ke(f,r);for(let[b,S]of Object.entries(A))S.length>1&&(q[b]=S);}return {eligible:f,pending:R,unresolved:B,blocked:I,conflicts:q}}function Sn(t){let e={};for(let[n,r]of Object.entries(t)){for(let o of ct(r))e[o]||(e[o]=[]),e[o].push(n);if(r.on)for(let o of Object.values(r.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(n)||e[s].push(n);if(r.on_failure)for(let o of r.on_failure)e[o]||(e[o]=[]),e[o].includes(n)||e[o].push(n);}return e}var Mt=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function ie(t){let e=ue(t);return Cn(e)}function ue(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(ue).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+ue(e[r])).join(",")+"}"}function Cn(t){let e=0xcbf29ce484222325n,n=0x100000001b3n,r=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*n&r;return e.toString(16).padStart(16,"0")}function bn(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),n="";for(let r of e)n+=String.fromCharCode(r);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Rn(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=new Uint8Array(r.length);for(let s=0;s<r.length;s++)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Ae(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return bn(e)}function wn(t){try{let e=JSON.parse(Rn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ee(t,e,n){let{handlers:r,onDrain:o}=e,s=new Mt,u="state"in t&&"config"in t?t:Wt(t),i=false,f=new Set,R=new Map(Object.entries(r)),B=new Mt,I=false,q=false;function A(){if(!i){if(I){q=true;return}I=true;try{do q=!1,b();while(q)}finally{I=false;}}}function b(){let m=B.drain(),w=s.drain(),P=[...m,...w];P.length>0&&(u=ve(u,P));let $=Vt(u);P.length>0&&o?.(P,u,$);for(let L of $.eligible)T(L);for(let L of P)if(L.type==="task-progress"){let{taskName:E,update:F}=L;if(!u.config.tasks[E])continue;let U=u.state.tasks[E];if(!U||U.status!=="running")continue;let J=Ae(E),K=k(E,J,F).catch(W=>{i||(B.append({type:"task-failed",taskName:E,error:W.message??String(W),timestamp:new Date().toISOString()}),A());}).finally(()=>{f.delete(K);});f.add(K);}}function S(m){let P=u.config.tasks[m].requires??[],$=new Map;for(let[E,F]of Object.entries(u.config.tasks))for(let z of F.provides??[])$.set(z,E);let L={};for(let E of P){let F=$.get(E);F?L[E]=u.state.tasks[F]?.data:L[E]=void 0;}return L}async function k(m,w,P){let $=u.config.tasks[m],L=$.taskHandlers??[],E=S(m);for(let F of L){let z=R.get(F);if(!z)throw new Error(`Handler '${F}' not found in registry (task '${m}')`);let U={nodeId:m,state:E,taskState:u.state.tasks[m],config:$,callbackToken:w,update:P};if(await z(U)==="task-initiate-failure")throw new Error(`Handler '${F}' returned task-initiate-failure (task '${m}')`)}}function T(m){let P=u.config.tasks[m]?.taskHandlers;if(!P||P.length===0)return;B.append({type:"task-started",taskName:m,timestamp:new Date().toISOString()}),A();let $=Ae(m),L=k(m,$).catch(E=>{i||(B.append({type:"task-failed",taskName:m,error:E.message??String(E),timestamp:new Date().toISOString()}),A());}).finally(()=>{f.delete(L);});f.add(L);}return {push(m){i||(m.type==="task-completed"&&m.data&&!m.dataHash&&(m={...m,dataHash:ie(m.data)}),s.append(m),A());},pushAll(m){if(!i){for(let w of m)w.type==="task-completed"&&w.data&&!w.dataHash?s.append({...w,dataHash:ie(w.data)}):s.append(w);A();}},resolveCallback(m,w,P){if(i)return;let $=wn(m);if(!$)return;let{taskName:L}=$;if(u.config.tasks[L]){if(P&&P.length>0)s.append({type:"task-failed",taskName:L,error:P.join("; "),timestamp:new Date().toISOString()});else {let E=w&&Object.keys(w).length>0?ie(w):void 0;s.append({type:"task-completed",taskName:L,data:w,dataHash:E,timestamp:new Date().toISOString()});}A();}},addNode(m,w){i||(s.append({type:"task-upsert",taskName:m,taskConfig:w,timestamp:new Date().toISOString()}),A());},removeNode(m){i||(s.append({type:"task-removal",taskName:m,timestamp:new Date().toISOString()}),A());},addRequires(m,w){i||(s.append({type:"node-requires-add",nodeName:m,tokens:w,timestamp:new Date().toISOString()}),A());},removeRequires(m,w){i||(s.append({type:"node-requires-remove",nodeName:m,tokens:w,timestamp:new Date().toISOString()}),A());},addProvides(m,w){i||(s.append({type:"node-provides-add",nodeName:m,tokens:w,timestamp:new Date().toISOString()}),A());},removeProvides(m,w){i||(s.append({type:"node-provides-remove",nodeName:m,tokens:w,timestamp:new Date().toISOString()}),A());},registerHandler(m,w){R.set(m,w);},unregisterHandler(m){R.delete(m);},retrigger(m){i||u.config.tasks[m]&&(s.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()}),A());},retriggerAll(m){if(!i){for(let w of m)u.config.tasks[w]&&s.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()});A();}},snapshot(){return Gt(u)},getState(){return u},getSchedule(){return Vt(u)},async waitForHandlers(){f.size>0&&await Promise.allSettled([...f]);},async dispose(m){m?.wait&&f.size>0&&await Promise.allSettled([...f]),i=true;}}}var xn=createRequire(import.meta.url);xn("./jsonata-sync.cjs");var En=createRequire(import.meta.url),Qt=En("./jsonata-sync.cjs"),Ie=Qt;function _e(t,e){if(!e||!t)return;let n=e.split("."),r=t;for(let o=0;o<n.length;o++){if(r==null)return;r=r[n[o]];}return r}function Oe(t,e,n){let r=e.split("."),o=t;for(let s=0;s<r.length-1;s++)(o[r[s]]==null||typeof o[r[s]]!="object")&&(o[r[s]]={}),o=o[r[s]];o[r[r.length-1]]=n;}async function _n(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await Qt(o.expr).evaluate(r);Oe(t.computed_values,o.bindTo,s),r.computed_values=t.computed_values;}catch{}return t}function Tn(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let u=Ie(s.expr).evaluate(r);Oe(t.computed_values,s.bindTo,u),r.computed_values=t.computed_values;}catch(u){let i=u instanceof Error?u.message:String(u);o.push({bindTo:s.bindTo,error:i});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function In(t,e,n){let r={...n??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return Qt(t).evaluate(r)}function On(t,e){return e.startsWith("fetched_sources.")?_e(t._sourcesData??{},e.slice(16)):_e(t,e)}var Te=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),jn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Nn(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let n=t;(typeof n.id!="string"||!n.id)&&e.push("id: required, must be a non-empty string");for(let r of Object.keys(n))jn.has(r)||e.push(`Unknown top-level key: "${r}"`);if((n.card_data==null||typeof n.card_data!="object"||Array.isArray(n.card_data))&&e.push("card_data: required, must be an object"),n.meta!=null)if(typeof n.meta!="object"||Array.isArray(n.meta))e.push("meta: must be an object");else {let r=n.meta;r.title!=null&&typeof r.title!="string"&&e.push("meta.title: must be a string"),r.tags!=null&&!Array.isArray(r.tags)&&e.push("meta.tags: must be an array");}if(n.requires!=null&&!Array.isArray(n.requires)&&e.push("requires: must be an array of strings"),n.provides!=null&&(Array.isArray(n.provides)?n.provides.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=r;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),n.compute!=null&&(Array.isArray(n.compute)?n.compute.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`compute[${o}]: must be a compute step object`);else {let s=r;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),n.source_defs!=null)if(!Array.isArray(n.source_defs))e.push("source_defs: must be an array");else {let r=new Set,o=new Set;n.source_defs.forEach((s,u)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${u}]: must be an object`);else {let i=s;typeof i.bindTo!="string"||!i.bindTo?e.push(`source_defs[${u}]: missing required "bindTo" property`):(r.has(i.bindTo)&&e.push(`source_defs[${u}]: bindTo "${i.bindTo}" is not unique across source_defs`),r.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?e.push(`source_defs[${u}]: missing required "outputFile" property`):(o.has(i.outputFile)&&e.push(`source_defs[${u}]: outputFile "${i.outputFile}" is not unique across source_defs`),o.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${u}]: optionalForCompletionGating must be a boolean`);}});}if(n.view!=null)if(typeof n.view!="object"||Array.isArray(n.view))e.push("view: must be an object");else {let r=n.view;!Array.isArray(r.elements)||r.elements.length===0?e.push("view.elements: required, must be a non-empty array"):r.elements.forEach((o,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):Te.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...Te].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),r.layout!=null&&(typeof r.layout!="object"||Array.isArray(r.layout))&&e.push("view.layout: must be an object"),r.features!=null&&(typeof r.features!="object"||Array.isArray(r.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function $n(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=await Qt(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function Fn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return t.map(r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=Ie(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}})}var Ut={run:_n,runSync:Tn,eval:In,resolve:On,validate:Nn,enrichSources:$n,enrichSourcesSync:Fn};function je(t){return JSON.stringify(t)}function Ne(t){let e;try{e=JSON.parse(t);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${t}`)}if(typeof e!="object"||e===null||typeof e.howToRun!="string"||typeof e.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${t}`);return e}function te(t,e){function n(){return t.readIndex()??{}}function r(o,s,u){let i=String(s||"").split(".").filter(Boolean);if(i.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let f={...o},R=f;for(let B=0;B<i.length-1;B++){let I=i[B],q=R[I],A=q&&typeof q=="object"&&!Array.isArray(q)?{...q}:{};R[I]=A,R=A;}return R[i[i.length-1]]=u,f}return {readCard(o){let s=n()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return n()[o]?.key??null},readAllCards(){let o=[];for(let[s,u]of Object.entries(n())){if(!t.cardExists(u.key))continue;let i=t.readCard(u.key);i?o.push(i):e?.(`[card-store] could not read card "${s}" at key "${u.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,u]of Object.entries(n()))o[s]=u.checksum;return o},changedSince(o){let s=n(),u=[];for(let[i,f]of Object.entries(s))o[i]!==f.checksum&&u.push(i);for(let i of Object.keys(o))s[i]||u.push(i);return u},validateUpsert(o,s){let u=n(),i=u[o],f=Object.entries(u).find(([,R])=>R.key===s);return i&&i.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${i.key}", cannot remap to "${s}"`}:f&&f[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${f[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,u){let i=n(),f=u??i[o]?.key??t.defaultCardKey(o),R=t.writeCard(f,s);i[o]={key:f,checksum:R,updatedAt:new Date().toISOString()},t.writeIndex(i);},patchCard(o,s,u){let i=n(),f=i[o];if(!f||!t.cardExists(f.key))throw new Error(`card "${o}" not found`);let R=t.readCard(f.key);if(!R||typeof R!="object"||Array.isArray(R))throw new Error(`card "${o}" is not patchable`);let B=r(R,s,u),I=t.writeCard(f.key,B);i[o]={key:f.key,checksum:I,updatedAt:new Date().toISOString()},t.writeIndex(i);},removeCard(o){let s=n();s[o]&&(delete s[o],t.writeIndex(s));},readIndex(){return n()}}}function ce(t,e){return {readSourceData(n,r){let o=t.read(`${n}/${r}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(n,r,o,s){let u=e(o);t.write(`${n}/.staged/${s}/${r}`,u);},commitSourceData(n,r,o){let s=`${n}/.staged/${o}/${r}`,u=t.read(s);return u==null?false:(t.write(`${n}/${r}`,u),t.remove(s),true)},hasSource(n,r){return t.exists(`${n}/${r}`)}}}function Pe(t){function e(n){let r=t.readAllEntries();if(!n)return r;let o=r.findIndex(s=>s.id===n);return o===-1?r:r.slice(o+1)}return {readEntriesAfterCursor(n){let r=e(n);return r.length===0?{events:[],newCursor:n}:{events:r.map(o=>o.event),newCursor:r[r.length-1].id}},pendingCount(n){return e(n).length},appendEvent(n){t.appendEntry({id:t.generateId(),event:n});}}}function qe(t,e){return {appendEntries(n,r){if(!n||r.length===0)return;let o=t.read(n)??[];t.write(n,[...o,...r]);},dispatchEntriesForJournalId(n,r){if(!n)return;let o=t.read(n);if(!(!o||o.length===0)){for(let s of o)try{r(s);}catch(u){let i=u instanceof Error?u.message:String(u);try{e(s,i);}catch{}}t.delete(n);}}}}var ee="v1",Tt="board/graph",Le="board/lastJournalProcessedId";function $e(t){return `cards/${t}/runtime`}function Ge(t){return {readRuntime(e){return t.read($e(e))??{_sources:{}}},writeRuntime(e,n){t.write($e(e),n);}}}function Dn(t,e){let n={...t};for(let r of e.deleteKeys)delete n[r];return {...n,...e.shallowMerge}}function Ve(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,n){if(n.schemaVersion!==ee)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);let r=t.readValues(e);if(r.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:r.version};let o=Dn(r.values,n);return {ok:true,newVersion:t.writeValues(e,o,n.deleteKeys)}}}}function Me(t){function e(n){let r=t.read(n);return r==null?null:typeof r=="string"?r:JSON.stringify(r)}return {readTaskExecutorRef(){let n=e("task-executor");if(n?.trim())return Ne(n.trim())},writeTaskExecutorRef(n){t.write("task-executor",je(n));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(n){t.write("chat-handler-flow",n);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(n){t.write("card-store-ref",n);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(n){t.write("outputs-store-ref",n);}}}function Ue(t){return {writeComputedValues(e,n){t.write(`cards/${e}/computed_values`,n);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let n of t.listKeys("cards/")){let r=n.match(/^cards\/([^/]+)\/computed_values$/);r&&(e[r[1]]=t.read(n));}return e},writeDataObjects(e){for(let[n,r]of Object.entries(e))n&&t.write(`data-objects/${n}`,r);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let n of t.listKeys("data-objects/"))e[n.slice(13)]=t.read(n);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function Fe(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Bn(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function De(t,e){return t?.lastRequestedToken?Bn(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function Pn(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function Be(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function ne(t,e){let n=e.state.tasks,r=e.config.tasks,o=Object.keys(n),s=Vt(e),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let b of s.pending)i.set(b.taskName,b.waitingOn);for(let b of s.unresolved)i.set(b.taskName,b.missingTokens);for(let b of s.blocked)i.set(b.taskName,b.failedTokens);let f=new Map;for(let[b,S]of Object.entries(r))for(let k of S.requires??[]){let T=f.get(k)??[];T.push(b),f.set(k,T);}let R=o.sort().map(b=>{let S=n[b],k=r[b]??{requires:[],provides:[]};S.status==="completed"?u.completed+=1:S.status==="failed"?u.failed+=1:S.status==="in-progress"&&(u.in_progress+=1);let T=k.requires??[],m=k.provides??[],w=Object.keys(S.data??{}).sort(),P=T.filter(U=>e.state.availableOutputs.includes(U)),$=T.filter(U=>!e.state.availableOutputs.includes(U)),L=i.get(b)??$,E=new Set;for(let U of m)for(let J of f.get(U)??[])J!==b&&E.add(J);let F=S.failedAt,z=S.error?{message:S.error,code:"TASK_FAILED",at:F,source:"task-runtime"}:void 0;return {name:b,status:S.status,error:z,requires:T,requires_satisfied:P,requires_missing:$,provides_declared:m,provides_runtime:w,blocked_by:L,unblocks:Array.from(E).sort(),runtime:{attempt_count:S.executionCount??0,restart_count:S.retryCount??0,in_progress_since:S.status==="in-progress"?S.startedAt??null:null,last_transition_at:S.lastUpdated??null,last_completed_at:S.completedAt??null,last_restarted_at:S.startedAt??null,status_age_ms:S.lastUpdated?0:null}}});u.pending=s.pending.length,u.blocked=s.blocked.length,u.unresolved=s.unresolved.length;let B=R.map(b=>({name:b.name,fanOut:b.unblocks.length})).sort((b,S)=>S.fanOut-b.fanOut||b.name.localeCompare(S.name)),I=B.length>0?B[0]:{name:null,fanOut:0},q=new Set;for(let b of Object.values(r))for(let S of b.requires??[])q.add(S);let A=0;for(let[b,S]of Object.entries(r)){let k=(S.requires??[]).length===0,m=(S.provides??[]).some(w=>(f.get(w)??[]).some(P=>P!==b));k&&!m&&(A+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:u.completed,eligible:s.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:A,topology:{edge_count:Array.from(q).length,max_fan_out_card:I.name,max_fan_out:I.fanOut}},cards:R}}function qn(){return new Date().toISOString()}function He(t,e,n,r,o,s,u){return async i=>{let f=[],R=n.cardStore.readCard(i.nodeId);if(!R)return "task-initiate-failure";let B=R.id,I=R.card_data??{},q=R.source_defs??[],A=q.filter(D=>D.optionalForCompletionGating!==true),b=n.cardRuntimeStore.readRuntime(B),S=false,k=()=>{S&&(n.cardRuntimeStore.writeRuntime(B,b),S=false);},T=D=>Fe(b._sources[D]),m=(D,p)=>{b._sources[D]=Fe(p),S=true;},w=i.taskState?.executionCount??0;if(b._lastExecutionCount!==w&&(b._sources={},b._lastExecutionCount=w,S=true),i.update){let D=i.update,p=D.outputFile;if(p){let l=T(p);if(D.failure){let C=D.rqt??l.lastRequestedToken??l.queueRequestedToken;C&&m(p,Be(l,C));}else {let C=D.rqt;if(!l.lastCompletedToken||C>l.lastCompletedToken){let _=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,G=false;_&&(G=n.fetchedSourcesStore.commitSourceData(B,p,_)),G?m(p,Pn(l,C)):m(p,Be(l,C));}}k();}}let $={};for(let D of q)if(D.outputFile){let p=n.fetchedSourcesStore.readSourceData(B,D.outputFile);p!==null&&($[D.bindTo]=p);}let L={};for(let[D,p]of Object.entries(i.state??{}))if(p!==null&&typeof p=="object"&&!Array.isArray(p)){let l=p[D];L[D]=l!==void 0?l:p;}else L[D]=p;let E={id:B,card_data:{...I},requires:L,source_defs:q,compute:R.compute};E._sourcesData=$,R.compute&&Ut.runSync(E,{sourcesData:$}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))(B,E.computed_values??{});let F={...R},z=Ut.enrichSourcesSync(Array.isArray(R.source_defs)?R.source_defs:void 0,{card_data:R.card_data,requires:L}),U=t.value;F.source_defs=Array.isArray(z)?z.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:U})):z;let J=qn(),K=i.update?void 0:J,W=A.filter(D=>{let p=D.outputFile;if(typeof p!="string"||!p)return true;let l=T(p);K&&(l={...l,queueRequestedToken:K},m(p,l));let C=l.queueRequestedToken??l.lastRequestedToken??J,_=De(l,C);return _==="in-flight"?false:_==="dispatch"});if(k(),W.length>0){let D=false,p=J;for(let l of W){let C=l.outputFile;if(typeof C!="string"||!C)continue;let _=T(C),G=_.queueRequestedToken??J;m(C,{..._,lastRequestedToken:G}),p=G,D=true;}return D&&k(),D&&(f.push({taskKind:"source-fetch",payload:{boardRef:St(t),enrichedCard:F,callbackToken:i.callbackToken,rqt:p}}),n.executionRequestStore.appendEntries(e,f)),"task-initiated"}if(A.some(D=>{let p=D.outputFile;if(typeof p!="string"||!p)return false;let l=T(p),C=l.queueRequestedToken??l.lastRequestedToken??J;return De(l,C)==="in-flight"}))return "task-initiated";let Bt=R.provides??[],xt={};for(let{bindTo:D,ref:p}of Bt)xt[D]=Ut.resolve(E,p);return (u??n.outputStore.writeDataObjects.bind(n.outputStore))(xt),q.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let p=T(D.outputFile);return !p.lastRequestedToken||!p.lastCompletedToken?true:p.lastCompletedToken<=p.lastRequestedToken}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:St(t),enrichedCard:F,callbackToken:i.callbackToken,rqt:J}}),r(i.nodeId,xt),f.length>0&&n.executionRequestStore.appendEntries(e,f),"task-initiated"}}var de={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Ke(t){return {[Tt]:t.graph,[Le]:t.lastDrainedJournalId}}function Je(t){let e=t[Tt],n=t[Le];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Tt}`);return {graph:e,lastDrainedJournalId:typeof n=="string"?n:""}}function ze(t){let e=t.requires,n=t.provides?.map(r=>r.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:n,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function rt(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function Q(t){return {status:"fail",error:t}}function ot(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Ln(t){let e=new TextEncoder().encode(t),n=Array.from(e,r=>String.fromCharCode(r)).join("");return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Xe(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=Uint8Array.from(r,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function re(t){try{let e=JSON.parse(Xe(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Gn(t){return Ln(JSON.stringify(t))}function Ye(t){try{let e=JSON.parse(Xe(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function dt(){return new Date().toISOString()}function We(t,e){let n=e.onWarn??(()=>{}),r=St(t);function o(p){if(p.length!==0)try{let l=e.publishBoardChangeNotifications?.(p);l&&typeof l.catch=="function"&&l.catch(C=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${C instanceof Error?C.message:String(C)}`));}catch(l){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${l instanceof Error?l.message:String(l)}`);}}function s(){let p=i().readCardStoreRef();if(!p)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let l=e.kvStorageForRef(p);return {readIndex(){return l.read("_index")},writeIndex(C){l.write("_index",C);},readCard(C){return l.read(C)},writeCard(C,_){return l.write(C,_),e.hashFn(_)},cardExists(C){return l.read(C)!==null},defaultCardKey(C){return C}}}let u={readValues(p){let l=e.kvStorage("state-snapshot"),C=l.listKeys().sort();if(C.length===0)return {version:null,values:{}};let _={};for(let G of C)_[G]=l.read(G);return {version:e.hashFn(_),values:_}},writeValues(p,l,C){let _=e.kvStorage("state-snapshot");for(let G of C)_.delete(G);for(let[G,Y]of Object.entries(l))_.write(G,Y);return e.hashFn(l)}},i=()=>Me(e.kvStorage("config")),f=()=>Ve(u),R=()=>Pe(e.journalAdapter()),B=()=>te(s(),n),I=()=>{let p=i().readOutputsStoreRef();if(!p)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Ue(e.kvStorageForRef(p))};function q(){return !!f().readSnapshot(t.value).values[Tt]}function A(){let p=f().readSnapshot(t.value);if(!p.values[Tt])throw new Error(`Board not initialized at ${t.value}`);return Je(p.values)}function b(p,l){let C=f().commitSnapshot(t.value,{schemaVersion:ee,expectedVersion:l,commitId:e.genId(),committedAt:dt(),deleteKeys:[],shallowMerge:Ke(p)});if(!C.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${l??"null"} current=${C.currentVersion??"null"}`)}function S(p){R().appendEvent(p);}async function k(){let p=(v,N)=>{let X=v.payload,a=(X?.enrichedCard??{}).id??X?.cardId??"unknown";S({type:"task-failed",taskName:a,error:N,timestamp:dt()});},l=qe(e.kvStorage("execution-requests"),p),C=Ge(e.kvStorage("card-runtime")),_=ce(e.blobStorage("sources"),v=>e.resolveBlob(v)),G=new Map,Y={readRuntime(v){return G.get(v)??C.readRuntime(v)},writeRuntime(v,N){G.set(v,N);}},ft=[],et=new Map,it={readSourceData(v,N){let X=`${v}/${N}`;return et.has(X)?et.get(X):_.readSourceData(v,N)},ingestSourceDataStaged(v,N,X,bt){_.ingestSourceDataStaged(v,N,X,bt);},commitSourceData(v,N,X){let bt=`${v}/.staged/${X}/${N}`,c=e.blobStorage("sources").read(bt);if(c==null)return false;let d=`${v}/${N}`,g=c.trim();try{et.set(d,JSON.parse(g));}catch{et.set(d,g);}return ft.push({cardId:v,outputFile:N,deliveryToken:X}),true},hasSource(v,N){let X=`${v}/${N}`;return et.has(X)?true:_.hasSource(v,N)}},st={cardStore:B(),cardRuntimeStore:Y,fetchedSourcesStore:it,outputStore:I(),executionRequestStore:l},mt=A(),ht=Zt(mt.graph),{events:Ct,newCursor:H}=R().readEntriesAfterCursor(mt.lastDrainedJournalId),ut=[],Pt=[],It=[],qt=new Map,Kt=(v,N)=>{ut.push({type:"task-completed",taskName:v,data:N,timestamp:dt()});},Ot=(v,N)=>S({type:"task-failed",taskName:v,error:N,timestamp:dt()}),At=Ee(ht,{handlers:{"card-handler":He(t,H,st,Kt,Ot,(v,N)=>{Pt.push({cardId:v,values:N});},v=>{It.push(v);})}});for(ut=Ct;ut.length>0;){let v=ut;ut=[];for(let N of v)if(N.type==="task-restart"){let X=st.cardStore.readCard(N.taskName);X&&qt.set(N.taskName,X);}At.pushAll(v),await At.waitForHandlers();}let jt=At.getState();await At.dispose({wait:true});let Lt=f().readSnapshot(t.value).version;b({lastDrainedJournalId:H,graph:Gt(jt)},Lt);for(let{cardId:v,values:N}of Pt)st.outputStore.writeComputedValues(v,N);for(let v of It)st.outputStore.writeDataObjects(v);for(let[v,N]of G)C.writeRuntime(v,N);for(let{cardId:v,outputFile:N,deliveryToken:X}of ft)_.commitSourceData(v,N,X);let Nt;try{Nt=ne(r,jt),st.outputStore.writeStatusSnapshot(Nt);}catch(v){n(`[board-live-cards-public] status publish failed: ${v instanceof Error?v.message:String(v)}`);}let Et=[];for(let{cardId:v,values:N}of Pt)Et.push({kind:"computed_values",cardId:v,values:N});for(let v of It)for(let[N,X]of Object.entries(v))N&&Et.push({kind:"data_object",key:N,payload:X});for(let[v,N]of qt)Et.push({kind:"card_refreshed",cardId:v,card:N});Nt!==void 0&&Et.push({kind:"status",status:Nt}),o(Et);let oe=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:St({kind:"built-in",value:"source-cli-task-executor"})};l.dispatchEntriesForJournalId(H,v=>{if(v.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${v.taskKind}" \u2014 skipping`);return}let N=v.payload,X=N.enrichedCard?.id??"unknown",bt=N.enrichedCard?.source_defs??[];for(let a of bt){if(!a.outputFile){n(`[dispatch] source "${a.bindTo}" has no outputFile \u2014 skipping`);continue}let c=Gn({cbk:N.callbackToken,rg:t.value,br:St(t),cid:X,b:a.bindTo,d:a.outputFile,cs:void 0,rqt:N.rqt});e.dispatchExecution(oe,{source_def:a,base_ref:St(t),callback:{token:c,via:e.selfRef}}).catch(d=>Ot(X,d instanceof Error?d.message:String(d)));}});}async function T(){try{let p=()=>{let C=A(),{events:_}=R().readEntriesAfterCursor(C.lastDrainedJournalId);_.length<=0||(T(),e.requestProcessAccumulated?.());},l=await pe(e.lock,k,p);return rt({ran:l!==!1})}catch(p){return ot(p)}}function m(p){try{let l=p.params?.cardStoreRef;if(!l)return Q("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!q()){let Y=Wt(de);b({lastDrainedJournalId:"",graph:Gt(Y)},null);}let C=p.params?.outputsStoreRef;if(!C)return Q("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let _=i();_.writeCardStoreRef(l),_.writeOutputsStoreRef(C);let G=p.body??{};G["task-executor-ref"]&&_.writeTaskExecutorRef(G["task-executor-ref"]),Object.prototype.hasOwnProperty.call(G,"chat-handler-flow")&&_.writeChatHandlerFlow(G["chat-handler-flow"]);try{I().writeStatusSnapshot(ne(r,Zt(A().graph)));}catch{}return rt()}catch(l){return ot(l)}}function w(p){try{let l=I().readStatusSnapshot();if(!l){l=ne(r,Zt(A().graph));try{I().writeStatusSnapshot(l);}catch{}}return rt(l)}catch(l){return ot(l)}}function P(p){try{let l=p.params?.id;return l?(S({type:"task-removal",taskName:l,timestamp:dt()}),T(),rt()):Q("removeCard requires params.id")}catch(l){return ot(l)}}function $(p){try{let l=p.params?.id;return l?(S({type:"task-restart",taskName:l,timestamp:dt()}),T(),rt()):Q("retrigger requires params.id")}catch(l){return ot(l)}}async function L(p){return T()}function E(p){try{let l=p.params?.cardId,C=p.params?.all,_=!!p.params?.restart;if(!l&&!C)return Q("upsertCard requires --card-id <id> or --all");let G=C?B().readAllCards().map(Y=>Y.id):[l];for(let Y of G)if(!B().readCard(Y))return Q(`Card "${Y}" not found in board at ${t.value}`);for(let Y of G){let ft=B().readCard(Y),et=ze(ft),it=e.hashFn(et),st=e.kvStorage("card-upsert"),mt=st.read(Y),ht=mt?.taskConfigHash!==it;if(!(!ht&&!_)){if(ht){let Ct=mt?.blobRef??B().readCardKey(Y)??Y;S({type:"task-upsert",taskName:Y,taskConfig:et,timestamp:dt()}),st.write(Y,{blobRef:Ct,taskConfigHash:it,updatedAt:dt()});}_&&S({type:"task-restart",taskName:Y,timestamp:dt()});}}return T(),rt()}catch(l){return ot(l)}}function F(p){try{let l=p.params?.token;if(!l)return Q("taskFailed requires params.token");let C=p.params?.error??"unknown error",_=re(l);return _?(S({type:"task-failed",taskName:_.taskName,error:C,timestamp:dt()}),T(),rt()):Q("Invalid callback token")}catch(l){return ot(l)}}function z(p){try{let l=p.params?.token;if(!l)return Q("taskProgress requires params.token");let _=(p.body??{}).update??{},G=re(l);return G?(S({type:"task-progress",taskName:G.taskName,update:_,timestamp:dt()}),T(),rt()):Q("Invalid callback token")}catch(l){return ot(l)}}function U(p){try{let l=p.params?.token,C=p.params?.ref;if(!l)return Q("sourceDataFetched requires params.token");if(!C)return Q("sourceDataFetched requires params.ref");let _=Ye(l);if(!_)return Q("Invalid source token");let{cbk:G,cid:Y,b:ft,d:et,cs:it,rqt:st}=_,mt=ce(e.blobStorage("sources"),ut=>e.resolveBlob(ut)),ht=e.genId();mt.ingestSourceDataStaged(Y,et,fe(C),ht);let Ct=re(G);if(!Ct)return Q("Invalid callback token embedded in source token");let H=dt();return S({type:"task-progress",taskName:Ct.taskName,update:{bindTo:ft,outputFile:et,fetchedAt:H,deliveryToken:ht,sourceChecksum:it,rqt:st},timestamp:H}),T(),rt()}catch(l){return ot(l)}}function J(p){try{let l=p.params?.token,C=p.params?.reason??"unknown";if(!l)return Q("sourceDataFetchFailure requires params.token");let _=Ye(l);if(!_)return Q("Invalid source token");let{cbk:G,b:Y,d:ft,cs:et,rqt:it}=_,st=re(G);return st?(S({type:"task-progress",taskName:st.taskName,update:{bindTo:Y,outputFile:ft,failure:!0,reason:C,sourceChecksum:et,rqt:it},timestamp:dt()}),T(),rt()):Q("Invalid callback token embedded in source token")}catch(l){return ot(l)}}function K(p){try{let l=i().readCardStoreRef();return l?rt({storeRef:l}):Q(`Board at ${t.value} has no card store configured`)}catch(l){return ot(l)}}function W(p){try{let l=i().readOutputsStoreRef();return l?rt({storeRef:l}):Q(`Board at ${t.value} has no outputs store configured`)}catch(l){return ot(l)}}function gt(p){try{let l=p.params?.key;if(!l)return Q("getConfig requires params.key");let C=i(),_;switch(l){case "task-executor":_=C.readTaskExecutorRef()??null;break;case "chat-handler-flow":_=C.readChatHandlerFlow()??null;break;case "card-store-ref":_=C.readCardStoreRef();break;case "outputs-store-ref":_=C.readOutputsStoreRef();break;default:return Q(`getConfig: unknown key "${l}"`)}return rt({value:_})}catch(l){return ot(l)}}function Bt(p){try{let l=p.params?.key;if(!l)return Q("getOutputsDataObject requires params.key");let C=I().readDataObject(l);return rt(C)}catch(l){return ot(l)}}function xt(p){try{return rt(I().readAllDataObjects())}catch(l){return ot(l)}}function Ht(p){try{let l=p.params?.key;if(!l)return Q("getOutputsComputedValues requires params.key");let C=I().readComputedValues(l);return rt(C)}catch(l){return ot(l)}}function D(p){try{return rt(I().readAllComputedValues())}catch(l){return ot(l)}}return {init:m,status:w,getCardStoreRef:K,getOutputsStoreRef:W,getConfig:gt,getOutputsDataObject:Bt,getAllOutputsDataObjects:xt,getOutputsComputedValues:Ht,getAllOutputsComputedValues:D,removeCard:P,retrigger:$,processAccumulatedEvents:L,upsertCard:E,taskFailed:F,taskProgress:z,sourceDataFetched:U,sourceDataFetchFailure:J}}function Ze(t){function e(o){return {status:"success",data:o}}function n(o){return {status:"fail",error:o}}function r(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let u=t.readCard(s);return u?e({cards:[u]}):n(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return r(s)}},set(o){try{let s=o.body;if(s==null)return n("set requires a body (card object or array of cards)");let u=Array.isArray(s)?s:[s];for(let i of u){if(typeof i.id!="string")return n("each card must have a string `id` field");t.writeCard(i.id,i);}return e({count:u.length})}catch(s){return r(s)}},del(o){try{let s=o.body?.ids??[],u=o.params?.id,i=u?[...s,u]:s;if(i.length===0)return n("del requires body.ids (string[]) or params.id");for(let f of i)t.removeCard(f);return e({count:i.length})}catch(s){return r(s)}},patch(o){try{let s=o.params?.id,u=o.params?.path;if(!s)return n("patch requires params.id");if(!u)return n("patch requires params.path");let i=o.body,f=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:o.body;return t.patchCard(s,u,f),e({count:1})}catch(s){return r(s)}}}}function Qe(){return new Date().toISOString()}function tn(t){return new TextEncoder().encode(t).byteLength}function Vn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function Mn(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function Un(t){let e=String(t||"").trim();if(!e)return "upload.bin";let n=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (n>=0?e.slice(n+1):e)||"upload.bin"}function Hn(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Kn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Jn(t){let e=Un(t),n=e.lastIndexOf(".");return n<=0||n===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,n),ext:e.slice(n)}}function zn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function en(t){function e(n){let r=t.stat?Vn(t.stat(n)):null;if(r)return r;if(!t.exists(n))return null;let o=t.read(n);return o===null?{key:n}:{key:n,size:tn(o)}}return {exists(n){return t.exists(n)},putText(n,r,o="text/plain; charset=utf-8"){t.write(n,r);let s=e(n)??{key:n};return s.contentType=o,s.updatedAt=s.updatedAt??Qe(),s.size=s.size??tn(r),s},putBytes(n,r,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(n,r);else {let u=JSON.stringify({__kind:"bytes-array",data:[...r]});t.write(n,u);}let s=e(n)??{key:n};return s.contentType=o,s.updatedAt=s.updatedAt??Qe(),s.size=s.size??r.byteLength,s},getText(n){let r=t.read(n);if(r===null){if(!t.readBytes)return null;let o=t.readBytes(n);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return r},getBytes(n){if(t.readBytes){let o=t.readBytes(n);if(o!==null)return o}let r=t.read(n);if(r===null)return null;try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(r)},head:e,list(n=""){return t.listKeys(n).map(r=>e(r)??{key:r}).sort((r,o)=>r.key.localeCompare(o.key))},remove(n){t.remove(n);}}}function nn(t){function e(o,s){let u=0,i=[];Array.isArray(s)&&i.push(...s);for(let f of t.list(`${o}/`))i.push(zn(f.key));for(let f of i){let R=Mn(f);Number.isFinite(R)&&R>u&&(u=R);}return u+1}function n(o,s,u){let i=Number(u?.maxLen||32),{stem:f,ext:R}=Jn(o),B=Kn(R),I=Hn(f),q=`${String(s).padStart(3,"0")}-`,A=B,b=i-q.length-A.length;b<1&&(A="",b=i-q.length);let S=I.slice(0,Math.max(1,b)),k=`${q}${S}${A}`;return k.length>i&&(k=k.slice(0,i).replace(/\.$/,"")),k}function r(o,s,u){let i=e(o,u?.seedNames),f=n(s,i,{maxLen:u?.maxLen});for(;t.exists(`${o}/${f}`);)i+=1,f=n(s,i,{maxLen:u?.maxLen});return f}return {nextSerial:e,buildStoredName:n,allocateStoredName:r}}function rn(){function t(o,s){if(!Array.isArray(o))return [];let u=[];for(let i of o){if(!i||typeof i!="object")continue;let f=i;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,path:typeof f.path=="string"?f.path:null,uploaded_at:typeof f.uploaded_at=="string"?f.uploaded_at:s||null});}return u}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function n(o,s){let u=e(o);if(s.length===0)return o.files=u,u;let i=new Set(u.map(f=>f.stored_name));for(let f of s)i.has(f.stored_name)||(u.push(f),i.add(f.stored_name));return o.files=u,u}function r(o,s,u){let i=e(o);if(!Number.isInteger(s)||s<0||s>=i.length)return {ok:false,reason:"index_out_of_range"};let f=i[s];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:e,normalizeIncoming:t,merge:n,resolve:r}}function Yn(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function on(){let t=new Map,e=new Map;function n(r){return t.has(r)||t.set(r,[]),t.get(r)}return {append(r,o,s,u=[]){let i={id:Yn(),role:o,text:s,files:u,updated_at:new Date().toISOString()};return n(r).push(i),i.id},readAll(r){return n(r).slice()},readAfter(r,o){let s=n(r);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let u=s.findIndex(f=>f.id===o),i=u===-1?s.slice():s.slice(u+1);return {records:i,cursor:i.length>0?i[i.length-1].id:o}},clear(r){t.set(r,[]);},setProcessing(r,o){o?e.set(`p:${r}`,true):e.delete(`p:${r}`);},isProcessing(r){return e.get(`p:${r}`)===true},getConfig(r){return e.get(`c:${r}`)??{}},setConfig(r,o){let s=e.get(`c:${r}`)??{};e.set(`c:${r}`,{...s,...o});}}}var sn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Xn=32;function Wn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function an(t){if(!t||typeof t!="object")return false;let e=t.summary;return !e||typeof e!="object"?false:Number(e.card_count||0)>0}function un(t,e){if(!e||typeof e!="object")return;let n=e;if(n.kind==="notification-batch"&&Array.isArray(n.notifications)){for(let r of n.notifications)un(t,r);return}n.kind==="status"&&an(n.status)&&(t.status=n.status),n.kind==="computed_values"&&n.cardId&&(t.computedValues[n.cardId]=n.values),n.kind==="data_object"&&n.key&&(t.dataObjects[n.key]=n.payload),n.kind==="card_refreshed"&&n.cardId&&(t.cards[n.cardId]=n.card);}function Xr(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),n={...sn,...t.corsHeaders||{}},r=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,u=t.chatFlowRunner||null,i=t.chatStorage??on(),f=t.notificationTransport||null,R=t.serverUrl||null,B=t.executionExtra||{},I=new Map,q=new Map,A=new Map,b=null;function S(a){let c=We(a.baseRef,a.boardAdapter),d=a.boardAdapter.kvStorageForRef(a.cardStoreRef),h=Ze(te({readIndex:()=>d.read("_index"),writeIndex:x=>d.write("_index",x),readCard:x=>d.read(x),writeCard:(x,j)=>(d.write(x,j),x),cardExists:x=>d.read(x)!==null,defaultCardKey:x=>x},o.warn)),y=a.artifactsAdapter||a.boardAdapter,O=null;return {label:a.label,board:c,cardStore:h,get filesArtifacts(){return O??=en(y.blobStorage("files"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:Wn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let k=t.boards.map(S),T=new Map;function m(a){return T.get(a)??0}function w(a){let c=k[m(a)];return {files:c?c.filesArtifacts:null}}function P(a){let c=w(a);return c.files?nn(c.files):null}function $(){return rn()}function L(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function E(a){if(!a||a.notificationTeardown||!f||!a.notifyRef)return;let c=await f.subscribe(a.notifyRef,d=>{un(a.notification,d);let g=d.kind==="notification-batch"?d.notifications:[d];N(g);});a.notificationTeardown=c;}async function F(a){if(!a||a.initialized)return;let c={cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef},d={};a.taskExecutorRef&&(d["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(d["chat-handler-flow"]=a.chatHandlerFlow),a.inferenceAdapterRef&&(d["inference-adapter-ref"]=a.inferenceAdapterRef);let g=a.board.init({params:c,body:d});if(g.status!=="success")throw Object.assign(new Error(g.error||`init failed for ${a.label}`),{statusCode:500});if(await E(a),!a.chatHandlerFlow&&a.chatHandlerRef&&s.describe)try{let h=await s.describe(a.chatHandlerRef);h&&h.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${h.kind}", expected "chat-handler" for ${a.label}`):h&&o.info(`[init] chat-handler validated: ${h.name} (protocol ${h.protocolVersion}) for ${a.label}`);}catch(h){o.warn(`[init] chat-handler describe failed for ${a.label}: ${h?.message||String(h)}`);}a.initialized=true;}function z(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let c=[],d=a.board.status({});d.status==="success"&&d.data!=null&&an(d.data)&&c.push({kind:"status",status:d.data});let g=a.board.getAllOutputsDataObjects({});if(g.status==="success"&&g.data!=null)for(let[y,O]of Object.entries(g.data))y&&c.push({kind:"data_object",key:y,payload:O});let h=a.board.getAllOutputsComputedValues({});if(h.status==="success"&&h.data!=null)for(let[y,O]of Object.entries(h.data))y&&c.push({kind:"computed_values",cardId:y,values:O});c.length>0&&a.boardAdapter.publishBoardChangeNotifications(c);}function U(a,c){if(!a||a.cardsBootstrapped)return;let d=a.cardStore.get({}),g=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let h of g)typeof h.id=="string"&&(T.set(h.id,c),a.board.upsertCard({params:{cardId:h.id}}));a.cardsBootstrapped=true;}async function J(){for(let a of k)await F(a);}async function K(){await J();for(let a=0;a<k.length;a++)z(k[a]),U(k[a],a);}function W(a){return k[m(a)]??null}function gt(a){let c=W(a);if(!c)return null;let d=c.cardStore.get({params:{id:a}});if(d.status!=="success")return null;let g=Array.isArray(d.data?.cards)?d.data.cards:[];return g.length>0?g[0]:null}function Bt(){let a=d=>{if(!d||!d.cardStore)return [];let g=d.cardStore.get({});return g.status!=="success"||!Array.isArray(g.data?.cards)?[]:g.data.cards},c=[];for(let d of k)c.push(...a(d));return c}function xt(){let a=k.map(y=>{try{let x=y.boardAdapter.kvStorageForRef(y.outputsStoreRef).read("status");if(x!=null)return x}catch{}return y.notification.status}).filter(Boolean);if(a.length===0)return null;if(a.length===1)return a[0];let c=[],d=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],g={};for(let y of d)g[y]=0;for(let y of a){let O=y,x=Array.isArray(O.cards)?O.cards:[];c.push(...x);for(let j of d)g[j]+=Number(O?.summary?.[j]||0);}let h=a[0];return {...h,cards:c,summary:{...h.summary||{},card_count:c.length,...g}}}function Ht(){let a={},c=d=>{for(let[g,h]of Object.entries(d.notification.computedValues)){let y=d.notification.cards[g];a[g]={schema_version:"v1",card_id:g,card_data:y?.card_data??{},computed_values:h??{}};}};for(let d of k)c(d);return a}function D(){let a={};for(let c of k)Object.assign(a,c.notification.dataObjects||{});return a}function p(){let a=Bt(),c=Ht(),d=D(),g={};for(let y of a){if(!y?.id)continue;let O=y.id,x=c[O]||{},j={...x.card_data&&typeof x.card_data=="object"?x.card_data:y.card_data&&typeof y.card_data=="object"?y.card_data:{}};g[O]={schema_version:x.schema_version||"v1",card_id:x.card_id||O,card_data:j,computed_values:x.computed_values&&typeof x.computed_values=="object"?x.computed_values:{}};}let h={};for(let y of a){if(!y?.id)continue;let O=y.id;try{let x=it(O),j=i.isProcessing(O);(x.length>0||j)&&(h[O]={messages:x.map(Z=>({role:String(Z.role||"system"),text:String(Z.text||""),files:Array.isArray(Z.files)?Z.files:[]})),receiving:!1,processing:j});}catch{}}return {boardId:r,cardDefinitions:a,statusSnapshot:xt(),dataObjectsByToken:d,cardRuntimeById:g,cardChatsByCardId:h}}function l(a,c,d){let g=d?.syncBoard!==false,h=W(a);if(!h)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let y=gt(a);if(!y)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let O=c(y)||y,x=h.cardStore.set({body:O});if(x.status!=="success")throw Object.assign(new Error(x.error||`Failed to persist card: ${a}`),{statusCode:500});if(g){let j=h.board.upsertCard({params:{cardId:a,restart:true}});if(j.status!=="success")throw Object.assign(new Error(j.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function C(a,c){l(a,c,{syncBoard:true});}function _(a,c){l(a,c,{syncBoard:false});}function G(a,c){C(a,d=>{if(!c||typeof c!="object"||Object.keys(c).length===0)return d;function g(h,y,O){let x=String(y||"").split(".").filter(Boolean);if(!x.length)return;let j=h;for(let Z=0;Z<x.length-1;Z++){let at=x[Z];(!j[at]||typeof j[at]!="object")&&(j[at]={}),j=j[at];}j[x[x.length-1]]=O;}if(c.fieldValues!==void 0&&c.fieldValues!==null){let h=null,y=d.view;if(y&&Array.isArray(y.elements)){for(let O of y.elements)if(O?.data&&O.data.writeTo){h=O.data.writeTo;break}}h?g(d,h,c.fieldValues):typeof c.fieldValues=="object"&&!Array.isArray(c.fieldValues)&&(d.card_data={...d.card_data||{},...c.fieldValues});}else {if(Array.isArray(c._stagedFiles)&&c._stagedFiles.length>0)return d;for(let[h,y]of Object.entries(c))h!=="_stagedFiles"&&(y!==null&&typeof y=="object"&&!Array.isArray(y)&&d[h]!==null&&typeof d[h]=="object"&&!Array.isArray(d[h])?d[h]={...d[h],...y}:d[h]=y);}return d});}function Y(a){let c=String(a||"").trim();if(!c)return "upload.bin";let d=Math.max(c.lastIndexOf("/"),c.lastIndexOf("\\"));return (d>=0?c.slice(d+1):c)||"upload.bin"}function ft(a){i.clear(a),i.setProcessing(a,false);}function et(a,c,d,g){let h=typeof d=="string"?d.trim():"";return i.append(a,c||"system",h,g)}function it(a){return i.readAll(a)}function st(a){let c=[];try{let d=gt(a);if(!d)return c;let g=$().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let h of g)c.push(h.stored_name);}catch{}return c}function mt(a,c,d,g){let h=L(a),y=w(a),O=Y(c),x=P(a),j=x?x.allocateStoredName(h,O,{seedNames:st(a),maxLen:Xn}):`${String(Date.now())}-${O}`;return y.files&&y.files.putBytes(`${h}/${j}`,new Uint8Array(g),d||"application/octet-stream"),{name:O,stored_name:j,size:g.length,mime_type:d||"application/octet-stream",path:`${a}/files/${j}`,uploaded_at:new Date().toISOString()}}function ht(a,c){let d=W(a);if(!d)return;let g=d.board.getConfig({params:{key:"chat-handler-flow"}});if(g.status!=="success")return;let h=g.data?.value,y=d.chatHandlerRef;if(h==null&&(!y||typeof y!="object"))return;try{i.setProcessing(a,!0);}catch{}let O={boardId:r,cardId:String(a),lastChatEntryId:c,...B,...R?{serverUrl:R}:{}};if(!u&&h!=null){try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${a}" but no chatFlowRunner was provided`);return}if(h!=null){let j=u;if(!j)return;j.run(h,O,{boardId:r,cardId:String(a),label:d.label,logger:o,serverUrl:R,executionExtra:B}).then(Z=>{if(Z.dispatched)o.info(`[chat-handler-flow] invoked for card "${a}" (boardId: "${r}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${a}": ${Z.error||"unknown"}`);}},Z=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${a}": ${Z?.message||String(Z)}`);});return}let x=y;x&&s.invoke(x,O).then(j=>{if(j.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${r}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${a}": ${j.error||"unknown"}`);}},j=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${a}": ${j?.message||String(j)}`);});}function Ct(a,c,d){let g=c==="chat-send"?_:C,h;g(a,y=>{let O=new Date().toISOString(),x=y.card_data&&typeof y.card_data=="object"?y.card_data:{};if(y.card_data=x,c==="chat-send"){let j=d&&typeof d.text=="string"?d.text.trim():"",Z=[];if(Array.isArray(d?.files)){for(let at of d.files)if(at){if(typeof at=="string"){Z.push({name:at});continue}if(typeof at=="object"){let tt=at;typeof tt.name=="string"&&Z.push({name:tt.name,size:tt.size,mime_type:tt.mime_type,path:tt.path,uploaded_at:tt.uploaded_at,stored_name:tt.stored_name});}}}if(j||Z.length>0){let at=et(a,"user",j,Z);h={cardId:a,lastEntryId:at};for(let tt of Z){if(!tt||typeof tt!="object")continue;let pt=typeof tt.name=="string"?tt.name:"file",V=typeof tt.stored_name=="string"?tt.stored_name:null;V&&et(a,"system",`File ${pt} uploaded as ${V}.`,[]);}try{let tt=it(a);N([{kind:"card_chats",cardId:a,messages:tt.map(pt=>({role:String(pt.role||"system"),text:String(pt.text||""),files:Array.isArray(pt.files)?pt.files:[]})),receiving:!0,processing:i.isProcessing(a)}]);}catch{}}return y}if(c==="file-upload"){let j=$().normalizeIncoming(d?.files,O);return j.length>0&&$().merge(x,j),y}if(c==="action"){let j=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!j)return y;x.lastAction={buttonId:j,at:O},x.lastActionText=`${j} @ ${O}`;}return y}),h&&ht(h.cardId,h.lastEntryId);}function H(a,c,d){let g=JSON.stringify(d),h=typeof Buffer<"u"?Buffer.byteLength(g):new TextEncoder().encode(g).length;a.writeHead(c,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":h}),a.end(g);}async function ut(a){let c=[];for await(let g of a)c.push(g);let d=typeof Buffer<"u"?Buffer.concat(c).toString("utf-8").trim():new TextDecoder().decode(It(c)).trim();return d?JSON.parse(d):{}}async function Pt(a){let c=[];for await(let d of a)c.push(d);return typeof Buffer<"u"?Buffer.concat(c):It(c)}function It(a){let c=a.reduce((h,y)=>h+y.length,0),d=new Uint8Array(c),g=0;for(let h of a)d.set(h,g),g+=h.length;return d}let qt=0;function Kt(a){let c=JSON.stringify(a);return qt++,`id: ${qt}
2
2
  data: ${c}
3
3
 
4
- `}function Ot(a,c){let d=I.get(a);if(!d)return;let g=Kt(c);try{d.res.write(g);}catch{I.delete(a);}}function Jt(){let a=new Set;for(let c of I.values())for(let d of c.subscribedChatCardIds)a.add(d);return Array.from(a)}function le(a){let c=q.has(a)?q.get(a):null,{cursor:d}=i.readAfter(a,c),g=i.isProcessing(a),h=g!==(A.get(a)??false),y=d!==c;return y&&q.set(a,d),A.set(a,g),y||h}function At(a,c=true){let d=at(a);return {kind:"card_chats",cardId:a,messages:d.map(g=>({role:String(g.role||"system"),text:String(g.text||""),files:Array.isArray(g.files)?g.files:[]})),receiving:c,processing:i.isProcessing(a)}}function jt(a,c=true){let d={kind:"notification-batch",notifications:[At(a,c)]};for(let[g,h]of I.entries())h.subscribedChatCardIds.has(a)&&Ot(g,d);}function Lt(){Jt().length>0||(b&&(clearInterval(b),b=null),q.clear(),A.clear());}function Nt(){b||(b=setInterval(()=>{let a=Jt();if(a.length===0){Lt();return}let c=new Set(a);for(let d of Array.from(q.keys()))c.has(d)||q.delete(d);for(let d of Array.from(A.keys()))c.has(d)||A.delete(d);for(let d of a)le(d)&&jt(d,true);},1e3));}function Et(a,c){let d=I.get(a);if(!d)return false;d.subscribedChatCardIds.add(c);let{cursor:g}=i.readAfter(c,null);return q.set(c,g),A.set(c,i.isProcessing(c)),Nt(),Ot(a,{kind:"notification-batch",notifications:[At(c,true)]}),true}function oe(a,c){let d=I.get(a);return d?(d.subscribedChatCardIds.delete(c),Jt().includes(c)||(q.delete(c),A.delete(c)),Lt(),true):false}function v(a){if(!a||typeof a!="object")return false;let c=a.kind;return c==="card_chats"||c==="chat_messages"}function N(a){if(!a||a.length===0)return;let c=[],d=new Set;for(let g of a)v(g)&&typeof g.cardId=="string"?d.add(String(g.cardId)):c.push(g);if(c.length>0){let g={kind:"notification-batch",notifications:c};for(let h of I.keys())Ot(h,g);}for(let g of d)jt(g,true);}function X(a,c,d){let g=I.get(d),h=g?new Set(g.subscribedChatCardIds):new Set;if(g)try{g.res.end();}catch{}c.writeHead(200,{...n,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),I.set(d,{res:c,subscribedChatCardIds:h});let y=p(),O=Kt(y);c.write(O);let x=setInterval(()=>{try{c.write(`: keepalive
4
+ `}function Ot(a,c){let d=I.get(a);if(!d)return;let g=Kt(c);try{d.res.write(g);}catch{I.delete(a);}}function Jt(){let a=new Set;for(let c of I.values())for(let d of c.subscribedChatCardIds)a.add(d);return Array.from(a)}function le(a){let c=q.has(a)?q.get(a):null,{cursor:d}=i.readAfter(a,c),g=i.isProcessing(a),h=g!==(A.get(a)??false),y=d!==c;return y&&q.set(a,d),A.set(a,g),y||h}function At(a,c=true){let d=it(a);return {kind:"card_chats",cardId:a,messages:d.map(g=>({role:String(g.role||"system"),text:String(g.text||""),files:Array.isArray(g.files)?g.files:[]})),receiving:c,processing:i.isProcessing(a)}}function jt(a,c=true){let d={kind:"notification-batch",notifications:[At(a,c)]};for(let[g,h]of I.entries())h.subscribedChatCardIds.has(a)&&Ot(g,d);}function Lt(){Jt().length>0||(b&&(clearInterval(b),b=null),q.clear(),A.clear());}function Nt(){b||(b=setInterval(()=>{let a=Jt();if(a.length===0){Lt();return}let c=new Set(a);for(let d of Array.from(q.keys()))c.has(d)||q.delete(d);for(let d of Array.from(A.keys()))c.has(d)||A.delete(d);for(let d of a)le(d)&&jt(d,true);},1e3));}function Et(a,c){let d=I.get(a);if(!d)return false;d.subscribedChatCardIds.add(c);let{cursor:g}=i.readAfter(c,null);return q.set(c,g),A.set(c,i.isProcessing(c)),Nt(),Ot(a,{kind:"notification-batch",notifications:[At(c,true)]}),true}function oe(a,c){let d=I.get(a);return d?(d.subscribedChatCardIds.delete(c),Jt().includes(c)||(q.delete(c),A.delete(c)),Lt(),true):false}function v(a){if(!a||typeof a!="object")return false;let c=a.kind;return c==="card_chats"||c==="chat_messages"}function N(a){if(!a||a.length===0)return;let c=[],d=new Set;for(let g of a)v(g)&&typeof g.cardId=="string"?d.add(String(g.cardId)):c.push(g);if(c.length>0){let g={kind:"notification-batch",notifications:c};for(let h of I.keys())Ot(h,g);}for(let g of d)jt(g,true);}function X(a,c,d){let g=I.get(d),h=g?new Set(g.subscribedChatCardIds):new Set;if(g)try{g.res.end();}catch{}c.writeHead(200,{...n,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),I.set(d,{res:c,subscribedChatCardIds:h});let y=p(),O=Kt(y);c.write(O);let x=setInterval(()=>{try{c.write(`: keepalive
5
5
 
6
- `);}catch{}},15e3);a.on("close",()=>{clearInterval(x),I.delete(d),Lt(),c.end();});}async function bt(a,c,d){let g=a.method||"GET",h=d,y=h.pathname;try{if(g==="GET"&&y===`${e}/init-board`)return await J(),H(c,200,p()),!0;if(g==="GET"&&y===`${e}/sse`){await J();let V=String(h.searchParams.get("clientId")||"").trim();if(!V)return H(c,400,{error:"clientId query param is required for SSE"}),!0;X(a,c,V);for(let M=0;M<k.length;M++)z(k[M]),U(k[M],M);return !0}if(g==="GET"&&y===`${e}/board-status`)return H(c,200,p()),!0;let O=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)$`));if(g==="GET"&&O){await K();let V=decodeURIComponent(O[1]),M=gt(V);return M?(H(c,200,M),!0):(H(c,404,{error:`card not found: ${V}`}),!0)}if(g==="PATCH"&&O){await K();let V=decodeURIComponent(O[1]),M=await it(a);return G(V,M),H(c,200,{ok:!0}),!0}let x=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/actions$`));if(g==="POST"&&x){await K();let V=decodeURIComponent(x[1]),M=await it(a);return Ct(V,M?.actionType,M?.payload),H(c,200,{ok:!0}),!0}let j=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/chats$`));if(g==="GET"&&j){await K();let V=decodeURIComponent(j[1]);return H(c,200,{ok:!0,messages:at(V)}),!0}if(g==="POST"&&j){await K();let V=decodeURIComponent(j[1]),M=await it(a),nt=typeof M?.role=="string"?M.role:"assistant",Ft=typeof M?.text=="string"?M.text:"",yt=Array.isArray(M?.files)?M.files:[],kt=M?.done===!0,$t=i.append(V,nt,Ft,yt);return kt&&i.setProcessing(V,!1),jt(V,!kt),H(c,200,{ok:!0,id:$t}),!0}let Z=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(g==="POST"&&Z){await K();let V=decodeURIComponent(Z[1]),M=await it(a),nt=typeof M?.clientId=="string"?M.clientId.trim():"";return nt?Et(nt,V)?(H(c,200,{ok:!0,clientId:nt,cardId:V,subscribed:!0}),!0):(H(c,404,{error:`SSE client not connected: ${nt}`}),!0):(H(c,400,{error:"clientId is required"}),!0)}let st=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(g==="POST"&&st){await K();let V=decodeURIComponent(st[1]),M=await it(a),nt=typeof M?.clientId=="string"?M.clientId.trim():"";return nt?oe(nt,V)?(H(c,200,{ok:!0,clientId:nt,cardId:V,subscribed:!1}),!0):(H(c,404,{error:`SSE client not connected: ${nt}`}),!0):(H(c,400,{error:"clientId is required"}),!0)}let tt=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/files$`));if(g==="POST"&&tt){await K();let V=decodeURIComponent(tt[1]),M=String(h.searchParams.get("inChat")||"").toLowerCase()==="true",nt=a.headers["x-file-name"],Ft=String(a.headers["content-type"]||"application/octet-stream"),yt=Array.isArray(nt)?nt[0]:nt,kt=yt?decodeURIComponent(String(yt)):"upload.bin",$t=await Pt(a);if(!$t.length)return H(c,400,{error:"Empty upload body"}),!0;let lt=mt(V,kt,Ft,$t);return _(V,_t=>{let Dt=new Date().toISOString(),zt=_t.card_data&&typeof _t.card_data=="object"?_t.card_data:{};_t.card_data=zt;let se=F().normalizeIncoming([{name:lt.name,stored_name:lt.stored_name,size:lt.size,mime_type:lt.mime_type,path:lt.path,uploaded_at:lt.uploaded_at||Dt}],Dt);return F().merge(zt,se),_t}),M&&et(V,"system",`file uploaded: ${lt.name} as ${lt.stored_name}`,[]),H(c,200,{ok:!0,file:lt}),!0}let pt=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/files/(\\d+)$`));if(g==="GET"&&pt){let V=decodeURIComponent(pt[1]),M=parseInt(pt[2],10),nt=h.searchParams.get("sn"),Ft=gt(V);if(!Ft)return H(c,404,{error:"Card not found"}),!0;let yt=F().resolve(Ft.card_data,M,nt);if(!yt.ok&&yt.reason==="stale_reference")return H(c,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!yt.ok)return H(c,404,{error:"File not found"}),!0;let kt=yt.file,$t=L(V),lt=w(V),_t=`${$t}/${kt.stored_name}`,Dt=lt.files?lt.files.getBytes(_t):null;if(!Dt)return H(c,404,{error:"File not found"}),!0;let zt=kt.name||kt.stored_name,se=kt.mime_type||"application/octet-stream";return c.writeHead(200,{"Content-Type":se,"Content-Disposition":`attachment; filename="${zt}"`,"Content-Length":Dt.length}),c.end(Dt),!0}return !1}catch(O){let x=O?.statusCode||500;return H(c,x,{error:String(O?.message||O)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleRuntimeApi:bt,buildPublishedRuntimePayload:p,clearChatRecords:ft,reportSourceFetched(a,c){let d=k[0];return d?d.board.sourceDataFetched({params:{token:a,ref:c}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,c){let d=k[0];return d?d.board.sourceDataFetchFailure({params:{token:a,reason:c}}):{status:"fail",error:"no board context"}},get cardStore(){return k[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Xr(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),n={...on,...t.corsHeaders||{}},r=t.serverMetaStore,o=t.boardRuntimeFactory,s=new Map,u="boards-config.json";function i(){let k=r.getText(u);if(!k)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(k)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function f(k){r.putText(u,JSON.stringify(k,null,2));}function R(k){let T=String(k||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return T.length>0&&T.length<=64?T:null}function B(k){if(s.has(k))return s.get(k);let m=i().boards.find(P=>P.id===k)||{},w=o(k,m);return s.set(k,w),w}function I(k,T,m){let w=JSON.stringify(m),P=typeof Buffer<"u"?Buffer.byteLength(w):new TextEncoder().encode(w).length;k.writeHead(T,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":P}),k.end(w);}async function q(k,T,m){let w=k.method||"GET",P=m.pathname;if(w==="GET"&&P===e)return I(T,200,{ok:true,boards:i().boards}),true;if(w==="POST"&&P===e){let F=[];for await(let K of k)F.push(K);let L=typeof Buffer<"u"?Buffer.concat(F).toString("utf-8").trim():new TextDecoder().decode(Wn(F)).trim(),E={};try{E=L?JSON.parse(L):{};}catch{E={};}let $=R(E.id);if(!$)return I(T,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let z=i();if(z.boards.some(K=>K.id===$))return I(T,409,{error:`Board "${$}" is already registered`}),true;let U=typeof E.label=="string"&&E.label.trim()?E.label.trim():$,J={id:$,label:U};for(let[K,W]of Object.entries(E))K==="id"||K==="label"||W!=null&&(J[K]=W);return z.boards.push(J),f(z),I(T,200,{ok:true,board:J}),true}return false}async function A(k,T,m){let P=m.pathname.match(new RegExp(`^${vt(e)}/([^/]+)(/|$)`));if(!P)return false;let F=R(decodeURIComponent(P[1]));return F?i().boards.some($=>$.id===F)?!!await B(F).handleRuntimeApi(k,T,m):(I(T,404,{error:`Board "${F}" not registered. POST ${e} with {id} to register it first.`}),true):(I(T,400,{error:"Invalid board id"}),true)}async function b(k,T,m){return !!(await q(k,T,m)||await A(k,T,m))}function S(k){if(!i().boards.some(m=>m.id===k))throw Object.assign(new Error(`Board "${k}" not registered`),{statusCode:404});return {service:B(k)}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleApi:b,requireBoardService:S}}function vt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Wn(t){let e=t.reduce((o,s)=>o+s.length,0),n=new Uint8Array(e),r=0;for(let o of t)n.set(o,r),r+=o.length;return n}export{Xr as createMultiBoardServerRuntime,Yr as createSingleBoardServerRuntime};//# sourceMappingURL=board-live-cards-server-runtime.js.map
6
+ `);}catch{}},15e3);a.on("close",()=>{clearInterval(x),I.delete(d),Lt(),c.end();});}async function bt(a,c,d){let g=a.method||"GET",h=d,y=h.pathname;try{if(g==="GET"&&y===`${e}/init-board`)return await J(),H(c,200,p()),!0;if(g==="GET"&&y===`${e}/sse`){await J();let V=String(h.searchParams.get("clientId")||"").trim();if(!V)return H(c,400,{error:"clientId query param is required for SSE"}),!0;X(a,c,V);for(let M=0;M<k.length;M++)z(k[M]),U(k[M],M);return !0}if(g==="GET"&&y===`${e}/board-status`)return H(c,200,p()),!0;let O=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)$`));if(g==="GET"&&O){await K();let V=decodeURIComponent(O[1]),M=gt(V);return M?(H(c,200,M),!0):(H(c,404,{error:`card not found: ${V}`}),!0)}if(g==="PATCH"&&O){await K();let V=decodeURIComponent(O[1]),M=await ut(a);return G(V,M),H(c,200,{ok:!0}),!0}let x=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/actions$`));if(g==="POST"&&x){await K();let V=decodeURIComponent(x[1]),M=await ut(a);return Ct(V,M?.actionType,M?.payload),H(c,200,{ok:!0}),!0}let j=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/chats$`));if(g==="GET"&&j){await K();let V=decodeURIComponent(j[1]);return H(c,200,{ok:!0,messages:it(V)}),!0}if(g==="POST"&&j){await K();let V=decodeURIComponent(j[1]),M=await ut(a),nt=typeof M?.role=="string"?M.role:"assistant",$t=typeof M?.text=="string"?M.text:"",yt=Array.isArray(M?.files)?M.files:[],kt=M?.done===!0,Ft=i.append(V,nt,$t,yt);return kt&&i.setProcessing(V,!1),jt(V,!kt),H(c,200,{ok:!0,id:Ft}),!0}let Z=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(g==="POST"&&Z){await K();let V=decodeURIComponent(Z[1]),M=await ut(a),nt=typeof M?.clientId=="string"?M.clientId.trim():"";return nt?Et(nt,V)?(H(c,200,{ok:!0,clientId:nt,cardId:V,subscribed:!0}),!0):(H(c,404,{error:`SSE client not connected: ${nt}`}),!0):(H(c,400,{error:"clientId is required"}),!0)}let at=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(g==="POST"&&at){await K();let V=decodeURIComponent(at[1]),M=await ut(a),nt=typeof M?.clientId=="string"?M.clientId.trim():"";return nt?oe(nt,V)?(H(c,200,{ok:!0,clientId:nt,cardId:V,subscribed:!1}),!0):(H(c,404,{error:`SSE client not connected: ${nt}`}),!0):(H(c,400,{error:"clientId is required"}),!0)}let tt=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/files$`));if(g==="POST"&&tt){await K();let V=decodeURIComponent(tt[1]),M=String(h.searchParams.get("inChat")||"").toLowerCase()==="true",nt=a.headers["x-file-name"],$t=String(a.headers["content-type"]||"application/octet-stream"),yt=Array.isArray(nt)?nt[0]:nt,kt=yt?decodeURIComponent(String(yt)):"upload.bin",Ft=await Pt(a);if(!Ft.length)return H(c,400,{error:"Empty upload body"}),!0;let lt=mt(V,kt,$t,Ft);return _(V,_t=>{let Dt=new Date().toISOString(),zt=_t.card_data&&typeof _t.card_data=="object"?_t.card_data:{};_t.card_data=zt;let se=$().normalizeIncoming([{name:lt.name,stored_name:lt.stored_name,size:lt.size,mime_type:lt.mime_type,path:lt.path,uploaded_at:lt.uploaded_at||Dt}],Dt);return $().merge(zt,se),_t}),M&&et(V,"system",`file uploaded: ${lt.name} as ${lt.stored_name}`,[]),H(c,200,{ok:!0,file:lt}),!0}let pt=y.match(new RegExp(`^${vt(e)}/cards/([^/]+)/files/(\\d+)$`));if(g==="GET"&&pt){let V=decodeURIComponent(pt[1]),M=parseInt(pt[2],10),nt=h.searchParams.get("sn"),$t=gt(V);if(!$t)return H(c,404,{error:"Card not found"}),!0;let yt=$().resolve($t.card_data,M,nt);if(!yt.ok&&yt.reason==="stale_reference")return H(c,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!yt.ok)return H(c,404,{error:"File not found"}),!0;let kt=yt.file,Ft=L(V),lt=w(V),_t=`${Ft}/${kt.stored_name}`,Dt=lt.files?lt.files.getBytes(_t):null;if(!Dt)return H(c,404,{error:"File not found"}),!0;let zt=kt.name||kt.stored_name,se=kt.mime_type||"application/octet-stream";return c.writeHead(200,{"Content-Type":se,"Content-Disposition":`attachment; filename="${zt}"`,"Content-Length":Dt.length}),c.end(Dt),!0}return !1}catch(O){let x=O?.statusCode||500;return H(c,x,{error:String(O?.message||O)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleRuntimeApi:bt,buildPublishedRuntimePayload:p,clearChatRecords:ft,reportSourceFetched(a,c){let d=k[0];return d?d.board.sourceDataFetched({params:{token:a,ref:c}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,c){let d=k[0];return d?d.board.sourceDataFetchFailure({params:{token:a,reason:c}}):{status:"fail",error:"no board context"}},get cardStore(){return k[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Wr(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),n={...sn,...t.corsHeaders||{}},r=t.serverMetaStore,o=t.boardRuntimeFactory,s=new Map,u="boards-config.json";function i(){let k=r.getText(u);if(!k)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(k)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function f(k){r.putText(u,JSON.stringify(k,null,2));}function R(k){let T=String(k||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return T.length>0&&T.length<=64?T:null}function B(k){if(s.has(k))return s.get(k);let m=i().boards.find(P=>P.id===k)||{},w=o(k,m);return s.set(k,w),w}function I(k,T,m){let w=JSON.stringify(m),P=typeof Buffer<"u"?Buffer.byteLength(w):new TextEncoder().encode(w).length;k.writeHead(T,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":P}),k.end(w);}async function q(k,T,m){let w=k.method||"GET",P=m.pathname;if(w==="GET"&&P===e)return I(T,200,{ok:true,boards:i().boards}),true;if(w==="POST"&&P===e){let $=[];for await(let K of k)$.push(K);let L=typeof Buffer<"u"?Buffer.concat($).toString("utf-8").trim():new TextDecoder().decode(Zn($)).trim(),E={};try{E=L?JSON.parse(L):{};}catch{E={};}let F=R(E.id);if(!F)return I(T,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let z=i();if(z.boards.some(K=>K.id===F))return I(T,409,{error:`Board "${F}" is already registered`}),true;let U=typeof E.label=="string"&&E.label.trim()?E.label.trim():F,J={id:F,label:U};for(let[K,W]of Object.entries(E))K==="id"||K==="label"||W!=null&&(J[K]=W);return z.boards.push(J),f(z),I(T,200,{ok:true,board:J}),true}return false}async function A(k,T,m){let P=m.pathname.match(new RegExp(`^${vt(e)}/([^/]+)(/|$)`));if(!P)return false;let $=R(decodeURIComponent(P[1]));return $?i().boards.some(F=>F.id===$)?!!await B($).handleRuntimeApi(k,T,m):(I(T,404,{error:`Board "${$}" not registered. POST ${e} with {id} to register it first.`}),true):(I(T,400,{error:"Invalid board id"}),true)}async function b(k,T,m){return !!(await q(k,T,m)||await A(k,T,m))}function S(k){if(!i().boards.some(m=>m.id===k))throw Object.assign(new Error(`Board "${k}" not registered`),{statusCode:404});return {service:B(k)}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleApi:b,requireBoardService:S}}function vt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Zn(t){let e=t.reduce((o,s)=>o+s.length,0),n=new Uint8Array(e),r=0;for(let o of t)n.set(o,r),r+=o.length;return n}export{Wr as createMultiBoardServerRuntime,Xr as createSingleBoardServerRuntime};//# sourceMappingURL=board-live-cards-server-runtime.js.map
7
7
  //# sourceMappingURL=board-live-cards-server-runtime.js.map