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