yaml-flow 8.4.15 → 8.4.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/asset-integrity.json +3 -3
- package/browser/board-livecards-localstorage.js +5 -5
- package/cli/browser-api/board-live-cards-browser-adapter.d.ts +2 -2
- package/cli/browser-api/board-live-cards-browser-adapter.js +3 -3
- package/cli/browser-api/card-store-browser-api.js +1 -1
- package/cli/bundled/artifacts-store-cli.mjs +4 -4
- package/cli/bundled/batch-runner-cli.mjs +1 -1
- package/cli/bundled/board-live-cards-cli.mjs +20 -20
- package/cli/{execution-interface-DCFBy4L8.d.ts → execution-interface-BCIhu1gO.d.ts} +7 -0
- package/cli/{types-BbQ75HLf.d.ts → types-YNCagczT.d.ts} +9 -1
- package/examples/board/demo-shell-with-server.html +2 -2
- package/examples/board/doc.html +2 -2
- package/examples/board-local/demo-shell-localstorage.html +3 -3
- package/lib/{artifacts-store-lib-WdoKNAF0.d.cts → artifacts-store-lib-CVgtQrNZ.d.cts} +1 -1
- package/lib/{artifacts-store-lib-CXgRA5J7.d.ts → artifacts-store-lib-D-k-E8Vy.d.ts} +1 -1
- package/lib/artifacts-store-public.d.cts +3 -3
- package/lib/artifacts-store-public.d.ts +3 -3
- package/lib/board-live-cards-node.cjs +13 -13
- package/lib/board-live-cards-node.d.cts +10 -10
- package/lib/board-live-cards-node.d.ts +10 -10
- package/lib/board-live-cards-node.js +13 -13
- package/lib/{board-live-cards-public-wbWRD1nO.d.cts → board-live-cards-public-CQ82CDdS.d.cts} +9 -1
- package/lib/{board-live-cards-public-C81ZEkF-.d.ts → board-live-cards-public-CtlVp0L3.d.ts} +9 -1
- package/lib/board-live-cards-public.cjs +2 -2
- package/lib/board-live-cards-public.d.cts +2 -2
- package/lib/board-live-cards-public.d.ts +2 -2
- package/lib/board-live-cards-public.js +2 -2
- package/lib/board-live-cards-server-runtime.cjs +3 -3
- package/lib/board-live-cards-server-runtime.d.cts +5 -5
- package/lib/board-live-cards-server-runtime.d.ts +5 -5
- package/lib/board-live-cards-server-runtime.js +3 -3
- package/lib/card-store-public.d.cts +2 -2
- package/lib/card-store-public.d.ts +2 -2
- package/lib/{chat-storage-lib-OX0Q_Ttf.d.cts → chat-storage-lib-B1wU27y3.d.cts} +1 -1
- package/lib/{chat-storage-lib-DGaKrjVe.d.ts → chat-storage-lib-DsF4kPon.d.ts} +1 -1
- package/lib/chat-store-public.d.cts +3 -3
- package/lib/chat-store-public.d.ts +3 -3
- package/lib/execution-refs.cjs +2 -2
- package/lib/execution-refs.js +2 -2
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/server-runtime/index.cjs +3 -3
- package/lib/server-runtime/index.d.cts +6 -6
- package/lib/server-runtime/index.d.ts +6 -6
- package/lib/server-runtime/index.js +3 -3
- package/lib/step-machine-public/index.cjs +3 -3
- package/lib/step-machine-public/index.d.cts +1 -1
- package/lib/step-machine-public/index.d.ts +1 -1
- package/lib/step-machine-public/index.js +3 -3
- package/lib/{storage-interface-B-7pDHwD.d.cts → storage-interface-B2WD9D5n.d.cts} +7 -0
- package/lib/{storage-interface-B-7pDHwD.d.ts → storage-interface-B2WD9D5n.d.ts} +7 -0
- package/lib/stores/index.d.cts +1 -1
- package/lib/stores/index.d.ts +1 -1
- package/lib/stores/kv.d.cts +1 -1
- package/lib/stores/kv.d.ts +1 -1
- package/lib/{types-U3Iu6jDR.d.cts → types-D1R0JHIs.d.cts} +4 -4
- package/lib/{types-DsKGXgeT.d.ts → types-vTfV-Zkn.d.ts} +4 -4
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-05-
|
|
2
|
+
"generatedAt": "2026-05-25T08:29:59.708Z",
|
|
3
3
|
"algorithm": "sha256",
|
|
4
4
|
"files": {
|
|
5
5
|
"browser/board-livecards-localstorage.js": {
|
|
6
|
-
"sha256": "sha256-
|
|
7
|
-
"bytes":
|
|
6
|
+
"sha256": "sha256-fU+FrOQu0TZ033le3W4MqfxL5HrTwK/gkBlJESH/buU=",
|
|
7
|
+
"bytes": 103629
|
|
8
8
|
},
|
|
9
9
|
"browser/live-cards.schema.json": {
|
|
10
10
|
"sha256": "sha256-F5nfqDzZ5L3p0lLTMxGt4YtMa2sVzdNPh8sbQ8OiXHE=",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
var BoardLiveCardsLocalStorage=(function(exports){'use strict';var tn=Object.defineProperty;var en=(t,e,r)=>e in t?tn(t,e,{enumerable:true,configurable:true,writable:true,value:r}):t[e]=r;var Le=(t,e,r)=>en(t,e+"",r);var ue="b64:";function rn(t){let e=new TextEncoder().encode(t),r=globalThis.Buffer,n;if(r)n=r.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function nn(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),r=globalThis.Buffer;if(r)return r.from(e,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(e),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function rt(t){return `${ue}${rn(JSON.stringify(t))}`}function Rt(t){if(!t.startsWith(ue))throw new Error(`Invalid ref format (expected ${ue}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(nn(t.slice(ue.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!e||typeof e!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let r=e;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:r.kind,value:r.value}}async function qe(t,e,r){let n=t.tryAcquire();if(!n)return false;try{await e();}finally{n();}return r?.(),true}var Ft={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ht(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function Lt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function Me(t){return t.tasks??{}}function Ie(t){return t?t.status===Ft.FAILED||t.status===Ft.INACTIVATED:false}function Ge(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function Ue(t){return t.maxExecutions}function Je(t,e){let r=new Set;for(let[n,o]of Object.entries(e))if(o.status===Ft.COMPLETED){let s=t.tasks[n];s&&ht(s).forEach(a=>r.add(a));}return Array.from(r)}function Ve(t,e){let r={};return t.forEach(n=>{let o=e[n];if(!o)return;ht(o).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function He(t,e,r){let n=t.tasks[e]??de(),o={};if(r){let i=r.tasks[e],a=Lt(i);for(let u of a)for(let[f,m]of Object.entries(r.tasks))if(ht(m).includes(u)){let p=t.tasks[f];p?.lastDataHash&&(o[u]=p.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Ke(t,e,r,n,o,s){let i=t.tasks[r]??de(),a=e.tasks[r];if(!a)throw new Error(`Task "${r}" not found in graph`);let u;n&&a.on&&a.on[n]?u=a.on[n]:u=ht(a);let f=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let l=a.requires??[];for(let h of l)for(let[y,b]of Object.entries(e.tasks))if(ht(b).includes(h)){let A=t.tasks[y];A?.lastDataHash&&(f[h]=A.lastDataHash);break}}let m={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:f,error:void 0},p=[...new Set([...t.availableOutputs,...u])];return {...t,tasks:{...t.tasks,[r]:m},availableOutputs:p,lastUpdated:new Date().toISOString()}}function ze(t,e,r,n){let o=t.tasks[r]??de(),s=e.tasks[r];if(s?.retry){let u=o.retryCount+1;if(u<=s.retry.max_attempts){let f={...o,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:f},lastUpdated:new Date().toISOString()}}}let i={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},a=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(a=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&i.executionCount>=s.circuit_breaker.max_executions){let u=s.circuit_breaker.on_break;a=[...new Set([...a,...u])];}return {...t,tasks:{...t.tasks,[r]:i},availableOutputs:a,lastUpdated:new Date().toISOString()}}function We(t,e,r,n){let o=t.tasks[e]??de(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Xe(t,e){let r=t.tasks[e];if(!r)return t;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:n},lastUpdated:new Date().toISOString()}}function de(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function le(t,e){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(t.tasks))n[s]=Ze();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function on(t,e){let{config:r,state:n}=t;if("executionId"in e&&e.executionId&&e.executionId!==n.executionId)return t;switch(e.type){case "task-started":return {config:r,state:He(n,e.taskName,r)};case "task-completed":return {config:r,state:Ke(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:ze(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:We(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:Xe(n,e.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:fn(n,e.action)};case "task-upsert":return sn(t,e.taskName,e.taskConfig);case "task-removal":return an(t,e.taskName);case "node-requires-add":return cn(t,e.nodeName,e.tokens);case "node-requires-remove":return un(t,e.nodeName,e.tokens);case "node-provides-add":return dn(t,e.nodeName,e.tokens);case "node-provides-remove":return ln(t,e.nodeName,e.tokens);default:return t}}function Ye(t,e){return e.reduce((r,n)=>on(r,n),t)}function sn(t,e,r){let n=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:r}},state:{...t.state,tasks:{...t.state.tasks,[e]:n?t.state.tasks[e]:Ze()},lastUpdated:new Date().toISOString()}}}function an(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function cn(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Lt(n),s=r.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...o,...s]}}},state:t.state}}function un(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Lt(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:s}}},state:t.state}}function dn(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=ht(n),s=r.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...o,...s]}}},state:t.state}}function ln(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=ht(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:s}}},state:t.state}}function ee(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function fe(t){if(!t||typeof t!="object")throw new Error("Invalid snapshot: expected an object");let e=t;if(!e.config||typeof e.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!e.state||typeof e.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=e.config,n=e.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function Ze(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function fn(t,e){let r=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:r};case "pause":return {...t,status:"paused",lastUpdated:r};case "resume":return {...t,status:"running",lastUpdated:r};default:return t}}function re(t){let{config:e,state:r}=t,n=Me(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=gn(n),i=Je(e,r.tasks),a=new Set([...i,...r.availableOutputs]),u=[],f=[],m=[],p=[];for(let[h,y]of Object.entries(n)){let b=r.tasks[h],A=Ge(y,e.settings),O=A!=="once";if(b?.status===Ft.RUNNING||Ie(b))continue;let C=Ue(y);if(C!==void 0&&b&&b.executionCount>=C||y.circuit_breaker&&b&&b.executionCount>=y.circuit_breaker.max_executions||!O&&b?.status===Ft.COMPLETED)continue;if(O&&b?.status===Ft.COMPLETED){let x=Lt(y),j=false;switch(A){case "data-changed":{x.length>0&&x.some(U=>{for(let[z,it]of Object.entries(n))if(ht(it).includes(U)){let at=r.tasks[z];if(!at)continue;let qt=b.lastConsumedHashes?.[U];return at.lastDataHash==null?at.executionCount>b.lastEpoch:at.lastDataHash!==qt}return false})||(j=true);break}case "epoch-changed":{x.length>0&&x.some(U=>{for(let[z,it]of Object.entries(n))if(ht(it).includes(U)){let at=r.tasks[z];if(at&&at.executionCount>b.lastEpoch)return true}return false})||(j=true);break}case "time-based":{let D=y.refreshInterval??0;if(D<=0){j=true;break}let U=b.completedAt;if(!U){j=true;break}(Date.now()-Date.parse(U))/1e3<D&&(j=true);break}case "manual":j=true;break}if(j)continue}let w=Lt(y);if(w.length===0){u.push(h);continue}let M=[],B=[],T=[];for(let x of w){if(a.has(x))continue;let j=s[x]||[];j.length===0?M.push(x):j.every(U=>Ie(r.tasks[U]))?T.push({token:x,failedProducer:j[0]}):B.push(x);}M.length>0?m.push({taskName:h,missingTokens:M}):T.length>0?p.push({taskName:h,failedTokens:T.map(x=>x.token),failedProducers:[...new Set(T.map(x=>x.failedProducer))]}):B.length>0?f.push({taskName:h,waitingOn:B}):u.push(h);}let l={};if(u.length>1){let h=Ve(u,n);for(let[y,b]of Object.entries(h))b.length>1&&(l[y]=b);}return {eligible:u,pending:f,unresolved:m,blocked:p,conflicts:l}}function gn(t){let e={};for(let[r,n]of Object.entries(t)){for(let o of ht(n))e[o]||(e[o]=[]),e[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(r)||e[s].push(r);if(n.on_failure)for(let o of n.on_failure)e[o]||(e[o]=[]),e[o].includes(r)||e[o].push(r);}return e}var ne=class{constructor(){Le(this,"buffer",[]);}append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function Ee(t){let e=Oe(t);return pn(e)}function Oe(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(Oe).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+Oe(e[n])).join(",")+"}"}function pn(t){let e=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*r&n;return e.toString(16).padStart(16,"0")}function mn(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),r="";for(let n of e)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function hn(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Qe(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return mn(e)}function yn(t){try{let e=JSON.parse(hn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Be(t,e,r){let{handlers:n,onDrain:o}=e,s=new ne,i="state"in t&&"config"in t?t:le(t),a=false,u=new Set,f=new Map(Object.entries(n)),m=new ne,p=false,l=false;function h(){if(!a){if(p){l=true;return}p=true;try{do l=!1,y();while(l)}finally{p=false;}}}function y(){let C=m.drain(),w=s.drain(),M=[...C,...w];M.length>0&&(i=Ye(i,M));let B=re(i);M.length>0&&o?.(M,i,B);for(let T of B.eligible)O(T);for(let T of M)if(T.type==="task-progress"){let{taskName:x,update:j}=T;if(!i.config.tasks[x])continue;let U=i.state.tasks[x];if(!U||U.status!=="running")continue;let z=Qe(x),it=A(x,z,j).catch(at=>{a||(m.append({type:"task-failed",taskName:x,error:at.message??String(at),timestamp:new Date().toISOString()}),h());}).finally(()=>{u.delete(it);});u.add(it);}}function b(C){let M=i.config.tasks[C].requires??[],B=new Map;for(let[x,j]of Object.entries(i.config.tasks))for(let D of j.provides??[])B.set(D,x);let T={};for(let x of M){let j=B.get(x);j?T[x]=i.state.tasks[j]?.data:T[x]=void 0;}return T}async function A(C,w,M){let B=i.config.tasks[C],T=B.taskHandlers??[],x=b(C);for(let j of T){let D=f.get(j);if(!D)throw new Error(`Handler '${j}' not found in registry (task '${C}')`);let U={nodeId:C,state:x,taskState:i.state.tasks[C],config:B,callbackToken:w,update:M};if(await D(U)==="task-initiate-failure")throw new Error(`Handler '${j}' returned task-initiate-failure (task '${C}')`)}}function O(C){let M=i.config.tasks[C]?.taskHandlers;if(!M||M.length===0)return;m.append({type:"task-started",taskName:C,timestamp:new Date().toISOString()}),h();let B=Qe(C),T=A(C,B).catch(x=>{a||(m.append({type:"task-failed",taskName:C,error:x.message??String(x),timestamp:new Date().toISOString()}),h());}).finally(()=>{u.delete(T);});u.add(T);}return {push(C){a||(C.type==="task-completed"&&C.data&&!C.dataHash&&(C={...C,dataHash:Ee(C.data)}),s.append(C),h());},pushAll(C){if(!a){for(let w of C)w.type==="task-completed"&&w.data&&!w.dataHash?s.append({...w,dataHash:Ee(w.data)}):s.append(w);h();}},resolveCallback(C,w,M){if(a)return;let B=yn(C);if(!B)return;let{taskName:T}=B;if(i.config.tasks[T]){if(M&&M.length>0)s.append({type:"task-failed",taskName:T,error:M.join("; "),timestamp:new Date().toISOString()});else {let x=w&&Object.keys(w).length>0?Ee(w):void 0;s.append({type:"task-completed",taskName:T,data:w,dataHash:x,timestamp:new Date().toISOString()});}h();}},addNode(C,w){a||(s.append({type:"task-upsert",taskName:C,taskConfig:w,timestamp:new Date().toISOString()}),h());},removeNode(C){a||(s.append({type:"task-removal",taskName:C,timestamp:new Date().toISOString()}),h());},addRequires(C,w){a||(s.append({type:"node-requires-add",nodeName:C,tokens:w,timestamp:new Date().toISOString()}),h());},removeRequires(C,w){a||(s.append({type:"node-requires-remove",nodeName:C,tokens:w,timestamp:new Date().toISOString()}),h());},addProvides(C,w){a||(s.append({type:"node-provides-add",nodeName:C,tokens:w,timestamp:new Date().toISOString()}),h());},removeProvides(C,w){a||(s.append({type:"node-provides-remove",nodeName:C,tokens:w,timestamp:new Date().toISOString()}),h());},registerHandler(C,w){f.set(C,w);},unregisterHandler(C){f.delete(C);},retrigger(C){a||i.config.tasks[C]&&(s.append({type:"task-restart",taskName:C,timestamp:new Date().toISOString()}),h());},retriggerAll(C){if(!a){for(let w of C)i.config.tasks[w]&&s.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()});h();}},snapshot(){return ee(i)},getState(){return i},getSchedule(){return re(i)},async waitForHandlers(){u.size>0&&await Promise.allSettled([...u]);},async dispose(C){C?.wait&&u.size>0&&await Promise.allSettled([...u]),a=true;}}}function ge(){return function(t){if(t==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+t)}}var kn=ge();kn("./jsonata-sync.cjs");var Sn=ge(),pe=Sn("./jsonata-sync.cjs"),rr=pe;function tr(t,e){if(!e||!t)return;let r=e.split("."),n=t;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function nr(t,e,r){let n=e.split("."),o=t;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function bn(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await pe(o.expr).evaluate(n);nr(t.computed_values,o.bindTo,s),n.computed_values=t.computed_values;}catch{}return t}function Cn(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let i=rr(s.expr).evaluate(n);nr(t.computed_values,s.bindTo,i),n.computed_values=t.computed_values;}catch(i){let a=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:a});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function Rn(t,e,r){let n={...r??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return pe(t).evaluate(n)}function wn(t,e){return e.startsWith("fetched_sources.")?tr(t._sourcesData??{},e.slice(16)):tr(t,e)}var er=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),vn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function An(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let r=t;(typeof r.id!="string"||!r.id)&&e.push("id: required, must be a non-empty string");for(let n of Object.keys(r))vn.has(n)||e.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&e.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))e.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&e.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&e.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&e.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))e.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${i}]: must be an object`);else {let a=s;typeof a.bindTo!="string"||!a.bindTo?e.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(a.bindTo)&&e.push(`source_defs[${i}]: bindTo "${a.bindTo}" is not unique across source_defs`),n.add(a.bindTo)),typeof a.outputFile!="string"||!a.outputFile?e.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(a.outputFile)&&e.push(`source_defs[${i}]: outputFile "${a.outputFile}" is not unique across source_defs`),o.add(a.outputFile)),a.optionalForCompletionGating!=null&&typeof a.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))e.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?e.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):er.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...er].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&e.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function _n(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await pe(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function xn(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return t.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=rr(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Wt={run:bn,runSync:Cn,eval:Rn,resolve:wn,validate:An,enrichSources:_n,enrichSourcesSync:xn};function or(t){return JSON.stringify(t)}function sr(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 me(t,e){function r(){return t.readIndex()??{}}function n(o,s,i){let a=String(s||"").split(".").filter(Boolean);if(a.length===0)return i&&typeof i=="object"&&!Array.isArray(i)?i:{value:i};let u={...o},f=u;for(let m=0;m<a.length-1;m++){let p=a[m],l=f[p],h=l&&typeof l=="object"&&!Array.isArray(l)?{...l}:{};f[p]=h,f=h;}return f[a[a.length-1]]=i,u}return {readCard(o){let s=r()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,i]of Object.entries(r())){if(!t.cardExists(i.key))continue;let a=t.readCard(i.key);a?o.push(a):e?.(`[card-store] could not read card "${s}" at key "${i.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,i]of Object.entries(r()))o[s]=i.checksum;return o},changedSince(o){let s=r(),i=[];for(let[a,u]of Object.entries(s))o[a]!==u.checksum&&i.push(a);for(let a of Object.keys(o))s[a]||i.push(a);return i},validateUpsert(o,s){let i=r(),a=i[o],u=Object.entries(i).find(([,f])=>f.key===s);return a&&a.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${a.key}", cannot remap to "${s}"`}:u&&u[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${u[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,i){let a=r(),u=i??a[o]?.key??t.defaultCardKey(o),f=t.writeCard(u,s);a[o]={key:u,checksum:f,updatedAt:new Date().toISOString()},t.writeIndex(a);},patchCard(o,s,i){let a=r(),u=a[o];if(!u||!t.cardExists(u.key))throw new Error(`card "${o}" not found`);let f=t.readCard(u.key);if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`card "${o}" is not patchable`);let m=n(f,s,i),p=t.writeCard(u.key,m);a[o]={key:u.key,checksum:p,updatedAt:new Date().toISOString()},t.writeIndex(a);},removeCard(o){let s=r(),i=s[o];i&&(t.removeCard(i.key),delete s[o],t.writeIndex(s));},readIndex(){return r()}}}function je(t,e){return {readSourceData(r,n){let o=t.read(`${r}/${n}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,n,o,s){let i=e(o);t.write(`${r}/.staged/${s}/${n}`,i);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,i=t.read(s);return i==null?false:(t.write(`${r}/${n}`,i),t.remove(s),true)},hasSource(r,n){return t.exists(`${r}/${n}`)}}}function dr(t){function e(r){let n=t.readAllEntries();if(!r)return n;let o=n.findIndex(s=>s.id===r);return o===-1?n:n.slice(o+1)}return {readEntriesAfterCursor(r){let n=e(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return e(r).length},appendEvent(r){t.appendEntry({id:t.generateId(),event:r});}}}function lr(t,e){return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.read(r)??[];t.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(i){let a=i instanceof Error?i.message:String(i);try{e(s,a);}catch{}}t.delete(r);}}}}var he="v1",Ut="board/graph",fr="board/lastJournalProcessedId";function ar(t){return `cards/${t}/runtime`}function gr(t){return {readRuntime(e){return t.read(ar(e))??{_sources:{}}},writeRuntime(e,r){t.write(ar(e),r);}}}function Tn(t,e){let r={...t};for(let n of e.deleteKeys)delete r[n];return {...r,...e.shallowMerge}}function pr(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,r){if(r.schemaVersion!==he)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=t.readValues(e);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let o=Tn(n.values,r);return {ok:true,newVersion:t.writeValues(e,o,r.deleteKeys)}}}}function mr(t){function e(r){let n=t.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=e("task-executor");if(r?.trim())return sr(r.trim())},writeTaskExecutorRef(r){t.write("task-executor",or(r));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(r){t.write("chat-handler-flow",r);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(r){t.write("card-store-ref",r);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(r){t.write("outputs-store-ref",r);},readScratchStoreRef(){return e("scratch-store-ref")},writeScratchStoreRef(r){t.write("scratch-store-ref",r);},readArchiveStoreRef(){return e("archive-store-ref")},writeArchiveStoreRef(r){t.write("archive-store-ref",r);}}}function hr(t){return {writeComputedValues(e,r){t.write(`cards/${e}/computed_values`,r);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let r of t.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(e[n[1]]=t.read(r));}return e},writeDataObjects(e){for(let[r,n]of Object.entries(e))r&&t.write(`data-objects/${r}`,n);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let r of t.listKeys("data-objects/"))e[r.slice(13)]=t.read(r);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function ir(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function In(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function cr(t,e){return t?.lastRequestedToken?In(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function En(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function ur(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function ye(t,e){let r=e.state.tasks,n=e.config.tasks,o=Object.keys(r),s=re(e),i={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},a=new Map;for(let y of s.pending)a.set(y.taskName,y.waitingOn);for(let y of s.unresolved)a.set(y.taskName,y.missingTokens);for(let y of s.blocked)a.set(y.taskName,y.failedTokens);let u=new Map;for(let[y,b]of Object.entries(n))for(let A of b.requires??[]){let O=u.get(A)??[];O.push(y),u.set(A,O);}let f=o.sort().map(y=>{let b=r[y],A=n[y]??{requires:[],provides:[]};b.status==="completed"?i.completed+=1:b.status==="failed"?i.failed+=1:b.status==="in-progress"&&(i.in_progress+=1);let O=A.requires??[],C=A.provides??[],w=Object.keys(b.data??{}).sort(),M=O.filter(U=>e.state.availableOutputs.includes(U)),B=O.filter(U=>!e.state.availableOutputs.includes(U)),T=a.get(y)??B,x=new Set;for(let U of C)for(let z of u.get(U)??[])z!==y&&x.add(z);let j=b.failedAt,D=b.error?{message:b.error,code:"TASK_FAILED",at:j,source:"task-runtime"}:void 0;return {name:y,status:b.status,error:D,requires:O,requires_satisfied:M,requires_missing:B,provides_declared:C,provides_runtime:w,blocked_by:T,unblocks:Array.from(x).sort(),runtime:{attempt_count:b.executionCount??0,restart_count:b.retryCount??0,in_progress_since:b.status==="in-progress"?b.startedAt??null:null,last_transition_at:b.lastUpdated??null,last_completed_at:b.completedAt??null,last_restarted_at:b.startedAt??null,status_age_ms:b.lastUpdated?0:null}}});i.pending=s.pending.length,i.blocked=s.blocked.length,i.unresolved=s.unresolved.length;let m=f.map(y=>({name:y.name,fanOut:y.unblocks.length})).sort((y,b)=>b.fanOut-y.fanOut||y.name.localeCompare(b.name)),p=m.length>0?m[0]:{name:null,fanOut:0},l=new Set;for(let y of Object.values(n))for(let b of y.requires??[])l.add(b);let h=0;for(let[y,b]of Object.entries(n)){let A=(b.requires??[]).length===0,C=(b.provides??[]).some(w=>(u.get(w)??[]).some(M=>M!==y));A&&!C&&(h+=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:h,topology:{edge_count:Array.from(l).length,max_fan_out_card:p.name,max_fan_out:p.fanOut}},cards:f}}function On(){return new Date().toISOString()}function yr(t,e,r,n,o,s,i){return async a=>{let u=[],f=r.cardStore.readCard(a.nodeId);if(!f)return "task-initiate-failure";let m=f.id,p=f.card_data??{},l=f.source_defs??[],h=l.filter(F=>F.optionalForCompletionGating!==true),y=r.cardRuntimeStore.readRuntime(m),b=false,A=()=>{b&&(r.cardRuntimeStore.writeRuntime(m,y),b=false);},O=F=>ir(y._sources[F]),C=(F,L)=>{y._sources[F]=ir(L),b=true;},w=a.taskState?.executionCount??0;if(y._lastExecutionCount!==w&&(y._sources={},y._lastExecutionCount=w,b=true),a.update){let F=a.update,L=F.outputFile;if(L){let X=O(L);if(F.failure){let nt=F.rqt??X.lastRequestedToken??X.queueRequestedToken;nt&&C(L,ur(X,nt));}else {let nt=F.rqt;if(!X.lastCompletedToken||nt>X.lastCompletedToken){let yt=typeof F.deliveryToken=="string"?F.deliveryToken:void 0,_=false;yt&&(_=r.fetchedSourcesStore.commitSourceData(m,L,yt)),_?C(L,En(X,nt)):C(L,ur(X,nt));}}A();}}let B={};for(let F of l)if(F.outputFile){let L=r.fetchedSourcesStore.readSourceData(m,F.outputFile);L!==null&&(B[F.bindTo]=L);}let T={};for(let[F,L]of Object.entries(a.state??{}))if(L!==null&&typeof L=="object"&&!Array.isArray(L)){let X=L[F];T[F]=X!==void 0?X:L;}else T[F]=L;let x={id:m,card_data:{...p},requires:T,source_defs:l,compute:f.compute};x._sourcesData=B,f.compute&&Wt.runSync(x,{sourcesData:B}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(m,x.computed_values??{});let j={...f},D=Wt.enrichSourcesSync(Array.isArray(f.source_defs)?f.source_defs:void 0,{card_data:f.card_data,requires:T}),U=t.value;j.source_defs=Array.isArray(D)?D.map(F=>({...F,boardDir:typeof F.boardDir=="string"&&F.boardDir?F.boardDir:U})):D;let z=On(),it=a.update?void 0:z,at=h.filter(F=>{let L=F.outputFile;if(typeof L!="string"||!L)return true;let X=O(L);it&&(X={...X,queueRequestedToken:it},C(L,X));let nt=X.queueRequestedToken??X.lastRequestedToken??z,yt=cr(X,nt);return yt==="in-flight"?false:yt==="dispatch"});if(A(),at.length>0){let F=false,L=z;for(let X of at){let nt=X.outputFile;if(typeof nt!="string"||!nt)continue;let yt=O(nt),_=yt.queueRequestedToken??z;C(nt,{...yt,lastRequestedToken:_}),L=_,F=true;}return F&&A(),F&&(u.push({taskKind:"source-fetch",payload:{boardRef:rt(t),enrichedCard:j,callbackToken:a.callbackToken,rqt:L}}),r.executionRequestStore.appendEntries(e,u)),"task-initiated"}if(h.some(F=>{let L=F.outputFile;if(typeof L!="string"||!L)return false;let X=O(L),nt=X.queueRequestedToken??X.lastRequestedToken??z;return cr(X,nt)==="in-flight"}))return "task-initiated";let Jt=f.provides??[],Tt={};for(let{bindTo:F,ref:L}of Jt)Tt[F]=Wt.resolve(x,L);return (i??r.outputStore.writeDataObjects.bind(r.outputStore))(Tt),l.filter(F=>{if(F.optionalForCompletionGating!==true)return false;let L=O(F.outputFile);return !L.lastRequestedToken||!L.lastCompletedToken?true:L.lastCompletedToken<=L.lastRequestedToken}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:rt(t),enrichedCard:j,callbackToken:a.callbackToken,rqt:z}}),n(a.nodeId,Tt),u.length>0&&r.executionRequestStore.appendEntries(e,u),"task-initiated"}}var $e={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function kr(t){return {[Ut]:t.graph,[fr]:t.lastDrainedJournalId}}function Sr(t){let e=t[Ut],r=t[fr];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Ut}`);return {graph:e,lastDrainedJournalId:typeof r=="string"?r:""}}function br(t){let e=t.requires,r=t.provides?.map(n=>n.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:r,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function ot(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function et(t){return {status:"fail",error:t}}function st(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Bn(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Rr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function ke(t){try{let e=JSON.parse(Rr(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function jn(t){return Bn(JSON.stringify(t))}function Cr(t){try{let e=JSON.parse(Rr(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function ut(){return new Date().toISOString()}function wr(t,e){let r=e.onWarn??(()=>{}),n=rt(t);function o(_){if(_.length!==0)try{let k=e.publishBoardChangeNotifications?.(_);k&&typeof k.catch=="function"&&k.catch(I=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${I instanceof Error?I.message:String(I)}`));}catch(k){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${k instanceof Error?k.message:String(k)}`);}}function s(){let _=a().readCardStoreRef();if(!_)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let k=e.kvStorageForRef(_);return {readIndex(){return k.read("_index")},writeIndex(I){k.write("_index",I);},readCard(I){return k.read(I)},writeCard(I,G){return k.write(I,G),e.hashFn(G)},removeCard(I){k.delete(I);},cardExists(I){return k.read(I)!==null},defaultCardKey(I){return I}}}let i={readValues(_){let k=e.kvStorage("state-snapshot"),I=k.listKeys().sort();if(I.length===0)return {version:null,values:{}};let G={};for(let Y of I)G[Y]=k.read(Y);return {version:e.hashFn(G),values:G}},writeValues(_,k,I){let G=e.kvStorage("state-snapshot");for(let Y of I)G.delete(Y);for(let[Y,W]of Object.entries(k))G.write(Y,W);return e.hashFn(k)}},a=()=>mr(e.kvStorage("config")),u=()=>pr(i),f=()=>dr(e.journalAdapter()),m=()=>me(s(),r),p=()=>{let _=a().readOutputsStoreRef();if(!_)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return hr(e.kvStorageForRef(_))},l=()=>{let _=a().readArchiveStoreRef();return _?e.archiveFactoryForRef(_):e.archiveFactory()};function h(){return !!u().readSnapshot(t.value).values[Ut]}function y(){let _=u().readSnapshot(t.value);if(!_.values[Ut])throw new Error(`Board not initialized at ${t.value}`);return Sr(_.values)}function b(_,k){let I=u().commitSnapshot(t.value,{schemaVersion:he,expectedVersion:k,commitId:e.genId(),committedAt:ut(),deleteKeys:[],shallowMerge:kr(_)});if(!I.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${k??"null"} current=${I.currentVersion??"null"}`)}function A(_){f().appendEvent(_);}async function O(){let _=(E,P)=>{let Z=E.payload,_t=(Z?.enrichedCard??{}).id??Z?.cardId??"unknown";A({type:"task-failed",taskName:_t,error:P,timestamp:ut()});},k=lr(e.kvStorage("execution-requests"),_),I=gr(e.kvStorage("card-runtime")),G=je(e.blobStorage("sources"),E=>e.resolveBlob(E)),Y=new Map,W={readRuntime(E){return Y.get(E)??I.readRuntime(E)},writeRuntime(E,P){Y.set(E,P);}},dt=[],ct=new Map,vt={readSourceData(E,P){let Z=`${E}/${P}`;return ct.has(Z)?ct.get(Z):G.readSourceData(E,P)},ingestSourceDataStaged(E,P,Z,Nt){G.ingestSourceDataStaged(E,P,Z,Nt);},commitSourceData(E,P,Z){let Nt=`${E}/.staged/${Z}/${P}`,Kt=e.blobStorage("sources").read(Nt);if(Kt==null)return false;let Pt=`${E}/${P}`,Qt=Kt.trim();try{ct.set(Pt,JSON.parse(Qt));}catch{ct.set(Pt,Qt);}return dt.push({cardId:E,outputFile:P,deliveryToken:Z}),true},hasSource(E,P){let Z=`${E}/${P}`;return ct.has(Z)?true:G.hasSource(E,P)}},lt={cardStore:m(),cardRuntimeStore:W,fetchedSourcesStore:vt,outputStore:p(),executionRequestStore:k},kt=y(),It=fe(kt.graph),{events:$t,newCursor:Et}=f().readEntriesAfterCursor(kt.lastDrainedJournalId),Ot=[],Yt=[],H=[],At=new Map,Ae=(E,P)=>{Ot.push({type:"task-completed",taskName:E,data:P,timestamp:ut()});try{l().stream("exec-history").append({taskName:E,status:"completed",completedAt:ut()});}catch{}},Zt=(E,P)=>{A({type:"task-failed",taskName:E,error:P,timestamp:ut()});try{l().stream("exec-history").append({taskName:E,status:"failed",error:P,completedAt:ut()});}catch{}},Mt=Be(It,{handlers:{"card-handler":yr(t,Et,lt,Ae,Zt,(E,P)=>{Yt.push({cardId:E,values:P});},E=>{H.push(E);})}});for(Ot=$t;Ot.length>0;){let E=Ot;Ot=[];for(let P of E)if(P.type==="task-restart"){let Z=lt.cardStore.readCard(P.taskName);Z&&At.set(P.taskName,Z);}Mt.pushAll(E),await Mt.waitForHandlers();}let Vt=Mt.getState();await Mt.dispose({wait:true});let Ht=u().readSnapshot(t.value).version;b({lastDrainedJournalId:Et,graph:ee(Vt)},Ht);for(let{cardId:E,values:P}of Yt)lt.outputStore.writeComputedValues(E,P);for(let E of H)lt.outputStore.writeDataObjects(E);for(let[E,P]of Y)I.writeRuntime(E,P);for(let{cardId:E,outputFile:P,deliveryToken:Z}of dt)G.commitSourceData(E,P,Z);let Gt;try{Gt=ye(n,Vt),lt.outputStore.writeStatusSnapshot(Gt);}catch(E){r(`[board-live-cards-public] status publish failed: ${E instanceof Error?E.message:String(E)}`);}let Bt=[];for(let{cardId:E,values:P}of Yt)Bt.push({kind:"computed_values",cardId:E,values:P});for(let E of H)for(let[P,Z]of Object.entries(E))P&&Bt.push({kind:"data_object",key:P,payload:Z});for(let[E,P]of At)Bt.push({kind:"card_refreshed",cardId:E,card:P});Gt!==void 0&&Bt.push({kind:"status",status:Gt}),o(Bt);let Te=a().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:rt({kind:"built-in",value:"source-cli-task-executor"})};k.dispatchEntriesForJournalId(Et,E=>{if(E.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${E.taskKind}" \u2014 skipping`);return}let P=E.payload,Z=P.enrichedCard?.id??"unknown",Nt=P.enrichedCard?.source_defs??[];for(let _t of Nt){if(!_t.outputFile){r(`[dispatch] source "${_t.bindTo}" has no outputFile \u2014 skipping`);continue}let Kt=jn({cbk:P.callbackToken,rg:t.value,br:rt(t),cid:Z,b:_t.bindTo,d:_t.outputFile,cs:void 0,rqt:P.rqt});e.dispatchExecution(Te,{source_def:_t,base_ref:rt(t),callback:{token:Kt,via:e.selfRef}}).catch(Pt=>Zt(Z,Pt instanceof Error?Pt.message:String(Pt)));}});}async function C(){try{let _=()=>{let I=y(),{events:G}=f().readEntriesAfterCursor(I.lastDrainedJournalId);G.length<=0||(C(),e.requestProcessAccumulated?.());},k=await qe(e.lock,O,_);return ot({ran:k!==!1})}catch(_){return st(_)}}function w(){C(),e.requestProcessAccumulated?.();}function M(_){try{let k=_.params?.cardStoreRef;if(!k)return et("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!h()){let ct=le($e);b({lastDrainedJournalId:"",graph:ee(ct)},null);}let I=_.params?.outputsStoreRef;if(!I)return et("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let G=_.params?.scratchStoreRef,Y=_.params?.archiveStoreRef,W=a();W.writeCardStoreRef(k),W.writeOutputsStoreRef(I),G&&W.writeScratchStoreRef(G),Y&&W.writeArchiveStoreRef(Y);let dt=_.body??{};dt["task-executor-ref"]&&W.writeTaskExecutorRef(dt["task-executor-ref"]),Object.prototype.hasOwnProperty.call(dt,"chat-handler-flow")&&W.writeChatHandlerFlow(dt["chat-handler-flow"]);try{p().writeStatusSnapshot(ye(n,fe(y().graph)));}catch{}return ot()}catch(k){return st(k)}}function B(_){try{let k=p().readStatusSnapshot();if(!k){k=ye(n,fe(y().graph));try{p().writeStatusSnapshot(k);}catch{}}return ot(k)}catch(k){return st(k)}}function T(_){try{let k=_.params?.id;return k?(A({type:"task-removal",taskName:k,timestamp:ut()}),w(),ot()):et("removeCard requires params.id")}catch(k){return st(k)}}function x(_){try{let k=_.params?.id;return k?(A({type:"task-restart",taskName:k,timestamp:ut()}),w(),ot()):et("retrigger requires params.id")}catch(k){return st(k)}}async function j(_){return C()}function D(_){try{let k=_.params?.cardId,I=_.params?.all,G=!!_.params?.restart;if(!k&&!I)return et("upsertCard requires --card-id <id> or --all");let Y=I?m().readAllCards().map(W=>W.id):[k];for(let W of Y)if(!m().readCard(W))return et(`Card "${W}" not found in board at ${t.value}`);for(let W of Y){let dt=m().readCard(W),ct=br(dt),vt=e.hashFn(ct),lt=e.kvStorage("card-upsert"),kt=lt.read(W),It=kt?.taskConfigHash!==vt;if(!(!It&&!G)){if(It){let $t=kt?.blobRef??m().readCardKey(W)??W;A({type:"task-upsert",taskName:W,taskConfig:ct,timestamp:ut()}),lt.write(W,{blobRef:$t,taskConfigHash:vt,updatedAt:ut()});}G&&A({type:"task-restart",taskName:W,timestamp:ut()});}}return w(),ot()}catch(k){return st(k)}}function U(_){try{let k=_.params?.token;if(!k)return et("taskFailed requires params.token");let I=_.params?.error??"unknown error",G=ke(k);if(!G)return et("Invalid callback token");A({type:"task-failed",taskName:G.taskName,error:I,timestamp:ut()});try{l().stream("exec-history").append({taskName:G.taskName,status:"failed",error:I,completedAt:ut()});}catch{}return w(),ot()}catch(k){return st(k)}}function z(_){try{let k=_.params?.token;if(!k)return et("taskProgress requires params.token");let G=(_.body??{}).update??{},Y=ke(k);return Y?(A({type:"task-progress",taskName:Y.taskName,update:G,timestamp:ut()}),w(),ot()):et("Invalid callback token")}catch(k){return st(k)}}function it(_){try{let k=_.params?.token,I=_.params?.ref;if(!k)return et("sourceDataFetched requires params.token");if(!I)return et("sourceDataFetched requires params.ref");let G=Cr(k);if(!G)return et("Invalid source token");let{cbk:Y,cid:W,b:dt,d:ct,cs:vt,rqt:lt}=G,kt=je(e.blobStorage("sources"),Ot=>e.resolveBlob(Ot)),It=e.genId();kt.ingestSourceDataStaged(W,ct,Rt(I),It);let $t=ke(Y);if(!$t)return et("Invalid callback token embedded in source token");let Et=ut();return A({type:"task-progress",taskName:$t.taskName,update:{bindTo:dt,outputFile:ct,fetchedAt:Et,deliveryToken:It,sourceChecksum:vt,rqt:lt},timestamp:Et}),w(),ot()}catch(k){return st(k)}}function at(_){try{let k=_.params?.token,I=_.params?.reason??"unknown";if(!k)return et("sourceDataFetchFailure requires params.token");let G=Cr(k);if(!G)return et("Invalid source token");let{cbk:Y,b:W,d:dt,cs:ct,rqt:vt}=G,lt=ke(Y);return lt?(A({type:"task-progress",taskName:lt.taskName,update:{bindTo:W,outputFile:dt,failure:!0,reason:I,sourceChecksum:ct,rqt:vt},timestamp:ut()}),w(),ot()):et("Invalid callback token embedded in source token")}catch(k){return st(k)}}function qt(_){try{let k=a().readCardStoreRef();return k?ot({storeRef:k}):et(`Board at ${t.value} has no card store configured`)}catch(k){return st(k)}}function Jt(_){try{let k=a().readOutputsStoreRef();return k?ot({storeRef:k}):et(`Board at ${t.value} has no outputs store configured`)}catch(k){return st(k)}}function Tt(_){try{let k=a().readScratchStoreRef();return ot({storeRef:k})}catch(k){return st(k)}}function pt(_){try{let k=a().readArchiveStoreRef();return ot({storeRef:k})}catch(k){return st(k)}}function F(_){try{let k=_.params?.key;if(!k)return et("getConfig requires params.key");let I=a(),G;switch(k){case "task-executor":G=I.readTaskExecutorRef()??null;break;case "chat-handler-flow":G=I.readChatHandlerFlow()??null;break;case "card-store-ref":G=I.readCardStoreRef();break;case "outputs-store-ref":G=I.readOutputsStoreRef();break;case "scratch-store-ref":G=I.readScratchStoreRef();break;case "archive-store-ref":G=I.readArchiveStoreRef();break;default:return et(`getConfig: unknown key "${k}"`)}return ot({value:G})}catch(k){return st(k)}}function L(_){try{let k=_.params?.key;if(!k)return et("getOutputsDataObject requires params.key");let I=p().readDataObject(k);return ot(I)}catch(k){return st(k)}}function X(_){try{return ot(p().readAllDataObjects())}catch(k){return st(k)}}function nt(_){try{let k=_.params?.key;if(!k)return et("getOutputsComputedValues requires params.key");let I=p().readComputedValues(k);return ot(I)}catch(k){return st(k)}}function yt(_){try{return ot(p().readAllComputedValues())}catch(k){return st(k)}}return {init:M,status:B,getCardStoreRef:qt,getOutputsStoreRef:Jt,getScratchStoreRef:Tt,getArchiveStoreRef:pt,getConfig:F,getOutputsDataObject:L,getAllOutputsDataObjects:X,getOutputsComputedValues:nt,getAllOutputsComputedValues:yt,removeCard:T,retrigger:x,processAccumulatedEvents:j,upsertCard:D,taskFailed:U,taskProgress:z,sourceDataFetched:it,sourceDataFetchFailure:at}}function vr(t){function e(o){return {status:"success",data:o}}function r(o){return {status:"fail",error:o}}function n(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let i=t.readCard(s);return i?e({cards:[i]}):r(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return n(s)}},set(o){try{let s=o.body;if(s==null)return r("set requires a body (card object or array of cards)");let i=Array.isArray(s)?s:[s];for(let a of i){if(typeof a.id!="string")return r("each card must have a string `id` field");t.writeCard(a.id,a);}return e({count:i.length})}catch(s){return n(s)}},del(o){try{let s=o.body?.ids??[],i=o.params?.id,a=i?[...s,i]:s;if(a.length===0)return r("del requires body.ids (string[]) or params.id");for(let u of a)t.removeCard(u);return e({count:a.length})}catch(s){return n(s)}},patch(o){try{let s=o.params?.id,i=o.params?.path;if(!s)return r("patch requires params.id");if(!i)return r("patch requires params.path");let a=o.body,u=a&&Object.prototype.hasOwnProperty.call(a,"value")?a.value:o.body;return t.patchCard(s,i,u),e({count:1})}catch(s){return n(s)}}}}function Ar(){return new Date().toISOString()}function _r(t){return new TextEncoder().encode(t).byteLength}function $n(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function Nn(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function Pn(t){let e=String(t||"").trim();if(!e)return "upload.bin";let r=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (r>=0?e.slice(r+1):e)||"upload.bin"}function Dn(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Fn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Ln(t){let e=Pn(t),r=e.lastIndexOf(".");return r<=0||r===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,r),ext:e.slice(r)}}function qn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function xr(t){function e(r){let n=t.stat?$n(t.stat(r)):null;if(n)return n;if(!t.exists(r))return null;let o=t.read(r);return o===null?{key:r}:{key:r,size:_r(o)}}return {exists(r){return t.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){t.write(r,n);let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Ar(),s.size=s.size??_r(n),s},putBytes(r,n,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});t.write(r,i);}let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Ar(),s.size=s.size??n.byteLength,s},getText(r){let n=t.read(r);if(n===null){if(!t.readBytes)return null;let o=t.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(t.readBytes){let o=t.readBytes(r);if(o!==null)return o}let n=t.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:e,list(r=""){return t.listKeys(r).map(n=>e(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){t.remove(r);}}}function Tr(t){function e(o,s){let i=0,a=[];Array.isArray(s)&&a.push(...s);for(let u of t.list(`${o}/`))a.push(qn(u.key));for(let u of a){let f=Nn(u);Number.isFinite(f)&&f>i&&(i=f);}return i+1}function r(o,s,i){let a=Number(i?.maxLen||32),{stem:u,ext:f}=Ln(o),m=Fn(f),p=Dn(u),l=`${String(s).padStart(3,"0")}-`,h=m,y=a-l.length-h.length;y<1&&(h="",y=a-l.length);let b=p.slice(0,Math.max(1,y)),A=`${l}${b}${h}`;return A.length>a&&(A=A.slice(0,a).replace(/\.$/,"")),A}function n(o,s,i){let a=e(o,i?.seedNames),u=r(s,a,{maxLen:i?.maxLen});for(;t.exists(`${o}/${u}`);)a+=1,u=r(s,a,{maxLen:i?.maxLen});return u}return {nextSerial:e,buildStoredName:r,allocateStoredName:n}}function Ir(){function t(o,s){if(!Array.isArray(o))return [];let i=[];for(let a of o){if(!a||typeof a!="object")continue;let u=a;typeof u.stored_name=="string"&&i.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:s||null,chat:u.chat===true});}return i}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function r(o,s){let i=e(o);if(s.length===0)return o.files=i,i;let a=new Set(i.map(u=>u.stored_name));for(let u of s)a.has(u.stored_name)||(i.push(u),a.add(u.stored_name));return o.files=i,i}function n(o,s,i){let a=e(o);if(!Number.isInteger(s)||s<0||s>=a.length)return {ok:false,reason:"index_out_of_range"};let u=a[s];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:i&&i!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:e,normalizeIncoming:t,merge:r,resolve:n}}function Er(t){return String(t).replace(/[^a-zA-Z0-9_-]/g,"_")}function Or(t){let e=t.payload??{};return {id:t.id,role:typeof e.role=="string"?e.role:"system",text:typeof e.text=="string"?e.text:"",files:Array.isArray(e.files)?e.files:[],updated_at:typeof e.updated_at=="string"?e.updated_at:""}}function Br(t,e){let r=o=>`chats/${Er(o)}/processing`,n=o=>`chats/${Er(o)}/config`;return {append(o,s,i,a=[]){return t(o).append({role:s,text:i,files:a,updated_at:new Date().toISOString()}).id},readAll(o){return t(o).readAll().map(Or)},readAfter(o,s){let i=t(o).readAfter(s);return {records:i.entries.map(Or),cursor:i.newCursor}},clear(o){t(o).clear?.();},setProcessing(o,s){s?e.write(r(o),true):e.delete(r(o));},isProcessing(o){return e.read(r(o))===true},getConfig(o){return e.read(n(o))??{}},setConfig(o,s){let i=e.read(n(o))??{};e.write(n(o),{...i,...s});}}}function Mn(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function jr(){let t=new Map,e=new Map;function r(n){return t.has(n)||t.set(n,[]),t.get(n)}return {append(n,o,s,i=[]){let a={id:Mn(),role:o,text:s,files:i,updated_at:new Date().toISOString()};return r(n).push(a),a.id},readAll(n){return r(n).slice()},readAfter(n,o){let s=r(n);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let i=s.findIndex(u=>u.id===o),a=i===-1?s.slice():s.slice(i+1);return {records:a,cursor:a.length>0?a[a.length-1].id:o}},clear(n){t.set(n,[]);},setProcessing(n,o){o?e.set(`p:${n}`,true):e.delete(`p:${n}`);},isProcessing(n){return e.get(`p:${n}`)===true},getConfig(n){return e.get(`c:${n}`)??{}},setConfig(n,o){let s=e.get(`c:${n}`)??{};e.set(`c:${n}`,{...s,...o});}}}function $r(t){function e(a){return {status:"success",data:a}}function r(a){return {status:"fail",error:a}}function n(a){return {status:"error",error:a instanceof Error?a.message:String(a)}}function o(a,u="command envelope"){let f=typeof a.cardId=="string"?a.cardId:void 0;if(!a.command)return r(`chat-store: ${u} missing "command"`);if(!f)return r(`chat-store: ${u} missing "cardId"`);if(a.command==="append")return i.append({params:{cardId:f},body:{role:a.role,text:a.text,files:a.files}});if(a.command==="read-all")return i.readAll({params:{cardId:f}});if(a.command==="read-after")return i.readAfter({params:{cardId:f},body:{cursor:a.cursor??null}});if(a.command==="clear")return i.clear({params:{cardId:f}});if(a.command==="set-processing")return i.setProcessing({params:{cardId:f},body:{active:a.active}});if(a.command==="is-processing")return i.isProcessing({params:{cardId:f}});if(a.command==="get-config")return i.getConfig({params:{cardId:f}});if(a.command==="set-config"){let{command:m,cardId:p,...l}=a;return i.setConfig({params:{cardId:f},body:l})}return r(`chat-store: unknown command "${String(a.command)}"`)}function s(a){if(!Array.isArray(a.commands)||a.commands.length===0)return r('chat-store: command envelope must include a non-empty "commands" array');let u=[];for(let f=0;f<a.commands.length;f+=1){let m=a.commands[f];if(!m||typeof m!="object"||Array.isArray(m))return r(`chat-store: command envelope entry ${f} must be an object`);let p={cardId:a.cardId,...m},l=o(p,`command envelope entry ${f}`);if(l.status!=="success")return l;u.push({index:f,command:String(p.command),data:l.data});}return e({results:u})}let i={append(a){try{let u=a.params?.cardId;if(!u)return r("append requires params.cardId");let f=a.body??{},m=typeof f.role=="string"?f.role:"",p=typeof f.text=="string"?f.text:"",l=Array.isArray(f.files)?f.files:[];if(!m)return r("append requires body.role");let h=t.append(u,m,p,l);return e({id:h})}catch(u){return n(u)}},readAll(a){try{let u=a.params?.cardId;return u?e({records:t.readAll(u)}):r("readAll requires params.cardId")}catch(u){return n(u)}},readAfter(a){try{let u=a.params?.cardId;if(!u)return r("readAfter requires params.cardId");let m=(a.body??{}).cursor??null;return e(t.readAfter(u,m))}catch(u){return n(u)}},clear(a){try{let u=a.params?.cardId;return u?(t.clear(u),e({ok:!0})):r("clear requires params.cardId")}catch(u){return n(u)}},setProcessing(a){try{let u=a.params?.cardId;if(!u)return r("setProcessing requires params.cardId");let f=a.body??{};return typeof f.active!="boolean"?r("setProcessing requires body.active (boolean)"):(t.setProcessing(u,f.active),e({ok:!0}))}catch(u){return n(u)}},isProcessing(a){try{let u=a.params?.cardId;return u?e({active:t.isProcessing(u)}):r("isProcessing requires params.cardId")}catch(u){return n(u)}},getConfig(a){try{let u=a.params?.cardId;return u?e({config:t.getConfig(u)}):r("getConfig requires params.cardId")}catch(u){return n(u)}},setConfig(a){try{let u=a.params?.cardId;if(!u)return r("setConfig requires params.cardId");let f=a.body??{};return t.setConfig(u,f),e({ok:!0})}catch(u){return n(u)}},run:o,runBatch:s};return i}var Gn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Un=32;function Jn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Nr(t){if(!t||typeof t!="object")return false;let e=t.summary;return !e||typeof e!="object"?false:Number(e.card_count||0)>0}function Pr(t,e){if(!e||typeof e!="object")return;let r=e;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)Pr(t,n);return}r.kind==="status"&&Nr(r.status)&&(t.status=r.status),r.kind==="computed_values"&&r.cardId&&(t.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(t.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(t.cards[r.cardId]=r.card);}function Dr(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),r={...Gn,...t.corsHeaders||{}},n=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,i=t.chatFlowRunner||null,a=t.chatStorage??jr(),u=$r(a),f=t.notificationTransport||null,m=t.serverUrl||null,p=t.executionExtra||{},l=t.onSseClientConnected,h=t.onSseClientDisconnected,y=t.onChannelSubscribed,b=t.onChannelUnsubscribed,A=new Map,O=new Map,C=new Map,w=null;function M(c){let d=wr(c.baseRef,c.boardAdapter),g=c.boardAdapter.kvStorageForRef(c.cardStoreRef),R=vr(me({readIndex:()=>g.read("_index"),writeIndex:N=>g.write("_index",N),readCard:N=>g.read(N),writeCard:(N,K)=>(g.write(N,K),N),cardExists:N=>g.read(N)!==null,defaultCardKey:N=>N},o.warn)),v=c.artifactsAdapter||c.boardAdapter,$=c.filesArtifactsStore??null,q=null;return {label:c.label,board:d,cardStore:R,get filesArtifacts(){return q??(q=$??xr(v.blobStorage("files")))},boardAdapter:c.boardAdapter,cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef,scratchStoreRef:c.scratchStoreRef,archiveStoreRef:c.archiveStoreRef,notifyRef:c.notifyRef,taskExecutorRef:c.taskExecutorRef,chatHandlerRef:c.chatHandlerRef,chatHandlerFlow:c.chatHandlerFlow,inferenceAdapterRef:c.inferenceAdapterRef,notification:Jn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let B=t.boards.map(M),T=new Map;function x(c){return T.get(c)??0}function j(c){let d=B[x(c)];return {files:d?d.filesArtifacts:null}}function D(c){let d=j(c);return d.files?Tr(d.files):null}function U(){return Ir()}function z(c){return String(c||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function it(c){if(!c||c.notificationTeardown||!f||!c.notifyRef)return;let d=await f.subscribe(c.notifyRef,g=>{Pr(c.notification,g);let S=g.kind==="notification-batch"?g.notifications:[g];Qt(S);});c.notificationTeardown=d;}async function at(c){if(!c||c.initialized)return;let d={cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef};c.scratchStoreRef&&(d.scratchStoreRef=c.scratchStoreRef),c.archiveStoreRef&&(d.archiveStoreRef=c.archiveStoreRef);let g={};c.taskExecutorRef&&(g["task-executor-ref"]=c.taskExecutorRef),c.chatHandlerFlow!==void 0&&(g["chat-handler-flow"]=c.chatHandlerFlow),c.inferenceAdapterRef&&(g["inference-adapter-ref"]=c.inferenceAdapterRef);let S=c.board.init({params:d,body:g});if(S.status!=="success")throw Object.assign(new Error(S.error||`init failed for ${c.label}`),{statusCode:500});if(await it(c),!c.chatHandlerFlow&&c.chatHandlerRef&&s.describe)try{let R=await s.describe(c.chatHandlerRef);R&&R.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${R.kind}", expected "chat-handler" for ${c.label}`):R&&o.info(`[init] chat-handler validated: ${R.name} (protocol ${R.protocolVersion}) for ${c.label}`);}catch(R){o.warn(`[init] chat-handler describe failed for ${c.label}: ${R?.message||String(R)}`);}c.initialized=true;}function qt(c){if(!c.boardAdapter.publishBoardChangeNotifications)return;let d=[],g=c.board.status({});g.status==="success"&&g.data!=null&&Nr(g.data)&&d.push({kind:"status",status:g.data});let S=c.board.getAllOutputsDataObjects({});if(S.status==="success"&&S.data!=null)for(let[v,$]of Object.entries(S.data))v&&d.push({kind:"data_object",key:v,payload:$});let R=c.board.getAllOutputsComputedValues({});if(R.status==="success"&&R.data!=null)for(let[v,$]of Object.entries(R.data))v&&d.push({kind:"computed_values",cardId:v,values:$});d.length>0&&c.boardAdapter.publishBoardChangeNotifications(d);}function Jt(c,d){if(!c||c.cardsBootstrapped)return;let g=c.cardStore.get({}),S=g.status==="success"&&Array.isArray(g.data?.cards)?g.data.cards:[];for(let R of S)typeof R.id=="string"&&(T.set(R.id,d),c.board.upsertCard({params:{cardId:R.id}}));c.cardsBootstrapped=true;}async function Tt(){for(let c of B)await at(c);}async function pt(){await Tt();for(let c=0;c<B.length;c++)qt(B[c]),Jt(B[c],c);}function F(c){return B[x(c)]??null}function L(c){let d=F(c);if(!d)return null;let g=d.cardStore.get({params:{id:c}});if(g.status!=="success")return null;let S=Array.isArray(g.data?.cards)?g.data.cards:[];return S.length>0?S[0]:null}function X(){let c=g=>{if(!g||!g.cardStore)return [];let S=g.cardStore.get({});return S.status!=="success"||!Array.isArray(S.data?.cards)?[]:S.data.cards},d=[];for(let g of B)d.push(...c(g));return d}function nt(){let c=B.map(v=>{try{let q=v.boardAdapter.kvStorageForRef(v.outputsStoreRef).read("status");if(q!=null)return q}catch{}return v.notification.status}).filter(Boolean);if(c.length===0)return null;if(c.length===1)return c[0];let d=[],g=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],S={};for(let v of g)S[v]=0;for(let v of c){let $=v,q=Array.isArray($.cards)?$.cards:[];d.push(...q);for(let N of g)S[N]+=Number($?.summary?.[N]||0);}let R=c[0];return {...R,cards:d,summary:{...R.summary||{},card_count:d.length,...S}}}function yt(){let c={},d=g=>{for(let[S,R]of Object.entries(g.notification.computedValues)){let v=g.notification.cards[S];c[S]={schema_version:"v1",card_id:S,card_data:v?.card_data??{},computed_values:R??{}};}};for(let g of B)d(g);return c}function _(){let c={};for(let d of B)Object.assign(c,d.notification.dataObjects||{});return c}function k(){let c=X(),d=yt(),g=_(),S={};for(let v of c){if(!v?.id)continue;let $=v.id,q=d[$]||{},N={...q.card_data&&typeof q.card_data=="object"?q.card_data:v.card_data&&typeof v.card_data=="object"?v.card_data:{}};S[$]={schema_version:q.schema_version||"v1",card_id:q.card_id||$,card_data:N,computed_values:q.computed_values&&typeof q.computed_values=="object"?q.computed_values:{}};}let R={};for(let v of c){if(!v?.id)continue;let $=v.id;try{let q=kt($),N=a.isProcessing($);(q.length>0||N)&&(R[$]={messages:q.map(K=>({role:String(K.role||"system"),text:String(K.text||""),files:Array.isArray(K.files)?K.files:[]})),receiving:!1,processing:N});}catch{}}return {boardId:n,cardDefinitions:c,statusSnapshot:nt(),dataObjectsByToken:g,cardRuntimeById:S,cardChatsByCardId:R}}function I(c,d,g){let S=g?.syncBoard!==false,R=g?.restartOnlyIfChanged===true,v=F(c);if(!v)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let $=L(c);if(!$)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let q=R?JSON.stringify($):null,N=d($)||$;if(R&&JSON.stringify(N)===q)return;let K=v.cardStore.set({body:N});if(K.status!=="success")throw Object.assign(new Error(K.error||`Failed to persist card: ${c}`),{statusCode:500});if(S){let Q=v.board.upsertCard({params:{cardId:c,restart:true}});if(Q.status!=="success")throw Object.assign(new Error(Q.error||`Failed to upsert card: ${c}`),{statusCode:500})}}function G(c,d){I(c,d,{syncBoard:true});}function Y(c,d){I(c,d,{syncBoard:false});}function W(c){let d=F(c);if(!d)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});if(!L(c))throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let S=d.board.upsertCard({params:{cardId:c,restart:true}});if(S.status!=="success")throw Object.assign(new Error(S.error||`Failed to retrigger card: ${c}`),{statusCode:500})}function dt(c,d){I(c,g=>{if(!d||typeof d!="object"||Object.keys(d).length===0)return g;function S(R,v,$){let q=String(v||"").split(".").filter(Boolean);if(!q.length)return;let N=R;for(let K=0;K<q.length-1;K++){let Q=q[K];(!N[Q]||typeof N[Q]!="object")&&(N[Q]={}),N=N[Q];}N[q[q.length-1]]=$;}if(d.fieldValues!==void 0&&d.fieldValues!==null){let R=null,v=g.view;if(v&&Array.isArray(v.elements)){for(let $ of v.elements)if($?.data&&$.data.writeTo){R=$.data.writeTo;break}}R?S(g,R,d.fieldValues):typeof d.fieldValues=="object"&&!Array.isArray(d.fieldValues)&&(g.card_data={...g.card_data||{},...d.fieldValues});}else {if(Array.isArray(d._stagedFiles)&&d._stagedFiles.length>0)return g;for(let[R,v]of Object.entries(d))R!=="_stagedFiles"&&(v!==null&&typeof v=="object"&&!Array.isArray(v)&&g[R]!==null&&typeof g[R]=="object"&&!Array.isArray(g[R])?g[R]={...g[R],...v}:g[R]=v);}return g},{syncBoard:true,restartOnlyIfChanged:true});}function ct(c){let d=String(c||"").trim();if(!d)return "upload.bin";let g=Math.max(d.lastIndexOf("/"),d.lastIndexOf("\\"));return (g>=0?d.slice(g+1):d)||"upload.bin"}function vt(c){a.clear(c),a.setProcessing(c,false);}function lt(c,d,g,S){let R=typeof g=="string"?g.trim():"";return a.append(c,d,R,S)}function kt(c){return a.readAll(c)}function It(c){let d=[];try{let g=L(c);if(!g)return d;let S=U().read(g.card_data&&typeof g.card_data=="object"?g.card_data:null);for(let R of S)d.push(R.stored_name);}catch{}return d}function $t(c,d,g,S){let R=z(c),v=j(c),$=ct(d),q=D(c),N=q?q.allocateStoredName(R,$,{seedNames:It(c),maxLen:Un}):`${String(Date.now())}-${$}`;return v.files&&v.files.putBytes(`${R}/${N}`,new Uint8Array(S),g||"application/octet-stream"),{name:$,stored_name:N,size:S.length,mime_type:g||"application/octet-stream",uploaded_at:new Date().toISOString()}}function Et(c){let d=F(c);if(!d)return null;let g=d.board.getConfig({params:{key:"chat-handler-flow"}}),S=g.status==="success"?g.data?.value:null,R=d.chatHandlerRef;return S==null&&(!R||typeof R!="object")?null:{ctx:d,handlerFlow:S,handlerRef:R}}function Ot(c,d,g=false){let S=Et(c);if(!S)return;let{ctx:R,handlerFlow:v,handlerRef:$}=S;if(!g)try{a.setProcessing(c,!0);}catch{}let q={boardId:n,cardId:String(c),lastChatEntryId:d,...p,...m?{serverUrl:m}:{}};if(!i&&v!=null){try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${c}" but no chatFlowRunner was provided`);return}if(v!=null){let K=i;if(!K)return;K.run(v,q,{boardId:n,cardId:String(c),label:R.label,logger:o,serverUrl:m,executionExtra:p}).then(Q=>{if(Q.dispatched)o.info(`[chat-handler-flow] invoked for card "${c}" (boardId: "${n}")`);else {try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${c}": ${Q.error||"unknown"}`);}},Q=>{try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${c}": ${Q?.message||String(Q)}`);});return}let N=$;N&&s.invoke(N,q).then(K=>{if(K.dispatched)o.info(`[chat-handler] invoked for card "${c}" (boardId: "${n}")`);else {try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${c}": ${K.error||"unknown"}`);}},K=>{try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${c}": ${K?.message||String(K)}`);});}function Yt(c,d,g){let S=d==="chat-send"?Y:G,R;S(c,v=>{let $=new Date().toISOString(),q=v.card_data&&typeof v.card_data=="object"?v.card_data:{};if(v.card_data=q,d==="chat-send"){let N=g&&typeof g.text=="string"?g.text.trim():"",K=[];if(Array.isArray(g?.files)){for(let Q of g.files)if(Q){if(typeof Q=="string"){K.push({name:Q});continue}if(typeof Q=="object"){let mt=Q;typeof mt.name=="string"&&K.push({name:mt.name,size:mt.size,mime_type:mt.mime_type,uploaded_at:mt.uploaded_at,stored_name:mt.stored_name,chat:mt.chat===true});}}}if(N||K.length>0){let Q=u.runBatch({cardId:c,commands:[{command:"append",role:"user",text:N,files:K},{command:"set-processing",active:true}]});if(Q.status!=="success")throw new Error(Q.error);let mt=Q.data.results[0]?.data?.id;if(typeof mt!="string"||!mt)throw new Error(`chat-send did not return an append id for card ${c}`);R={cardId:c,lastEntryId:mt,processingAlreadySet:true};try{let ae=kt(c);Qt([{kind:"card_chats",cardId:c,messages:ae.map(Dt=>({role:String(Dt.role||"system"),text:String(Dt.text||""),files:Array.isArray(Dt.files)?Dt.files:[]})),receiving:!0,processing:a.isProcessing(c)}]);}catch{}}return v}if(d==="file-upload"){let N=U().normalizeIncoming(g?.files,$);return N.length>0&&U().merge(q,N),v}if(d==="action"){let N=g&&typeof g.buttonId=="string"?g.buttonId:"";if(!N)return v;q.lastAction={buttonId:N,at:$},q.lastActionText=`${N} @ ${$}`;}return v}),R&&Ot(R.cardId,R.lastEntryId,R.processingAlreadySet);}function H(c,d,g){let S=JSON.stringify(g),R=typeof Buffer<"u"?Buffer.byteLength(S):new TextEncoder().encode(S).length;c.writeHead(d,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":R}),c.end(S);}async function At(c){let d=[];for await(let S of c)d.push(S);let g=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(Zt(d)).trim();return g?JSON.parse(g):{}}async function Ae(c){let d=[];for await(let g of c)d.push(g);return typeof Buffer<"u"?Buffer.concat(d):Zt(d)}function Zt(c){let d=c.reduce((R,v)=>R+v.length,0),g=new Uint8Array(d),S=0;for(let R of c)g.set(R,S),S+=R.length;return g}let _e=0;function xe(c){let d=JSON.stringify(c);return _e++,`id: ${_e}
|
|
1
|
+
var BoardLiveCardsLocalStorage=(function(exports){'use strict';var tn=Object.defineProperty;var en=(t,e,r)=>e in t?tn(t,e,{enumerable:true,configurable:true,writable:true,value:r}):t[e]=r;var Me=(t,e,r)=>en(t,e+"",r);var fe="b64:";function rn(t){let e=new TextEncoder().encode(t),r=globalThis.Buffer,n;if(r)n=r.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function nn(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),r=globalThis.Buffer;if(r)return r.from(e,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(e),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function st(t){return `${fe}${rn(JSON.stringify(t))}`}function wt(t){if(!t.startsWith(fe))throw new Error(`Invalid ref format (expected ${fe}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(nn(t.slice(fe.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!e||typeof e!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let r=e;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:r.kind,value:r.value}}async function Ge(t,e,r){let n=t.tryAcquire();if(!n)return false;try{await e();}finally{n();}return r?.(),true}var $t={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function kt(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function Nt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function Ue(t){return t.tasks??{}}function Oe(t){return t?t.status===$t.FAILED||t.status===$t.INACTIVATED:false}function Je(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function Ve(t){return t.maxExecutions}function He(t,e){let r=new Set;for(let[n,o]of Object.entries(e))if(o.status===$t.COMPLETED){let s=t.tasks[n];s&&kt(s).forEach(a=>r.add(a));}return Array.from(r)}function Ke(t,e){let r={};return t.forEach(n=>{let o=e[n];if(!o)return;kt(o).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function ze(t,e,r){let n=t.tasks[e]??ge(),o={};if(r){let i=r.tasks[e],a=Nt(i);for(let u of a)for(let[f,m]of Object.entries(r.tasks))if(kt(m).includes(u)){let p=t.tasks[f];p?.lastDataHash&&(o[u]=p.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function We(t,e,r,n,o,s){let i=t.tasks[r]??ge(),a=e.tasks[r];if(!a)throw new Error(`Task "${r}" not found in graph`);let u;n&&a.on&&a.on[n]?u=a.on[n]:u=kt(a);let f=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let l=a.requires??[];for(let y of l)for(let[S,C]of Object.entries(e.tasks))if(kt(C).includes(y)){let _=t.tasks[S];_?.lastDataHash&&(f[y]=_.lastDataHash);break}}let m={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:f,error:void 0},p=[...new Set([...t.availableOutputs,...u])];return {...t,tasks:{...t.tasks,[r]:m},availableOutputs:p,lastUpdated:new Date().toISOString()}}function Xe(t,e,r,n){let o=t.tasks[r]??ge(),s=e.tasks[r];if(s?.retry){let u=o.retryCount+1;if(u<=s.retry.max_attempts){let f={...o,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...t,tasks:{...t.tasks,[r]:f},lastUpdated:new Date().toISOString()}}}let i={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},a=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(a=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&i.executionCount>=s.circuit_breaker.max_executions){let u=s.circuit_breaker.on_break;a=[...new Set([...a,...u])];}return {...t,tasks:{...t.tasks,[r]:i},availableOutputs:a,lastUpdated:new Date().toISOString()}}function Ye(t,e,r,n){let o=t.tasks[e]??ge(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function Ze(t,e){let r=t.tasks[e];if(!r)return t;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:n},lastUpdated:new Date().toISOString()}}function ge(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function pe(t,e){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(t.tasks))n[s]=tr();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function on(t,e){let{config:r,state:n}=t;if("executionId"in e&&e.executionId&&e.executionId!==n.executionId)return t;switch(e.type){case "task-started":return {config:r,state:ze(n,e.taskName,r)};case "task-completed":return {config:r,state:We(n,r,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:r,state:Xe(n,r,e.taskName,e.error)};case "task-progress":return {config:r,state:Ye(n,e.taskName,e.message,e.progress)};case "task-restart":return {config:r,state:Ze(n,e.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:fn(n,e.action)};case "task-upsert":return sn(t,e.taskName,e.taskConfig);case "task-removal":return an(t,e.taskName);case "node-requires-add":return cn(t,e.nodeName,e.tokens);case "node-requires-remove":return un(t,e.nodeName,e.tokens);case "node-provides-add":return dn(t,e.nodeName,e.tokens);case "node-provides-remove":return ln(t,e.nodeName,e.tokens);default:return t}}function Qe(t,e){return e.reduce((r,n)=>on(r,n),t)}function sn(t,e,r){let n=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:r}},state:{...t.state,tasks:{...t.state.tasks,[e]:n?t.state.tasks[e]:tr()},lastUpdated:new Date().toISOString()}}}function an(t,e){if(!t.config.tasks[e])return t;let{[e]:r,...n}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:n},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function cn(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Nt(n),s=r.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:[...o,...s]}}},state:t.state}}function un(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=Nt(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,requires:s}}},state:t.state}}function dn(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=kt(n),s=r.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:[...o,...s]}}},state:t.state}}function ln(t,e,r){let n=t.config.tasks[e];if(!n)return t;let o=kt(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...n,provides:s}}},state:t.state}}function ee(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function me(t){if(!t||typeof t!="object")throw new Error("Invalid snapshot: expected an object");let e=t;if(!e.config||typeof e.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!e.state||typeof e.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=e.config,n=e.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function tr(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function fn(t,e){let r=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:r};case "pause":return {...t,status:"paused",lastUpdated:r};case "resume":return {...t,status:"running",lastUpdated:r};default:return t}}function re(t){let{config:e,state:r}=t,n=Ue(e);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=gn(n),i=He(e,r.tasks),a=new Set([...i,...r.availableOutputs]),u=[],f=[],m=[],p=[];for(let[y,S]of Object.entries(n)){let C=r.tasks[y],_=Je(S,e.settings),O=_!=="once";if(C?.status===$t.RUNNING||Oe(C))continue;let R=Ve(S);if(R!==void 0&&C&&C.executionCount>=R||S.circuit_breaker&&C&&C.executionCount>=S.circuit_breaker.max_executions||!O&&C?.status===$t.COMPLETED)continue;if(O&&C?.status===$t.COMPLETED){let x=Nt(S),$=false;switch(_){case "data-changed":{x.length>0&&x.some(U=>{for(let[X,ct]of Object.entries(n))if(kt(ct).includes(U)){let it=r.tasks[X];if(!it)continue;let Ft=C.lastConsumedHashes?.[U];return it.lastDataHash==null?it.executionCount>C.lastEpoch:it.lastDataHash!==Ft}return false})||($=true);break}case "epoch-changed":{x.length>0&&x.some(U=>{for(let[X,ct]of Object.entries(n))if(kt(ct).includes(U)){let it=r.tasks[X];if(it&&it.executionCount>C.lastEpoch)return true}return false})||($=true);break}case "time-based":{let D=S.refreshInterval??0;if(D<=0){$=true;break}let U=C.completedAt;if(!U){$=true;break}(Date.now()-Date.parse(U))/1e3<D&&($=true);break}case "manual":$=true;break}if($)continue}let w=Nt(S);if(w.length===0){u.push(y);continue}let G=[],j=[],T=[];for(let x of w){if(a.has(x))continue;let $=s[x]||[];$.length===0?G.push(x):$.every(U=>Oe(r.tasks[U]))?T.push({token:x,failedProducer:$[0]}):j.push(x);}G.length>0?m.push({taskName:y,missingTokens:G}):T.length>0?p.push({taskName:y,failedTokens:T.map(x=>x.token),failedProducers:[...new Set(T.map(x=>x.failedProducer))]}):j.length>0?f.push({taskName:y,waitingOn:j}):u.push(y);}let l={};if(u.length>1){let y=Ke(u,n);for(let[S,C]of Object.entries(y))C.length>1&&(l[S]=C);}return {eligible:u,pending:f,unresolved:m,blocked:p,conflicts:l}}function gn(t){let e={};for(let[r,n]of Object.entries(t)){for(let o of kt(n))e[o]||(e[o]=[]),e[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(r)||e[s].push(r);if(n.on_failure)for(let o of n.on_failure)e[o]||(e[o]=[]),e[o].includes(r)||e[o].push(r);}return e}var ne=class{constructor(){Me(this,"buffer",[]);}append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function Be(t){let e=je(t);return pn(e)}function je(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(je).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(n=>JSON.stringify(n)+":"+je(e[n])).join(",")+"}"}function pn(t){let e=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*r&n;return e.toString(16).padStart(16,"0")}function mn(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),r="";for(let n of e)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function hn(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function er(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return mn(e)}function yn(t){try{let e=JSON.parse(hn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function $e(t,e,r){let{handlers:n,onDrain:o}=e,s=new ne,i="state"in t&&"config"in t?t:pe(t),a=false,u=new Set,f=new Map(Object.entries(n)),m=new ne,p=false,l=false;function y(){if(!a){if(p){l=true;return}p=true;try{do l=!1,S();while(l)}finally{p=false;}}}function S(){let R=m.drain(),w=s.drain(),G=[...R,...w];G.length>0&&(i=Qe(i,G));let j=re(i);G.length>0&&o?.(G,i,j);for(let T of j.eligible)O(T);for(let T of G)if(T.type==="task-progress"){let{taskName:x,update:$}=T;if(!i.config.tasks[x])continue;let U=i.state.tasks[x];if(!U||U.status!=="running")continue;let X=er(x),ct=_(x,X,$).catch(it=>{a||(m.append({type:"task-failed",taskName:x,error:it.message??String(it),timestamp:new Date().toISOString()}),y());}).finally(()=>{u.delete(ct);});u.add(ct);}}function C(R){let G=i.config.tasks[R].requires??[],j=new Map;for(let[x,$]of Object.entries(i.config.tasks))for(let D of $.provides??[])j.set(D,x);let T={};for(let x of G){let $=j.get(x);$?T[x]=i.state.tasks[$]?.data:T[x]=void 0;}return T}async function _(R,w,G){let j=i.config.tasks[R],T=j.taskHandlers??[],x=C(R);for(let $ of T){let D=f.get($);if(!D)throw new Error(`Handler '${$}' not found in registry (task '${R}')`);let U={nodeId:R,state:x,taskState:i.state.tasks[R],config:j,callbackToken:w,update:G};if(await D(U)==="task-initiate-failure")throw new Error(`Handler '${$}' returned task-initiate-failure (task '${R}')`)}}function O(R){let G=i.config.tasks[R]?.taskHandlers;if(!G||G.length===0)return;m.append({type:"task-started",taskName:R,timestamp:new Date().toISOString()}),y();let j=er(R),T=_(R,j).catch(x=>{a||(m.append({type:"task-failed",taskName:R,error:x.message??String(x),timestamp:new Date().toISOString()}),y());}).finally(()=>{u.delete(T);});u.add(T);}return {push(R){a||(R.type==="task-completed"&&R.data&&!R.dataHash&&(R={...R,dataHash:Be(R.data)}),s.append(R),y());},pushAll(R){if(!a){for(let w of R)w.type==="task-completed"&&w.data&&!w.dataHash?s.append({...w,dataHash:Be(w.data)}):s.append(w);y();}},resolveCallback(R,w,G){if(a)return;let j=yn(R);if(!j)return;let{taskName:T}=j;if(i.config.tasks[T]){if(G&&G.length>0)s.append({type:"task-failed",taskName:T,error:G.join("; "),timestamp:new Date().toISOString()});else {let x=w&&Object.keys(w).length>0?Be(w):void 0;s.append({type:"task-completed",taskName:T,data:w,dataHash:x,timestamp:new Date().toISOString()});}y();}},addNode(R,w){a||(s.append({type:"task-upsert",taskName:R,taskConfig:w,timestamp:new Date().toISOString()}),y());},removeNode(R){a||(s.append({type:"task-removal",taskName:R,timestamp:new Date().toISOString()}),y());},addRequires(R,w){a||(s.append({type:"node-requires-add",nodeName:R,tokens:w,timestamp:new Date().toISOString()}),y());},removeRequires(R,w){a||(s.append({type:"node-requires-remove",nodeName:R,tokens:w,timestamp:new Date().toISOString()}),y());},addProvides(R,w){a||(s.append({type:"node-provides-add",nodeName:R,tokens:w,timestamp:new Date().toISOString()}),y());},removeProvides(R,w){a||(s.append({type:"node-provides-remove",nodeName:R,tokens:w,timestamp:new Date().toISOString()}),y());},registerHandler(R,w){f.set(R,w);},unregisterHandler(R){f.delete(R);},retrigger(R){a||i.config.tasks[R]&&(s.append({type:"task-restart",taskName:R,timestamp:new Date().toISOString()}),y());},retriggerAll(R){if(!a){for(let w of R)i.config.tasks[w]&&s.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()});y();}},snapshot(){return ee(i)},getState(){return i},getSchedule(){return re(i)},async waitForHandlers(){u.size>0&&await Promise.allSettled([...u]);},async dispose(R){R?.wait&&u.size>0&&await Promise.allSettled([...u]),a=true;}}}function he(){return function(t){if(t==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+t)}}var kn=he();kn("./jsonata-sync.cjs");var Sn=he(),ye=Sn("./jsonata-sync.cjs"),or=ye;function rr(t,e){if(!e||!t)return;let r=e.split("."),n=t;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function sr(t,e,r){let n=e.split("."),o=t;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Cn(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await ye(o.expr).evaluate(n);sr(t.computed_values,o.bindTo,s),n.computed_values=t.computed_values;}catch{}return t}function Rn(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let r=t.requires??{},n={card_data:t.card_data,requires:r,expects_data:r,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let i=or(s.expr).evaluate(n);sr(t.computed_values,s.bindTo,i),n.computed_values=t.computed_values;}catch(i){let a=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:a});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function bn(t,e,r){let n={...r??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return ye(t).evaluate(n)}function wn(t,e){return e.startsWith("fetched_sources.")?rr(t._sourcesData??{},e.slice(16)):rr(t,e)}var nr=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),vn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function An(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let r=t;(typeof r.id!="string"||!r.id)&&e.push("id: required, must be a non-empty string");for(let n of Object.keys(r))vn.has(n)||e.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&e.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))e.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&e.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&e.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&e.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))e.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))e.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${i}]: must be an object`);else {let a=s;typeof a.bindTo!="string"||!a.bindTo?e.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(a.bindTo)&&e.push(`source_defs[${i}]: bindTo "${a.bindTo}" is not unique across source_defs`),n.add(a.bindTo)),typeof a.outputFile!="string"||!a.outputFile?e.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(a.outputFile)&&e.push(`source_defs[${i}]: outputFile "${a.outputFile}" is not unique across source_defs`),o.add(a.outputFile)),a.optionalForCompletionGating!=null&&typeof a.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))e.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?e.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):nr.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...nr].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&e.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function _n(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await ye(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function xn(t,e){if(!t||t.length===0)return [];let r={card_data:e.card_data??{},requires:e.requires??{}};return t.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=or(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Xt={run:Cn,runSync:Rn,eval:bn,resolve:wn,validate:An,enrichSources:_n,enrichSourcesSync:xn};function ar(t){return JSON.stringify(t)}function ir(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 ke(t,e){function r(){return t.readIndex()??{}}function n(o,s,i){let a=String(s||"").split(".").filter(Boolean);if(a.length===0)return i&&typeof i=="object"&&!Array.isArray(i)?i:{value:i};let u={...o},f=u;for(let m=0;m<a.length-1;m++){let p=a[m],l=f[p],y=l&&typeof l=="object"&&!Array.isArray(l)?{...l}:{};f[p]=y,f=y;}return f[a[a.length-1]]=i,u}return {readCard(o){let s=r()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,i]of Object.entries(r())){if(!t.cardExists(i.key))continue;let a=t.readCard(i.key);a?o.push(a):e?.(`[card-store] could not read card "${s}" at key "${i.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,i]of Object.entries(r()))o[s]=i.checksum;return o},changedSince(o){let s=r(),i=[];for(let[a,u]of Object.entries(s))o[a]!==u.checksum&&i.push(a);for(let a of Object.keys(o))s[a]||i.push(a);return i},validateUpsert(o,s){let i=r(),a=i[o],u=Object.entries(i).find(([,f])=>f.key===s);return a&&a.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${a.key}", cannot remap to "${s}"`}:u&&u[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${u[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,i){let a=r(),u=i??a[o]?.key??t.defaultCardKey(o),f=t.writeCard(u,s);a[o]={key:u,checksum:f,updatedAt:new Date().toISOString()},t.writeIndex(a);},patchCard(o,s,i){let a=r(),u=a[o];if(!u||!t.cardExists(u.key))throw new Error(`card "${o}" not found`);let f=t.readCard(u.key);if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`card "${o}" is not patchable`);let m=n(f,s,i),p=t.writeCard(u.key,m);a[o]={key:u.key,checksum:p,updatedAt:new Date().toISOString()},t.writeIndex(a);},removeCard(o){let s=r(),i=s[o];i&&(t.removeCard(i.key),delete s[o],t.writeIndex(s));},readIndex(){return r()}}}function Se(t,e){return {readSourceData(r,n){let o=t.read(`${r}/${n}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,n,o,s){let i=e(o);t.write(`${r}/.staged/${s}/${n}`,i);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,i=t.read(s);return i==null?false:(t.write(`${r}/${n}`,i),t.remove(s),true)},hasSource(r,n){return t.exists(`${r}/${n}`)},listSources(r){return t.listKeys(`${r}/`).filter(n=>!n.includes("/.staged/")).map(n=>n.slice(`${r}/`.length))}}}function fr(t){function e(r){let n=t.readAllEntries();if(!r)return n;let o=n.findIndex(s=>s.id===r);return o===-1?n:n.slice(o+1)}return {readEntriesAfterCursor(r){let n=e(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return e(r).length},appendEvent(r){t.appendEntry({id:t.generateId(),event:r});}}}function gr(t,e){return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.read(r)??[];t.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(i){let a=i instanceof Error?i.message:String(i);try{e(s,a);}catch{}}t.delete(r);}}}}var Ce="v1",Lt="board/graph",pr="board/lastJournalProcessedId";function cr(t){return `cards/${t}/runtime`}function mr(t){return {readRuntime(e){return t.read(cr(e))??{_sources:{}}},writeRuntime(e,r){t.write(cr(e),r);}}}function Tn(t,e){let r={...t};for(let n of e.deleteKeys)delete r[n];return {...r,...e.shallowMerge}}function hr(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,r){if(r.schemaVersion!==Ce)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=t.readValues(e);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let o=Tn(n.values,r);return {ok:true,newVersion:t.writeValues(e,o,r.deleteKeys)}}}}function yr(t){function e(r){let n=t.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=e("task-executor");if(r?.trim())return ir(r.trim())},writeTaskExecutorRef(r){t.write("task-executor",ar(r));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(r){t.write("chat-handler-flow",r);},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(r){t.write("card-store-ref",r);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(r){t.write("outputs-store-ref",r);},readScratchStoreRef(){return e("scratch-store-ref")},writeScratchStoreRef(r){t.write("scratch-store-ref",r);},readArchiveStoreRef(){return e("archive-store-ref")},writeArchiveStoreRef(r){t.write("archive-store-ref",r);},readChatStoreRef(){return e("chat-store-ref")},writeChatStoreRef(r){t.write("chat-store-ref",r);},readArtifactsStoreRef(){return e("artifacts-store-ref")},writeArtifactsStoreRef(r){t.write("artifacts-store-ref",r);}}}function kr(t){return {writeComputedValues(e,r){t.write(`cards/${e}/computed_values`,r);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let r of t.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(e[n[1]]=t.read(r));}return e},writeDataObjects(e){for(let[r,n]of Object.entries(e))r&&t.write(`data-objects/${r}`,n);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let r of t.listKeys("data-objects/"))e[r.slice(13)]=t.read(r);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function ur(t){return t?{lastRequestedToken:t.lastRequestedToken,lastCompletedToken:t.lastCompletedToken,lastCompletionStatus:t.lastCompletionStatus??(t.lastCompletedToken?"success":"not-started"),queueRequestedToken:t.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function In(t){return t?.lastRequestedToken?t.lastCompletedToken!==t.lastRequestedToken:false}function dr(t,e){return t?.lastRequestedToken?In(t)?"in-flight":!t.lastCompletedToken||t.lastCompletedToken<e?"dispatch":"idle":"dispatch"}function En(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"success"}}function lr(t,e){return {...t,lastCompletedToken:e,lastCompletionStatus:"failure"}}function Re(t,e){let r=e.state.tasks,n=e.config.tasks,o=Object.keys(r),s=re(e),i={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},a=new Map;for(let S of s.pending)a.set(S.taskName,S.waitingOn);for(let S of s.unresolved)a.set(S.taskName,S.missingTokens);for(let S of s.blocked)a.set(S.taskName,S.failedTokens);let u=new Map;for(let[S,C]of Object.entries(n))for(let _ of C.requires??[]){let O=u.get(_)??[];O.push(S),u.set(_,O);}let f=o.sort().map(S=>{let C=r[S],_=n[S]??{requires:[],provides:[]};C.status==="completed"?i.completed+=1:C.status==="failed"?i.failed+=1:C.status==="in-progress"&&(i.in_progress+=1);let O=_.requires??[],R=_.provides??[],w=Object.keys(C.data??{}).sort(),G=O.filter(U=>e.state.availableOutputs.includes(U)),j=O.filter(U=>!e.state.availableOutputs.includes(U)),T=a.get(S)??j,x=new Set;for(let U of R)for(let X of u.get(U)??[])X!==S&&x.add(X);let $=C.failedAt,D=C.error?{message:C.error,code:"TASK_FAILED",at:$,source:"task-runtime"}:void 0;return {name:S,status:C.status,error:D,requires:O,requires_satisfied:G,requires_missing:j,provides_declared:R,provides_runtime:w,blocked_by:T,unblocks:Array.from(x).sort(),runtime:{attempt_count:C.executionCount??0,restart_count:C.retryCount??0,in_progress_since:C.status==="in-progress"?C.startedAt??null:null,last_transition_at:C.lastUpdated??null,last_completed_at:C.completedAt??null,last_restarted_at:C.startedAt??null,status_age_ms:C.lastUpdated?0:null}}});i.pending=s.pending.length,i.blocked=s.blocked.length,i.unresolved=s.unresolved.length;let m=f.map(S=>({name:S.name,fanOut:S.unblocks.length})).sort((S,C)=>C.fanOut-S.fanOut||S.name.localeCompare(C.name)),p=m.length>0?m[0]:{name:null,fanOut:0},l=new Set;for(let S of Object.values(n))for(let C of S.requires??[])l.add(C);let y=0;for(let[S,C]of Object.entries(n)){let _=(C.requires??[]).length===0,R=(C.provides??[]).some(w=>(u.get(w)??[]).some(G=>G!==S));_&&!R&&(y+=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:y,topology:{edge_count:Array.from(l).length,max_fan_out_card:p.name,max_fan_out:p.fanOut}},cards:f}}function On(){return new Date().toISOString()}function Sr(t,e,r,n,o,s,i){return async a=>{let u=[],f=r.cardStore.readCard(a.nodeId);if(!f)return "task-initiate-failure";let m=f.id,p=f.card_data??{},l=f.source_defs??[],y=l.filter(L=>L.optionalForCompletionGating!==true),S=r.cardRuntimeStore.readRuntime(m),C=false,_=()=>{C&&(r.cardRuntimeStore.writeRuntime(m,S),C=false);},O=L=>ur(S._sources[L]),R=(L,q)=>{S._sources[L]=ur(q),C=true;},w=a.taskState?.executionCount??0;if(S._lastExecutionCount!==w&&(S._sources={},S._lastExecutionCount=w,C=true),a.update){let L=a.update,q=L.outputFile;if(q){let Y=O(q);if(L.failure){let at=L.rqt??Y.lastRequestedToken??Y.queueRequestedToken;at&&R(q,lr(Y,at));}else {let at=L.rqt;if(!Y.lastCompletedToken||at>Y.lastCompletedToken){let St=typeof L.deliveryToken=="string"?L.deliveryToken:void 0,It=false;St&&(It=r.fetchedSourcesStore.commitSourceData(m,q,St)),It?R(q,En(Y,at)):R(q,lr(Y,at));}}_();}}let j={};for(let L of l)if(L.outputFile){let q=r.fetchedSourcesStore.readSourceData(m,L.outputFile);q!==null&&(j[L.bindTo]=q);}let T={};for(let[L,q]of Object.entries(a.state??{}))if(q!==null&&typeof q=="object"&&!Array.isArray(q)){let Y=q[L];T[L]=Y!==void 0?Y:q;}else T[L]=q;let x={id:m,card_data:{...p},requires:T,source_defs:l,compute:f.compute};x._sourcesData=j,f.compute&&Xt.runSync(x,{sourcesData:j}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(m,x.computed_values??{});let $={...f},D=Xt.enrichSourcesSync(Array.isArray(f.source_defs)?f.source_defs:void 0,{card_data:f.card_data,requires:T}),U=t.value;$.source_defs=Array.isArray(D)?D.map(L=>({...L,boardDir:typeof L.boardDir=="string"&&L.boardDir?L.boardDir:U})):D;let X=On(),ct=a.update?void 0:X,it=y.filter(L=>{let q=L.outputFile;if(typeof q!="string"||!q)return true;let Y=O(q);ct&&(Y={...Y,queueRequestedToken:ct},R(q,Y));let at=Y.queueRequestedToken??Y.lastRequestedToken??X,St=dr(Y,at);return St==="in-flight"?false:St==="dispatch"});if(_(),it.length>0){let L=false,q=X;for(let Y of it){let at=Y.outputFile;if(typeof at!="string"||!at)continue;let St=O(at),It=St.queueRequestedToken??X;R(at,{...St,lastRequestedToken:It}),q=It,L=true;}return L&&_(),L&&(u.push({taskKind:"source-fetch",payload:{boardRef:st(t),enrichedCard:$,callbackToken:a.callbackToken,rqt:q}}),r.executionRequestStore.appendEntries(e,u)),"task-initiated"}if(y.some(L=>{let q=L.outputFile;if(typeof q!="string"||!q)return false;let Y=O(q),at=Y.queueRequestedToken??Y.lastRequestedToken??X;return dr(Y,at)==="in-flight"}))return "task-initiated";let qt=f.provides??[],Tt={};for(let{bindTo:L,ref:q}of qt)Tt[L]=Xt.resolve(x,q);return (i??r.outputStore.writeDataObjects.bind(r.outputStore))(Tt),l.filter(L=>{if(L.optionalForCompletionGating!==true)return false;let q=O(L.outputFile);return !q.lastRequestedToken||!q.lastCompletedToken?true:q.lastCompletedToken<=q.lastRequestedToken}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:st(t),enrichedCard:$,callbackToken:a.callbackToken,rqt:X}}),n(a.nodeId,Tt),u.length>0&&r.executionRequestStore.appendEntries(e,u),"task-initiated"}}var Ne={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Cr(t){return {[Lt]:t.graph,[pr]:t.lastDrainedJournalId}}function Rr(t){let e=t[Lt],r=t[pr];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Lt}`);return {graph:e,lastDrainedJournalId:typeof r=="string"?r:""}}function br(t){let e=t.requires,r=t.provides?.map(n=>n.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:r,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function nt(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function rt(t){return {status:"fail",error:t}}function ot(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Bn(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function vr(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e+"=".repeat((4-e.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function be(t){try{let e=JSON.parse(vr(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function jn(t){return Bn(JSON.stringify(t))}function wr(t){try{let e=JSON.parse(vr(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 Ar(t,e){let r=e.onWarn??(()=>{}),n=st(t);function o(v){if(v.length!==0)try{let h=e.publishBoardChangeNotifications?.(v);h&&typeof h.catch=="function"&&h.catch(I=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${I instanceof Error?I.message:String(I)}`));}catch(h){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${h instanceof Error?h.message:String(h)}`);}}function s(){let v=a().readCardStoreRef();if(!v)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let h=e.kvStorageForRef(v);return {readIndex(){return h.read("_index")},writeIndex(I){h.write("_index",I);},readCard(I){return h.read(I)},writeCard(I,B){return h.write(I,B),e.hashFn(B)},removeCard(I){h.delete(I);},cardExists(I){return h.read(I)!==null},defaultCardKey(I){return I}}}let i={readValues(v){let h=e.kvStorage("state-snapshot"),I=h.listKeys().sort();if(I.length===0)return {version:null,values:{}};let B={};for(let J of I)B[J]=h.read(J);return {version:e.hashFn(B),values:B}},writeValues(v,h,I){let B=e.kvStorage("state-snapshot");for(let J of I)B.delete(J);for(let[J,W]of Object.entries(h))B.write(J,W);return e.hashFn(h)}},a=()=>yr(e.kvStorage("config")),u=()=>hr(i),f=()=>fr(e.journalAdapter()),m=()=>ke(s(),r),p=()=>{let v=a().readOutputsStoreRef();if(!v)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return kr(e.kvStorageForRef(v))},l=()=>{let v=a().readArchiveStoreRef();return v?e.archiveFactoryForRef(v):e.archiveFactory()};function y(){return !!u().readSnapshot(t.value).values[Lt]}function S(){let v=u().readSnapshot(t.value);if(!v.values[Lt])throw new Error(`Board not initialized at ${t.value}`);return Rr(v.values)}function C(v,h){let I=u().commitSnapshot(t.value,{schemaVersion:Ce,expectedVersion:h,commitId:e.genId(),committedAt:lt(),deleteKeys:[],shallowMerge:Cr(v)});if(!I.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${h??"null"} current=${I.currentVersion??"null"}`)}function _(v){f().appendEvent(v);}async function O(){let v=(E,F)=>{let Z=E.payload,c=(Z?.enrichedCard??{}).id??Z?.cardId??"unknown";_({type:"task-failed",taskName:c,error:F,timestamp:lt()});},h=gr(e.kvStorage("execution-requests"),v),I=mr(e.kvStorage("card-runtime")),B=Se(e.blobStorage("sources"),E=>e.resolveBlob(E)),J=new Map,W={readRuntime(E){return J.get(E)??I.readRuntime(E)},writeRuntime(E,F){J.set(E,F);}},dt=[],Q=new Map,ft={readSourceData(E,F){let Z=`${E}/${F}`;return Q.has(Z)?Q.get(Z):B.readSourceData(E,F)},ingestSourceDataStaged(E,F,Z,_t){B.ingestSourceDataStaged(E,F,Z,_t);},commitSourceData(E,F,Z){let _t=`${E}/.staged/${Z}/${F}`,d=e.blobStorage("sources").read(_t);if(d==null)return false;let g=`${E}/${F}`,k=d.trim();try{Q.set(g,JSON.parse(k));}catch{Q.set(g,k);}return dt.push({cardId:E,outputFile:F,deliveryToken:Z}),true},hasSource(E,F){let Z=`${E}/${F}`;return Q.has(Z)?true:B.hasSource(E,F)},listSources(E){let F=B.listSources(E),Z=new Set;for(let c of Q.keys())c.startsWith(`${E}/`)&&Z.add(c.slice(`${E}/`.length));let _t=new Set([...F,...Z]);return Array.from(_t)}},ut={cardStore:m(),cardRuntimeStore:W,fetchedSourcesStore:ft,outputStore:p(),executionRequestStore:h},K=S(),gt=me(K.graph),{events:Bt,newCursor:Et}=f().readEntriesAfterCursor(K.lastDrainedJournalId),At=[],Ut=[],Jt=[],Vt=new Map,Ht=(E,F)=>{At.push({type:"task-completed",taskName:E,data:F,timestamp:lt()});try{l().stream("exec-history").append({taskName:E,status:"completed",completedAt:lt()});}catch{}},Zt=(E,F)=>{_({type:"task-failed",taskName:E,error:F,timestamp:lt()});try{l().stream("exec-history").append({taskName:E,status:"failed",error:F,completedAt:lt()});}catch{}},Pt=$e(gt,{handlers:{"card-handler":Sr(t,Et,ut,Ht,Zt,(E,F)=>{Ut.push({cardId:E,values:F});},E=>{Jt.push(E);})}});for(At=Bt;At.length>0;){let E=At;At=[];for(let F of E)if(F.type==="task-restart"){let Z=ut.cardStore.readCard(F.taskName);Z&&Vt.set(F.taskName,Z);}Pt.pushAll(E),await Pt.waitForHandlers();}let Kt=Pt.getState();await Pt.dispose({wait:true});let Qt=u().readSnapshot(t.value).version;C({lastDrainedJournalId:Et,graph:ee(Kt)},Qt);for(let{cardId:E,values:F}of Ut)ut.outputStore.writeComputedValues(E,F);for(let E of Jt)ut.outputStore.writeDataObjects(E);for(let[E,F]of J)I.writeRuntime(E,F);for(let{cardId:E,outputFile:F,deliveryToken:Z}of dt)B.commitSourceData(E,F,Z);let zt;try{zt=Re(n,Kt),ut.outputStore.writeStatusSnapshot(zt);}catch(E){r(`[board-live-cards-public] status publish failed: ${E instanceof Error?E.message:String(E)}`);}let Dt=[];for(let{cardId:E,values:F}of Ut)Dt.push({kind:"computed_values",cardId:E,values:F});for(let E of Jt)for(let[F,Z]of Object.entries(E))F&&Dt.push({kind:"data_object",key:F,payload:Z});for(let[E,F]of Vt)Dt.push({kind:"card_refreshed",cardId:E,card:F});zt!==void 0&&Dt.push({kind:"status",status:zt}),o(Dt);let Ee=a().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:st({kind:"built-in",value:"source-cli-task-executor"})};h.dispatchEntriesForJournalId(Et,E=>{if(E.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${E.taskKind}" \u2014 skipping`);return}let F=E.payload,Z=F.enrichedCard?.id??"unknown",_t=F.enrichedCard?.source_defs??[];for(let c of _t){if(!c.outputFile){r(`[dispatch] source "${c.bindTo}" has no outputFile \u2014 skipping`);continue}let d=jn({cbk:F.callbackToken,rg:t.value,br:st(t),cid:Z,b:c.bindTo,d:c.outputFile,cs:void 0,rqt:F.rqt});e.dispatchExecution(Ee,{source_def:c,base_ref:st(t),callback:{token:d,via:e.selfRef}}).catch(g=>Zt(Z,g instanceof Error?g.message:String(g)));}});}async function R(){try{let v=()=>{let I=S(),{events:B}=f().readEntriesAfterCursor(I.lastDrainedJournalId);B.length<=0||(R(),e.requestProcessAccumulated?.());},h=await Ge(e.lock,O,v);return nt({ran:h!==!1})}catch(v){return ot(v)}}function w(){R(),e.requestProcessAccumulated?.();}function G(v){try{let h=v.params?.cardStoreRef;if(!h)return rt("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!y()){let ut=pe(Ne);C({lastDrainedJournalId:"",graph:ee(ut)},null);}let I=v.params?.outputsStoreRef;if(!I)return rt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let B=v.params?.scratchStoreRef,J=v.params?.archiveStoreRef,W=v.params?.chatStoreRef,dt=v.params?.artifactsStoreRef,Q=a();Q.writeCardStoreRef(h),Q.writeOutputsStoreRef(I),B&&Q.writeScratchStoreRef(B),J&&Q.writeArchiveStoreRef(J),W&&Q.writeChatStoreRef(W),dt&&Q.writeArtifactsStoreRef(dt);let ft=v.body??{};ft["task-executor-ref"]&&Q.writeTaskExecutorRef(ft["task-executor-ref"]),Object.prototype.hasOwnProperty.call(ft,"chat-handler-flow")&&Q.writeChatHandlerFlow(ft["chat-handler-flow"]);try{p().writeStatusSnapshot(Re(n,me(S().graph)));}catch{}return nt()}catch(h){return ot(h)}}function j(v){try{let h=p().readStatusSnapshot();if(!h){h=Re(n,me(S().graph));try{p().writeStatusSnapshot(h);}catch{}}return nt(h)}catch(h){return ot(h)}}function T(v){try{let h=v.params?.id;return h?(_({type:"task-removal",taskName:h,timestamp:lt()}),w(),nt()):rt("removeCard requires params.id")}catch(h){return ot(h)}}function x(v){try{let h=v.params?.id;return h?(_({type:"task-restart",taskName:h,timestamp:lt()}),w(),nt()):rt("retrigger requires params.id")}catch(h){return ot(h)}}async function $(v){return R()}function D(v){try{let h=v.params?.cardId,I=v.params?.all,B=!!v.params?.restart;if(!h&&!I)return rt("upsertCard requires --card-id <id> or --all");let J=I?m().readAllCards().map(W=>W.id):[h];for(let W of J)if(!m().readCard(W))return rt(`Card "${W}" not found in board at ${t.value}`);for(let W of J){let dt=m().readCard(W),Q=br(dt),ft=e.hashFn(Q),ut=e.kvStorage("card-upsert"),K=ut.read(W),gt=K?.taskConfigHash!==ft;if(!(!gt&&!B)){if(gt){let Bt=K?.blobRef??m().readCardKey(W)??W;_({type:"task-upsert",taskName:W,taskConfig:Q,timestamp:lt()}),ut.write(W,{blobRef:Bt,taskConfigHash:ft,updatedAt:lt()});}B&&_({type:"task-restart",taskName:W,timestamp:lt()});}}return w(),nt()}catch(h){return ot(h)}}function U(v){try{let h=v.params?.token;if(!h)return rt("taskFailed requires params.token");let I=v.params?.error??"unknown error",B=be(h);if(!B)return rt("Invalid callback token");_({type:"task-failed",taskName:B.taskName,error:I,timestamp:lt()});try{l().stream("exec-history").append({taskName:B.taskName,status:"failed",error:I,completedAt:lt()});}catch{}return w(),nt()}catch(h){return ot(h)}}function X(v){try{let h=v.params?.token;if(!h)return rt("taskProgress requires params.token");let B=(v.body??{}).update??{},J=be(h);return J?(_({type:"task-progress",taskName:J.taskName,update:B,timestamp:lt()}),w(),nt()):rt("Invalid callback token")}catch(h){return ot(h)}}function ct(v){try{let h=v.params?.token,I=v.params?.ref;if(!h)return rt("sourceDataFetched requires params.token");if(!I)return rt("sourceDataFetched requires params.ref");let B=wr(h);if(!B)return rt("Invalid source token");let{cbk:J,cid:W,b:dt,d:Q,cs:ft,rqt:ut}=B,K=Se(e.blobStorage("sources"),At=>e.resolveBlob(At)),gt=e.genId();K.ingestSourceDataStaged(W,Q,wt(I),gt);let Bt=be(J);if(!Bt)return rt("Invalid callback token embedded in source token");let Et=lt();return _({type:"task-progress",taskName:Bt.taskName,update:{bindTo:dt,outputFile:Q,fetchedAt:Et,deliveryToken:gt,sourceChecksum:ft,rqt:ut},timestamp:Et}),w(),nt()}catch(h){return ot(h)}}function it(v){try{let h=v.params?.token,I=v.params?.reason??"unknown";if(!h)return rt("sourceDataFetchFailure requires params.token");let B=wr(h);if(!B)return rt("Invalid source token");let{cbk:J,b:W,d:dt,cs:Q,rqt:ft}=B,ut=be(J);return ut?(_({type:"task-progress",taskName:ut.taskName,update:{bindTo:W,outputFile:dt,failure:!0,reason:I,sourceChecksum:Q,rqt:ft},timestamp:lt()}),w(),nt()):rt("Invalid callback token embedded in source token")}catch(h){return ot(h)}}function Ft(v){try{let h=a().readCardStoreRef();return h?nt({storeRef:h}):rt(`Board at ${t.value} has no card store configured`)}catch(h){return ot(h)}}function qt(v){try{let h=a().readOutputsStoreRef();return h?nt({storeRef:h}):rt(`Board at ${t.value} has no outputs store configured`)}catch(h){return ot(h)}}function Tt(v){try{let h=a().readScratchStoreRef();return nt({storeRef:h})}catch(h){return ot(h)}}function ht(v){try{let h=a().readArchiveStoreRef();return nt({storeRef:h})}catch(h){return ot(h)}}function L(v){try{let h=a().readChatStoreRef();return nt({storeRef:h})}catch(h){return ot(h)}}function q(v){try{let h=a().readArtifactsStoreRef();return nt({storeRef:h})}catch(h){return ot(h)}}function Y(v){try{let h=v.params?.key;if(!h)return rt("getConfig requires params.key");let I=a(),B;switch(h){case "task-executor":B=I.readTaskExecutorRef()??null;break;case "chat-handler-flow":B=I.readChatHandlerFlow()??null;break;case "card-store-ref":B=I.readCardStoreRef();break;case "outputs-store-ref":B=I.readOutputsStoreRef();break;case "scratch-store-ref":B=I.readScratchStoreRef();break;case "archive-store-ref":B=I.readArchiveStoreRef();break;case "chat-store-ref":B=I.readChatStoreRef();break;case "artifacts-store-ref":B=I.readArtifactsStoreRef();break;default:return rt(`getConfig: unknown key "${h}"`)}return nt({value:B})}catch(h){return ot(h)}}function at(v){try{let h=v.params?.key;if(!h)return rt("getOutputsDataObject requires params.key");let I=p().readDataObject(h);return nt(I)}catch(h){return ot(h)}}function St(v){try{return nt(p().readAllDataObjects())}catch(h){return ot(h)}}function It(v){try{let h=v.params?.key;if(!h)return rt("getOutputsComputedValues requires params.key");let I=p().readComputedValues(h);return nt(I)}catch(h){return ot(h)}}function Mt(v){try{return nt(p().readAllComputedValues())}catch(h){return ot(h)}}function Gt(){return Se(e.blobStorage("sources"),v=>e.resolveBlob(v))}function se(v){let h=e.blobStorage("sources").keyRef?.(v);return h?st(h):v}function ae(v){try{let h=v.params?.key;if(!h)return rt("getOutputsFetchedSources requires params.key");let I=Gt().listSources(h),B={};for(let J of I)B[J]=se(`${h}/${J}`);return nt(B)}catch(h){return ot(h)}}function Ie(v){try{let h=Gt(),I=new Set;for(let J of e.blobStorage("sources").listKeys()){let W=J.indexOf("/");W>0&&!J.includes("/.staged/")&&I.add(J.slice(0,W));}let B={};for(let J of I){let W=h.listSources(J);if(W.length>0){B[J]={};for(let dt of W)B[J][dt]=se(`${J}/${dt}`);}}return nt(B)}catch(h){return ot(h)}}return {init:G,status:j,getCardStoreRef:Ft,getOutputsStoreRef:qt,getScratchStoreRef:Tt,getArchiveStoreRef:ht,getChatStoreRef:L,getArtifactsStoreRef:q,getConfig:Y,getOutputsDataObject:at,getAllOutputsDataObjects:St,getOutputsComputedValues:It,getAllOutputsComputedValues:Mt,getOutputsFetchedSources:ae,getAllOutputsFetchedSources:Ie,removeCard:T,retrigger:x,processAccumulatedEvents:$,upsertCard:D,taskFailed:U,taskProgress:X,sourceDataFetched:ct,sourceDataFetchFailure:it}}function _r(t){function e(o){return {status:"success",data:o}}function r(o){return {status:"fail",error:o}}function n(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let i=t.readCard(s);return i?e({cards:[i]}):r(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return n(s)}},set(o){try{let s=o.body;if(s==null)return r("set requires a body (card object or array of cards)");let i=Array.isArray(s)?s:[s];for(let a of i){if(typeof a.id!="string")return r("each card must have a string `id` field");t.writeCard(a.id,a);}return e({count:i.length})}catch(s){return n(s)}},del(o){try{let s=o.body?.ids??[],i=o.params?.id,a=i?[...s,i]:s;if(a.length===0)return r("del requires body.ids (string[]) or params.id");for(let u of a)t.removeCard(u);return e({count:a.length})}catch(s){return n(s)}},patch(o){try{let s=o.params?.id,i=o.params?.path;if(!s)return r("patch requires params.id");if(!i)return r("patch requires params.path");let a=o.body,u=a&&Object.prototype.hasOwnProperty.call(a,"value")?a.value:o.body;return t.patchCard(s,i,u),e({count:1})}catch(s){return n(s)}}}}function xr(){return new Date().toISOString()}function Tr(t){return new TextEncoder().encode(t).byteLength}function $n(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function Nn(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function Fn(t){let e=String(t||"").trim();if(!e)return "upload.bin";let r=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (r>=0?e.slice(r+1):e)||"upload.bin"}function Pn(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 Ln(t){let e=Fn(t),r=e.lastIndexOf(".");return r<=0||r===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,r),ext:e.slice(r)}}function qn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function Ir(t){function e(r){let n=t.stat?$n(t.stat(r)):null;if(n)return n;if(!t.exists(r))return null;let o=t.read(r);return o===null?{key:r}:{key:r,size:Tr(o)}}return {exists(r){return t.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){t.write(r,n);let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??xr(),s.size=s.size??Tr(n),s},putBytes(r,n,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});t.write(r,i);}let s=e(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??xr(),s.size=s.size??n.byteLength,s},getText(r){let n=t.read(r);if(n===null){if(!t.readBytes)return null;let o=t.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(t.readBytes){let o=t.readBytes(r);if(o!==null)return o}let n=t.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:e,list(r=""){return t.listKeys(r).map(n=>e(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){t.remove(r);}}}function Er(t){function e(o,s){let i=0,a=[];Array.isArray(s)&&a.push(...s);for(let u of t.list(`${o}/`))a.push(qn(u.key));for(let u of a){let f=Nn(u);Number.isFinite(f)&&f>i&&(i=f);}return i+1}function r(o,s,i){let a=Number(i?.maxLen||32),{stem:u,ext:f}=Ln(o),m=Dn(f),p=Pn(u),l=`${String(s).padStart(3,"0")}-`,y=m,S=a-l.length-y.length;S<1&&(y="",S=a-l.length);let C=p.slice(0,Math.max(1,S)),_=`${l}${C}${y}`;return _.length>a&&(_=_.slice(0,a).replace(/\.$/,"")),_}function n(o,s,i){let a=e(o,i?.seedNames),u=r(s,a,{maxLen:i?.maxLen});for(;t.exists(`${o}/${u}`);)a+=1,u=r(s,a,{maxLen:i?.maxLen});return u}return {nextSerial:e,buildStoredName:r,allocateStoredName:n}}function Or(){function t(o,s){if(!Array.isArray(o))return [];let i=[];for(let a of o){if(!a||typeof a!="object")continue;let u=a;typeof u.stored_name=="string"&&i.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:s||null,chat:u.chat===true});}return i}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function r(o,s){let i=e(o);if(s.length===0)return o.files=i,i;let a=new Set(i.map(u=>u.stored_name));for(let u of s)a.has(u.stored_name)||(i.push(u),a.add(u.stored_name));return o.files=i,i}function n(o,s,i){let a=e(o);if(!Number.isInteger(s)||s<0||s>=a.length)return {ok:false,reason:"index_out_of_range"};let u=a[s];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:i&&i!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:e,normalizeIncoming:t,merge:r,resolve:n}}function Br(t){return String(t).replace(/[^a-zA-Z0-9_-]/g,"_")}function jr(t){let e=t.payload??{};return {id:t.id,role:typeof e.role=="string"?e.role:"system",text:typeof e.text=="string"?e.text:"",files:Array.isArray(e.files)?e.files:[],updated_at:typeof e.updated_at=="string"?e.updated_at:""}}function $r(t,e){let r=o=>`chats/${Br(o)}/processing`,n=o=>`chats/${Br(o)}/config`;return {append(o,s,i,a=[]){return t(o).append({role:s,text:i,files:a,updated_at:new Date().toISOString()}).id},readAll(o){return t(o).readAll().map(jr)},readAfter(o,s){let i=t(o).readAfter(s);return {records:i.entries.map(jr),cursor:i.newCursor}},clear(o){t(o).clear?.();},setProcessing(o,s){s?e.write(r(o),true):e.delete(r(o));},isProcessing(o){return e.read(r(o))===true},getConfig(o){return e.read(n(o))??{}},setConfig(o,s){let i=e.read(n(o))??{};e.write(n(o),{...i,...s});}}}function Mn(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function Nr(){let t=new Map,e=new Map;function r(n){return t.has(n)||t.set(n,[]),t.get(n)}return {append(n,o,s,i=[]){let a={id:Mn(),role:o,text:s,files:i,updated_at:new Date().toISOString()};return r(n).push(a),a.id},readAll(n){return r(n).slice()},readAfter(n,o){let s=r(n);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let i=s.findIndex(u=>u.id===o),a=i===-1?s.slice():s.slice(i+1);return {records:a,cursor:a.length>0?a[a.length-1].id:o}},clear(n){t.set(n,[]);},setProcessing(n,o){o?e.set(`p:${n}`,true):e.delete(`p:${n}`);},isProcessing(n){return e.get(`p:${n}`)===true},getConfig(n){return e.get(`c:${n}`)??{}},setConfig(n,o){let s=e.get(`c:${n}`)??{};e.set(`c:${n}`,{...s,...o});}}}function Fr(t){function e(a){return {status:"success",data:a}}function r(a){return {status:"fail",error:a}}function n(a){return {status:"error",error:a instanceof Error?a.message:String(a)}}function o(a,u="command envelope"){let f=typeof a.cardId=="string"?a.cardId:void 0;if(!a.command)return r(`chat-store: ${u} missing "command"`);if(!f)return r(`chat-store: ${u} missing "cardId"`);if(a.command==="append")return i.append({params:{cardId:f},body:{role:a.role,text:a.text,files:a.files}});if(a.command==="read-all")return i.readAll({params:{cardId:f}});if(a.command==="read-after")return i.readAfter({params:{cardId:f},body:{cursor:a.cursor??null}});if(a.command==="clear")return i.clear({params:{cardId:f}});if(a.command==="set-processing")return i.setProcessing({params:{cardId:f},body:{active:a.active}});if(a.command==="is-processing")return i.isProcessing({params:{cardId:f}});if(a.command==="get-config")return i.getConfig({params:{cardId:f}});if(a.command==="set-config"){let{command:m,cardId:p,...l}=a;return i.setConfig({params:{cardId:f},body:l})}return r(`chat-store: unknown command "${String(a.command)}"`)}function s(a){if(!Array.isArray(a.commands)||a.commands.length===0)return r('chat-store: command envelope must include a non-empty "commands" array');let u=[];for(let f=0;f<a.commands.length;f+=1){let m=a.commands[f];if(!m||typeof m!="object"||Array.isArray(m))return r(`chat-store: command envelope entry ${f} must be an object`);let p={cardId:a.cardId,...m},l=o(p,`command envelope entry ${f}`);if(l.status!=="success")return l;u.push({index:f,command:String(p.command),data:l.data});}return e({results:u})}let i={append(a){try{let u=a.params?.cardId;if(!u)return r("append requires params.cardId");let f=a.body??{},m=typeof f.role=="string"?f.role:"",p=typeof f.text=="string"?f.text:"",l=Array.isArray(f.files)?f.files:[];if(!m)return r("append requires body.role");let y=t.append(u,m,p,l);return e({id:y})}catch(u){return n(u)}},readAll(a){try{let u=a.params?.cardId;return u?e({records:t.readAll(u)}):r("readAll requires params.cardId")}catch(u){return n(u)}},readAfter(a){try{let u=a.params?.cardId;if(!u)return r("readAfter requires params.cardId");let m=(a.body??{}).cursor??null;return e(t.readAfter(u,m))}catch(u){return n(u)}},clear(a){try{let u=a.params?.cardId;return u?(t.clear(u),e({ok:!0})):r("clear requires params.cardId")}catch(u){return n(u)}},setProcessing(a){try{let u=a.params?.cardId;if(!u)return r("setProcessing requires params.cardId");let f=a.body??{};return typeof f.active!="boolean"?r("setProcessing requires body.active (boolean)"):(t.setProcessing(u,f.active),e({ok:!0}))}catch(u){return n(u)}},isProcessing(a){try{let u=a.params?.cardId;return u?e({active:t.isProcessing(u)}):r("isProcessing requires params.cardId")}catch(u){return n(u)}},getConfig(a){try{let u=a.params?.cardId;return u?e({config:t.getConfig(u)}):r("getConfig requires params.cardId")}catch(u){return n(u)}},setConfig(a){try{let u=a.params?.cardId;if(!u)return r("setConfig requires params.cardId");let f=a.body??{};return t.setConfig(u,f),e({ok:!0})}catch(u){return n(u)}},run:o,runBatch:s};return i}var Gn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Un=32;function Jn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Pr(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 Dr(t,e){if(!e||typeof e!="object")return;let r=e;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)Dr(t,n);return}r.kind==="status"&&Pr(r.status)&&(t.status=r.status),r.kind==="computed_values"&&r.cardId&&(t.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(t.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(t.cards[r.cardId]=r.card);}function Lr(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),r={...Gn,...t.corsHeaders||{}},n=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,i=t.chatFlowRunner||null,a=t.chatStorage??Nr(),u=Fr(a),f=t.notificationTransport||null,m=t.serverUrl||null,p=t.executionExtra||{},l=t.onSseClientConnected,y=t.onSseClientDisconnected,S=t.onChannelSubscribed,C=t.onChannelUnsubscribed,_=new Map,O=new Map,R=new Map,w=null;function G(c){let d=Ar(c.baseRef,c.boardAdapter),g=c.boardAdapter.kvStorageForRef(c.cardStoreRef),b=_r(ke({readIndex:()=>g.read("_index"),writeIndex:P=>g.write("_index",P),readCard:P=>g.read(P),writeCard:(P,z)=>(g.write(P,z),P),cardExists:P=>g.read(P)!==null,defaultCardKey:P=>P},o.warn)),A=c.artifactsAdapter||c.boardAdapter,N=c.filesArtifactsStore??null,M=null;return {label:c.label,board:d,cardStore:b,get filesArtifacts(){return M??(M=N??Ir(A.blobStorage("files")))},boardAdapter:c.boardAdapter,cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef,scratchStoreRef:c.scratchStoreRef,archiveStoreRef:c.archiveStoreRef,notifyRef:c.notifyRef,taskExecutorRef:c.taskExecutorRef,chatHandlerRef:c.chatHandlerRef,chatHandlerFlow:c.chatHandlerFlow,inferenceAdapterRef:c.inferenceAdapterRef,notification:Jn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let j=t.boards.map(G),T=new Map;function x(c){return T.get(c)??0}function $(c){let d=j[x(c)];return {files:d?d.filesArtifacts:null}}function D(c){let d=$(c);return d.files?Er(d.files):null}function U(){return Or()}function X(c){return String(c||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function ct(c){if(!c||c.notificationTeardown||!f||!c.notifyRef)return;let d=await f.subscribe(c.notifyRef,g=>{Dr(c.notification,g);let k=g.kind==="notification-batch"?g.notifications:[g];F(k);});c.notificationTeardown=d;}async function it(c){if(!c||c.initialized)return;let d={cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef};c.scratchStoreRef&&(d.scratchStoreRef=c.scratchStoreRef),c.archiveStoreRef&&(d.archiveStoreRef=c.archiveStoreRef);let g={};c.taskExecutorRef&&(g["task-executor-ref"]=c.taskExecutorRef),c.chatHandlerFlow!==void 0&&(g["chat-handler-flow"]=c.chatHandlerFlow),c.inferenceAdapterRef&&(g["inference-adapter-ref"]=c.inferenceAdapterRef);let k=c.board.init({params:d,body:g});if(k.status!=="success")throw Object.assign(new Error(k.error||`init failed for ${c.label}`),{statusCode:500});if(await ct(c),!c.chatHandlerFlow&&c.chatHandlerRef&&s.describe)try{let b=await s.describe(c.chatHandlerRef);b&&b.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${b.kind}", expected "chat-handler" for ${c.label}`):b&&o.info(`[init] chat-handler validated: ${b.name} (protocol ${b.protocolVersion}) for ${c.label}`);}catch(b){o.warn(`[init] chat-handler describe failed for ${c.label}: ${b?.message||String(b)}`);}c.initialized=true;}function Ft(c){if(!c.boardAdapter.publishBoardChangeNotifications)return;let d=[],g=c.board.status({});g.status==="success"&&g.data!=null&&Pr(g.data)&&d.push({kind:"status",status:g.data});let k=c.board.getAllOutputsDataObjects({});if(k.status==="success"&&k.data!=null)for(let[A,N]of Object.entries(k.data))A&&d.push({kind:"data_object",key:A,payload:N});let b=c.board.getAllOutputsComputedValues({});if(b.status==="success"&&b.data!=null)for(let[A,N]of Object.entries(b.data))A&&d.push({kind:"computed_values",cardId:A,values:N});d.length>0&&c.boardAdapter.publishBoardChangeNotifications(d);}function qt(c,d){if(!c||c.cardsBootstrapped)return;let g=c.cardStore.get({}),k=g.status==="success"&&Array.isArray(g.data?.cards)?g.data.cards:[];for(let b of k)typeof b.id=="string"&&(T.set(b.id,d),c.board.upsertCard({params:{cardId:b.id}}));c.cardsBootstrapped=true;}async function Tt(){for(let c of j)await it(c);}async function ht(){await Tt();for(let c=0;c<j.length;c++)Ft(j[c]),qt(j[c],c);}function L(c){return j[x(c)]??null}function q(c){let d=L(c);if(!d)return null;let g=d.cardStore.get({params:{id:c}});if(g.status!=="success")return null;let k=Array.isArray(g.data?.cards)?g.data.cards:[];return k.length>0?k[0]:null}function Y(){let c=g=>{if(!g||!g.cardStore)return [];let k=g.cardStore.get({});return k.status!=="success"||!Array.isArray(k.data?.cards)?[]:k.data.cards},d=[];for(let g of j)d.push(...c(g));return d}function at(){let c=j.map(A=>{try{let M=A.boardAdapter.kvStorageForRef(A.outputsStoreRef).read("status");if(M!=null)return M}catch{}return A.notification.status}).filter(Boolean);if(c.length===0)return null;if(c.length===1)return c[0];let d=[],g=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],k={};for(let A of g)k[A]=0;for(let A of c){let N=A,M=Array.isArray(N.cards)?N.cards:[];d.push(...M);for(let P of g)k[P]+=Number(N?.summary?.[P]||0);}let b=c[0];return {...b,cards:d,summary:{...b.summary||{},card_count:d.length,...k}}}function St(){let c={},d=g=>{for(let[k,b]of Object.entries(g.notification.computedValues)){let A=g.notification.cards[k];c[k]={schema_version:"v1",card_id:k,card_data:A?.card_data??{},computed_values:b??{}};}};for(let g of j)d(g);return c}function It(){let c={};for(let d of j)Object.assign(c,d.notification.dataObjects||{});return c}function Mt(){let c=Y(),d=St(),g=It(),k={};for(let A of c){if(!A?.id)continue;let N=A.id,M=d[N]||{},P={...M.card_data&&typeof M.card_data=="object"?M.card_data:A.card_data&&typeof A.card_data=="object"?A.card_data:{}};k[N]={schema_version:M.schema_version||"v1",card_id:M.card_id||N,card_data:P,computed_values:M.computed_values&&typeof M.computed_values=="object"?M.computed_values:{}};}let b={};for(let A of c){if(!A?.id)continue;let N=A.id;try{let M=J(N),P=a.isProcessing(N);(M.length>0||P)&&(b[N]={messages:M.map(z=>({role:String(z.role||"system"),text:String(z.text||""),files:Array.isArray(z.files)?z.files:[]})),receiving:!1,processing:P});}catch{}}return {boardId:n,cardDefinitions:c,statusSnapshot:at(),dataObjectsByToken:g,cardRuntimeById:k,cardChatsByCardId:b}}function Gt(c,d,g){let k=g?.syncBoard!==false,b=g?.restartOnlyIfChanged===true,A=L(c);if(!A)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let N=q(c);if(!N)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let M=b?JSON.stringify(N):null,P=d(N)||N;if(b&&JSON.stringify(P)===M)return;let z=A.cardStore.set({body:P});if(z.status!=="success")throw Object.assign(new Error(z.error||`Failed to persist card: ${c}`),{statusCode:500});if(k){let tt=A.board.upsertCard({params:{cardId:c,restart:true}});if(tt.status!=="success")throw Object.assign(new Error(tt.error||`Failed to upsert card: ${c}`),{statusCode:500})}}function se(c,d){Gt(c,d,{syncBoard:true});}function ae(c,d){Gt(c,d,{syncBoard:false});}function Ie(c){let d=L(c);if(!d)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});if(!q(c))throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let k=d.board.upsertCard({params:{cardId:c,restart:true}});if(k.status!=="success")throw Object.assign(new Error(k.error||`Failed to retrigger card: ${c}`),{statusCode:500})}function v(c,d){Gt(c,g=>{if(!d||typeof d!="object"||Object.keys(d).length===0)return g;function k(b,A,N){let M=String(A||"").split(".").filter(Boolean);if(!M.length)return;let P=b;for(let z=0;z<M.length-1;z++){let tt=M[z];(!P[tt]||typeof P[tt]!="object")&&(P[tt]={}),P=P[tt];}P[M[M.length-1]]=N;}if(d.fieldValues!==void 0&&d.fieldValues!==null){let b=null,A=g.view;if(A&&Array.isArray(A.elements)){for(let N of A.elements)if(N?.data&&N.data.writeTo){b=N.data.writeTo;break}}b?k(g,b,d.fieldValues):typeof d.fieldValues=="object"&&!Array.isArray(d.fieldValues)&&(g.card_data={...g.card_data||{},...d.fieldValues});}else {if(Array.isArray(d._stagedFiles)&&d._stagedFiles.length>0)return g;for(let[b,A]of Object.entries(d))b!=="_stagedFiles"&&(A!==null&&typeof A=="object"&&!Array.isArray(A)&&g[b]!==null&&typeof g[b]=="object"&&!Array.isArray(g[b])?g[b]={...g[b],...A}:g[b]=A);}return g},{syncBoard:true,restartOnlyIfChanged:true});}function h(c){let d=String(c||"").trim();if(!d)return "upload.bin";let g=Math.max(d.lastIndexOf("/"),d.lastIndexOf("\\"));return (g>=0?d.slice(g+1):d)||"upload.bin"}function I(c){a.clear(c),a.setProcessing(c,false);}function B(c,d,g,k){let b=typeof g=="string"?g.trim():"";return a.append(c,d,b,k)}function J(c){return a.readAll(c)}function W(c){let d=[];try{let g=q(c);if(!g)return d;let k=U().read(g.card_data&&typeof g.card_data=="object"?g.card_data:null);for(let b of k)d.push(b.stored_name);}catch{}return d}function dt(c,d,g,k){let b=X(c),A=$(c),N=h(d),M=D(c),P=M?M.allocateStoredName(b,N,{seedNames:W(c),maxLen:Un}):`${String(Date.now())}-${N}`;return A.files&&A.files.putBytes(`${b}/${P}`,new Uint8Array(k),g||"application/octet-stream"),{name:N,stored_name:P,size:k.length,mime_type:g||"application/octet-stream",uploaded_at:new Date().toISOString()}}function Q(c){let d=L(c);if(!d)return null;let g=d.board.getConfig({params:{key:"chat-handler-flow"}}),k=g.status==="success"?g.data?.value:null,b=d.chatHandlerRef;return k==null&&(!b||typeof b!="object")?null:{ctx:d,handlerFlow:k,handlerRef:b}}function ft(c,d,g=false){let k=Q(c);if(!k)return;let{ctx:b,handlerFlow:A,handlerRef:N}=k;if(!g)try{a.setProcessing(c,!0);}catch{}let M={boardId:n,cardId:String(c),lastChatEntryId:d,...p,...m?{serverUrl:m}:{}};if(!i&&A!=null){try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${c}" but no chatFlowRunner was provided`);return}if(A!=null){let z=i;if(!z)return;z.run(A,M,{boardId:n,cardId:String(c),label:b.label,logger:o,serverUrl:m,executionExtra:p}).then(tt=>{if(tt.dispatched)o.info(`[chat-handler-flow] invoked for card "${c}" (boardId: "${n}")`);else {try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${c}": ${tt.error||"unknown"}`);}},tt=>{try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${c}": ${tt?.message||String(tt)}`);});return}let P=N;P&&s.invoke(P,M).then(z=>{if(z.dispatched)o.info(`[chat-handler] invoked for card "${c}" (boardId: "${n}")`);else {try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${c}": ${z.error||"unknown"}`);}},z=>{try{a.setProcessing(c,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${c}": ${z?.message||String(z)}`);});}function ut(c,d,g){let k=d==="chat-send"?ae:se,b;k(c,A=>{let N=new Date().toISOString(),M=A.card_data&&typeof A.card_data=="object"?A.card_data:{};if(A.card_data=M,d==="chat-send"){let P=g&&typeof g.text=="string"?g.text.trim():"",z=[];if(Array.isArray(g?.files)){for(let tt of g.files)if(tt){if(typeof tt=="string"){z.push({name:tt});continue}if(typeof tt=="object"){let yt=tt;typeof yt.name=="string"&&z.push({name:yt.name,size:yt.size,mime_type:yt.mime_type,uploaded_at:yt.uploaded_at,stored_name:yt.stored_name,chat:yt.chat===true});}}}if(P||z.length>0){let tt=u.runBatch({cardId:c,commands:[{command:"append",role:"user",text:P,files:z},{command:"set-processing",active:true}]});if(tt.status!=="success")throw new Error(tt.error);let yt=tt.data.results[0]?.data?.id;if(typeof yt!="string"||!yt)throw new Error(`chat-send did not return an append id for card ${c}`);b={cardId:c,lastEntryId:yt,processingAlreadySet:true};try{let ue=J(c);F([{kind:"card_chats",cardId:c,messages:ue.map(jt=>({role:String(jt.role||"system"),text:String(jt.text||""),files:Array.isArray(jt.files)?jt.files:[]})),receiving:!0,processing:a.isProcessing(c)}]);}catch{}}return A}if(d==="file-upload"){let P=U().normalizeIncoming(g?.files,N);return P.length>0&&U().merge(M,P),A}if(d==="action"){let P=g&&typeof g.buttonId=="string"?g.buttonId:"";if(!P)return A;M.lastAction={buttonId:P,at:N},M.lastActionText=`${P} @ ${N}`;}return A}),b&&ft(b.cardId,b.lastEntryId,b.processingAlreadySet);}function K(c,d,g){let k=JSON.stringify(g),b=typeof Buffer<"u"?Buffer.byteLength(k):new TextEncoder().encode(k).length;c.writeHead(d,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":b}),c.end(k);}async function gt(c){let d=[];for await(let k of c)d.push(k);let g=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(Et(d)).trim();return g?JSON.parse(g):{}}async function Bt(c){let d=[];for await(let g of c)d.push(g);return typeof Buffer<"u"?Buffer.concat(d):Et(d)}function Et(c){let d=c.reduce((b,A)=>b+A.length,0),g=new Uint8Array(d),k=0;for(let b of c)g.set(b,k),k+=b.length;return g}let At=0;function Ut(c){let d=JSON.stringify(c);return At++,`id: ${At}
|
|
2
2
|
data: ${d}
|
|
3
3
|
|
|
4
|
-
`}function
|
|
4
|
+
`}function Jt(c){let d=c;try{d.flushHeaders?.();}catch{}try{d.flush?.();}catch{}try{d.socket?.setNoDelay?.(!0);}catch{}try{d.socket?.uncork?.();}catch{}}function Vt(c,d){let g=_.get(c);if(g&&!(d&&g.res!==d)){_.delete(c),Qt();try{y?.(c);}catch{}try{g.res.end();}catch{}}}function Ht(c,d){let g=_.get(c);if(!g)return;let k=Ut(d);try{g.res.write(k),Jt(g.res);}catch{Vt(c,g.res);}}function Zt(c,d,g,k,b){if(!_.has(d)){K(c,404,{error:`SSE client not connected: ${d}`});return}b?S?.(d,g,k):C?.(d,g,k),K(c,200,{ok:true,clientId:d,channelName:g,...k.cardId?{cardId:k.cardId}:{},subscribed:b});}function ie(){let c=new Set;for(let d of _.values())for(let g of d.subscribedChatCardIds)c.add(g);return Array.from(c)}function qe(c){let d=O.has(c)?O.get(c):null,{cursor:g}=a.readAfter(c,d),k=a.isProcessing(c),b=k!==(R.get(c)??false),A=g!==d;return A&&O.set(c,g),R.set(c,k),A||b}function Pt(c,d=true){let g=J(c),k=Date.now();return {kind:"card_chats",cardId:c,sentAt:new Date(k).toISOString(),sentAtMs:k,messages:g.map(b=>({role:String(b.role||"system"),text:String(b.text||""),files:Array.isArray(b.files)?b.files:[]})),receiving:d,processing:a.isProcessing(c)}}function Kt(c,d=true){let g={kind:"notification-batch",notifications:[Pt(c,d)]};for(let[k,b]of _.entries())b.subscribedChatCardIds.has(c)&&Ht(k,g);}function Qt(){ie().length>0||(w&&(clearInterval(w),w=null),O.clear(),R.clear());}function zt(){if(w)return;let c=()=>{let d=ie();if(d.length===0){Qt();return}let g=new Set(d);for(let k of Array.from(O.keys()))g.has(k)||O.delete(k);for(let k of Array.from(R.keys()))g.has(k)||R.delete(k);for(let k of d)qe(k)&&Kt(k,true);};c(),w=setInterval(c,1e3);}function Dt(c,d){let g=_.get(c);if(!g)return false;g.subscribedChatCardIds.add(d);let{cursor:k}=a.readAfter(d,null);return O.set(d,k),R.set(d,a.isProcessing(d)),zt(),Ht(c,{kind:"notification-batch",notifications:[Pt(d,true)]}),true}function Ee(c,d){let g=_.get(c);return g?(g.subscribedChatCardIds.delete(d),ie().includes(d)||(O.delete(d),R.delete(d)),Qt(),true):false}function E(c){if(!c||typeof c!="object")return false;let d=c.kind;return d==="card_chats"||d==="chat_messages"}function F(c){if(!c||c.length===0)return;let d=[],g=new Set;for(let k of c)E(k)&&typeof k.cardId=="string"?g.add(String(k.cardId)):d.push(k);if(d.length>0){let k={kind:"notification-batch",notifications:d};for(let b of _.keys())Ht(b,k);}for(let k of g)Kt(k,true);}function Z(c,d,g){let k=_.get(g),b=k?new Set(k.subscribedChatCardIds):new Set;k&&Vt(g,k.res),d.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),Jt(d),_.set(g,{res:d,subscribedChatCardIds:b});let A=Mt(),N=Ut(A);d.write(N);try{l?.(g,P=>{Ht(g,P);});}catch{}let M=setInterval(()=>{try{d.write(`: keepalive
|
|
5
5
|
|
|
6
|
-
`);}catch{}},15e3);c.on("close",()=>{clearInterval(
|
|
7
|
-
${new Date().toISOString()}`);}catch{}function i(){let p=globalThis.localStorage.getItem(r);if(p===null)return {};try{let l=JSON.parse(p);return l&&typeof l=="object"&&!Array.isArray(l)?l:{}}catch{return {}}}function a(p){try{globalThis.localStorage.setItem(r,JSON.stringify(p));}catch{}}if(s){let p=i();typeof p["retention.lastSweepAt"]!="number"&&(p["retention.lastSweepAt"]=Date.now(),a(p));}function u(){if(globalThis.localStorage.getItem(e)===null)return;let p=i(),l=typeof p["retention.maxAgeMs"]=="number"?p["retention.maxAgeMs"]:Kn,
|
|
8
|
-
${new Date().toISOString()}`);}catch{}function o(){let a=globalThis.localStorage.getItem(r);if(a===null)return {};try{let u=JSON.parse(a);return u&&typeof u=="object"&&!Array.isArray(u)?u:{}}catch{return {}}}function s(a){try{globalThis.localStorage.setItem(r,JSON.stringify(a));}catch{}}function i(){if(globalThis.localStorage.getItem(e)===null)return;let a=o(),u=typeof a["retention.maxAgeMs"]=="number"?a["retention.maxAgeMs"]:0,f=typeof a["retention.sweepIntervalMs"]=="number"?a["retention.sweepIntervalMs"]:0;if(u<=0||f<=0)return;let m=typeof a["retention.lastSweepAt"]=="number"?a["retention.lastSweepAt"]:0,p=Date.now();if(p-m<f)return;a["retention.lastSweepAt"]=p,s(a);let l=`${t}${Ne}`;for(let h=0;h<globalThis.localStorage.length;h++){let y=globalThis.localStorage.key(h);if(!y||!y.startsWith(l))continue;let b=globalThis.localStorage.getItem(y);if(b)try{let A=JSON.parse(b),O=A.filter(C=>typeof C.__ts!="number"||p-C.__ts<=u);O.length!==A.length&&globalThis.localStorage.setItem(y,JSON.stringify(O));}catch{}}}return {stream(a){let u=qr(a),f=n(u);function m(){let l=globalThis.localStorage.getItem(f);if(!l)return [];try{return JSON.parse(l)}catch{return []}}function p(l){try{globalThis.localStorage.setItem(f,JSON.stringify(l));}catch{}}return {append(l){let h={id:globalThis.crypto.randomUUID(),payload:l,__ts:Date.now()},y=m();y.push(h),p(y);try{i();}catch{}return {id:h.id,payload:h.payload}},readAll(){return m().map(l=>({id:l.id,payload:l.payload}))},readAfter(l){let h=m();if(!l){let O=h.map(C=>({id:C.id,payload:C.payload}));return {entries:O,newCursor:O.length>0?O[O.length-1].id:null}}let y=h.findIndex(O=>O.id===l),A=(y===-1?h:h.slice(y+1)).map(O=>({id:O.id,payload:O.payload}));return {entries:A,newCursor:A.length>0?A[A.length-1].id:l}},clear(){try{globalThis.localStorage.removeItem(f);}catch{}}}},blob(a){let u=qr(a),f=Ce(`${t}${Lr}${u}`);return {read:m=>f.read(m),write:(m,p)=>{f.write(m,p);try{i();}catch{}},exists:m=>f.exists(m),remove:m=>f.remove(m),readBytes:f.readBytes?m=>f.readBytes(m):void 0,writeBytes:f.writeBytes?(m,p)=>{f.writeBytes(m,p);try{i();}catch{}}:void 0,listKeys:m=>f.listKeys(m),stat:f.stat?m=>f.stat(m):void 0}},listStreams(a){let u=`${t}${Ne}`,f=[];for(let m=0;m<globalThis.localStorage.length;m++){let p=globalThis.localStorage.key(m);if(!p||!p.startsWith(u))continue;let l=p.slice(u.length);(!a||l.startsWith(a))&&f.push(l);}return f.sort()},listBlobs(a){let u=`${t}${Lr}`,f=new Set;for(let m=0;m<globalThis.localStorage.length;m++){let p=globalThis.localStorage.key(m);if(!p||!p.startsWith(u))continue;let l=p.slice(u.length),h=l.indexOf(":"),y=h===-1?l:l.slice(0,h);(!a||y.startsWith(a))&&f.add(y);}return Array.from(f).sort()},config:{get(a){return o()[a]??null},set(a,u){let f=o();u==null?delete f[a]:f[a]=u,s(f);}}}}function Re(t){function e(r){return `${t}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(e(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(e(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(e(r));},listKeys(r){let n=e(r??""),o=[];for(let s=0;s<globalThis.localStorage.length;s++){let i=globalThis.localStorage.key(s);i!==null&&i.startsWith(n)&&o.push(i.slice(e("").length));}return o}}}function Gr(t){function e(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {readAllEntries(){return e()},appendEntry(n){let o=e();o.push(n),r(o);},generateId(){return globalThis.crypto.randomUUID()}}}function Zn(){let t=false;return {tryAcquire(){return t?null:(t=true,()=>{t=false;})}}}function Qn(t){return String(t).replace(/[^a-zA-Z0-9_-]/g,"_")}function to(t){function e(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {append(n){let o={id:globalThis.crypto.randomUUID(),payload:n},s=e();return s.push(o),r(s),o},readAll(){return e()},readAfter(n){let o=e();if(!n)return {entries:o,newCursor:o.length>0?o[o.length-1].id:null};let s=o.findIndex(a=>a.id===n),i=s===-1?o:o.slice(s+1);return {entries:i,newCursor:i.length>0?i[i.length-1].id:n}},clear(){globalThis.localStorage.removeItem(t);}}}function Jr(t){return Br(e=>to(`${t}:chat:journal:${Qn(e)}`),Re(`${t}:chat`))}var Ur=new Map;function we(t){let e=Ur.get(t);if(!e){let r=new Set;e={publish(n){for(let o of r)o(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},Ur.set(t,e);}return e}function Vr(){return {async subscribe(t,e){return t.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${t.kind}`),()=>{}):we(t.value).subscribe(n=>{let o=n;if(o&&o.kind==="notification-batch"&&Array.isArray(o.notifications)){for(let s of o.notifications)e(s);return}e(n);})}}}function Hr(t,e){let r=e?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:e.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:rt({kind:"in-browser",value:t})},n=new Map,o=new Map,s=Zn();return {kvStorage:i=>Re(`${t}:${i}`),blobStorage:i=>Ce(i?`${t}:${i}`:t),scratchStorage:()=>De(`${t}:scratch`),scratchStorageForRef:i=>De(Rt(i).value),archiveFactory:()=>Fe(`${t}:archive`),archiveFactoryForRef:i=>Fe(Rt(i).value),journalAdapter:()=>Gr(`${t}:journal`),lock:s,selfRef:r,async dispatchExecution(i,a){if(i.howToRun==="http:post")try{let u=i.whatToRun,f=typeof u=="object"?u.value:Rt(u).value,m=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return m.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${m.status}: ${m.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(i.howToRun==="http:get")try{let u=i.whatToRun,f=typeof u=="object"?u.value:Rt(u).value,m=new URLSearchParams(Object.entries(a).filter(([,h])=>h!=null).map(([h,y])=>[h,String(y)])),p=`${f}?${m.toString()}`,l=await fetch(p);return l.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${l.status}: ${l.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(i.howToRun==="in-browser"){let u=i.whatToRun,f=typeof u=="object"?u.value:Rt(u).value,m=n.get(f);return m?m(i,a):{dispatched:false,error:`No in-browser handler registered for: ${f}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${i.howToRun})`}},resolveBlob(i){if(i.kind==="in-memory"){let f=o.get(i.value);if(f==null)throw new Error(`resolveBlob: in-memory blob not found: ${rt(i)}`);return f}let u=Ce(t).read(i.value);if(u===null)throw new Error(`resolveBlob: blob not found: ${rt(i)}`);return u},hashFn:Mr,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:i=>Re(Rt(i).value),publishBoardChangeNotifications(i){if(!e?.notifyChannel||i.length===0)return;we(e.notifyChannel).publish({kind:"notification-batch",notifications:i});},onWarn:e?.onWarn,registerHandler(i,a){n.set(i,a);},writeMemoryBlob(i,a){return o.set(i,a),rt({kind:"in-memory",value:i})}}}function Kr(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function eo(t,e){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:t,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function oe(t,e){if(!t||typeof t!="object")throw new Error("payload must be an object");if(!e)throw new Error("cardId is required");let n=(Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).find(w=>w.id===e);if(!n)throw new Error(`cardDefinitions has no entry with id ${e}`);let o=t.statusSnapshot&&typeof t.statusSnapshot=="object"?t.statusSnapshot:{},s=t.cardRuntimeById&&typeof t.cardRuntimeById=="object"?t.cardRuntimeById:{},i=t.dataObjectsByToken&&typeof t.dataObjectsByToken=="object"?t.dataObjectsByToken:{},u=(Array.isArray(o.cards)?o.cards:[]).find(w=>w.name===e),f=structuredClone(n),m=eo(e,s[e]),l={...f.card_data&&typeof f.card_data=="object"&&!Array.isArray(f.card_data)?f.card_data:{},...m.card_data||{},status:Kr(u?.status),lastRun:u?.runtime?.last_transition_at??null};u?.error?.message&&(l.error=u.error.message);let h=u?{task_status:u.status??null,card_status:Kr(u.status),runtime:structuredClone(u.runtime??{}),error:u.error?structuredClone(u.error):null,blocked_by:Array.isArray(u.blocked_by)?structuredClone(u.blocked_by):[],requires_missing:Array.isArray(u.requires_missing)?structuredClone(u.requires_missing):[]}:{task_status:null,card_status:l.status??"fresh",runtime:{last_transition_at:l.lastRun??null},error:l.error?{message:l.error}:null,blocked_by:[],requires_missing:[]},y=Array.isArray(f.requires)?f.requires:[],b={};for(let[w,M]of Object.entries(i))b[w]=structuredClone(M);for(let w of y)Object.prototype.hasOwnProperty.call(b,w)||(b[w]=null);let O=(t.cardChatsByCardId&&typeof t.cardChatsByCardId=="object"?t.cardChatsByCardId:{})[e],C=O?{messages:Array.isArray(O.messages)?O.messages:[],receiving:!!O.receiving,processing:!!O.processing}:null;return {id:e,card:f,card_data:l,requires:b,computed_values:m.computed_values,runtime_state:h,card_chats:C}}function ro(t){if(!t||typeof t!="object")throw new Error("payload must be an object");return (Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).map(r=>oe(t,r.id))}function ve(t){return JSON.parse(JSON.stringify(t))}function Xt(t,e){if(t===e)return t;try{if(JSON.stringify(t)===JSON.stringify(e))return t}catch{}return e}function wt(t,e){if(t===e)return true;try{return JSON.stringify(t)===JSON.stringify(e)}catch{return false}}function no(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function zr(t,e,r){let n=t,s=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(u=>u.id),i=e&&e.modelsById||{},a={};for(let u of s){let f=r(t,u),m=i[u];if(!m){a[u]=f;continue}let p=f.card_chats!=null?Xt(m.card_chats,f.card_chats??null):m.card_chats??null,l={id:f.id,card:Xt(m.card,f.card),card_data:Xt(m.card_data,f.card_data),requires:Xt(m.requires,f.requires),computed_values:Xt(m.computed_values,f.computed_values),runtime_state:Xt(m.runtime_state,f.runtime_state),card_chats:p};a[u]=l.card===m.card&&l.card_data===m.card_data&&l.requires===m.requires&&l.computed_values===m.computed_values&&l.runtime_state===m.runtime_state&&l.card_chats===m.card_chats?m:l;}return {payload:t,cardIds:s,modelsById:a}}function Wr(t,e,r,n){if(!t||!Array.isArray(e)||e.length===0)return t;let o=t.modelsById,s=t.cardIds,i=false,a=false,u={};for(let m of s){let p=o[m],l=p&&p.requires;if(l&&typeof l=="object")for(let h of Object.keys(l))(u[h]=u[h]||[]).push(m);}function f(){i||(o={...o},i=true);}for(let m of e)if(!(!m||!m.kind)){if(m.kind==="computed_values"){let p=m.cardId,l=o[p];if(!l)continue;let h=m.values||{};if(wt(l.computed_values,h))continue;f(),o[p]={...l,computed_values:h},a=true;}else if(m.kind==="data_object"){let p=m.key,l=m.payload,h=u[p]||[];for(let y of h){let b=o[y];if(!b)continue;let A=b.requires||{};wt(A[p],l)||(f(),o[y]={...b,requires:{...A,[p]:l}},a=true);}}else if(m.kind==="card_refreshed"){let p=m.cardId,l=null,h=o[p],y=m.card;if(h&&y&&typeof y=="object"&&!Array.isArray(y)){let b=y,A=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:h.card_data,O=b.requires&&typeof b.requires=="object"&&!Array.isArray(b.requires)?b.requires:h.requires,C=b.computed_values&&typeof b.computed_values=="object"&&!Array.isArray(b.computed_values)?b.computed_values:h.computed_values,w=b.runtime_state&&typeof b.runtime_state=="object"&&!Array.isArray(b.runtime_state)?b.runtime_state:h.runtime_state;l={...h,card:y,card_data:A,requires:O,computed_values:C,runtime_state:w};}if(!l)try{let b=n();b&&(l=r(b,p));}catch{}if(!l||h&&wt(h.card,l.card)&&wt(h.card_data,l.card_data)&&wt(h.requires,l.requires)&&wt(h.computed_values,l.computed_values)&&wt(h.runtime_state,l.runtime_state))continue;f(),o[p]=l,s.includes(p)||(s=[...s,p]),a=true;}else if(m.kind==="card_chats"){let p=m.cardId,l=o[p];if(!l)continue;let h=Array.isArray(m.messages)?m.messages:l.card_chats?.messages??[],y=typeof m.receiving=="boolean"?m.receiving:l.card_chats?.receiving??false,b=typeof m.processing=="boolean"?m.processing:l.card_chats?.processing??false,A={messages:h,receiving:y,processing:b};if(wt(l.card_chats,A))continue;f(),o[p]={...l,card_chats:A},a=true;}else if(m.kind==="chat_messages"){let p=m.cardId,l=o[p];if(!l)continue;let h=Array.isArray(m.messages)?m.messages:[],y=l.card_chats||{receiving:false,processing:false},b={messages:h,receiving:y.receiving,processing:!!y.processing};if(wt(l.card_chats,b))continue;f(),o[p]={...l,card_chats:b},a=true;}else if(m.kind==="status"){let p=m.status?.cards??[];for(let l of p){let h=l?.name;if(!h||!o[h])continue;let y=o[h],b=no(l.status),A={...y.card_data||{},status:b,lastRun:l.runtime?.last_transition_at??null,...l.error?.message?{error:l.error.message}:{}};l.error?.message||delete A.error;let O={task_status:l.status??null,card_status:b,runtime:l.runtime?ve(l.runtime):{},error:l.error?ve(l.error):null,blocked_by:Array.isArray(l.blocked_by)?ve(l.blocked_by):[],requires_missing:Array.isArray(l.requires_missing)?ve(l.requires_missing):[]};wt(y.card_data,A)&&wt(y.runtime_state,O)||(f(),o[h]={...y,card_data:A,runtime_state:O},a=true);}}}return a?{payload:t.payload,cardIds:s,modelsById:o}:t}function _s(t,e){let r=e?.cards??[],n=e?.onWarn??(()=>{}),o=`${t}:notify`,s=Hr(t,{callbackBaseUrl:e?.callbackBaseUrl,notifyChannel:o,onWarn:n}),i=Rt(rt({kind:"localstorage",value:t})),a=rt({kind:"localstorage",value:`${t}:card-store`}),u=rt({kind:"localstorage",value:`${t}:outputs`}),f=e?.taskExecutor??null,m=e?.chatHandler??null,p=rt({kind:"in-browser",value:`${t}:task-executor`}),l=rt({kind:"in-browser",value:`${t}:chat-handler`});f&&s.registerHandler(p,f),m&&s.registerHandler(l,m);let h={async invoke(T,x){return T.howToRun==="in-browser",s.dispatchExecution(T,x)}},y=e?.taskExecutorRef??(f?{meta:"task-executor",howToRun:"in-browser",whatToRun:p}:void 0),b=e?.chatHandlerRef??(m?{meta:"chat-handler",howToRun:"in-browser",whatToRun:l}:void 0),A=Vr(),O=Jr(t),C=Dr({boardId:t,chatStorage:O,boards:[{label:t,boardAdapter:s,baseRef:i,cardStoreRef:a,outputsStoreRef:u,notifyRef:{kind:"in-memory-bus",value:o},taskExecutorRef:y,chatHandlerRef:b}],invocationAdapter:h,notificationTransport:A,logger:{info:(...T)=>console.log("[board]",...T),warn:(...T)=>{n(String(T[0])),console.warn("[board]",...T);},error:(...T)=>console.error("[board]",...T)}});r.length&&C.cardStore.set({body:r}),e?.onBoardChange&&we(o).subscribe(x=>{let j=x;!j||j.kind!=="notification-batch"||!Array.isArray(j.notifications)||j.notifications.length===0||e.onBoardChange?.({notifications:j.notifications});});function w(T,x,j){let D=j?JSON.stringify(j):"",U=new TextEncoder().encode(D),z=false;return {method:T,url:x,headers:{"content-type":"application/json"},on(it,at){},[Symbol.asyncIterator](){let it={async next(){return z?{done:true,value:void 0}:(z=true,{done:false,value:U})},[Symbol.asyncIterator](){return it}};return it}}}function M(){let T=200,x=[];return {res:{writeHead(D){T=D;},write(D){return x.push(typeof D=="string"?D:new TextDecoder().decode(D)),true},end(D){D&&x.push(typeof D=="string"?D:new TextDecoder().decode(D));}},getResult:()=>{let D=x.join(""),U;try{U=JSON.parse(D);}catch{U=D;}return {status:T,body:U}}}}let B=C.apiBasePath;return {async bootstrap(){let T=w("GET",`${B}/bootstrap`),{res:x}=M();await C.handleRuntimeApi(T,x,new URL(`http://localhost${B}/bootstrap`));},getState(){return C.buildPublishedRuntimePayload()},async patchCard(T,x){let j=`${B}/cards/${encodeURIComponent(T)}`,D=w("PATCH",j,x),{res:U}=M();await C.handleRuntimeApi(D,U,new URL(`http://localhost${j}`));},async applyCardAction(T,x,j){let D=`${B}/cards/${encodeURIComponent(T)}/actions`,U=w("POST",D,{actionType:x,payload:j}),{res:z}=M();await C.handleRuntimeApi(U,z,new URL(`http://localhost${D}`));},readChatRecords(T){let x=`${B}/cards/${encodeURIComponent(T)}/chats`,j=w("GET",x),D=M();C.handleRuntimeApi(j,D.res,new URL(`http://localhost${x}`));let z=D.getResult().body;return Array.isArray(z?.messages)?z.messages:[]},clearChatRecords(T){C.clearChatRecords(T);},writeMemoryBlob(T,x){return s.writeMemoryBlob(T,x)},reportSourceFetched(T,x){C.reportSourceFetched(T,x);},reportSourceFetchFailure(T,x){C.reportSourceFetchFailure(T,x);},get runtime(){return C}}}function Is(t,e){return zr(t,e,oe)}function Es(t,e,r){return Wr(t,e,oe,r)}
|
|
6
|
+
`);}catch{}},15e3);c.on("close",()=>{clearInterval(M),Vt(g,d);});}async function _t(c,d,g){let k=c.method||"GET",b=g,A=b.pathname;try{if(k==="GET"&&A===`${e}/init-board`)return await Tt(),K(d,200,Mt()),!0;if(k==="GET"&&A===`${e}/sse`){await Tt();let V=String(b.searchParams.get("clientId")||"").trim();if(!V)return K(d,400,{error:"clientId query param is required for SSE"}),!0;Z(c,d,V);for(let H=0;H<j.length;H++)Ft(j[H]),qt(j[H],H);return !0}if(k==="GET"&&A===`${e}/board-status`)return K(d,200,Mt()),!0;let N=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)$`));if(k==="GET"&&N){await ht();let V=decodeURIComponent(N[1]),H=q(V);return H?(K(d,200,H),!0):(K(d,404,{error:`card not found: ${V}`}),!0)}if(k==="PATCH"&&N){await ht();let V=decodeURIComponent(N[1]),H=await gt(c);return v(V,H),K(d,200,{ok:!0}),!0}let M=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)/retrigger$`));if(k==="POST"&&M){await ht();let V=decodeURIComponent(M[1]);return Ie(V),K(d,200,{ok:!0}),!0}let P=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)/actions$`));if(k==="POST"&&P){await ht();let V=decodeURIComponent(P[1]),H=Date.now(),et=new Date(H).toISOString(),pt=await gt(c),mt=pt?.actionType;if(mt==="chat-send"&&!Q(V)){let Ot=Date.now();return K(d,409,{error:`chat handler is not configured for card: ${V}`,requestReceivedAt:et,requestReceivedAtMs:H,responseSentAt:new Date(Ot).toISOString(),responseSentAtMs:Ot,responseStatus:409}),!0}ut(V,mt,pt?.payload);let Ct=Date.now();return K(d,200,{ok:!0,requestReceivedAt:et,requestReceivedAtMs:H,responseSentAt:new Date(Ct).toISOString(),responseSentAtMs:Ct,responseStatus:200}),!0}let z=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)/chats$`));if(k==="GET"&&z){await ht();let V=decodeURIComponent(z[1]);return K(d,200,{ok:!0,messages:J(V)}),!0}if(k==="POST"&&z){await ht();let V=decodeURIComponent(z[1]),H=await gt(c),et=typeof H?.role=="string"?H.role:"assistant",pt=typeof H?.text=="string"?H.text:"",mt=Array.isArray(H?.files)?H.files:[],Ct=H?.done===!0,Ot=a.append(V,et,pt,mt);return Ct&&a.setProcessing(V,!1),Kt(V,!Ct),K(d,200,{ok:!0,id:Ot}),!0}let tt=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(k==="POST"&&tt){await ht();let V=decodeURIComponent(tt[1]),H=await gt(c),et=typeof H?.clientId=="string"?H.clientId.trim():"";return et?Dt(et,V)?(K(d,200,{ok:!0,clientId:et,cardId:V,subscribed:!0}),!0):(K(d,404,{error:`SSE client not connected: ${et}`}),!0):(K(d,400,{error:"clientId is required"}),!0)}let yt=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(k==="POST"&&yt){await ht();let V=decodeURIComponent(yt[1]),H=await gt(c),et=typeof H?.clientId=="string"?H.clientId.trim():"";return et?Ee(et,V)?(K(d,200,{ok:!0,clientId:et,cardId:V,subscribed:!1}),!0):(K(d,404,{error:`SSE client not connected: ${et}`}),!0):(K(d,400,{error:"clientId is required"}),!0)}let ce=A.match(new RegExp(`^${xt(e)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(k==="POST"&&ce){await ht();let V=decodeURIComponent(ce[1]),H=ce[2]==="subscribe",et=await gt(c),pt=typeof et?.clientId=="string"?et.clientId.trim():"";return pt?(Zt(d,pt,V,{},H),!0):(K(d,400,{error:"clientId is required"}),!0)}let te=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(k==="POST"&&te){await ht();let V=decodeURIComponent(te[1]),H=decodeURIComponent(te[2]),et=te[3]==="subscribe",pt=await gt(c),mt=typeof pt?.clientId=="string"?pt.clientId.trim():"";return mt?(Zt(d,mt,H,{cardId:V},et),!0):(K(d,400,{error:"clientId is required"}),!0)}let ue=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)/files$`));if(k==="POST"&&ue){await ht();let V=decodeURIComponent(ue[1]),H=String(b.searchParams.get("inChat")||"").toLowerCase()==="true",et=c.headers["x-file-name"],pt=String(c.headers["content-type"]||"application/octet-stream"),mt=Array.isArray(et)?et[0]:et,Ct=mt?decodeURIComponent(String(mt)):"upload.bin",Ot=await Bt(c);if(!Ot.length)return K(d,400,{error:"Empty upload body"}),!0;let Rt=dt(V,Ct,pt,Ot),Wt=null;if(ae(V,bt=>{let de=new Date().toISOString(),le=bt.card_data&&typeof bt.card_data=="object"?bt.card_data:{};bt.card_data=le;let Zr=U().normalizeIncoming([{name:Rt.name,stored_name:Rt.stored_name,size:Rt.size,mime_type:Rt.mime_type,uploaded_at:Rt.uploaded_at||de,chat:H}],de);return Wt=U().merge(le,Zr).findIndex(Qr=>Qr.stored_name===Rt.stored_name),bt}),H){let bt=typeof Wt=="number"&&Wt>=0?` #${Wt}`:"";B(V,"system",`file uploaded: ${Rt.name} as ${Rt.stored_name}${bt}`,[]);}return K(d,200,{ok:!0,file:Rt}),!0}let jt=A.match(new RegExp(`^${xt(e)}/cards/([^/]+)/files/(\\d+)$`));if(k==="GET"&&jt){let V=decodeURIComponent(jt[1]),H=parseInt(jt[2],10),et=b.searchParams.get("sn"),pt=q(V);if(!pt)return K(d,404,{error:"Card not found"}),!0;let mt=U().resolve(pt.card_data,H,et);if(!mt.ok&&mt.reason==="stale_reference")return K(d,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!mt.ok)return K(d,404,{error:"File not found"}),!0;let Ct=mt.file,Ot=X(V),Rt=$(V),Wt=`${Ot}/${Ct.stored_name}`,bt=Rt.files?Rt.files.getBytes(Wt):null;if(!bt)return K(d,404,{error:"File not found"}),!0;let de=Ct.name||Ct.stored_name,le=Ct.mime_type||"application/octet-stream";return d.writeHead(200,{"Content-Type":le,"Content-Disposition":`attachment; filename="${de}"`,"Content-Length":bt.length}),d.end(bt),!0}return !1}catch(N){let M=N?.statusCode||500;return K(d,M,{error:String(N?.message||N)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return r},handleRuntimeApi:_t,buildPublishedRuntimePayload:Mt,clearChatRecords:I,reportSourceFetched(c,d){let g=j[0];return g?g.board.sourceDataFetched({params:{token:c,ref:d}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(c,d){let g=j[0];return g?g.board.sourceDataFetchFailure({params:{token:c,reason:d}}):{status:"fail",error:"no board context"}},get cardStore(){return j[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function xt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pe(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return `[${t.map(Pe).join(",")}]`;let e=t;return `{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Pe(e[n])}`).join(",")}}`}function we(t,e){let r=e>>>0;for(let n=0;n<t.length;n++)r^=t.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function Ur(t){let e=Pe(t),r=we(e,2166136261),n=we(e,3735928559),o=we(e,19088743),s=we(e,4277009102);return [r,n,o,s].map(i=>i.toString(16).padStart(8,"0")).join("")}function Ae(t){function e(s){return `${t}:blob:${s}`}let r=new TextEncoder;function n(s){if(typeof btoa=="function"){let i="";for(let a=0;a<s.length;a++)i+=String.fromCharCode(s[a]);return btoa(i)}return ""}function o(s){if(typeof atob=="function"){let i=atob(s),a=new Uint8Array(i.length);for(let u=0;u<i.length;u++)a[u]=i.charCodeAt(u);return a}return new Uint8Array}return {read(s){return globalThis.localStorage.getItem(e(s))},write(s,i){globalThis.localStorage.setItem(e(s),i);},exists(s){return globalThis.localStorage.getItem(e(s))!==null},remove(s){globalThis.localStorage.removeItem(e(s));},readBytes(s){let i=globalThis.localStorage.getItem(e(s));if(i===null)return null;try{let a=JSON.parse(i);if(a&&a.__kind==="bytes-b64"&&typeof a.data=="string")return o(a.data)}catch{}return r.encode(i)},writeBytes(s,i){let a=JSON.stringify({__kind:"bytes-b64",data:n(i)});globalThis.localStorage.setItem(e(s),a);},listKeys(s){let i=e(s??""),a=[];for(let u=0;u<globalThis.localStorage.length;u++){let f=globalThis.localStorage.key(u);f&&f.startsWith(i)&&a.push(f.slice(e("").length));}return a.sort()},stat(s){let i=globalThis.localStorage.getItem(e(s));if(i===null)return null;let a=r.encode(i).byteLength;try{let u=JSON.parse(i);u&&u.__kind==="bytes-b64"&&typeof u.data=="string"&&(a=o(u.data).byteLength);}catch{}return {key:s,size:a}}}}var Vn=":scratch-marker",Hn=":scratch-config",ve=":scratch:",Kn=1440*60*1e3,zn=720*60*1e3,Wn=200;function qr(t,e){if(!t)return e;let r=t.replace(/[^A-Za-z0-9._-]/g,"_");return r.length>0?r:e}function De(t){let e=`${t}${Vn}`,r=`${t}${Hn}`,n=p=>`${t}${ve}${p}`,o=p=>`${t}${ve}${p}:__ts`,s=globalThis.localStorage.getItem(e)===null;if(s)try{globalThis.localStorage.setItem(e,`scratch-store
|
|
7
|
+
${new Date().toISOString()}`);}catch{}function i(){let p=globalThis.localStorage.getItem(r);if(p===null)return {};try{let l=JSON.parse(p);return l&&typeof l=="object"&&!Array.isArray(l)?l:{}}catch{return {}}}function a(p){try{globalThis.localStorage.setItem(r,JSON.stringify(p));}catch{}}if(s){let p=i();typeof p["retention.lastSweepAt"]!="number"&&(p["retention.lastSweepAt"]=Date.now(),a(p));}function u(){if(globalThis.localStorage.getItem(e)===null)return;let p=i(),l=typeof p["retention.maxAgeMs"]=="number"?p["retention.maxAgeMs"]:Kn,y=typeof p["retention.sweepIntervalMs"]=="number"?p["retention.sweepIntervalMs"]:zn;if(l<=0||y<=0)return;let S=typeof p["retention.lastSweepAt"]=="number"?p["retention.lastSweepAt"]:0,C=Date.now();if(C-S<y)return;p["retention.lastSweepAt"]=C,a(p);let _=C,O=`${t}${ve}`,R=[];for(let w=0;w<globalThis.localStorage.length;w++){let G=globalThis.localStorage.key(w);G&&G.startsWith(O)&&!G.endsWith(":__ts")&&R.push(G);}for(let w of R){if(Date.now()-_>Wn)break;let G=globalThis.localStorage.getItem(`${w}:__ts`),j=G===null?0:Number(G);if(Number.isFinite(j)&&j>0&&C-j>l){try{globalThis.localStorage.removeItem(w);}catch{}try{globalThis.localStorage.removeItem(`${w}:__ts`);}catch{}}}}function f(p,l){let y=qr(p,"scratch"),S=qr(l,".json"),C=S.startsWith(".")?S:`.${S}`,_=Math.random().toString(36).slice(2,10);return `${y}-${Date.now()}-${_}${C}`}function m(p,l){globalThis.localStorage.setItem(n(p),l),globalThis.localStorage.setItem(o(p),String(Date.now()));}return {read(p){return globalThis.localStorage.getItem(n(p))},write(p,l){m(p,l);try{u();}catch{}},exists(p){return globalThis.localStorage.getItem(n(p))!==null},remove(p){try{globalThis.localStorage.removeItem(n(p));}catch{}try{globalThis.localStorage.removeItem(o(p));}catch{}},readBytes(p){let l=globalThis.localStorage.getItem(n(p));return l===null?null:new TextEncoder().encode(l)},writeBytes(p,l){let y="";for(let S=0;S<l.length;S++)y+=String.fromCharCode(l[S]);m(p,y);try{u();}catch{}},stat(p){let l=globalThis.localStorage.getItem(n(p));if(l===null)return null;let y=globalThis.localStorage.getItem(o(p)),S=y===null?null:Number(y);return {key:p,size:new TextEncoder().encode(l).byteLength,updatedAt:S!==null&&Number.isFinite(S)?new Date(S).toISOString():void 0}},listKeys(p){let l=`${t}${ve}`,y=[];for(let S=0;S<globalThis.localStorage.length;S++){let C=globalThis.localStorage.key(S);if(C&&C.startsWith(l)&&!C.endsWith(":__ts")){let _=C.slice(l.length);(!p||_.startsWith(p))&&y.push(_);}}return y.sort()},getUniqueKey(p,l){return f(p,l)},create(p,l,y){let S=f(l,y);m(S,p);try{u();}catch{}return S},keyRef(p){return {kind:"local-storage-scratch",value:p,extra:{prefix:t}}},config:{get(p){return i()[p]??null},set(p,l){let y=i();l==null?delete y[p]:y[p]=l,a(y);}}}}var Xn=":archive-marker",Yn=":archive-config",Fe=":archive:stream:",Mr=":archive:blob:";function Gr(t){let e=t.replace(/[^A-Za-z0-9._-]/g,"_");if(!e)throw new Error("Archive segment name cannot be empty after sanitization");return e}function Le(t){let e=`${t}${Xn}`,r=`${t}${Yn}`,n=a=>`${t}${Fe}${a}`;if(globalThis.localStorage.getItem(e)===null)try{globalThis.localStorage.setItem(e,`archive-store
|
|
8
|
+
${new Date().toISOString()}`);}catch{}function o(){let a=globalThis.localStorage.getItem(r);if(a===null)return {};try{let u=JSON.parse(a);return u&&typeof u=="object"&&!Array.isArray(u)?u:{}}catch{return {}}}function s(a){try{globalThis.localStorage.setItem(r,JSON.stringify(a));}catch{}}function i(){if(globalThis.localStorage.getItem(e)===null)return;let a=o(),u=typeof a["retention.maxAgeMs"]=="number"?a["retention.maxAgeMs"]:0,f=typeof a["retention.sweepIntervalMs"]=="number"?a["retention.sweepIntervalMs"]:0;if(u<=0||f<=0)return;let m=typeof a["retention.lastSweepAt"]=="number"?a["retention.lastSweepAt"]:0,p=Date.now();if(p-m<f)return;a["retention.lastSweepAt"]=p,s(a);let l=`${t}${Fe}`;for(let y=0;y<globalThis.localStorage.length;y++){let S=globalThis.localStorage.key(y);if(!S||!S.startsWith(l))continue;let C=globalThis.localStorage.getItem(S);if(C)try{let _=JSON.parse(C),O=_.filter(R=>typeof R.__ts!="number"||p-R.__ts<=u);O.length!==_.length&&globalThis.localStorage.setItem(S,JSON.stringify(O));}catch{}}}return {stream(a){let u=Gr(a),f=n(u);function m(){let l=globalThis.localStorage.getItem(f);if(!l)return [];try{return JSON.parse(l)}catch{return []}}function p(l){try{globalThis.localStorage.setItem(f,JSON.stringify(l));}catch{}}return {append(l){let y={id:globalThis.crypto.randomUUID(),payload:l,__ts:Date.now()},S=m();S.push(y),p(S);try{i();}catch{}return {id:y.id,payload:y.payload}},readAll(){return m().map(l=>({id:l.id,payload:l.payload}))},readAfter(l){let y=m();if(!l){let O=y.map(R=>({id:R.id,payload:R.payload}));return {entries:O,newCursor:O.length>0?O[O.length-1].id:null}}let S=y.findIndex(O=>O.id===l),_=(S===-1?y:y.slice(S+1)).map(O=>({id:O.id,payload:O.payload}));return {entries:_,newCursor:_.length>0?_[_.length-1].id:l}},clear(){try{globalThis.localStorage.removeItem(f);}catch{}}}},blob(a){let u=Gr(a),f=Ae(`${t}${Mr}${u}`);return {read:m=>f.read(m),write:(m,p)=>{f.write(m,p);try{i();}catch{}},exists:m=>f.exists(m),remove:m=>f.remove(m),readBytes:f.readBytes?m=>f.readBytes(m):void 0,writeBytes:f.writeBytes?(m,p)=>{f.writeBytes(m,p);try{i();}catch{}}:void 0,listKeys:m=>f.listKeys(m),stat:f.stat?m=>f.stat(m):void 0}},listStreams(a){let u=`${t}${Fe}`,f=[];for(let m=0;m<globalThis.localStorage.length;m++){let p=globalThis.localStorage.key(m);if(!p||!p.startsWith(u))continue;let l=p.slice(u.length);(!a||l.startsWith(a))&&f.push(l);}return f.sort()},listBlobs(a){let u=`${t}${Mr}`,f=new Set;for(let m=0;m<globalThis.localStorage.length;m++){let p=globalThis.localStorage.key(m);if(!p||!p.startsWith(u))continue;let l=p.slice(u.length),y=l.indexOf(":"),S=y===-1?l:l.slice(0,y);(!a||S.startsWith(a))&&f.add(S);}return Array.from(f).sort()},config:{get(a){return o()[a]??null},set(a,u){let f=o();u==null?delete f[a]:f[a]=u,s(f);}}}}function _e(t){function e(r){return `${t}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(e(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(e(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(e(r));},listKeys(r){let n=e(r??""),o=[];for(let s=0;s<globalThis.localStorage.length;s++){let i=globalThis.localStorage.key(s);i!==null&&i.startsWith(n)&&o.push(i.slice(e("").length));}return o}}}function Jr(t){function e(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {readAllEntries(){return e()},appendEntry(n){let o=e();o.push(n),r(o);},generateId(){return globalThis.crypto.randomUUID()}}}function Zn(){let t=false;return {tryAcquire(){return t?null:(t=true,()=>{t=false;})}}}function Qn(t){return String(t).replace(/[^a-zA-Z0-9_-]/g,"_")}function to(t){function e(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {append(n){let o={id:globalThis.crypto.randomUUID(),payload:n},s=e();return s.push(o),r(s),o},readAll(){return e()},readAfter(n){let o=e();if(!n)return {entries:o,newCursor:o.length>0?o[o.length-1].id:null};let s=o.findIndex(a=>a.id===n),i=s===-1?o:o.slice(s+1);return {entries:i,newCursor:i.length>0?i[i.length-1].id:n}},clear(){globalThis.localStorage.removeItem(t);}}}function Hr(t){return $r(e=>to(`${t}:chat:journal:${Qn(e)}`),_e(`${t}:chat`))}var Vr=new Map;function xe(t){let e=Vr.get(t);if(!e){let r=new Set;e={publish(n){for(let o of r)o(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},Vr.set(t,e);}return e}function Kr(){return {async subscribe(t,e){return t.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${t.kind}`),()=>{}):xe(t.value).subscribe(n=>{let o=n;if(o&&o.kind==="notification-batch"&&Array.isArray(o.notifications)){for(let s of o.notifications)e(s);return}e(n);})}}}function zr(t,e){let r=e?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:e.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:st({kind:"in-browser",value:t})},n=new Map,o=new Map,s=Zn();return {kvStorage:i=>_e(`${t}:${i}`),blobStorage:i=>Ae(i?`${t}:${i}`:t),scratchStorage:()=>De(`${t}:scratch`),scratchStorageForRef:i=>De(wt(i).value),archiveFactory:()=>Le(`${t}:archive`),archiveFactoryForRef:i=>Le(wt(i).value),journalAdapter:()=>Jr(`${t}:journal`),lock:s,selfRef:r,async dispatchExecution(i,a){if(i.howToRun==="http:post")try{let u=i.whatToRun,f=typeof u=="object"?u.value:wt(u).value,m=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return m.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${m.status}: ${m.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(i.howToRun==="http:get")try{let u=i.whatToRun,f=typeof u=="object"?u.value:wt(u).value,m=new URLSearchParams(Object.entries(a).filter(([,y])=>y!=null).map(([y,S])=>[y,String(S)])),p=`${f}?${m.toString()}`,l=await fetch(p);return l.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${l.status}: ${l.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(i.howToRun==="in-browser"){let u=i.whatToRun,f=typeof u=="object"?u.value:wt(u).value,m=n.get(f);return m?m(i,a):{dispatched:false,error:`No in-browser handler registered for: ${f}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${i.howToRun})`}},resolveBlob(i){if(i.kind==="in-memory"){let f=o.get(i.value);if(f==null)throw new Error(`resolveBlob: in-memory blob not found: ${st(i)}`);return f}let u=Ae(t).read(i.value);if(u===null)throw new Error(`resolveBlob: blob not found: ${st(i)}`);return u},hashFn:Ur,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:i=>_e(wt(i).value),publishBoardChangeNotifications(i){if(!e?.notifyChannel||i.length===0)return;xe(e.notifyChannel).publish({kind:"notification-batch",notifications:i});},onWarn:e?.onWarn,registerHandler(i,a){n.set(i,a);},writeMemoryBlob(i,a){return o.set(i,a),st({kind:"in-memory",value:i})}}}function Wr(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function eo(t,e){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:t,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function oe(t,e){if(!t||typeof t!="object")throw new Error("payload must be an object");if(!e)throw new Error("cardId is required");let n=(Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).find(w=>w.id===e);if(!n)throw new Error(`cardDefinitions has no entry with id ${e}`);let o=t.statusSnapshot&&typeof t.statusSnapshot=="object"?t.statusSnapshot:{},s=t.cardRuntimeById&&typeof t.cardRuntimeById=="object"?t.cardRuntimeById:{},i=t.dataObjectsByToken&&typeof t.dataObjectsByToken=="object"?t.dataObjectsByToken:{},u=(Array.isArray(o.cards)?o.cards:[]).find(w=>w.name===e),f=structuredClone(n),m=eo(e,s[e]),l={...f.card_data&&typeof f.card_data=="object"&&!Array.isArray(f.card_data)?f.card_data:{},...m.card_data||{},status:Wr(u?.status),lastRun:u?.runtime?.last_transition_at??null};u?.error?.message&&(l.error=u.error.message);let y=u?{task_status:u.status??null,card_status:Wr(u.status),runtime:structuredClone(u.runtime??{}),error:u.error?structuredClone(u.error):null,blocked_by:Array.isArray(u.blocked_by)?structuredClone(u.blocked_by):[],requires_missing:Array.isArray(u.requires_missing)?structuredClone(u.requires_missing):[]}:{task_status:null,card_status:l.status??"fresh",runtime:{last_transition_at:l.lastRun??null},error:l.error?{message:l.error}:null,blocked_by:[],requires_missing:[]},S=Array.isArray(f.requires)?f.requires:[],C={};for(let[w,G]of Object.entries(i))C[w]=structuredClone(G);for(let w of S)Object.prototype.hasOwnProperty.call(C,w)||(C[w]=null);let O=(t.cardChatsByCardId&&typeof t.cardChatsByCardId=="object"?t.cardChatsByCardId:{})[e],R=O?{messages:Array.isArray(O.messages)?O.messages:[],receiving:!!O.receiving,processing:!!O.processing}:null;return {id:e,card:f,card_data:l,requires:C,computed_values:m.computed_values,runtime_state:y,card_chats:R}}function ro(t){if(!t||typeof t!="object")throw new Error("payload must be an object");return (Array.isArray(t.cardDefinitions)?t.cardDefinitions:[]).map(r=>oe(t,r.id))}function Te(t){return JSON.parse(JSON.stringify(t))}function Yt(t,e){if(t===e)return t;try{if(JSON.stringify(t)===JSON.stringify(e))return t}catch{}return e}function vt(t,e){if(t===e)return true;try{return JSON.stringify(t)===JSON.stringify(e)}catch{return false}}function no(t){return t==="running"||t==="in-progress"?"loading":t==="failed"?"error":"fresh"}function Xr(t,e,r){let n=t,s=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(u=>u.id),i=e&&e.modelsById||{},a={};for(let u of s){let f=r(t,u),m=i[u];if(!m){a[u]=f;continue}let p=f.card_chats!=null?Yt(m.card_chats,f.card_chats??null):m.card_chats??null,l={id:f.id,card:Yt(m.card,f.card),card_data:Yt(m.card_data,f.card_data),requires:Yt(m.requires,f.requires),computed_values:Yt(m.computed_values,f.computed_values),runtime_state:Yt(m.runtime_state,f.runtime_state),card_chats:p};a[u]=l.card===m.card&&l.card_data===m.card_data&&l.requires===m.requires&&l.computed_values===m.computed_values&&l.runtime_state===m.runtime_state&&l.card_chats===m.card_chats?m:l;}return {payload:t,cardIds:s,modelsById:a}}function Yr(t,e,r,n){if(!t||!Array.isArray(e)||e.length===0)return t;let o=t.modelsById,s=t.cardIds,i=false,a=false,u={};for(let m of s){let p=o[m],l=p&&p.requires;if(l&&typeof l=="object")for(let y of Object.keys(l))(u[y]=u[y]||[]).push(m);}function f(){i||(o={...o},i=true);}for(let m of e)if(!(!m||!m.kind)){if(m.kind==="computed_values"){let p=m.cardId,l=o[p];if(!l)continue;let y=m.values||{};if(vt(l.computed_values,y))continue;f(),o[p]={...l,computed_values:y},a=true;}else if(m.kind==="data_object"){let p=m.key,l=m.payload,y=u[p]||[];for(let S of y){let C=o[S];if(!C)continue;let _=C.requires||{};vt(_[p],l)||(f(),o[S]={...C,requires:{..._,[p]:l}},a=true);}}else if(m.kind==="card_refreshed"){let p=m.cardId,l=null,y=o[p],S=m.card;if(y&&S&&typeof S=="object"&&!Array.isArray(S)){let C=S,_=C.card_data&&typeof C.card_data=="object"&&!Array.isArray(C.card_data)?C.card_data:y.card_data,O=C.requires&&typeof C.requires=="object"&&!Array.isArray(C.requires)?C.requires:y.requires,R=C.computed_values&&typeof C.computed_values=="object"&&!Array.isArray(C.computed_values)?C.computed_values:y.computed_values,w=C.runtime_state&&typeof C.runtime_state=="object"&&!Array.isArray(C.runtime_state)?C.runtime_state:y.runtime_state;l={...y,card:S,card_data:_,requires:O,computed_values:R,runtime_state:w};}if(!l)try{let C=n();C&&(l=r(C,p));}catch{}if(!l||y&&vt(y.card,l.card)&&vt(y.card_data,l.card_data)&&vt(y.requires,l.requires)&&vt(y.computed_values,l.computed_values)&&vt(y.runtime_state,l.runtime_state))continue;f(),o[p]=l,s.includes(p)||(s=[...s,p]),a=true;}else if(m.kind==="card_chats"){let p=m.cardId,l=o[p];if(!l)continue;let y=Array.isArray(m.messages)?m.messages:l.card_chats?.messages??[],S=typeof m.receiving=="boolean"?m.receiving:l.card_chats?.receiving??false,C=typeof m.processing=="boolean"?m.processing:l.card_chats?.processing??false,_={messages:y,receiving:S,processing:C};if(vt(l.card_chats,_))continue;f(),o[p]={...l,card_chats:_},a=true;}else if(m.kind==="chat_messages"){let p=m.cardId,l=o[p];if(!l)continue;let y=Array.isArray(m.messages)?m.messages:[],S=l.card_chats||{receiving:false,processing:false},C={messages:y,receiving:S.receiving,processing:!!S.processing};if(vt(l.card_chats,C))continue;f(),o[p]={...l,card_chats:C},a=true;}else if(m.kind==="status"){let p=m.status?.cards??[];for(let l of p){let y=l?.name;if(!y||!o[y])continue;let S=o[y],C=no(l.status),_={...S.card_data||{},status:C,lastRun:l.runtime?.last_transition_at??null,...l.error?.message?{error:l.error.message}:{}};l.error?.message||delete _.error;let O={task_status:l.status??null,card_status:C,runtime:l.runtime?Te(l.runtime):{},error:l.error?Te(l.error):null,blocked_by:Array.isArray(l.blocked_by)?Te(l.blocked_by):[],requires_missing:Array.isArray(l.requires_missing)?Te(l.requires_missing):[]};vt(S.card_data,_)&&vt(S.runtime_state,O)||(f(),o[y]={...S,card_data:_,runtime_state:O},a=true);}}}return a?{payload:t.payload,cardIds:s,modelsById:o}:t}function _s(t,e){let r=e?.cards??[],n=e?.onWarn??(()=>{}),o=`${t}:notify`,s=zr(t,{callbackBaseUrl:e?.callbackBaseUrl,notifyChannel:o,onWarn:n}),i=wt(st({kind:"localstorage",value:t})),a=st({kind:"localstorage",value:`${t}:card-store`}),u=st({kind:"localstorage",value:`${t}:outputs`}),f=e?.taskExecutor??null,m=e?.chatHandler??null,p=st({kind:"in-browser",value:`${t}:task-executor`}),l=st({kind:"in-browser",value:`${t}:chat-handler`});f&&s.registerHandler(p,f),m&&s.registerHandler(l,m);let y={async invoke(T,x){return T.howToRun==="in-browser",s.dispatchExecution(T,x)}},S=e?.taskExecutorRef??(f?{meta:"task-executor",howToRun:"in-browser",whatToRun:p}:void 0),C=e?.chatHandlerRef??(m?{meta:"chat-handler",howToRun:"in-browser",whatToRun:l}:void 0),_=Kr(),O=Hr(t),R=Lr({boardId:t,chatStorage:O,boards:[{label:t,boardAdapter:s,baseRef:i,cardStoreRef:a,outputsStoreRef:u,notifyRef:{kind:"in-memory-bus",value:o},taskExecutorRef:S,chatHandlerRef:C}],invocationAdapter:y,notificationTransport:_,logger:{info:(...T)=>console.log("[board]",...T),warn:(...T)=>{n(String(T[0])),console.warn("[board]",...T);},error:(...T)=>console.error("[board]",...T)}});r.length&&R.cardStore.set({body:r}),e?.onBoardChange&&xe(o).subscribe(x=>{let $=x;!$||$.kind!=="notification-batch"||!Array.isArray($.notifications)||$.notifications.length===0||e.onBoardChange?.({notifications:$.notifications});});function w(T,x,$){let D=$?JSON.stringify($):"",U=new TextEncoder().encode(D),X=false;return {method:T,url:x,headers:{"content-type":"application/json"},on(ct,it){},[Symbol.asyncIterator](){let ct={async next(){return X?{done:true,value:void 0}:(X=true,{done:false,value:U})},[Symbol.asyncIterator](){return ct}};return ct}}}function G(){let T=200,x=[];return {res:{writeHead(D){T=D;},write(D){return x.push(typeof D=="string"?D:new TextDecoder().decode(D)),true},end(D){D&&x.push(typeof D=="string"?D:new TextDecoder().decode(D));}},getResult:()=>{let D=x.join(""),U;try{U=JSON.parse(D);}catch{U=D;}return {status:T,body:U}}}}let j=R.apiBasePath;return {async bootstrap(){let T=w("GET",`${j}/bootstrap`),{res:x}=G();await R.handleRuntimeApi(T,x,new URL(`http://localhost${j}/bootstrap`));},getState(){return R.buildPublishedRuntimePayload()},async patchCard(T,x){let $=`${j}/cards/${encodeURIComponent(T)}`,D=w("PATCH",$,x),{res:U}=G();await R.handleRuntimeApi(D,U,new URL(`http://localhost${$}`));},async applyCardAction(T,x,$){let D=`${j}/cards/${encodeURIComponent(T)}/actions`,U=w("POST",D,{actionType:x,payload:$}),{res:X}=G();await R.handleRuntimeApi(U,X,new URL(`http://localhost${D}`));},readChatRecords(T){let x=`${j}/cards/${encodeURIComponent(T)}/chats`,$=w("GET",x),D=G();R.handleRuntimeApi($,D.res,new URL(`http://localhost${x}`));let X=D.getResult().body;return Array.isArray(X?.messages)?X.messages:[]},clearChatRecords(T){R.clearChatRecords(T);},writeMemoryBlob(T,x){return s.writeMemoryBlob(T,x)},reportSourceFetched(T,x){R.reportSourceFetched(T,x);},reportSourceFetchFailure(T,x){R.reportSourceFetchFailure(T,x);},get runtime(){return R}}}function Is(t,e){return Xr(t,e,oe)}function Es(t,e,r){return Yr(t,e,oe,r)}
|
|
9
9
|
exports.applyNotification=Es;exports.buildBoardState=Is;exports.create=_s;exports.selectAllLiveCardModels=ro;exports.selectLiveCardModel=oe;return exports;})({});//# sourceMappingURL=board-livecards-localstorage.js.map
|
|
10
10
|
//# sourceMappingURL=board-livecards-localstorage.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BoardPlatformAdapter, N as NotificationTransport, C as ChatStorage } from '../types-
|
|
2
|
-
import { E as ExecutionRef } from '../execution-interface-
|
|
1
|
+
import { B as BoardPlatformAdapter, N as NotificationTransport, C as ChatStorage } from '../types-YNCagczT.js';
|
|
2
|
+
import { E as ExecutionRef } from '../execution-interface-BCIhu1gO.js';
|
|
3
3
|
import '../board-live-cards-lib-COi4bSpk.js';
|
|
4
4
|
|
|
5
5
|
declare function createLocalStorageChatStorage(namespace: string): ChatStorage;
|