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