yaml-flow 8.1.0 → 8.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  {
2
- "generatedAt": "2026-05-15T11:19:22.498Z",
2
+ "generatedAt": "2026-05-15T16:11:54.897Z",
3
3
  "algorithm": "sha256",
4
4
  "files": {
5
5
  "browser/board-livecards-localstorage.js": {
6
- "sha256": "sha256-oZWQa8+9JVunP7kVV7cBECk73kcAo64ymg4z8pKZwls=",
6
+ "sha256": "sha256-Z52RH9OgjHXVkKVtxkM/I2notTO5YjDLzrdn/mB7cbY=",
7
7
  "bytes": 87644
8
8
  },
9
9
  "browser/live-cards.schema.json": {
@@ -1,2 +1,2 @@
1
- var BoardLiveCardsClient=(function(exports){'use strict';function ee(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function _e(e,n){let o=n&&typeof n=="object"&&!Array.isArray(n)?n:{};return {schema_version:o.schema_version||"v1",card_id:typeof o.card_id=="string"?o.card_id:e,card_data:o.card_data&&typeof o.card_data=="object"&&!Array.isArray(o.card_data)?structuredClone(o.card_data):{},computed_values:o.computed_values&&typeof o.computed_values=="object"&&!Array.isArray(o.computed_values)?structuredClone(o.computed_values):{}}}function j(e,n){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!n)throw new Error("cardId is required");let C=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(T=>T.id===n);if(!C)throw new Error(`cardDefinitions has no entry with id ${n}`);let c=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},i=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},g=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},d=(Array.isArray(c.cards)?c.cards:[]).find(T=>T.name===n),l=structuredClone(C),r=_e(n,i[n]),t={...l.card_data&&typeof l.card_data=="object"&&!Array.isArray(l.card_data)?l.card_data:{},...r.card_data||{},status:ee(d?.status),lastRun:d?.runtime?.last_transition_at??null};d?.error?.message&&(t.error=d.error.message);let u=d?{task_status:d.status??null,card_status:ee(d.status),runtime:structuredClone(d.runtime??{}),error:d.error?structuredClone(d.error):null,blocked_by:Array.isArray(d.blocked_by)?structuredClone(d.blocked_by):[],requires_missing:Array.isArray(d.requires_missing)?structuredClone(d.requires_missing):[]}:{task_status:null,card_status:t.status??"fresh",runtime:{last_transition_at:t.lastRun??null},error:t.error?{message:t.error}:null,blocked_by:[],requires_missing:[]},h=Array.isArray(l.requires)?l.requires:[],s={};for(let[T,$]of Object.entries(g))s[T]=structuredClone($);for(let T of h)Object.prototype.hasOwnProperty.call(s,T)||(s[T]=null);let R=(e.cardChatsByCardId&&typeof e.cardChatsByCardId=="object"?e.cardChatsByCardId:{})[n],P=R?{messages:Array.isArray(R.messages)?R.messages:[],receiving:!!R.receiving,processing:!!R.processing}:null;return {id:n,card:l,card_data:t,requires:s,computed_values:r.computed_values,runtime_state:u,card_chats:P}}function V(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(o=>j(e,o.id))}function B(e){return JSON.parse(JSON.stringify(e))}function D(e,n){if(e===n)return e;try{if(JSON.stringify(e)===JSON.stringify(n))return e}catch{}return n}function x(e,n){if(e===n)return true;try{return JSON.stringify(e)===JSON.stringify(n)}catch{return false}}function xe(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function W(e,n,o){let C=e,i=(C&&Array.isArray(C.cardDefinitions)?C.cardDefinitions:[]).map(d=>d.id),g=n&&n.modelsById||{},k={};for(let d of i){let l=o(e,d),r=g[d];if(!r){k[d]=l;continue}let f=l.card_chats!=null?D(r.card_chats,l.card_chats??null):r.card_chats??null,t={id:l.id,card:D(r.card,l.card),card_data:D(r.card_data,l.card_data),requires:D(r.requires,l.requires),computed_values:D(r.computed_values,l.computed_values),runtime_state:D(r.runtime_state,l.runtime_state),card_chats:f};k[d]=t.card===r.card&&t.card_data===r.card_data&&t.requires===r.requires&&t.computed_values===r.computed_values&&t.runtime_state===r.runtime_state&&t.card_chats===r.card_chats?r:t;}return {payload:e,cardIds:i,modelsById:k}}function X(e,n,o,C){if(!e||!Array.isArray(n)||n.length===0)return e;let c=e.modelsById,i=e.cardIds,g=false,k=false,d={};for(let r of i){let f=c[r],t=f&&f.requires;if(t&&typeof t=="object")for(let u of Object.keys(t))(d[u]=d[u]||[]).push(r);}function l(){g||(c={...c},g=true);}for(let r of n)if(!(!r||!r.kind)){if(r.kind==="computed_values"){let f=r.cardId,t=c[f];if(!t)continue;let u=r.values||{};if(x(t.computed_values,u))continue;l(),c[f]={...t,computed_values:u},k=true;}else if(r.kind==="data_object"){let f=r.key,t=r.payload,u=d[f]||[];for(let h of u){let s=c[h];if(!s)continue;let S=s.requires||{};x(S[f],t)||(l(),c[h]={...s,requires:{...S,[f]:t}},k=true);}}else if(r.kind==="card_refreshed"){let f=r.cardId,t=null,u=c[f],h=r.card;if(u&&h&&typeof h=="object"&&!Array.isArray(h)){let s=h,S=s.card_data&&typeof s.card_data=="object"&&!Array.isArray(s.card_data)?s.card_data:u.card_data,R=s.requires&&typeof s.requires=="object"&&!Array.isArray(s.requires)?s.requires:u.requires,P=s.computed_values&&typeof s.computed_values=="object"&&!Array.isArray(s.computed_values)?s.computed_values:u.computed_values,T=s.runtime_state&&typeof s.runtime_state=="object"&&!Array.isArray(s.runtime_state)?s.runtime_state:u.runtime_state;t={...u,card:h,card_data:S,requires:R,computed_values:P,runtime_state:T};}if(!t)try{let s=C();s&&(t=o(s,f));}catch{}if(!t||u&&x(u.card,t.card)&&x(u.card_data,t.card_data)&&x(u.requires,t.requires)&&x(u.computed_values,t.computed_values)&&x(u.runtime_state,t.runtime_state))continue;l(),c[f]=t,i.includes(f)||(i=[...i,f]),k=true;}else if(r.kind==="card_chats"){let f=r.cardId,t=c[f];if(!t)continue;let u=Array.isArray(r.messages)?r.messages:t.card_chats?.messages??[],h=typeof r.receiving=="boolean"?r.receiving:t.card_chats?.receiving??false,s=typeof r.processing=="boolean"?r.processing:t.card_chats?.processing??false,S={messages:u,receiving:h,processing:s};if(x(t.card_chats,S))continue;l(),c[f]={...t,card_chats:S},k=true;}else if(r.kind==="chat_messages"){let f=r.cardId,t=c[f];if(!t)continue;let u=Array.isArray(r.messages)?r.messages:[],h=t.card_chats||{receiving:false,processing:false},s={messages:u,receiving:h.receiving,processing:!!h.processing};if(x(t.card_chats,s))continue;l(),c[f]={...t,card_chats:s},k=true;}else if(r.kind==="status"){let f=r.status?.cards??[];for(let t of f){let u=t?.name;if(!u||!c[u])continue;let h=c[u],s=xe(t.status),S={...h.card_data||{},status:s,lastRun:t.runtime?.last_transition_at??null,...t.error?.message?{error:t.error.message}:{}};t.error?.message||delete S.error;let R={task_status:t.status??null,card_status:s,runtime:t.runtime?B(t.runtime):{},error:t.error?B(t.error):null,blocked_by:Array.isArray(t.blocked_by)?B(t.blocked_by):[],requires_missing:Array.isArray(t.requires_missing)?B(t.requires_missing):[]};x(h.card_data,S)&&x(h.runtime_state,R)||(l(),c[u]={...h,card_data:S,runtime_state:R},k=true);}}}return k?{payload:e.payload,cardIds:i,modelsById:c}:e}function yr(e,n="/api/boards"){let o=n.replace(/\/$/,""),C=encodeURIComponent(e||"default"),c=`${o}/${C}`;return {initBoard:`${c}/init-board`,stream:`${c}/sse`,patchCard:i=>`${c}/cards/${encodeURIComponent(i)}`,cardAction:i=>`${c}/cards/${encodeURIComponent(i)}/actions`,cardFile:i=>`${c}/cards/${encodeURIComponent(i)}/files`,cardChats:i=>`${c}/cards/${encodeURIComponent(i)}/chats`,chatSubscribeSse:i=>`${c}/cards/${encodeURIComponent(i)}/chats/subscribe-sse`,chatUnsubscribeSse:i=>`${c}/cards/${encodeURIComponent(i)}/chats/unsubscribe-sse`}}function vr(e="/api/board"){let n=e.replace(/\/$/,"");return {initBoard:`${n}/init-board`,stream:`${n}/sse`,patchCard:o=>`${n}/cards/${encodeURIComponent(o)}`,cardAction:o=>`${n}/cards/${encodeURIComponent(o)}/actions`,cardFile:o=>`${n}/cards/${encodeURIComponent(o)}/files`,cardChats:o=>`${n}/cards/${encodeURIComponent(o)}/chats`,chatSubscribeSse:o=>`${n}/cards/${encodeURIComponent(o)}/chats/subscribe-sse`,chatUnsubscribeSse:o=>`${n}/cards/${encodeURIComponent(o)}/chats/unsubscribe-sse`}}function br(e){if(!e||typeof e!="object")throw new Error("options are required");let{fetchServer:n,boardPaths:o,getServerOrigin:C}=e;if(typeof n!="function")throw new Error("options.fetchServer is required");if(typeof o!="function")throw new Error("options.boardPaths is required");if(typeof C!="function")throw new Error("options.getServerOrigin is required");let c=e.canvas&&typeof e.canvas=="object"?e.canvas:{height:"72vh",overflow:"auto"},i={current:null},g=null,k=null,d=String(e.initialMode||"board"),l={},r=globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():`lc-${Date.now()}-${Math.random().toString(36).slice(2)}`;function t(){return i.current?i.current.payload:null}function h(a,p,b){if(!g||!i.current)return;g.setState(w=>{let y=X(w,[{kind:"card_chats",cardId:a,messages:p,receiving:b}],j,t);return i.current=y,y});let _=g&&g.engine;_&&typeof _.onServerSseEvent=="function"&&_.onServerSseEvent();}async function s(a,p){l[a]=true,h(a,i.current?.modelsById[a]?.card_chats?.messages??[],true);try{await n(p.chatSubscribeSse(a),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({clientId:r})});}catch{}}async function S(a,p){delete l[a];try{await n(p.chatUnsubscribeSse(a),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({clientId:r})});}catch{}}function R(a){Object.keys(l).forEach(p=>{n(a.chatSubscribeSse(p),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({clientId:r})}).catch(()=>{});});}async function P(a,p,b,_){if(!b)return null;let w=_?.inChat===true,y=typeof b.name=="string"?b.name:"upload.bin",L=b.type||"application/octet-stream",O=o(a),I=w?`${O.cardFile(p)}?inChat=true`:O.cardFile(p),N=await n(I,{method:"POST",headers:{"content-type":L,"x-file-name":encodeURIComponent(y)},body:b});if(!N.ok){let U=await N.text();throw new Error(`Upload failed (${N.status}): ${U||"unknown error"}`)}return (await N.json())?.file??null}async function T(a,p,b,_){if(b!=="chat-send"&&b!=="file-upload")return _||{};let w={..._||{}},y=Array.isArray(w.files)?w.files:[];if(!y.length)return w.files=[],w;let L=[];for(let O of y){let I=await P(a,p,O,{inChat:b==="chat-send"});I&&L.push(I);}return w.files=b==="chat-send"?[]:L,w}async function $(a){let p=String(a?.boardId||"default"),b=typeof a?.taskExecutorPath=="string"?a.taskExecutorPath.trim():"",_=String(a?.mode||d||"board"),w=a?.rootElement;if(!w)throw new Error("bootstrapBoard requires params.rootElement");let y=o(p);let L=b?`${y.initBoard}?taskExecutorPath=${encodeURIComponent(b)}`:y.initBoard,O=await n(L);if(!O.ok)throw new Error(`Server init-board failed (${O.status}).`);let I=C();if(!I)throw new Error("Server origin not resolved before SSE start");let N=await new Promise((m,v)=>{let A=`${I}${y.stream}${y.stream.includes("?")?"&":"?"}clientId=${encodeURIComponent(r)}`,E=new EventSource(A);k=E;let G=false,Y=setTimeout(()=>{G||v(new Error("SSE initial payload timeout (15s)"));},15e3);E.onmessage=ae=>{try{let F=JSON.parse(ae.data||"{}");!G&&(F?.cardDefinitions||V(F))&&(G=!0,clearTimeout(Y),m(F));}catch{}},E.onerror=()=>{G||(clearTimeout(Y),v(new Error("SSE connection failed during bootstrap")));};});if(!V(N))throw new Error("SSE payload missing published runtime artifacts");i.current=W(N,null,j);let M=globalThis.LiveCard;if(!M)throw new Error("LiveCard global not loaded \u2014 include live-cards.js before this script");let U=M.init({resolve:m=>i.current?.modelsById[m],chartLib:globalThis.Chart??null,markdown:globalThis.marked?m=>globalThis.marked.parse(m):null,sanitize:globalThis.DOMPurify?m=>globalThis.DOMPurify.sanitize(m):null,onPatchState:async(m,v)=>{await n(y.patchCard(m),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(v||{})});},onRefresh:async m=>{await n(y.patchCard(m),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({})});},onAction:async(m,v,A)=>{let E=await T(p,m,v,A);await n(y.cardAction(m),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actionType:v,payload:E||{}})});},startReceivingChats:m=>{s(m,y);},stopReceivingChats:m=>{S(m,y),h(m,i.current?.modelsById[m]?.card_chats?.messages??[],false);}});return w.innerHTML="",g=M.Board(U,w,{initialState:i.current,getNodeIds:m=>m.cardIds,selectNode:(m,v)=>m.modelsById[v],mode:_,canvas:c}),d=_,k.onopen=()=>{R(y);},k.onmessage=m=>{try{let v=JSON.parse(m.data||"{}");if(v?.kind==="notification-batch"&&Array.isArray(v.notifications))g&&g.setState(E=>{let G=X(E,v.notifications,j,t);return i.current=G,G});else if(v?.cardDefinitions){let E=W(v,i.current,j);i.current=E,g&&g.setState(()=>E);}let A=g&&g.engine;A&&typeof A.onServerSseEvent=="function"?A.onServerSseEvent():A&&typeof A.refreshOpenChatModal=="function"&&A.refreshOpenChatModal();}catch(v){console.warn("Bad SSE payload",v);}},g}function te(){k&&(k.close(),k=null),Object.keys(l).forEach(a=>delete l[a]),g=null,i.current=null;}function re(a){d=String(a||"board");let p=g&&g.core;p&&typeof p.setMode=="function"&&p.setMode(d);}function ne(){if(!g)return;d="canvas";let a=g.core;a&&typeof a.setMode=="function"&&a.setMode("canvas"),a&&typeof a.autoLayout=="function"&&a.autoLayout();}function se(a){let p=g&&g.core;p&&typeof p.setDevMode=="function"&&p.setDevMode(!!a);}function oe(){return d}return {bootstrapBoard:$,dispose:te,setMode:re,autoLayout:ne,setDevMode:se,getCurrentMode:oe}}exports.applyNotification=X;exports.buildBoardState=W;exports.createBoardRuntimeClient=br;exports.defaultBoardPaths=yr;exports.selectAllLiveCardModels=V;exports.selectLiveCardModel=j;exports.singleBoardPaths=vr;return exports;})({});//# sourceMappingURL=board-livecards-client.js.map
1
+ var BoardLiveCardsClient=(function(exports){'use strict';function ee(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function _e(e,n){let o=n&&typeof n=="object"&&!Array.isArray(n)?n:{};return {schema_version:o.schema_version||"v1",card_id:typeof o.card_id=="string"?o.card_id:e,card_data:o.card_data&&typeof o.card_data=="object"&&!Array.isArray(o.card_data)?structuredClone(o.card_data):{},computed_values:o.computed_values&&typeof o.computed_values=="object"&&!Array.isArray(o.computed_values)?structuredClone(o.computed_values):{}}}function j(e,n){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!n)throw new Error("cardId is required");let b=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(T=>T.id===n);if(!b)throw new Error(`cardDefinitions has no entry with id ${n}`);let c=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},s=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},p=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},a=(Array.isArray(c.cards)?c.cards:[]).find(T=>T.name===n),u=structuredClone(b),r=_e(n,s[n]),t={...u.card_data&&typeof u.card_data=="object"&&!Array.isArray(u.card_data)?u.card_data:{},...r.card_data||{},status:ee(a?.status),lastRun:a?.runtime?.last_transition_at??null};a?.error?.message&&(t.error=a.error.message);let l=a?{task_status:a.status??null,card_status:ee(a.status),runtime:structuredClone(a.runtime??{}),error:a.error?structuredClone(a.error):null,blocked_by:Array.isArray(a.blocked_by)?structuredClone(a.blocked_by):[],requires_missing:Array.isArray(a.requires_missing)?structuredClone(a.requires_missing):[]}:{task_status:null,card_status:t.status??"fresh",runtime:{last_transition_at:t.lastRun??null},error:t.error?{message:t.error}:null,blocked_by:[],requires_missing:[]},h=Array.isArray(u.requires)?u.requires:[],i={};for(let[T,$]of Object.entries(p))i[T]=structuredClone($);for(let T of h)Object.prototype.hasOwnProperty.call(i,T)||(i[T]=null);let R=(e.cardChatsByCardId&&typeof e.cardChatsByCardId=="object"?e.cardChatsByCardId:{})[n],P=R?{messages:Array.isArray(R.messages)?R.messages:[],receiving:!!R.receiving,processing:!!R.processing}:null;return {id:n,card:u,card_data:t,requires:i,computed_values:r.computed_values,runtime_state:l,card_chats:P}}function V(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(o=>j(e,o.id))}function B(e){return JSON.parse(JSON.stringify(e))}function D(e,n){if(e===n)return e;try{if(JSON.stringify(e)===JSON.stringify(n))return e}catch{}return n}function x(e,n){if(e===n)return true;try{return JSON.stringify(e)===JSON.stringify(n)}catch{return false}}function xe(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function W(e,n,o){let b=e,s=(b&&Array.isArray(b.cardDefinitions)?b.cardDefinitions:[]).map(a=>a.id),p=n&&n.modelsById||{},k={};for(let a of s){let u=o(e,a),r=p[a];if(!r){k[a]=u;continue}let g=u.card_chats!=null?D(r.card_chats,u.card_chats??null):r.card_chats??null,t={id:u.id,card:D(r.card,u.card),card_data:D(r.card_data,u.card_data),requires:D(r.requires,u.requires),computed_values:D(r.computed_values,u.computed_values),runtime_state:D(r.runtime_state,u.runtime_state),card_chats:g};k[a]=t.card===r.card&&t.card_data===r.card_data&&t.requires===r.requires&&t.computed_values===r.computed_values&&t.runtime_state===r.runtime_state&&t.card_chats===r.card_chats?r:t;}return {payload:e,cardIds:s,modelsById:k}}function Ae(e,n={}){if(!e)return e;let o=typeof n.includeCard=="function"?n.includeCard:(()=>true),b=typeof n.mapCard=="function"?n.mapCard:(a=>a),c=false,s=[],p={};for(let a of e.cardIds){let u=e.modelsById[a];if(!u){c=true;continue}if(!o(u,e)){c=true;continue}let r=b(u,e);if(!r||r.id!==a)throw new Error(`deriveBoardState: mapped card must preserve id "${a}"`);r!==u&&(c=true),s.push(a),p[a]=r;}let k=typeof n.mapPayload=="function"?n.mapPayload(e.payload,{sourceState:e,cardIds:s,modelsById:p}):e.payload;return k!==e.payload&&(c=true),!c&&s.length===e.cardIds.length?e:{payload:k,cardIds:s,modelsById:p}}function X(e,n,o,b){if(!e||!Array.isArray(n)||n.length===0)return e;let c=e.modelsById,s=e.cardIds,p=false,k=false,a={};for(let r of s){let g=c[r],t=g&&g.requires;if(t&&typeof t=="object")for(let l of Object.keys(t))(a[l]=a[l]||[]).push(r);}function u(){p||(c={...c},p=true);}for(let r of n)if(!(!r||!r.kind)){if(r.kind==="computed_values"){let g=r.cardId,t=c[g];if(!t)continue;let l=r.values||{};if(x(t.computed_values,l))continue;u(),c[g]={...t,computed_values:l},k=true;}else if(r.kind==="data_object"){let g=r.key,t=r.payload,l=a[g]||[];for(let h of l){let i=c[h];if(!i)continue;let C=i.requires||{};x(C[g],t)||(u(),c[h]={...i,requires:{...C,[g]:t}},k=true);}}else if(r.kind==="card_refreshed"){let g=r.cardId,t=null,l=c[g],h=r.card;if(l&&h&&typeof h=="object"&&!Array.isArray(h)){let i=h,C=i.card_data&&typeof i.card_data=="object"&&!Array.isArray(i.card_data)?i.card_data:l.card_data,R=i.requires&&typeof i.requires=="object"&&!Array.isArray(i.requires)?i.requires:l.requires,P=i.computed_values&&typeof i.computed_values=="object"&&!Array.isArray(i.computed_values)?i.computed_values:l.computed_values,T=i.runtime_state&&typeof i.runtime_state=="object"&&!Array.isArray(i.runtime_state)?i.runtime_state:l.runtime_state;t={...l,card:h,card_data:C,requires:R,computed_values:P,runtime_state:T};}if(!t)try{let i=b();i&&(t=o(i,g));}catch{}if(!t||l&&x(l.card,t.card)&&x(l.card_data,t.card_data)&&x(l.requires,t.requires)&&x(l.computed_values,t.computed_values)&&x(l.runtime_state,t.runtime_state))continue;u(),c[g]=t,s.includes(g)||(s=[...s,g]),k=true;}else if(r.kind==="card_chats"){let g=r.cardId,t=c[g];if(!t)continue;let l=Array.isArray(r.messages)?r.messages:t.card_chats?.messages??[],h=typeof r.receiving=="boolean"?r.receiving:t.card_chats?.receiving??false,i=typeof r.processing=="boolean"?r.processing:t.card_chats?.processing??false,C={messages:l,receiving:h,processing:i};if(x(t.card_chats,C))continue;u(),c[g]={...t,card_chats:C},k=true;}else if(r.kind==="chat_messages"){let g=r.cardId,t=c[g];if(!t)continue;let l=Array.isArray(r.messages)?r.messages:[],h=t.card_chats||{receiving:false,processing:false},i={messages:l,receiving:h.receiving,processing:!!h.processing};if(x(t.card_chats,i))continue;u(),c[g]={...t,card_chats:i},k=true;}else if(r.kind==="status"){let g=r.status?.cards??[];for(let t of g){let l=t?.name;if(!l||!c[l])continue;let h=c[l],i=xe(t.status),C={...h.card_data||{},status:i,lastRun:t.runtime?.last_transition_at??null,...t.error?.message?{error:t.error.message}:{}};t.error?.message||delete C.error;let R={task_status:t.status??null,card_status:i,runtime:t.runtime?B(t.runtime):{},error:t.error?B(t.error):null,blocked_by:Array.isArray(t.blocked_by)?B(t.blocked_by):[],requires_missing:Array.isArray(t.requires_missing)?B(t.requires_missing):[]};x(h.card_data,C)&&x(h.runtime_state,R)||(u(),c[l]={...h,card_data:C,runtime_state:R},k=true);}}}return k?{payload:e.payload,cardIds:s,modelsById:c}:e}function vr(e,n="/api/boards"){let o=n.replace(/\/$/,""),b=encodeURIComponent(e||"default"),c=`${o}/${b}`;return {initBoard:`${c}/init-board`,stream:`${c}/sse`,patchCard:s=>`${c}/cards/${encodeURIComponent(s)}`,cardAction:s=>`${c}/cards/${encodeURIComponent(s)}/actions`,cardFile:s=>`${c}/cards/${encodeURIComponent(s)}/files`,cardChats:s=>`${c}/cards/${encodeURIComponent(s)}/chats`,chatSubscribeSse:s=>`${c}/cards/${encodeURIComponent(s)}/chats/subscribe-sse`,chatUnsubscribeSse:s=>`${c}/cards/${encodeURIComponent(s)}/chats/unsubscribe-sse`}}function br(e="/api/board"){let n=e.replace(/\/$/,"");return {initBoard:`${n}/init-board`,stream:`${n}/sse`,patchCard:o=>`${n}/cards/${encodeURIComponent(o)}`,cardAction:o=>`${n}/cards/${encodeURIComponent(o)}/actions`,cardFile:o=>`${n}/cards/${encodeURIComponent(o)}/files`,cardChats:o=>`${n}/cards/${encodeURIComponent(o)}/chats`,chatSubscribeSse:o=>`${n}/cards/${encodeURIComponent(o)}/chats/subscribe-sse`,chatUnsubscribeSse:o=>`${n}/cards/${encodeURIComponent(o)}/chats/unsubscribe-sse`}}function Sr(e){if(!e||typeof e!="object")throw new Error("options are required");let{fetchServer:n,boardPaths:o,getServerOrigin:b}=e;if(typeof n!="function")throw new Error("options.fetchServer is required");if(typeof o!="function")throw new Error("options.boardPaths is required");if(typeof b!="function")throw new Error("options.getServerOrigin is required");let c=e.canvas&&typeof e.canvas=="object"?e.canvas:{height:"72vh",overflow:"auto"},s={current:null},p=null,k=null,a=String(e.initialMode||"board"),u={},r=globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():`lc-${Date.now()}-${Math.random().toString(36).slice(2)}`;function t(){return s.current?s.current.payload:null}function h(d,f,S){if(!p||!s.current)return;p.setState(w=>{let y=X(w,[{kind:"card_chats",cardId:d,messages:f,receiving:S}],j,t);return s.current=y,y});let _=p&&p.engine;_&&typeof _.onServerSseEvent=="function"&&_.onServerSseEvent();}async function i(d,f){u[d]=true,h(d,s.current?.modelsById[d]?.card_chats?.messages??[],true);try{await n(f.chatSubscribeSse(d),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({clientId:r})});}catch{}}async function C(d,f){delete u[d];try{await n(f.chatUnsubscribeSse(d),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({clientId:r})});}catch{}}function R(d){Object.keys(u).forEach(f=>{n(d.chatSubscribeSse(f),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({clientId:r})}).catch(()=>{});});}async function P(d,f,S,_){if(!S)return null;let w=_?.inChat===true,y=typeof S.name=="string"?S.name:"upload.bin",L=S.type||"application/octet-stream",O=o(d),I=w?`${O.cardFile(f)}?inChat=true`:O.cardFile(f),N=await n(I,{method:"POST",headers:{"content-type":L,"x-file-name":encodeURIComponent(y)},body:S});if(!N.ok){let U=await N.text();throw new Error(`Upload failed (${N.status}): ${U||"unknown error"}`)}return (await N.json())?.file??null}async function T(d,f,S,_){if(S!=="chat-send"&&S!=="file-upload")return _||{};let w={..._||{}},y=Array.isArray(w.files)?w.files:[];if(!y.length)return w.files=[],w;let L=[];for(let O of y){let I=await P(d,f,O,{inChat:S==="chat-send"});I&&L.push(I);}return w.files=S==="chat-send"?[]:L,w}async function $(d){let f=String(d?.boardId||"default"),S=typeof d?.taskExecutorPath=="string"?d.taskExecutorPath.trim():"",_=String(d?.mode||a||"board"),w=d?.rootElement;if(!w)throw new Error("bootstrapBoard requires params.rootElement");let y=o(f);let L=S?`${y.initBoard}?taskExecutorPath=${encodeURIComponent(S)}`:y.initBoard,O=await n(L);if(!O.ok)throw new Error(`Server init-board failed (${O.status}).`);let I=b();if(!I)throw new Error("Server origin not resolved before SSE start");let N=await new Promise((m,v)=>{let A=`${I}${y.stream}${y.stream.includes("?")?"&":"?"}clientId=${encodeURIComponent(r)}`,E=new EventSource(A);k=E;let G=false,Y=setTimeout(()=>{G||v(new Error("SSE initial payload timeout (15s)"));},15e3);E.onmessage=ae=>{try{let F=JSON.parse(ae.data||"{}");!G&&(F?.cardDefinitions||V(F))&&(G=!0,clearTimeout(Y),m(F));}catch{}},E.onerror=()=>{G||(clearTimeout(Y),v(new Error("SSE connection failed during bootstrap")));};});if(!V(N))throw new Error("SSE payload missing published runtime artifacts");s.current=W(N,null,j);let M=globalThis.LiveCard;if(!M)throw new Error("LiveCard global not loaded \u2014 include live-cards.js before this script");let U=M.init({resolve:m=>s.current?.modelsById[m],chartLib:globalThis.Chart??null,markdown:globalThis.marked?m=>globalThis.marked.parse(m):null,sanitize:globalThis.DOMPurify?m=>globalThis.DOMPurify.sanitize(m):null,onPatchState:async(m,v)=>{await n(y.patchCard(m),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(v||{})});},onRefresh:async m=>{await n(y.patchCard(m),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({})});},onAction:async(m,v,A)=>{let E=await T(f,m,v,A);await n(y.cardAction(m),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actionType:v,payload:E||{}})});},startReceivingChats:m=>{i(m,y);},stopReceivingChats:m=>{C(m,y),h(m,s.current?.modelsById[m]?.card_chats?.messages??[],false);}});return w.innerHTML="",p=M.Board(U,w,{initialState:s.current,getNodeIds:m=>m.cardIds,selectNode:(m,v)=>m.modelsById[v],mode:_,canvas:c}),a=_,k.onopen=()=>{R(y);},k.onmessage=m=>{try{let v=JSON.parse(m.data||"{}");if(v?.kind==="notification-batch"&&Array.isArray(v.notifications))p&&p.setState(E=>{let G=X(E,v.notifications,j,t);return s.current=G,G});else if(v?.cardDefinitions){let E=W(v,s.current,j);s.current=E,p&&p.setState(()=>E);}let A=p&&p.engine;A&&typeof A.onServerSseEvent=="function"?A.onServerSseEvent():A&&typeof A.refreshOpenChatModal=="function"&&A.refreshOpenChatModal();}catch(v){console.warn("Bad SSE payload",v);}},p}function te(){k&&(k.close(),k=null),Object.keys(u).forEach(d=>delete u[d]),p=null,s.current=null;}function re(d){a=String(d||"board");let f=p&&p.core;f&&typeof f.setMode=="function"&&f.setMode(a);}function ne(){if(!p)return;a="canvas";let d=p.core;d&&typeof d.setMode=="function"&&d.setMode("canvas"),d&&typeof d.autoLayout=="function"&&d.autoLayout();}function se(d){let f=p&&p.core;f&&typeof f.setDevMode=="function"&&f.setDevMode(!!d);}function oe(){return a}return {bootstrapBoard:$,dispose:te,setMode:re,autoLayout:ne,setDevMode:se,getCurrentMode:oe}}exports.applyNotification=X;exports.buildBoardState=W;exports.createBoardRuntimeClient=Sr;exports.defaultBoardPaths=vr;exports.deriveBoardState=Ae;exports.selectAllLiveCardModels=V;exports.selectLiveCardModel=j;exports.singleBoardPaths=br;return exports;})({});//# sourceMappingURL=board-livecards-client.js.map
2
2
  //# sourceMappingURL=board-livecards-client.js.map
@@ -1,10 +1,10 @@
1
- var BoardLiveCardsLocalStorage=(function(exports){'use strict';var Pr=Object.defineProperty;var Dr=(e,t,r)=>t in e?Pr(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var qt=(e,t,r)=>Dr(e,t+"",r);var ot="b64:";function qr(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)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 Gr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),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 te(e){return `${ot}${qr(JSON.stringify(e))}`}function Se(e){if(!e.startsWith(ot))throw new Error(`Invalid ref format (expected ${ot}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Gr(e.slice(ot.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Gt(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var ye={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function de(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function Ce(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function at(e){return e.tasks??{}}function it(e){return e?e.status===ye.FAILED||e.status===ye.INACTIVATED:false}function Mt(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Ht(e){return e.maxExecutions}function Ut(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===ye.COMPLETED){let s=e.tasks[n];s&&de(s).forEach(c=>r.add(c));}return Array.from(r)}function Vt(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;de(o).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function Jt(e,t,r){let n=e.tasks[t]??ct(),o={};if(r){let a=r.tasks[t],c=Ce(a);for(let d of c)for(let[k,y]of Object.entries(r.tasks))if(de(y).includes(d)){let R=e.tasks[k];R?.lastDataHash&&(o[d]=R.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Kt(e,t,r,n,o,s){let a=e.tasks[r]??ct(),c=t.tasks[r];if(!c)throw new Error(`Task "${r}" not found in graph`);let d;n&&c.on&&c.on[n]?d=c.on[n]:d=de(c);let k=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let p=c.requires??[];for(let g of p)for(let[h,f]of Object.entries(t.tasks))if(de(f).includes(g)){let j=e.tasks[h];j?.lastDataHash&&(k[g]=j.lastDataHash);break}}let y={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:k,error:void 0},R=[...new Set([...e.availableOutputs,...d])];return {...e,tasks:{...e.tasks,[r]:y},availableOutputs:R,lastUpdated:new Date().toISOString()}}function zt(e,t,r,n){let o=e.tasks[r]??ct(),s=t.tasks[r];if(s?.retry){let d=o.retryCount+1;if(d<=s.retry.max_attempts){let k={...o,status:"not-started",retryCount:d,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:k},lastUpdated:new Date().toISOString()}}}let a={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},c=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(c=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&a.executionCount>=s.circuit_breaker.max_executions){let d=s.circuit_breaker.on_break;c=[...new Set([...c,...d])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:c,lastUpdated:new Date().toISOString()}}function Wt(e,t,r,n){let o=e.tasks[t]??ct(),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 {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Xt(e,t){let r=e.tasks[t];if(!r)return e;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 {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function ct(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ke(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=Qt();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:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function Yt(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:Jt(n,t.taskName,r)};case "task-completed":return {config:r,state:Kt(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:zt(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Wt(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Xt(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Mr(n,t.action)};case "task-upsert":return vt(e,t.taskName,t.taskConfig);case "task-removal":return wt(e,t.taskName);case "node-requires-add":return xt(e,t.nodeName,t.tokens);case "node-requires-remove":return _t(e,t.nodeName,t.tokens);case "node-provides-add":return At(e,t.nodeName,t.tokens);case "node-provides-remove":return Tt(e,t.nodeName,t.tokens);default:return e}}function ut(e,t){return t.reduce((r,n)=>Yt(r,n),e)}function vt(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:Qt()},lastUpdated:new Date().toISOString()}}}function wt(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function xt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ce(n),s=r.filter(a=>!o.includes(a));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function _t(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ce(n),s=o.filter(a=>!r.includes(a));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function At(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=de(n),s=r.filter(a=>!o.includes(a));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function Tt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=de(n),s=o.filter(a=>!r.includes(a));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function De(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function ze(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!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 Qt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Mr(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function qe(e){let{config:t,state:r}=e,n=at(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=Hr(n),a=Ut(t,r.tasks),c=new Set([...a,...r.availableOutputs]),d=[],k=[],y=[],R=[];for(let[g,h]of Object.entries(n)){let f=r.tasks[g],j=Mt(h,t.settings),E=j!=="once";if(f?.status===ye.RUNNING||it(f))continue;let C=Ht(h);if(C!==void 0&&f&&f.executionCount>=C||h.circuit_breaker&&f&&f.executionCount>=h.circuit_breaker.max_executions||!E&&f?.status===ye.COMPLETED)continue;if(E&&f?.status===ye.COMPLETED){let _=Ce(h),O=false;switch(j){case "data-changed":{_.length>0&&_.some(M=>{for(let[W,re]of Object.entries(n))if(de(re).includes(M)){let ne=r.tasks[W];if(!ne)continue;let Te=f.lastConsumedHashes?.[M];return ne.lastDataHash==null?ne.executionCount>f.lastEpoch:ne.lastDataHash!==Te}return false})||(O=true);break}case "epoch-changed":{_.length>0&&_.some(M=>{for(let[W,re]of Object.entries(n))if(de(re).includes(M)){let ne=r.tasks[W];if(ne&&ne.executionCount>f.lastEpoch)return true}return false})||(O=true);break}case "time-based":{let U=h.refreshInterval??0;if(U<=0){O=true;break}let M=f.completedAt;if(!M){O=true;break}(Date.now()-Date.parse(M))/1e3<U&&(O=true);break}case "manual":O=true;break}if(O)continue}let x=Ce(h);if(x.length===0){d.push(g);continue}let P=[],T=[],I=[];for(let _ of x){if(c.has(_))continue;let O=s[_]||[];O.length===0?P.push(_):O.every(M=>it(r.tasks[M]))?I.push({token:_,failedProducer:O[0]}):T.push(_);}P.length>0?y.push({taskName:g,missingTokens:P}):I.length>0?R.push({taskName:g,failedTokens:I.map(_=>_.token),failedProducers:[...new Set(I.map(_=>_.failedProducer))]}):T.length>0?k.push({taskName:g,waitingOn:T}):d.push(g);}let p={};if(d.length>1){let g=Vt(d,n);for(let[h,f]of Object.entries(g))f.length>1&&(p[h]=f);}return {eligible:d,pending:k,unresolved:y,blocked:R,conflicts:p}}function Hr(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of de(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var Ge=class{constructor(){qt(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function dt(e){let t=Et(e);return Ur(t)}function Et(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Et).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Et(t[n])).join(",")+"}"}function Ur(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Vr(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Jr(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),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 Zt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Vr(t)}function Kr(e){try{let t=JSON.parse(Jr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function We(e,t,r){let{handlers:n,onDrain:o}=t,s=new Ge,a="state"in e&&"config"in e?e:Ke(e),c=false,d=new Set,k=new Map(Object.entries(n)),y=new Ge,R=false,p=false;function g(){if(!c){if(R){p=true;return}R=true;try{do p=!1,h();while(p)}finally{R=false;}}}function h(){let C=y.drain(),x=s.drain(),P=[...C,...x];P.length>0&&(a=ut(a,P));let T=qe(a);P.length>0&&o?.(P,a,T);for(let I of T.eligible)E(I);for(let I of P)if(I.type==="task-progress"){let{taskName:_,update:O}=I;if(!a.config.tasks[_])continue;let M=a.state.tasks[_];if(!M||M.status!=="running")continue;let W=Zt(_),re=j(_,W,O).catch(ne=>{c||(y.append({type:"task-failed",taskName:_,error:ne.message??String(ne),timestamp:new Date().toISOString()}),g());}).finally(()=>{d.delete(re);});d.add(re);}}function f(C){let P=a.config.tasks[C].requires??[],T=new Map;for(let[_,O]of Object.entries(a.config.tasks))for(let U of O.provides??[])T.set(U,_);let I={};for(let _ of P){let O=T.get(_);O?I[_]=a.state.tasks[O]?.data:I[_]=void 0;}return I}async function j(C,x,P){let T=a.config.tasks[C],I=T.taskHandlers??[],_=f(C);for(let O of I){let U=k.get(O);if(!U)throw new Error(`Handler '${O}' not found in registry (task '${C}')`);let M={nodeId:C,state:_,taskState:a.state.tasks[C],config:T,callbackToken:x,update:P};if(await U(M)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${C}')`)}}function E(C){let P=a.config.tasks[C]?.taskHandlers;if(!P||P.length===0)return;y.append({type:"task-started",taskName:C,timestamp:new Date().toISOString()}),g();let T=Zt(C),I=j(C,T).catch(_=>{c||(y.append({type:"task-failed",taskName:C,error:_.message??String(_),timestamp:new Date().toISOString()}),g());}).finally(()=>{d.delete(I);});d.add(I);}return {push(C){c||(C.type==="task-completed"&&C.data&&!C.dataHash&&(C={...C,dataHash:dt(C.data)}),s.append(C),g());},pushAll(C){if(!c){for(let x of C)x.type==="task-completed"&&x.data&&!x.dataHash?s.append({...x,dataHash:dt(x.data)}):s.append(x);g();}},resolveCallback(C,x,P){if(c)return;let T=Kr(C);if(!T)return;let{taskName:I}=T;if(a.config.tasks[I]){if(P&&P.length>0)s.append({type:"task-failed",taskName:I,error:P.join("; "),timestamp:new Date().toISOString()});else {let _=x&&Object.keys(x).length>0?dt(x):void 0;s.append({type:"task-completed",taskName:I,data:x,dataHash:_,timestamp:new Date().toISOString()});}g();}},addNode(C,x){c||(s.append({type:"task-upsert",taskName:C,taskConfig:x,timestamp:new Date().toISOString()}),g());},removeNode(C){c||(s.append({type:"task-removal",taskName:C,timestamp:new Date().toISOString()}),g());},addRequires(C,x){c||(s.append({type:"node-requires-add",nodeName:C,tokens:x,timestamp:new Date().toISOString()}),g());},removeRequires(C,x){c||(s.append({type:"node-requires-remove",nodeName:C,tokens:x,timestamp:new Date().toISOString()}),g());},addProvides(C,x){c||(s.append({type:"node-provides-add",nodeName:C,tokens:x,timestamp:new Date().toISOString()}),g());},removeProvides(C,x){c||(s.append({type:"node-provides-remove",nodeName:C,tokens:x,timestamp:new Date().toISOString()}),g());},registerHandler(C,x){k.set(C,x);},unregisterHandler(C){k.delete(C);},retrigger(C){c||a.config.tasks[C]&&(s.append({type:"task-restart",taskName:C,timestamp:new Date().toISOString()}),g());},retriggerAll(C){if(!c){for(let x of C)a.config.tasks[x]&&s.append({type:"task-restart",taskName:x,timestamp:new Date().toISOString()});g();}},snapshot(){return De(a)},getState(){return a},getSchedule(){return qe(a)},async waitForHandlers(){d.size>0&&await Promise.allSettled([...d]);},async dispose(C){C?.wait&&d.size>0&&await Promise.allSettled([...d]),c=true;}}}function lt(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var zr=lt();zr("./jsonata-sync.cjs");var Wr=lt(),ft=Wr("./jsonata-sync.cjs"),rr=ft;function er(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function nr(e,t,r){let n=t.split("."),o=e;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 Xr(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await ft(o.expr).evaluate(n);nr(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Yr(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let a=rr(s.expr).evaluate(n);nr(e.computed_values,s.bindTo,a),n.computed_values=e.computed_values;}catch(a){let c=a instanceof Error?a.message:String(a);o.push({bindTo:s.bindTo,error:c});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Qr(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return ft(e).evaluate(n)}function Zr(e,t){return t.startsWith("fetched_sources.")?er(e._sourcesData??{},t.slice(16)):er(e,t)}var tr=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),en=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function tn(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))en.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,a)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${a}]: must be an object`);else {let c=s;typeof c.bindTo!="string"||!c.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(c.bindTo)&&t.push(`source_defs[${a}]: bindTo "${c.bindTo}" is not unique across source_defs`),n.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(o.has(c.outputFile)&&t.push(`source_defs[${a}]: outputFile "${c.outputFile}" is not unique across source_defs`),o.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):tr.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...tr].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function rn(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{o[s]=await ft(a).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function nn(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{o[s]=rr(a).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Be={run:Xr,runSync:Yr,eval:Qr,resolve:Zr,validate:tn,enrichSources:rn,enrichSourcesSync:nn};function It(e){return JSON.stringify(e)}function Ot(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function pt(e,t){function r(){return e.readIndex()??{}}function n(o,s,a){let c=String(s||"").split(".").filter(Boolean);if(c.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let d={...o},k=d;for(let y=0;y<c.length-1;y++){let R=c[y],p=k[R],g=p&&typeof p=="object"&&!Array.isArray(p)?{...p}:{};k[R]=g,k=g;}return k[c[c.length-1]]=a,d}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let c=e.readCard(a.key);c?o.push(c):t?.(`[card-store] could not read card "${s}" at key "${a.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,a]of Object.entries(r()))o[s]=a.checksum;return o},changedSince(o){let s=r(),a=[];for(let[c,d]of Object.entries(s))o[c]!==d.checksum&&a.push(c);for(let c of Object.keys(o))s[c]||a.push(c);return a},validateUpsert(o,s){let a=r(),c=a[o],d=Object.entries(a).find(([,k])=>k.key===s);return c&&c.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${c.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,a){let c=r(),d=a??c[o]?.key??e.defaultCardKey(o),k=e.writeCard(d,s);c[o]={key:d,checksum:k,updatedAt:new Date().toISOString()},e.writeIndex(c);},patchCard(o,s,a){let c=r(),d=c[o];if(!d||!e.cardExists(d.key))throw new Error(`card "${o}" not found`);let k=e.readCard(d.key);if(!k||typeof k!="object"||Array.isArray(k))throw new Error(`card "${o}" is not patchable`);let y=n(k,s,a),R=e.writeCard(d.key,y);c[o]={key:d.key,checksum:R,updatedAt:new Date().toISOString()},e.writeIndex(c);},removeCard(o){let s=r();s[o]&&(delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function jt(e,t){return {readSourceData(r,n){let o=e.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 a=t(o);e.write(`${r}/.staged/${s}/${n}`,a);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,a=e.read(s);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(s),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function ar(e){function t(r){let n=e.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=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function ir(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let o=e.read(r)??[];e.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=e.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(a){let c=a instanceof Error?a.message:String(a);try{t(s,c);}catch{}}e.delete(r);}}}}var gt="v1",Le="board/graph",cr="board/lastJournalProcessedId";function sr(e){return `cards/${e}/runtime`}function ur(e){return {readRuntime(t){return e.read(sr(t))??{_sources:{}}},writeRuntime(t,r){e.write(sr(t),r);}}}function sn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function dr(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==gt)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let o=sn(n.values,r);return {ok:true,newVersion:e.writeValues(t,o,r.deleteKeys)}}}}function lr(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Ot(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",It(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return Ot(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",It(r));},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function fr(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function on(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function an(e,t){return e?.lastRequestedAt?on(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function cn(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function or(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function mt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=qe(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},c=new Map;for(let h of s.pending)c.set(h.taskName,h.waitingOn);for(let h of s.unresolved)c.set(h.taskName,h.missingTokens);for(let h of s.blocked)c.set(h.taskName,h.failedTokens);let d=new Map;for(let[h,f]of Object.entries(n))for(let j of f.requires??[]){let E=d.get(j)??[];E.push(h),d.set(j,E);}let k=o.sort().map(h=>{let f=r[h],j=n[h]??{requires:[],provides:[]};f.status==="completed"?a.completed+=1:f.status==="failed"?a.failed+=1:f.status==="in-progress"&&(a.in_progress+=1);let E=j.requires??[],C=j.provides??[],x=Object.keys(f.data??{}).sort(),P=E.filter(M=>t.state.availableOutputs.includes(M)),T=E.filter(M=>!t.state.availableOutputs.includes(M)),I=c.get(h)??T,_=new Set;for(let M of C)for(let W of d.get(M)??[])W!==h&&_.add(W);let O=f.failedAt,U=f.error?{message:f.error,code:"TASK_FAILED",at:O,source:"task-runtime"}:void 0;return {name:h,status:f.status,error:U,requires:E,requires_satisfied:P,requires_missing:T,provides_declared:C,provides_runtime:x,blocked_by:I,unblocks:Array.from(_).sort(),runtime:{attempt_count:f.executionCount??0,restart_count:f.retryCount??0,in_progress_since:f.status==="in-progress"?f.startedAt??null:null,last_transition_at:f.lastUpdated??null,last_completed_at:f.completedAt??null,last_restarted_at:f.startedAt??null,status_age_ms:f.lastUpdated?0:null}}});a.pending=s.pending.length,a.blocked=s.blocked.length,a.unresolved=s.unresolved.length;let y=k.map(h=>({name:h.name,fanOut:h.unblocks.length})).sort((h,f)=>f.fanOut-h.fanOut||h.name.localeCompare(f.name)),R=y.length>0?y[0]:{name:null,fanOut:0},p=new Set;for(let h of Object.values(n))for(let f of h.requires??[])p.add(f);let g=0;for(let[h,f]of Object.entries(n)){let j=(f.requires??[]).length===0,C=(f.provides??[]).some(x=>(d.get(x)??[]).some(P=>P!==h));j&&!C&&(g+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:a.completed,eligible:s.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:g,topology:{edge_count:Array.from(p).length,max_fan_out_card:R.name,max_fan_out:R.fanOut}},cards:k}}function un(){return new Date().toISOString()}function pr(e,t,r,n,o,s,a){return async c=>{let d=[],k=r.cardStore.readCard(c.nodeId);if(!k)return "task-initiate-failure";let y=k.id,R=k.card_data??{},p=k.source_defs??[],g=p.filter(q=>q.optionalForCompletionGating!==true),h=r.cardRuntimeStore.readRuntime(y),f=false,j=()=>{f&&(r.cardRuntimeStore.writeRuntime(y,h),f=false);},E=q=>({...h._sources[q]??{}}),C=(q,G)=>{h._sources[q]=G,f=true;},x=c.taskState?.executionCount??0,P=h._lastExecutionCount;if(typeof P=="number"&&P!==x&&(h._sources={},f=true),P!==x&&(h._lastExecutionCount=x,f=true),c.update){let q=c.update,G=q.outputFile;if(G){let v=E(G);if(q.failure)C(G,or(v,q.reason??"unknown"));else {let m=q.rqt;if(!v.lastFetchedAt||m>v.lastFetchedAt){let A=typeof q.deliveryToken=="string"?q.deliveryToken:void 0,F=false;A&&(F=r.fetchedSourcesStore.commitSourceData(y,G,A)),F?C(G,cn(v,m)):C(G,or(v,`source delivery commit failed for ${G} token=${String(A)}`));}}j();}}let T={};for(let q of p)if(q.outputFile){let G=r.fetchedSourcesStore.readSourceData(y,q.outputFile);G!==null&&(T[q.bindTo]=G);}let I={};for(let[q,G]of Object.entries(c.state??{}))if(G!==null&&typeof G=="object"&&!Array.isArray(G)){let v=G[q];I[q]=v!==void 0?v:G;}else I[q]=G;let _={id:y,card_data:{...R},requires:I,source_defs:p,compute:k.compute};_._sourcesData=T,k.compute&&Be.runSync(_,{sourcesData:T}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(y,_.computed_values??{});let O={...k},U=Be.enrichSourcesSync(Array.isArray(k.source_defs)?k.source_defs:void 0,{card_data:k.card_data,requires:I}),M=e.value;O.source_defs=Array.isArray(U)?U.map(q=>({...q,boardDir:typeof q.boardDir=="string"&&q.boardDir?q.boardDir:M})):U;let W=un(),re=c.update?void 0:W,ne=g.filter(q=>{let G=q.outputFile;if(typeof G!="string"||!G)return true;let v=E(G);re&&(v={...v,queueRequestedAt:re},C(G,v));let m=v.queueRequestedAt??v.lastRequestedAt??W,A=an(v,m);return A==="in-flight"?false:A==="dispatch"});if(j(),ne.length>0){let q=false,G=W;for(let v of ne){let m=v.outputFile;if(typeof m!="string"||!m)continue;let A=E(m),F=A.queueRequestedAt??W;C(m,{...A,lastRequestedAt:F}),G=F,q=true;}return q&&j(),q&&(d.push({taskKind:"source-fetch",payload:{boardRef:te(e),enrichedCard:O,callbackToken:c.callbackToken,rqt:G}}),r.executionRequestStore.appendEntries(t,d)),"task-initiated"}let Te=k.provides??[],Ee={};for(let{bindTo:q,ref:G}of Te)Ee[q]=Be.resolve(_,G);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(Ee),p.filter(q=>{if(q.optionalForCompletionGating!==true)return false;let G=E(q.outputFile);return !G.lastRequestedAt||!G.lastFetchedAt?true:G.lastFetchedAt<=G.lastRequestedAt}).length>0&&d.push({taskKind:"source-fetch",payload:{boardRef:te(e),enrichedCard:O,callbackToken:c.callbackToken,rqt:W}}),n(c.nodeId,Ee),d.length>0&&r.executionRequestStore.appendEntries(t,d),"task-initiated"}}var Nt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function gr(e){return {[Le]:e.graph,[cr]:e.lastDrainedJournalId}}function mr(e){let t=e[Le],r=e[cr];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${Le}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function hr(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function se(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function Z(e){return {status:"fail",error:e}}function oe(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function dn(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function yr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function ht(e){try{let t=JSON.parse(yr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function ln(e){return dn(JSON.stringify(e))}function kr(e){try{let t=JSON.parse(yr(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function fe(){return new Date().toISOString()}function br(e,t){let r=t.onWarn??(()=>{}),n=te(e);function o(v){if(v.length!==0)try{let m=t.publishBoardChangeNotifications?.(v);m&&typeof m.catch=="function"&&m.catch(A=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${A instanceof Error?A.message:String(A)}`));}catch(m){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${m instanceof Error?m.message:String(m)}`);}}function s(){let v=c().readCardStoreRef();if(!v)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let m=t.kvStorageForRef(v);return {readIndex(){return m.read("_index")},writeIndex(A){m.write("_index",A);},readCard(A){return m.read(A)},writeCard(A,F){return m.write(A,F),t.hashFn(F)},cardExists(A){return m.read(A)!==null},defaultCardKey(A){return A}}}let a={readValues(v){let m=t.kvStorage("state-snapshot"),A=m.listKeys().sort();if(A.length===0)return {version:null,values:{}};let F={};for(let z of A)F[z]=m.read(z);return {version:t.hashFn(F),values:F}},writeValues(v,m,A){let F=t.kvStorage("state-snapshot");for(let z of A)F.delete(z);for(let[z,Q]of Object.entries(m))F.write(z,Q);return t.hashFn(m)}},c=()=>lr(t.kvStorage("config")),d=()=>dr(a),k=()=>ar(t.journalAdapter()),y=()=>pt(s(),r),R=()=>{let v=c().readOutputsStoreRef();if(!v)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return fr(t.kvStorageForRef(v))};function p(){return !!d().readSnapshot(e.value).values[Le]}function g(){let v=d().readSnapshot(e.value);if(!v.values[Le])throw new Error(`Board not initialized at ${e.value}`);return mr(v.values)}function h(v,m){let A=d().commitSnapshot(e.value,{schemaVersion:gt,expectedVersion:m,commitId:t.genId(),committedAt:fe(),deleteKeys:[],shallowMerge:gr(v)});if(!A.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${m??"null"} current=${A.currentVersion??"null"}`)}function f(v){k().appendEvent(v);}async function j(){let v=(N,D)=>{let X=N.payload,he=(X?.enrichedCard??{}).id??X?.cardId??"unknown";f({type:"task-failed",taskName:he,error:D,timestamp:fe()});},m=ir(t.kvStorage("execution-requests"),v),A=ur(t.kvStorage("card-runtime")),F=jt(t.blobStorage("sources"),N=>t.resolveBlob(N)),z=new Map,Q={readRuntime(N){return z.get(N)??A.readRuntime(N)},writeRuntime(N,D){z.set(N,D);}},me=[],ae=new Map,le={readSourceData(N,D){let X=`${N}/${D}`;return ae.has(X)?ae.get(X):F.readSourceData(N,D)},ingestSourceDataStaged(N,D,X,Ae){F.ingestSourceDataStaged(N,D,X,Ae);},commitSourceData(N,D,X){let Ae=`${N}/.staged/${X}/${D}`,i=t.blobStorage("sources").read(Ae);if(i==null)return false;let u=`${N}/${D}`,l=i.trim();try{ae.set(u,JSON.parse(l));}catch{ae.set(u,l);}return me.push({cardId:N,outputFile:D,deliveryToken:X}),true},hasSource(N,D){let X=`${N}/${D}`;return ae.has(X)?true:F.hasSource(N,D)}},ie={cardStore:y(),cardRuntimeStore:Q,fetchedSourcesStore:le,outputStore:R(),executionRequestStore:m},be=g(),Re=ze(be.graph),{events:ve,newCursor:we}=k().readEntriesAfterCursor(be.lastDrainedJournalId),J=[],xe=[],He=[],Ue=new Map,Ze=(N,D)=>{J.push({type:"task-completed",taskName:N,data:D,timestamp:fe()});},Ve=(N,D)=>f({type:"task-failed",taskName:N,error:D,timestamp:fe()}),Ie=We(Re,{handlers:{"card-handler":pr(e,we,ie,Ze,Ve,(N,D)=>{xe.push({cardId:N,values:D});},N=>{He.push(N);})}});for(J=ve;J.length>0;){let N=J;J=[];for(let D of N)if(D.type==="task-restart"){let X=ie.cardStore.readCard(D.taskName);X&&Ue.set(D.taskName,X);}Ie.pushAll(N),await Ie.waitForHandlers();}let Je=Ie.getState();await Ie.dispose({wait:true});let rt=d().readSnapshot(e.value).version;h({lastDrainedJournalId:we,graph:De(Je)},rt);for(let{cardId:N,values:D}of xe)ie.outputStore.writeComputedValues(N,D);for(let N of He)ie.outputStore.writeDataObjects(N);for(let[N,D]of z)A.writeRuntime(N,D);for(let{cardId:N,outputFile:D,deliveryToken:X}of me)F.commitSourceData(N,D,X);let _e;try{_e=mt(n,Je),ie.outputStore.writeStatusSnapshot(_e);}catch(N){r(`[board-live-cards-public] status publish failed: ${N instanceof Error?N.message:String(N)}`);}let Oe=[];for(let{cardId:N,values:D}of xe)Oe.push({kind:"computed_values",cardId:N,values:D});for(let N of He)for(let[D,X]of Object.entries(N))D&&Oe.push({kind:"data_object",key:D,payload:X});for(let[N,D]of Ue)Oe.push({kind:"card_refreshed",cardId:N,card:D});_e!==void 0&&Oe.push({kind:"status",status:_e}),o(Oe);let St=c().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:te({kind:"built-in",value:"source-cli-task-executor"})};m.dispatchEntriesForJournalId(we,N=>{if(N.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${N.taskKind}" \u2014 skipping`);return}let D=N.payload,X=D.enrichedCard?.id??"unknown",Ae=D.enrichedCard?.source_defs??[];for(let he of Ae){if(!he.outputFile){r(`[dispatch] source "${he.bindTo}" has no outputFile \u2014 skipping`);continue}let i=ln({cbk:D.callbackToken,rg:e.value,br:te(e),cid:X,b:he.bindTo,d:he.outputFile,cs:void 0,rqt:D.rqt});t.dispatchExecution(St,{source_def:he,base_ref:te(e),callback:{token:i,via:t.selfRef}}).catch(u=>Ve(X,u instanceof Error?u.message:String(u)));}});}async function E(){try{let v=()=>{let A=g(),{events:F}=k().readEntriesAfterCursor(A.lastDrainedJournalId);F.length<=0||(E(),t.requestProcessAccumulated?.());},m=await Gt(t.lock,j,v);return se({ran:m!==!1})}catch(v){return oe(v)}}function C(v){try{let m=v.params?.cardStoreRef;if(!m)return Z("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!p()){let Q=Ke(Nt);h({lastDrainedJournalId:"",graph:De(Q)},null);}let A=v.params?.outputsStoreRef;if(!A)return Z("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let F=c();F.writeCardStoreRef(m),F.writeOutputsStoreRef(A);let z=v.body??{};z["task-executor-ref"]&&F.writeTaskExecutorRef(z["task-executor-ref"]),z["chat-handler-ref"]&&F.writeChatHandlerRef(z["chat-handler-ref"]);try{R().writeStatusSnapshot(mt(n,ze(g().graph)));}catch{}return se()}catch(m){return oe(m)}}function x(v){try{let m=R().readStatusSnapshot();if(!m){m=mt(n,ze(g().graph));try{R().writeStatusSnapshot(m);}catch{}}return se(m)}catch(m){return oe(m)}}function P(v){try{let m=v.params?.id;return m?(f({type:"task-removal",taskName:m,timestamp:fe()}),E(),se()):Z("removeCard requires params.id")}catch(m){return oe(m)}}function T(v){try{let m=v.params?.id;return m?(f({type:"task-restart",taskName:m,timestamp:fe()}),E(),se()):Z("retrigger requires params.id")}catch(m){return oe(m)}}async function I(v){return E()}function _(v){try{let m=v.params?.cardId,A=v.params?.all,F=!!v.params?.restart;if(!m&&!A)return Z("upsertCard requires --card-id <id> or --all");let z=A?y().readAllCards().map(Q=>Q.id):[m];for(let Q of z)if(!y().readCard(Q))return Z(`Card "${Q}" not found in board at ${e.value}`);for(let Q of z){let me=y().readCard(Q),ae=hr(me),le=t.hashFn(ae),ie=t.kvStorage("card-upsert"),be=ie.read(Q),Re=be?.taskConfigHash!==le;if(!(!Re&&!F)){if(Re){let ve=be?.blobRef??y().readCardKey(Q)??Q;f({type:"task-upsert",taskName:Q,taskConfig:ae,timestamp:fe()}),ie.write(Q,{blobRef:ve,taskConfigHash:le,updatedAt:fe()});}F&&f({type:"task-restart",taskName:Q,timestamp:fe()});}}return E(),se()}catch(m){return oe(m)}}function O(v){try{let m=v.params?.token;if(!m)return Z("taskFailed requires params.token");let A=v.params?.error??"unknown error",F=ht(m);return F?(f({type:"task-failed",taskName:F.taskName,error:A,timestamp:fe()}),E(),se()):Z("Invalid callback token")}catch(m){return oe(m)}}function U(v){try{let m=v.params?.token;if(!m)return Z("taskProgress requires params.token");let F=(v.body??{}).update??{},z=ht(m);return z?(f({type:"task-progress",taskName:z.taskName,update:F,timestamp:fe()}),E(),se()):Z("Invalid callback token")}catch(m){return oe(m)}}function M(v){try{let m=v.params?.token,A=v.params?.ref;if(!m)return Z("sourceDataFetched requires params.token");if(!A)return Z("sourceDataFetched requires params.ref");let F=kr(m);if(!F)return Z("Invalid source token");let{cbk:z,cid:Q,b:me,d:ae,cs:le,rqt:ie}=F,be=jt(t.blobStorage("sources"),J=>t.resolveBlob(J)),Re=t.genId();be.ingestSourceDataStaged(Q,ae,Se(A),Re);let ve=ht(z);if(!ve)return Z("Invalid callback token embedded in source token");let we=fe();return f({type:"task-progress",taskName:ve.taskName,update:{bindTo:me,outputFile:ae,fetchedAt:we,deliveryToken:Re,sourceChecksum:le,rqt:ie},timestamp:we}),E(),se()}catch(m){return oe(m)}}function W(v){try{let m=v.params?.token,A=v.params?.reason??"unknown";if(!m)return Z("sourceDataFetchFailure requires params.token");let F=kr(m);if(!F)return Z("Invalid source token");let{cbk:z,b:Q,d:me,cs:ae}=F,le=ht(z);return le?(f({type:"task-progress",taskName:le.taskName,update:{bindTo:Q,outputFile:me,failure:!0,reason:A,sourceChecksum:ae},timestamp:fe()}),E(),se()):Z("Invalid callback token embedded in source token")}catch(m){return oe(m)}}function re(v){try{let m=c().readCardStoreRef();return m?se({storeRef:m}):Z(`Board at ${e.value} has no card store configured`)}catch(m){return oe(m)}}function ne(v){try{let m=c().readOutputsStoreRef();return m?se({storeRef:m}):Z(`Board at ${e.value} has no outputs store configured`)}catch(m){return oe(m)}}function Te(v){try{let m=v.params?.key;if(!m)return Z("getConfig requires params.key");let A=c(),F;switch(m){case "task-executor":F=A.readTaskExecutorRef()??null;break;case "chat-handler":F=A.readChatHandlerRef()??null;break;case "card-store-ref":F=A.readCardStoreRef();break;case "outputs-store-ref":F=A.readOutputsStoreRef();break;default:return Z(`getConfig: unknown key "${m}"`)}return se({value:F})}catch(m){return oe(m)}}function Ee(v){try{let m=v.params?.key;if(!m)return Z("getOutputsDataObject requires params.key");let A=R().readDataObject(m);return se(A)}catch(m){return oe(m)}}function Qe(v){try{return se(R().readAllDataObjects())}catch(m){return oe(m)}}function q(v){try{let m=v.params?.key;if(!m)return Z("getOutputsComputedValues requires params.key");let A=R().readComputedValues(m);return se(A)}catch(m){return oe(m)}}function G(v){try{return se(R().readAllComputedValues())}catch(m){return oe(m)}}return {init:C,status:x,getCardStoreRef:re,getOutputsStoreRef:ne,getConfig:Te,getOutputsDataObject:Ee,getAllOutputsDataObjects:Qe,getOutputsComputedValues:q,getAllOutputsComputedValues:G,removeCard:P,retrigger:T,processAccumulatedEvents:I,upsertCard:_,taskFailed:O,taskProgress:U,sourceDataFetched:M,sourceDataFetchFailure:W}}function Rr(e){function t(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 a=e.readCard(s);return a?t({cards:[a]}):r(`card "${s}" not found`)}return t({cards:e.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 a=Array.isArray(s)?s:[s];for(let c of a){if(typeof c.id!="string")return r("each card must have a string `id` field");e.writeCard(c.id,c);}return t({count:a.length})}catch(s){return n(s)}},del(o){try{let s=o.body?.ids??[],a=o.params?.id,c=a?[...s,a]:s;if(c.length===0)return r("del requires body.ids (string[]) or params.id");for(let d of c)e.removeCard(d);return t({count:c.length})}catch(s){return n(s)}},patch(o){try{let s=o.params?.id,a=o.params?.path;if(!s)return r("patch requires params.id");if(!a)return r("patch requires params.path");let c=o.body,d=c&&Object.prototype.hasOwnProperty.call(c,"value")?c.value:o.body;return e.patchCard(s,a,d),t({count:1})}catch(s){return n(s)}}}}var kt=".artifacts-index.json";function Sr(){return new Date().toISOString()}function Cr(e){return new TextEncoder().encode(e).byteLength}function Xe(e){let t=e.read(kt);if(!t)return {entries:{}};try{let r=JSON.parse(t);if(r&&r.entries&&typeof r.entries=="object")return r}catch{}return {entries:{}}}function Bt(e,t){e.write(kt,JSON.stringify(t,null,2));}function fn(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function vr(e,t,r){e.entries[t]={key:t,size:r.size,updatedAt:r.updatedAt,contentType:r.contentType};}function Lt(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function pn(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function gn(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function mn(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function hn(e){let t=pn(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function kn(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function $t(e){function t(r){let n=e.stat?fn(e.stat(r)):null;if(n)return n;let s=Xe(e).entries[r];if(s)return {...s};if(!e.exists(r))return null;let a=e.read(r);return a===null?{key:r}:{key:r,size:Cr(a)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let s=t(r)??{key:r};s.contentType=o,s.updatedAt=s.updatedAt??Sr(),s.size=s.size??Cr(n);let a=Xe(e);return vr(a,r,s),Bt(e,a),s},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let c=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,c);}let s=t(r)??{key:r};s.contentType=o,s.updatedAt=s.updatedAt??Sr(),s.size=s.size??n.byteLength;let a=Xe(e);return vr(a,r,s),Bt(e,a),s},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.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(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.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:t,list(r=""){let n=new Map;if(e.listKeys)for(let s of e.listKeys(r)){if(s===kt)continue;let a=t(s)??{key:s};n.set(s,a);}let o=Xe(e);for(let[s,a]of Object.entries(o.entries))s===kt||r&&!s.startsWith(r)||n.has(s)||n.set(s,{...a});return [...n.values()].sort((s,a)=>s.key.localeCompare(a.key))},remove(r){e.remove(r);let n=Xe(e);delete n.entries[r],Bt(e,n);}}}function wr(e,t){let r=t?.indexFileName;function n(R){return `${R}/${r}`}function o(R){let p=e.getText(n(R));if(!p)return [];try{let g=JSON.parse(p);return Array.isArray(g)?g.filter(h=>h&&typeof h.stored_name=="string").map(h=>({serial:Number(h.serial||Lt(String(h.stored_name))||0),role:String(h.role||"system").toLowerCase(),stored_name:String(h.stored_name),path:typeof h.path=="string"?h.path:`${R}/chats/${String(h.stored_name)}`,updated_at:typeof h.updated_at=="string"?h.updated_at:null})):[]}catch{return []}}function s(R,p){e.putText(n(R),JSON.stringify(p,null,2),"application/json; charset=utf-8");}function a(R){let p=o(R),g=0;for(let h of p){let f=Number(h.serial||0);Number.isFinite(f)&&f>g&&(g=f);}return g+1}function c(R,p){let g=o(R);g.push(p),s(R,g);}function d(R){let p=o(R),g=[];for(let h of p){let f=`${R}/${h.stored_name}`,j=e.getText(f);j!==null&&g.push({serial:Number(h.serial||Lt(h.stored_name)||0),role:String(h.role||"system").toLowerCase(),text:j,path:typeof h.path=="string"?h.path:`${R}/chats/${h.stored_name}`,stored_name:h.stored_name,updated_at:h.updated_at||null});}return g.sort((h,f)=>h.serial-f.serial||h.stored_name.localeCompare(f.stored_name)),g}function k(R){let p=`${R}/`;for(let g of e.list(p))e.remove(g.key);}function y(R){let p=`${R}/`,g=e.list(p),h=0,f=0,j=false;for(let E of g){let C=E.key.slice(p.length);if(C===".processing"){j=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(C))continue;h+=1;let x=E.updatedAt?Number(new Date(E.updatedAt).getTime()||0):0;x>f&&(f=x);}return {count:h,latest_mtime_ms:f,processing:j}}return {indexKey:n,loadIndex:o,saveIndex:s,nextSerial:a,appendIndexRecord:c,readRecords:d,clear:k,readSignal:y}}function xr(e){function t(o,s){let a=0,c=[];Array.isArray(s)&&c.push(...s);for(let d of e.list(`${o}/`))c.push(kn(d.key));for(let d of c){let k=Lt(d);Number.isFinite(k)&&k>a&&(a=k);}return a+1}function r(o,s,a){let c=Number(a?.maxLen||32),{stem:d,ext:k}=hn(o),y=mn(k),R=gn(d),p=`${String(s).padStart(3,"0")}-`,g=y,h=c-p.length-g.length;h<1&&(g="",h=c-p.length);let f=R.slice(0,Math.max(1,h)),j=`${p}${f}${g}`;return j.length>c&&(j=j.slice(0,c).replace(/\.$/,"")),j}function n(o,s,a){let c=t(o,a?.seedNames),d=r(s,c,{maxLen:a?.maxLen});for(;e.exists(`${o}/${d}`);)c+=1,d=r(s,c,{maxLen:a?.maxLen});return d}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function _r(){function e(o,s){if(!Array.isArray(o))return [];let a=[];for(let c of o){if(!c||typeof c!="object")continue;let d=c;typeof d.stored_name=="string"&&a.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,path:typeof d.path=="string"?d.path:null,uploaded_at:typeof d.uploaded_at=="string"?d.uploaded_at:s||null});}return a}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let a=t(o);if(s.length===0)return o.files=a,a;let c=new Set(a.map(d=>d.stored_name));for(let d of s)c.has(d.stored_name)||(a.push(d),c.add(d.stored_name));return o.files=a,a}function n(o,s,a){let c=t(o);if(!Number.isInteger(s)||s<0||s>=c.length)return {ok:false,reason:"index_out_of_range"};let d=c[s];return !d||!d.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==d.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:d}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}var yn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},bn=32;function Rn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Ar(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function Tr(e,t){if(!t||typeof t!="object")return;let r=t;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)Tr(e,n);return}r.kind==="status"&&Ar(r.status)&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card);}function Er(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...yn,...e.corsHeaders||{}},n=e.boardId||"",o=e.logger||{info:console.log,warn:console.warn,error:console.error},s=e.invocationAdapter,a=e.notificationTransport||null,c=e.serverUrl||null,d=e.executionExtra||{},k=new Map,y=new Map,R=null;function p(i){let u=br(i.baseRef,i.boardAdapter),l=i.boardAdapter.kvStorageForRef(i.cardStoreRef),S=Rr(pt({readIndex:()=>l.read("_index"),writeIndex:L=>l.write("_index",L),readCard:L=>l.read(L),writeCard:(L,K)=>(l.write(L,K),L),cardExists:L=>l.read(L)!==null,defaultCardKey:L=>L},o.warn)),w=i.artifactsAdapter||i.boardAdapter,$=null,B=null;return {label:i.label,board:u,cardStore:S,get filesArtifacts(){return $??($=$t(w.blobStorage("files")))},get chatsArtifacts(){return B??(B=$t(w.blobStorage("chats")))},boardAdapter:i.boardAdapter,cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef,notifyRef:i.notifyRef,taskExecutorRef:i.taskExecutorRef,chatHandlerRef:i.chatHandlerRef,inferenceAdapterRef:i.inferenceAdapterRef,notification:Rn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let g=e.boards.map(p),h=new Map;function f(i){return h.get(i)??0}function j(i){let u=g[f(i)];return {files:u?u.filesArtifacts:null,chats:u?u.chatsArtifacts:null}}function E(i){let u=j(i);return u.chats?wr(u.chats,{indexFileName:".index.json"}):null}function C(i){let u=j(i);return u.files?xr(u.files):null}function x(){return _r()}function P(i){return String(i||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function T(i){if(!i||i.notificationTeardown||!a||!i.notifyRef)return;let u=await a.subscribe(i.notifyRef,l=>{Tr(i.notification,l);let b=l.kind==="notification-batch"?l.notifications:[l];X(b);});i.notificationTeardown=u;}async function I(i){if(!i||i.initialized)return;let u={cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef},l={};i.taskExecutorRef&&(l["task-executor-ref"]=i.taskExecutorRef),i.chatHandlerRef&&(l["chat-handler-ref"]=i.chatHandlerRef),i.inferenceAdapterRef&&(l["inference-adapter-ref"]=i.inferenceAdapterRef);let b=i.board.init({params:u,body:l});if(b.status!=="success")throw Object.assign(new Error(b.error||`init failed for ${i.label}`),{statusCode:500});if(await T(i),i.chatHandlerRef&&s.describe)try{let S=await s.describe(i.chatHandlerRef);S&&S.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${S.kind}", expected "chat-handler" for ${i.label}`):S&&o.info(`[init] chat-handler validated: ${S.name} (protocol ${S.protocolVersion}) for ${i.label}`);}catch(S){o.warn(`[init] chat-handler describe failed for ${i.label}: ${S?.message||String(S)}`);}i.initialized=true;}function _(i){if(!i.boardAdapter.publishBoardChangeNotifications)return;let u=[],l=i.board.status({});l.status==="success"&&l.data!=null&&Ar(l.data)&&u.push({kind:"status",status:l.data});let b=i.board.getAllOutputsDataObjects({});if(b.status==="success"&&b.data!=null)for(let[w,$]of Object.entries(b.data))w&&u.push({kind:"data_object",key:w,payload:$});let S=i.board.getAllOutputsComputedValues({});if(S.status==="success"&&S.data!=null)for(let[w,$]of Object.entries(S.data))w&&u.push({kind:"computed_values",cardId:w,values:$});u.length>0&&i.boardAdapter.publishBoardChangeNotifications(u);}function O(i,u){if(!i||i.cardsBootstrapped)return;let l=i.cardStore.get({}),b=l.status==="success"&&Array.isArray(l.data?.cards)?l.data.cards:[];for(let S of b)typeof S.id=="string"&&(h.set(S.id,u),i.board.upsertCard({params:{cardId:S.id}}));i.cardsBootstrapped=true;}async function U(){for(let i of g)await I(i);}async function M(){await U();for(let i=0;i<g.length;i++)_(g[i]),O(g[i],i);}function W(i){return g[f(i)]??null}function re(i){let u=W(i);if(!u)return null;let l=u.cardStore.get({params:{id:i}});if(l.status!=="success")return null;let b=Array.isArray(l.data?.cards)?l.data.cards:[];return b.length>0?b[0]:null}function ne(){let i=l=>{if(!l||!l.cardStore)return [];let b=l.cardStore.get({});return b.status!=="success"||!Array.isArray(b.data?.cards)?[]:b.data.cards},u=[];for(let l of g)u.push(...i(l));return u}function Te(){let i=g.map(w=>{try{let B=w.boardAdapter.kvStorageForRef(w.outputsStoreRef).read("status");if(B!=null)return B}catch{}return w.notification.status}).filter(Boolean);if(i.length===0)return null;if(i.length===1)return i[0];let u=[],l=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],b={};for(let w of l)b[w]=0;for(let w of i){let $=w,B=Array.isArray($.cards)?$.cards:[];u.push(...B);for(let L of l)b[L]+=Number($?.summary?.[L]||0);}let S=i[0];return {...S,cards:u,summary:{...S.summary||{},card_count:u.length,...b}}}function Ee(){let i={},u=l=>{for(let[b,S]of Object.entries(l.notification.computedValues)){let w=l.notification.cards[b];i[b]={schema_version:"v1",card_id:b,card_data:w?.card_data??{},computed_values:S??{}};}};for(let l of g)u(l);return i}function Qe(){let i={};for(let u of g)Object.assign(i,u.notification.dataObjects||{});return i}function q(i){let u=P(i),l=E(i);return l?l.readSignal(u):{count:0,latest_mtime_ms:0,processing:false}}function G(){let i=ne(),u=Ee(),l=Qe(),b={};for(let w of i){if(!w?.id)continue;let $=w.id,B=u[$]||{},L={...B.card_data&&typeof B.card_data=="object"?B.card_data:w.card_data&&typeof w.card_data=="object"?w.card_data:{}};b[$]={schema_version:B.schema_version||"v1",card_id:B.card_id||$,card_data:L,computed_values:B.computed_values&&typeof B.computed_values=="object"?B.computed_values:{}};}let S={};for(let w of i){if(!w?.id)continue;let $=w.id;try{let B=q($),L=ie($);(L.length>0||B.processing)&&(S[$]={messages:L.map(K=>({role:String(K.role||"system"),text:String(K.text||""),files:Array.isArray(K.files)?K.files:[]})),receiving:!1,processing:!!B.processing});}catch{}}return {boardId:n,cardDefinitions:i,statusSnapshot:Te(),dataObjectsByToken:l,cardRuntimeById:b,cardChatsByCardId:S}}function v(i,u,l){let b=l?.syncBoard!==false,S=W(i);if(!S)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let w=re(i);if(!w)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let $=u(w)||w,B=S.cardStore.set({body:$});if(B.status!=="success")throw Object.assign(new Error(B.error||`Failed to persist card: ${i}`),{statusCode:500});if(b){let L=S.board.upsertCard({params:{cardId:i,restart:true}});if(L.status!=="success")throw Object.assign(new Error(L.error||`Failed to upsert card: ${i}`),{statusCode:500})}}function m(i,u){v(i,u,{syncBoard:true});}function A(i,u){v(i,u,{syncBoard:false});}function F(i,u){m(i,l=>{if(!u||typeof u!="object"||Object.keys(u).length===0)return l;function b(S,w,$){let B=String(w||"").split(".").filter(Boolean);if(!B.length)return;let L=S;for(let K=0;K<B.length-1;K++){let Y=B[K];(!L[Y]||typeof L[Y]!="object")&&(L[Y]={}),L=L[Y];}L[B[B.length-1]]=$;}if(u.fieldValues!==void 0&&u.fieldValues!==null){let S=null,w=l.view;if(w&&Array.isArray(w.elements)){for(let $ of w.elements)if($?.data&&$.data.writeTo){S=$.data.writeTo;break}}S?b(l,S,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[S,w]of Object.entries(u))S!=="_stagedFiles"&&(w!==null&&typeof w=="object"&&!Array.isArray(w)&&l[S]!==null&&typeof l[S]=="object"&&!Array.isArray(l[S])?l[S]={...l[S],...w}:l[S]=w);}return l});}function z(i){let u=String(i||"").match(/^(\d+)[-_]/);return u?parseInt(u[1],10):0}function Q(i){let u=String(i||"").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 me(i){let u=P(i),l=E(i);l&&l.clear(u);}function ae(i,u){let l=P(i),b=E(i),S=b?b.nextSerial(l):1,w=String(u||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(S).padStart(3,"0")}_${w}.txt`}function le(i,u,l,b){let S=new Date().toISOString(),w=P(i),$=j(i),B=ae(i,u||"system"),L=`${w}/${B}`,K=[],Y=typeof l=="string"?l.trim():"";Y&&K.push(Y);let ce=Array.isArray(b)?b:[];if(ce.length){K.length&&K.push(""),K.push("files:");for(let H of ce){if(!H||typeof H!="object")continue;let ee=typeof H.name=="string"?H.name:"file",ue=typeof H.stored_name=="string"?H.stored_name:"";K.push(ue?`- ${ee} -> ${ue}`:`- ${ee}`);}}$.chats&&$.chats.putText(L,`${K.join(`
1
+ var BoardLiveCardsLocalStorage=(function(exports){'use strict';var Pr=Object.defineProperty;var Dr=(e,t,r)=>t in e?Pr(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var qt=(e,t,r)=>Dr(e,t+"",r);var ot="b64:";function qr(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)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 Mr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),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 te(e){return `${ot}${qr(JSON.stringify(e))}`}function Se(e){if(!e.startsWith(ot))throw new Error(`Invalid ref format (expected ${ot}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Mr(e.slice(ot.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Mt(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var ke={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ue(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function Ce(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function at(e){return e.tasks??{}}function it(e){return e?e.status===ke.FAILED||e.status===ke.INACTIVATED:false}function Gt(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Ht(e){return e.maxExecutions}function Ut(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===ke.COMPLETED){let s=e.tasks[n];s&&ue(s).forEach(c=>r.add(c));}return Array.from(r)}function Vt(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;ue(o).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function Jt(e,t,r){let n=e.tasks[t]??ct(),o={};if(r){let a=r.tasks[t],c=Ce(a);for(let u of c)for(let[y,k]of Object.entries(r.tasks))if(ue(k).includes(u)){let R=e.tasks[y];R?.lastDataHash&&(o[u]=R.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Kt(e,t,r,n,o,s){let a=e.tasks[r]??ct(),c=t.tasks[r];if(!c)throw new Error(`Task "${r}" not found in graph`);let u;n&&c.on&&c.on[n]?u=c.on[n]:u=ue(c);let y=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let p=c.requires??[];for(let g of p)for(let[h,f]of Object.entries(t.tasks))if(ue(f).includes(g)){let j=e.tasks[h];j?.lastDataHash&&(y[g]=j.lastDataHash);break}}let k={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:y,error:void 0},R=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:k},availableOutputs:R,lastUpdated:new Date().toISOString()}}function zt(e,t,r,n){let o=e.tasks[r]??ct(),s=t.tasks[r];if(s?.retry){let u=o.retryCount+1;if(u<=s.retry.max_attempts){let y={...o,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:y},lastUpdated:new Date().toISOString()}}}let a={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},c=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(c=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&a.executionCount>=s.circuit_breaker.max_executions){let u=s.circuit_breaker.on_break;c=[...new Set([...c,...u])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:c,lastUpdated:new Date().toISOString()}}function Wt(e,t,r,n){let o=e.tasks[t]??ct(),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 {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Xt(e,t){let r=e.tasks[t];if(!r)return e;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 {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function ct(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ke(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=Qt();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:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function Yt(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:Jt(n,t.taskName,r)};case "task-completed":return {config:r,state:Kt(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:zt(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Wt(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Xt(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Gr(n,t.action)};case "task-upsert":return vt(e,t.taskName,t.taskConfig);case "task-removal":return wt(e,t.taskName);case "node-requires-add":return xt(e,t.nodeName,t.tokens);case "node-requires-remove":return _t(e,t.nodeName,t.tokens);case "node-provides-add":return At(e,t.nodeName,t.tokens);case "node-provides-remove":return Tt(e,t.nodeName,t.tokens);default:return e}}function dt(e,t){return t.reduce((r,n)=>Yt(r,n),e)}function vt(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:Qt()},lastUpdated:new Date().toISOString()}}}function wt(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function xt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ce(n),s=r.filter(a=>!o.includes(a));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function _t(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ce(n),s=o.filter(a=>!r.includes(a));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function At(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ue(n),s=r.filter(a=>!o.includes(a));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function Tt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ue(n),s=o.filter(a=>!r.includes(a));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function De(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function ze(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!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 Qt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Gr(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function qe(e){let{config:t,state:r}=e,n=at(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=Hr(n),a=Ut(t,r.tasks),c=new Set([...a,...r.availableOutputs]),u=[],y=[],k=[],R=[];for(let[g,h]of Object.entries(n)){let f=r.tasks[g],j=Gt(h,t.settings),E=j!=="once";if(f?.status===ke.RUNNING||it(f))continue;let C=Ht(h);if(C!==void 0&&f&&f.executionCount>=C||h.circuit_breaker&&f&&f.executionCount>=h.circuit_breaker.max_executions||!E&&f?.status===ke.COMPLETED)continue;if(E&&f?.status===ke.COMPLETED){let _=Ce(h),O=false;switch(j){case "data-changed":{_.length>0&&_.some(G=>{for(let[W,re]of Object.entries(n))if(ue(re).includes(G)){let ne=r.tasks[W];if(!ne)continue;let Te=f.lastConsumedHashes?.[G];return ne.lastDataHash==null?ne.executionCount>f.lastEpoch:ne.lastDataHash!==Te}return false})||(O=true);break}case "epoch-changed":{_.length>0&&_.some(G=>{for(let[W,re]of Object.entries(n))if(ue(re).includes(G)){let ne=r.tasks[W];if(ne&&ne.executionCount>f.lastEpoch)return true}return false})||(O=true);break}case "time-based":{let U=h.refreshInterval??0;if(U<=0){O=true;break}let G=f.completedAt;if(!G){O=true;break}(Date.now()-Date.parse(G))/1e3<U&&(O=true);break}case "manual":O=true;break}if(O)continue}let x=Ce(h);if(x.length===0){u.push(g);continue}let P=[],T=[],I=[];for(let _ of x){if(c.has(_))continue;let O=s[_]||[];O.length===0?P.push(_):O.every(G=>it(r.tasks[G]))?I.push({token:_,failedProducer:O[0]}):T.push(_);}P.length>0?k.push({taskName:g,missingTokens:P}):I.length>0?R.push({taskName:g,failedTokens:I.map(_=>_.token),failedProducers:[...new Set(I.map(_=>_.failedProducer))]}):T.length>0?y.push({taskName:g,waitingOn:T}):u.push(g);}let p={};if(u.length>1){let g=Vt(u,n);for(let[h,f]of Object.entries(g))f.length>1&&(p[h]=f);}return {eligible:u,pending:y,unresolved:k,blocked:R,conflicts:p}}function Hr(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of ue(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var Me=class{constructor(){qt(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function ut(e){let t=Et(e);return Ur(t)}function Et(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Et).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Et(t[n])).join(",")+"}"}function Ur(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Vr(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Jr(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),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 Zt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Vr(t)}function Kr(e){try{let t=JSON.parse(Jr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function We(e,t,r){let{handlers:n,onDrain:o}=t,s=new Me,a="state"in e&&"config"in e?e:Ke(e),c=false,u=new Set,y=new Map(Object.entries(n)),k=new Me,R=false,p=false;function g(){if(!c){if(R){p=true;return}R=true;try{do p=!1,h();while(p)}finally{R=false;}}}function h(){let C=k.drain(),x=s.drain(),P=[...C,...x];P.length>0&&(a=dt(a,P));let T=qe(a);P.length>0&&o?.(P,a,T);for(let I of T.eligible)E(I);for(let I of P)if(I.type==="task-progress"){let{taskName:_,update:O}=I;if(!a.config.tasks[_])continue;let G=a.state.tasks[_];if(!G||G.status!=="running")continue;let W=Zt(_),re=j(_,W,O).catch(ne=>{c||(k.append({type:"task-failed",taskName:_,error:ne.message??String(ne),timestamp:new Date().toISOString()}),g());}).finally(()=>{u.delete(re);});u.add(re);}}function f(C){let P=a.config.tasks[C].requires??[],T=new Map;for(let[_,O]of Object.entries(a.config.tasks))for(let U of O.provides??[])T.set(U,_);let I={};for(let _ of P){let O=T.get(_);O?I[_]=a.state.tasks[O]?.data:I[_]=void 0;}return I}async function j(C,x,P){let T=a.config.tasks[C],I=T.taskHandlers??[],_=f(C);for(let O of I){let U=y.get(O);if(!U)throw new Error(`Handler '${O}' not found in registry (task '${C}')`);let G={nodeId:C,state:_,taskState:a.state.tasks[C],config:T,callbackToken:x,update:P};if(await U(G)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${C}')`)}}function E(C){let P=a.config.tasks[C]?.taskHandlers;if(!P||P.length===0)return;k.append({type:"task-started",taskName:C,timestamp:new Date().toISOString()}),g();let T=Zt(C),I=j(C,T).catch(_=>{c||(k.append({type:"task-failed",taskName:C,error:_.message??String(_),timestamp:new Date().toISOString()}),g());}).finally(()=>{u.delete(I);});u.add(I);}return {push(C){c||(C.type==="task-completed"&&C.data&&!C.dataHash&&(C={...C,dataHash:ut(C.data)}),s.append(C),g());},pushAll(C){if(!c){for(let x of C)x.type==="task-completed"&&x.data&&!x.dataHash?s.append({...x,dataHash:ut(x.data)}):s.append(x);g();}},resolveCallback(C,x,P){if(c)return;let T=Kr(C);if(!T)return;let{taskName:I}=T;if(a.config.tasks[I]){if(P&&P.length>0)s.append({type:"task-failed",taskName:I,error:P.join("; "),timestamp:new Date().toISOString()});else {let _=x&&Object.keys(x).length>0?ut(x):void 0;s.append({type:"task-completed",taskName:I,data:x,dataHash:_,timestamp:new Date().toISOString()});}g();}},addNode(C,x){c||(s.append({type:"task-upsert",taskName:C,taskConfig:x,timestamp:new Date().toISOString()}),g());},removeNode(C){c||(s.append({type:"task-removal",taskName:C,timestamp:new Date().toISOString()}),g());},addRequires(C,x){c||(s.append({type:"node-requires-add",nodeName:C,tokens:x,timestamp:new Date().toISOString()}),g());},removeRequires(C,x){c||(s.append({type:"node-requires-remove",nodeName:C,tokens:x,timestamp:new Date().toISOString()}),g());},addProvides(C,x){c||(s.append({type:"node-provides-add",nodeName:C,tokens:x,timestamp:new Date().toISOString()}),g());},removeProvides(C,x){c||(s.append({type:"node-provides-remove",nodeName:C,tokens:x,timestamp:new Date().toISOString()}),g());},registerHandler(C,x){y.set(C,x);},unregisterHandler(C){y.delete(C);},retrigger(C){c||a.config.tasks[C]&&(s.append({type:"task-restart",taskName:C,timestamp:new Date().toISOString()}),g());},retriggerAll(C){if(!c){for(let x of C)a.config.tasks[x]&&s.append({type:"task-restart",taskName:x,timestamp:new Date().toISOString()});g();}},snapshot(){return De(a)},getState(){return a},getSchedule(){return qe(a)},async waitForHandlers(){u.size>0&&await Promise.allSettled([...u]);},async dispose(C){C?.wait&&u.size>0&&await Promise.allSettled([...u]),c=true;}}}function lt(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var zr=lt();zr("./jsonata-sync.cjs");var Wr=lt(),ft=Wr("./jsonata-sync.cjs"),rr=ft;function er(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function nr(e,t,r){let n=t.split("."),o=e;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 Xr(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await ft(o.expr).evaluate(n);nr(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Yr(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let a=rr(s.expr).evaluate(n);nr(e.computed_values,s.bindTo,a),n.computed_values=e.computed_values;}catch(a){let c=a instanceof Error?a.message:String(a);o.push({bindTo:s.bindTo,error:c});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Qr(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return ft(e).evaluate(n)}function Zr(e,t){return t.startsWith("fetched_sources.")?er(e._sourcesData??{},t.slice(16)):er(e,t)}var tr=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),en=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function tn(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))en.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,a)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${a}]: must be an object`);else {let c=s;typeof c.bindTo!="string"||!c.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(c.bindTo)&&t.push(`source_defs[${a}]: bindTo "${c.bindTo}" is not unique across source_defs`),n.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(o.has(c.outputFile)&&t.push(`source_defs[${a}]: outputFile "${c.outputFile}" is not unique across source_defs`),o.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):tr.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...tr].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function rn(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{o[s]=await ft(a).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function nn(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{o[s]=rr(a).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Be={run:Xr,runSync:Yr,eval:Qr,resolve:Zr,validate:tn,enrichSources:rn,enrichSourcesSync:nn};function It(e){return JSON.stringify(e)}function Ot(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function pt(e,t){function r(){return e.readIndex()??{}}function n(o,s,a){let c=String(s||"").split(".").filter(Boolean);if(c.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let u={...o},y=u;for(let k=0;k<c.length-1;k++){let R=c[k],p=y[R],g=p&&typeof p=="object"&&!Array.isArray(p)?{...p}:{};y[R]=g,y=g;}return y[c[c.length-1]]=a,u}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let c=e.readCard(a.key);c?o.push(c):t?.(`[card-store] could not read card "${s}" at key "${a.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,a]of Object.entries(r()))o[s]=a.checksum;return o},changedSince(o){let s=r(),a=[];for(let[c,u]of Object.entries(s))o[c]!==u.checksum&&a.push(c);for(let c of Object.keys(o))s[c]||a.push(c);return a},validateUpsert(o,s){let a=r(),c=a[o],u=Object.entries(a).find(([,y])=>y.key===s);return c&&c.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${c.key}", cannot remap to "${s}"`}:u&&u[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${u[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,a){let c=r(),u=a??c[o]?.key??e.defaultCardKey(o),y=e.writeCard(u,s);c[o]={key:u,checksum:y,updatedAt:new Date().toISOString()},e.writeIndex(c);},patchCard(o,s,a){let c=r(),u=c[o];if(!u||!e.cardExists(u.key))throw new Error(`card "${o}" not found`);let y=e.readCard(u.key);if(!y||typeof y!="object"||Array.isArray(y))throw new Error(`card "${o}" is not patchable`);let k=n(y,s,a),R=e.writeCard(u.key,k);c[o]={key:u.key,checksum:R,updatedAt:new Date().toISOString()},e.writeIndex(c);},removeCard(o){let s=r();s[o]&&(delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function jt(e,t){return {readSourceData(r,n){let o=e.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 a=t(o);e.write(`${r}/.staged/${s}/${n}`,a);},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,a=e.read(s);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(s),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function ar(e){function t(r){let n=e.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=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(o=>o.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function ir(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let o=e.read(r)??[];e.write(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=e.read(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(a){let c=a instanceof Error?a.message:String(a);try{t(s,c);}catch{}}e.delete(r);}}}}var gt="v1",Le="board/graph",cr="board/lastJournalProcessedId";function sr(e){return `cards/${e}/runtime`}function dr(e){return {readRuntime(t){return e.read(sr(t))??{_sources:{}}},writeRuntime(t,r){e.write(sr(t),r);}}}function sn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function ur(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==gt)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let o=sn(n.values,r);return {ok:true,newVersion:e.writeValues(t,o,r.deleteKeys)}}}}function lr(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Ot(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",It(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return Ot(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",It(r));},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function fr(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function on(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function an(e,t){return e?.lastRequestedAt?on(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function cn(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function or(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function mt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=qe(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},c=new Map;for(let h of s.pending)c.set(h.taskName,h.waitingOn);for(let h of s.unresolved)c.set(h.taskName,h.missingTokens);for(let h of s.blocked)c.set(h.taskName,h.failedTokens);let u=new Map;for(let[h,f]of Object.entries(n))for(let j of f.requires??[]){let E=u.get(j)??[];E.push(h),u.set(j,E);}let y=o.sort().map(h=>{let f=r[h],j=n[h]??{requires:[],provides:[]};f.status==="completed"?a.completed+=1:f.status==="failed"?a.failed+=1:f.status==="in-progress"&&(a.in_progress+=1);let E=j.requires??[],C=j.provides??[],x=Object.keys(f.data??{}).sort(),P=E.filter(G=>t.state.availableOutputs.includes(G)),T=E.filter(G=>!t.state.availableOutputs.includes(G)),I=c.get(h)??T,_=new Set;for(let G of C)for(let W of u.get(G)??[])W!==h&&_.add(W);let O=f.failedAt,U=f.error?{message:f.error,code:"TASK_FAILED",at:O,source:"task-runtime"}:void 0;return {name:h,status:f.status,error:U,requires:E,requires_satisfied:P,requires_missing:T,provides_declared:C,provides_runtime:x,blocked_by:I,unblocks:Array.from(_).sort(),runtime:{attempt_count:f.executionCount??0,restart_count:f.retryCount??0,in_progress_since:f.status==="in-progress"?f.startedAt??null:null,last_transition_at:f.lastUpdated??null,last_completed_at:f.completedAt??null,last_restarted_at:f.startedAt??null,status_age_ms:f.lastUpdated?0:null}}});a.pending=s.pending.length,a.blocked=s.blocked.length,a.unresolved=s.unresolved.length;let k=y.map(h=>({name:h.name,fanOut:h.unblocks.length})).sort((h,f)=>f.fanOut-h.fanOut||h.name.localeCompare(f.name)),R=k.length>0?k[0]:{name:null,fanOut:0},p=new Set;for(let h of Object.values(n))for(let f of h.requires??[])p.add(f);let g=0;for(let[h,f]of Object.entries(n)){let j=(f.requires??[]).length===0,C=(f.provides??[]).some(x=>(u.get(x)??[]).some(P=>P!==h));j&&!C&&(g+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:a.completed,eligible:s.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:g,topology:{edge_count:Array.from(p).length,max_fan_out_card:R.name,max_fan_out:R.fanOut}},cards:y}}function dn(){return new Date().toISOString()}function pr(e,t,r,n,o,s,a){return async c=>{let u=[],y=r.cardStore.readCard(c.nodeId);if(!y)return "task-initiate-failure";let k=y.id,R=y.card_data??{},p=y.source_defs??[],g=p.filter(q=>q.optionalForCompletionGating!==true),h=r.cardRuntimeStore.readRuntime(k),f=false,j=()=>{f&&(r.cardRuntimeStore.writeRuntime(k,h),f=false);},E=q=>({...h._sources[q]??{}}),C=(q,M)=>{h._sources[q]=M,f=true;},x=c.taskState?.executionCount??0,P=h._lastExecutionCount;if(typeof P=="number"&&P!==x&&(h._sources={},f=true),P!==x&&(h._lastExecutionCount=x,f=true),c.update){let q=c.update,M=q.outputFile;if(M){let v=E(M);if(q.failure)C(M,or(v,q.reason??"unknown"));else {let m=q.rqt;if(!v.lastFetchedAt||m>v.lastFetchedAt){let A=typeof q.deliveryToken=="string"?q.deliveryToken:void 0,F=false;A&&(F=r.fetchedSourcesStore.commitSourceData(k,M,A)),F?C(M,cn(v,m)):C(M,or(v,`source delivery commit failed for ${M} token=${String(A)}`));}}j();}}let T={};for(let q of p)if(q.outputFile){let M=r.fetchedSourcesStore.readSourceData(k,q.outputFile);M!==null&&(T[q.bindTo]=M);}let I={};for(let[q,M]of Object.entries(c.state??{}))if(M!==null&&typeof M=="object"&&!Array.isArray(M)){let v=M[q];I[q]=v!==void 0?v:M;}else I[q]=M;let _={id:k,card_data:{...R},requires:I,source_defs:p,compute:y.compute};_._sourcesData=T,y.compute&&Be.runSync(_,{sourcesData:T}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(k,_.computed_values??{});let O={...y},U=Be.enrichSourcesSync(Array.isArray(y.source_defs)?y.source_defs:void 0,{card_data:y.card_data,requires:I}),G=e.value;O.source_defs=Array.isArray(U)?U.map(q=>({...q,boardDir:typeof q.boardDir=="string"&&q.boardDir?q.boardDir:G})):U;let W=dn(),re=c.update?void 0:W,ne=g.filter(q=>{let M=q.outputFile;if(typeof M!="string"||!M)return true;let v=E(M);re&&(v={...v,queueRequestedAt:re},C(M,v));let m=v.queueRequestedAt??v.lastRequestedAt??W,A=an(v,m);return A==="in-flight"?false:A==="dispatch"});if(j(),ne.length>0){let q=false,M=W;for(let v of ne){let m=v.outputFile;if(typeof m!="string"||!m)continue;let A=E(m),F=A.queueRequestedAt??W;C(m,{...A,lastRequestedAt:F}),M=F,q=true;}return q&&j(),q&&(u.push({taskKind:"source-fetch",payload:{boardRef:te(e),enrichedCard:O,callbackToken:c.callbackToken,rqt:M}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}let Te=y.provides??[],Ee={};for(let{bindTo:q,ref:M}of Te)Ee[q]=Be.resolve(_,M);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(Ee),p.filter(q=>{if(q.optionalForCompletionGating!==true)return false;let M=E(q.outputFile);return !M.lastRequestedAt||!M.lastFetchedAt?true:M.lastFetchedAt<=M.lastRequestedAt}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:te(e),enrichedCard:O,callbackToken:c.callbackToken,rqt:W}}),n(c.nodeId,Ee),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var Nt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function gr(e){return {[Le]:e.graph,[cr]:e.lastDrainedJournalId}}function mr(e){let t=e[Le],r=e[cr];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${Le}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function hr(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function se(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function Z(e){return {status:"fail",error:e}}function oe(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function un(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function kr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function ht(e){try{let t=JSON.parse(kr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function ln(e){return un(JSON.stringify(e))}function yr(e){try{let t=JSON.parse(kr(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function fe(){return new Date().toISOString()}function br(e,t){let r=t.onWarn??(()=>{}),n=te(e);function o(v){if(v.length!==0)try{let m=t.publishBoardChangeNotifications?.(v);m&&typeof m.catch=="function"&&m.catch(A=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${A instanceof Error?A.message:String(A)}`));}catch(m){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${m instanceof Error?m.message:String(m)}`);}}function s(){let v=c().readCardStoreRef();if(!v)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let m=t.kvStorageForRef(v);return {readIndex(){return m.read("_index")},writeIndex(A){m.write("_index",A);},readCard(A){return m.read(A)},writeCard(A,F){return m.write(A,F),t.hashFn(F)},cardExists(A){return m.read(A)!==null},defaultCardKey(A){return A}}}let a={readValues(v){let m=t.kvStorage("state-snapshot"),A=m.listKeys().sort();if(A.length===0)return {version:null,values:{}};let F={};for(let z of A)F[z]=m.read(z);return {version:t.hashFn(F),values:F}},writeValues(v,m,A){let F=t.kvStorage("state-snapshot");for(let z of A)F.delete(z);for(let[z,Q]of Object.entries(m))F.write(z,Q);return t.hashFn(m)}},c=()=>lr(t.kvStorage("config")),u=()=>ur(a),y=()=>ar(t.journalAdapter()),k=()=>pt(s(),r),R=()=>{let v=c().readOutputsStoreRef();if(!v)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return fr(t.kvStorageForRef(v))};function p(){return !!u().readSnapshot(e.value).values[Le]}function g(){let v=u().readSnapshot(e.value);if(!v.values[Le])throw new Error(`Board not initialized at ${e.value}`);return mr(v.values)}function h(v,m){let A=u().commitSnapshot(e.value,{schemaVersion:gt,expectedVersion:m,commitId:t.genId(),committedAt:fe(),deleteKeys:[],shallowMerge:gr(v)});if(!A.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${m??"null"} current=${A.currentVersion??"null"}`)}function f(v){y().appendEvent(v);}async function j(){let v=(N,D)=>{let X=N.payload,he=(X?.enrichedCard??{}).id??X?.cardId??"unknown";f({type:"task-failed",taskName:he,error:D,timestamp:fe()});},m=ir(t.kvStorage("execution-requests"),v),A=dr(t.kvStorage("card-runtime")),F=jt(t.blobStorage("sources"),N=>t.resolveBlob(N)),z=new Map,Q={readRuntime(N){return z.get(N)??A.readRuntime(N)},writeRuntime(N,D){z.set(N,D);}},me=[],ae=new Map,le={readSourceData(N,D){let X=`${N}/${D}`;return ae.has(X)?ae.get(X):F.readSourceData(N,D)},ingestSourceDataStaged(N,D,X,Ae){F.ingestSourceDataStaged(N,D,X,Ae);},commitSourceData(N,D,X){let Ae=`${N}/.staged/${X}/${D}`,i=t.blobStorage("sources").read(Ae);if(i==null)return false;let d=`${N}/${D}`,l=i.trim();try{ae.set(d,JSON.parse(l));}catch{ae.set(d,l);}return me.push({cardId:N,outputFile:D,deliveryToken:X}),true},hasSource(N,D){let X=`${N}/${D}`;return ae.has(X)?true:F.hasSource(N,D)}},ie={cardStore:k(),cardRuntimeStore:Q,fetchedSourcesStore:le,outputStore:R(),executionRequestStore:m},be=g(),Re=ze(be.graph),{events:ve,newCursor:we}=y().readEntriesAfterCursor(be.lastDrainedJournalId),J=[],xe=[],He=[],Ue=new Map,Ze=(N,D)=>{J.push({type:"task-completed",taskName:N,data:D,timestamp:fe()});},Ve=(N,D)=>f({type:"task-failed",taskName:N,error:D,timestamp:fe()}),Ie=We(Re,{handlers:{"card-handler":pr(e,we,ie,Ze,Ve,(N,D)=>{xe.push({cardId:N,values:D});},N=>{He.push(N);})}});for(J=ve;J.length>0;){let N=J;J=[];for(let D of N)if(D.type==="task-restart"){let X=ie.cardStore.readCard(D.taskName);X&&Ue.set(D.taskName,X);}Ie.pushAll(N),await Ie.waitForHandlers();}let Je=Ie.getState();await Ie.dispose({wait:true});let rt=u().readSnapshot(e.value).version;h({lastDrainedJournalId:we,graph:De(Je)},rt);for(let{cardId:N,values:D}of xe)ie.outputStore.writeComputedValues(N,D);for(let N of He)ie.outputStore.writeDataObjects(N);for(let[N,D]of z)A.writeRuntime(N,D);for(let{cardId:N,outputFile:D,deliveryToken:X}of me)F.commitSourceData(N,D,X);let _e;try{_e=mt(n,Je),ie.outputStore.writeStatusSnapshot(_e);}catch(N){r(`[board-live-cards-public] status publish failed: ${N instanceof Error?N.message:String(N)}`);}let Oe=[];for(let{cardId:N,values:D}of xe)Oe.push({kind:"computed_values",cardId:N,values:D});for(let N of He)for(let[D,X]of Object.entries(N))D&&Oe.push({kind:"data_object",key:D,payload:X});for(let[N,D]of Ue)Oe.push({kind:"card_refreshed",cardId:N,card:D});_e!==void 0&&Oe.push({kind:"status",status:_e}),o(Oe);let St=c().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:te({kind:"built-in",value:"source-cli-task-executor"})};m.dispatchEntriesForJournalId(we,N=>{if(N.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${N.taskKind}" \u2014 skipping`);return}let D=N.payload,X=D.enrichedCard?.id??"unknown",Ae=D.enrichedCard?.source_defs??[];for(let he of Ae){if(!he.outputFile){r(`[dispatch] source "${he.bindTo}" has no outputFile \u2014 skipping`);continue}let i=ln({cbk:D.callbackToken,rg:e.value,br:te(e),cid:X,b:he.bindTo,d:he.outputFile,cs:void 0,rqt:D.rqt});t.dispatchExecution(St,{source_def:he,base_ref:te(e),callback:{token:i,via:t.selfRef}}).catch(d=>Ve(X,d instanceof Error?d.message:String(d)));}});}async function E(){try{let v=()=>{let A=g(),{events:F}=y().readEntriesAfterCursor(A.lastDrainedJournalId);F.length<=0||(E(),t.requestProcessAccumulated?.());},m=await Mt(t.lock,j,v);return se({ran:m!==!1})}catch(v){return oe(v)}}function C(v){try{let m=v.params?.cardStoreRef;if(!m)return Z("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!p()){let Q=Ke(Nt);h({lastDrainedJournalId:"",graph:De(Q)},null);}let A=v.params?.outputsStoreRef;if(!A)return Z("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let F=c();F.writeCardStoreRef(m),F.writeOutputsStoreRef(A);let z=v.body??{};z["task-executor-ref"]&&F.writeTaskExecutorRef(z["task-executor-ref"]),z["chat-handler-ref"]&&F.writeChatHandlerRef(z["chat-handler-ref"]);try{R().writeStatusSnapshot(mt(n,ze(g().graph)));}catch{}return se()}catch(m){return oe(m)}}function x(v){try{let m=R().readStatusSnapshot();if(!m){m=mt(n,ze(g().graph));try{R().writeStatusSnapshot(m);}catch{}}return se(m)}catch(m){return oe(m)}}function P(v){try{let m=v.params?.id;return m?(f({type:"task-removal",taskName:m,timestamp:fe()}),E(),se()):Z("removeCard requires params.id")}catch(m){return oe(m)}}function T(v){try{let m=v.params?.id;return m?(f({type:"task-restart",taskName:m,timestamp:fe()}),E(),se()):Z("retrigger requires params.id")}catch(m){return oe(m)}}async function I(v){return E()}function _(v){try{let m=v.params?.cardId,A=v.params?.all,F=!!v.params?.restart;if(!m&&!A)return Z("upsertCard requires --card-id <id> or --all");let z=A?k().readAllCards().map(Q=>Q.id):[m];for(let Q of z)if(!k().readCard(Q))return Z(`Card "${Q}" not found in board at ${e.value}`);for(let Q of z){let me=k().readCard(Q),ae=hr(me),le=t.hashFn(ae),ie=t.kvStorage("card-upsert"),be=ie.read(Q),Re=be?.taskConfigHash!==le;if(!(!Re&&!F)){if(Re){let ve=be?.blobRef??k().readCardKey(Q)??Q;f({type:"task-upsert",taskName:Q,taskConfig:ae,timestamp:fe()}),ie.write(Q,{blobRef:ve,taskConfigHash:le,updatedAt:fe()});}F&&f({type:"task-restart",taskName:Q,timestamp:fe()});}}return E(),se()}catch(m){return oe(m)}}function O(v){try{let m=v.params?.token;if(!m)return Z("taskFailed requires params.token");let A=v.params?.error??"unknown error",F=ht(m);return F?(f({type:"task-failed",taskName:F.taskName,error:A,timestamp:fe()}),E(),se()):Z("Invalid callback token")}catch(m){return oe(m)}}function U(v){try{let m=v.params?.token;if(!m)return Z("taskProgress requires params.token");let F=(v.body??{}).update??{},z=ht(m);return z?(f({type:"task-progress",taskName:z.taskName,update:F,timestamp:fe()}),E(),se()):Z("Invalid callback token")}catch(m){return oe(m)}}function G(v){try{let m=v.params?.token,A=v.params?.ref;if(!m)return Z("sourceDataFetched requires params.token");if(!A)return Z("sourceDataFetched requires params.ref");let F=yr(m);if(!F)return Z("Invalid source token");let{cbk:z,cid:Q,b:me,d:ae,cs:le,rqt:ie}=F,be=jt(t.blobStorage("sources"),J=>t.resolveBlob(J)),Re=t.genId();be.ingestSourceDataStaged(Q,ae,Se(A),Re);let ve=ht(z);if(!ve)return Z("Invalid callback token embedded in source token");let we=fe();return f({type:"task-progress",taskName:ve.taskName,update:{bindTo:me,outputFile:ae,fetchedAt:we,deliveryToken:Re,sourceChecksum:le,rqt:ie},timestamp:we}),E(),se()}catch(m){return oe(m)}}function W(v){try{let m=v.params?.token,A=v.params?.reason??"unknown";if(!m)return Z("sourceDataFetchFailure requires params.token");let F=yr(m);if(!F)return Z("Invalid source token");let{cbk:z,b:Q,d:me,cs:ae}=F,le=ht(z);return le?(f({type:"task-progress",taskName:le.taskName,update:{bindTo:Q,outputFile:me,failure:!0,reason:A,sourceChecksum:ae},timestamp:fe()}),E(),se()):Z("Invalid callback token embedded in source token")}catch(m){return oe(m)}}function re(v){try{let m=c().readCardStoreRef();return m?se({storeRef:m}):Z(`Board at ${e.value} has no card store configured`)}catch(m){return oe(m)}}function ne(v){try{let m=c().readOutputsStoreRef();return m?se({storeRef:m}):Z(`Board at ${e.value} has no outputs store configured`)}catch(m){return oe(m)}}function Te(v){try{let m=v.params?.key;if(!m)return Z("getConfig requires params.key");let A=c(),F;switch(m){case "task-executor":F=A.readTaskExecutorRef()??null;break;case "chat-handler":F=A.readChatHandlerRef()??null;break;case "card-store-ref":F=A.readCardStoreRef();break;case "outputs-store-ref":F=A.readOutputsStoreRef();break;default:return Z(`getConfig: unknown key "${m}"`)}return se({value:F})}catch(m){return oe(m)}}function Ee(v){try{let m=v.params?.key;if(!m)return Z("getOutputsDataObject requires params.key");let A=R().readDataObject(m);return se(A)}catch(m){return oe(m)}}function Qe(v){try{return se(R().readAllDataObjects())}catch(m){return oe(m)}}function q(v){try{let m=v.params?.key;if(!m)return Z("getOutputsComputedValues requires params.key");let A=R().readComputedValues(m);return se(A)}catch(m){return oe(m)}}function M(v){try{return se(R().readAllComputedValues())}catch(m){return oe(m)}}return {init:C,status:x,getCardStoreRef:re,getOutputsStoreRef:ne,getConfig:Te,getOutputsDataObject:Ee,getAllOutputsDataObjects:Qe,getOutputsComputedValues:q,getAllOutputsComputedValues:M,removeCard:P,retrigger:T,processAccumulatedEvents:I,upsertCard:_,taskFailed:O,taskProgress:U,sourceDataFetched:G,sourceDataFetchFailure:W}}function Rr(e){function t(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 a=e.readCard(s);return a?t({cards:[a]}):r(`card "${s}" not found`)}return t({cards:e.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 a=Array.isArray(s)?s:[s];for(let c of a){if(typeof c.id!="string")return r("each card must have a string `id` field");e.writeCard(c.id,c);}return t({count:a.length})}catch(s){return n(s)}},del(o){try{let s=o.body?.ids??[],a=o.params?.id,c=a?[...s,a]:s;if(c.length===0)return r("del requires body.ids (string[]) or params.id");for(let u of c)e.removeCard(u);return t({count:c.length})}catch(s){return n(s)}},patch(o){try{let s=o.params?.id,a=o.params?.path;if(!s)return r("patch requires params.id");if(!a)return r("patch requires params.path");let c=o.body,u=c&&Object.prototype.hasOwnProperty.call(c,"value")?c.value:o.body;return e.patchCard(s,a,u),t({count:1})}catch(s){return n(s)}}}}var yt=".artifacts-index.json";function Sr(){return new Date().toISOString()}function Cr(e){return new TextEncoder().encode(e).byteLength}function Xe(e){let t=e.read(yt);if(!t)return {entries:{}};try{let r=JSON.parse(t);if(r&&r.entries&&typeof r.entries=="object")return r}catch{}return {entries:{}}}function Bt(e,t){e.write(yt,JSON.stringify(t,null,2));}function fn(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function vr(e,t,r){e.entries[t]={key:t,size:r.size,updatedAt:r.updatedAt,contentType:r.contentType};}function Lt(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function pn(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function gn(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function mn(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function hn(e){let t=pn(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function yn(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function $t(e){function t(r){let n=e.stat?fn(e.stat(r)):null;if(n)return n;let s=Xe(e).entries[r];if(s)return {...s};if(!e.exists(r))return null;let a=e.read(r);return a===null?{key:r}:{key:r,size:Cr(a)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let s=t(r)??{key:r};s.contentType=o,s.updatedAt=s.updatedAt??Sr(),s.size=s.size??Cr(n);let a=Xe(e);return vr(a,r,s),Bt(e,a),s},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let c=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,c);}let s=t(r)??{key:r};s.contentType=o,s.updatedAt=s.updatedAt??Sr(),s.size=s.size??n.byteLength;let a=Xe(e);return vr(a,r,s),Bt(e,a),s},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.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(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.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:t,list(r=""){let n=new Map;if(e.listKeys)for(let s of e.listKeys(r)){if(s===yt)continue;let a=t(s)??{key:s};n.set(s,a);}let o=Xe(e);for(let[s,a]of Object.entries(o.entries))s===yt||r&&!s.startsWith(r)||n.has(s)||n.set(s,{...a});return [...n.values()].sort((s,a)=>s.key.localeCompare(a.key))},remove(r){e.remove(r);let n=Xe(e);delete n.entries[r],Bt(e,n);}}}function wr(e,t){let r=t?.indexFileName;function n(R){return `${R}/${r}`}function o(R){let p=e.getText(n(R));if(!p)return [];try{let g=JSON.parse(p);return Array.isArray(g)?g.filter(h=>h&&typeof h.stored_name=="string").map(h=>({serial:Number(h.serial||Lt(String(h.stored_name))||0),role:String(h.role||"system").toLowerCase(),stored_name:String(h.stored_name),path:typeof h.path=="string"?h.path:`${R}/chats/${String(h.stored_name)}`,updated_at:typeof h.updated_at=="string"?h.updated_at:null})):[]}catch{return []}}function s(R,p){e.putText(n(R),JSON.stringify(p,null,2),"application/json; charset=utf-8");}function a(R){let p=o(R),g=0;for(let h of p){let f=Number(h.serial||0);Number.isFinite(f)&&f>g&&(g=f);}return g+1}function c(R,p){let g=o(R);g.push(p),s(R,g);}function u(R){let p=o(R),g=[];for(let h of p){let f=`${R}/${h.stored_name}`,j=e.getText(f);j!==null&&g.push({serial:Number(h.serial||Lt(h.stored_name)||0),role:String(h.role||"system").toLowerCase(),text:j,path:typeof h.path=="string"?h.path:`${R}/chats/${h.stored_name}`,stored_name:h.stored_name,updated_at:h.updated_at||null});}return g.sort((h,f)=>h.serial-f.serial||h.stored_name.localeCompare(f.stored_name)),g}function y(R){let p=`${R}/`;for(let g of e.list(p))e.remove(g.key);}function k(R){let p=`${R}/`,g=e.list(p),h=0,f=0,j=false;for(let E of g){let C=E.key.slice(p.length);if(C===".processing"){j=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(C))continue;h+=1;let x=E.updatedAt?Number(new Date(E.updatedAt).getTime()||0):0;x>f&&(f=x);}return {count:h,latest_mtime_ms:f,processing:j}}return {indexKey:n,loadIndex:o,saveIndex:s,nextSerial:a,appendIndexRecord:c,readRecords:u,clear:y,readSignal:k}}function xr(e){function t(o,s){let a=0,c=[];Array.isArray(s)&&c.push(...s);for(let u of e.list(`${o}/`))c.push(yn(u.key));for(let u of c){let y=Lt(u);Number.isFinite(y)&&y>a&&(a=y);}return a+1}function r(o,s,a){let c=Number(a?.maxLen||32),{stem:u,ext:y}=hn(o),k=mn(y),R=gn(u),p=`${String(s).padStart(3,"0")}-`,g=k,h=c-p.length-g.length;h<1&&(g="",h=c-p.length);let f=R.slice(0,Math.max(1,h)),j=`${p}${f}${g}`;return j.length>c&&(j=j.slice(0,c).replace(/\.$/,"")),j}function n(o,s,a){let c=t(o,a?.seedNames),u=r(s,c,{maxLen:a?.maxLen});for(;e.exists(`${o}/${u}`);)c+=1,u=r(s,c,{maxLen:a?.maxLen});return u}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function _r(){function e(o,s){if(!Array.isArray(o))return [];let a=[];for(let c of o){if(!c||typeof c!="object")continue;let u=c;typeof u.stored_name=="string"&&a.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,path:typeof u.path=="string"?u.path:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:s||null});}return a}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let a=t(o);if(s.length===0)return o.files=a,a;let c=new Set(a.map(u=>u.stored_name));for(let u of s)c.has(u.stored_name)||(a.push(u),c.add(u.stored_name));return o.files=a,a}function n(o,s,a){let c=t(o);if(!Number.isInteger(s)||s<0||s>=c.length)return {ok:false,reason:"index_out_of_range"};let u=c[s];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}var kn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},bn=32;function Rn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Ar(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function Tr(e,t){if(!t||typeof t!="object")return;let r=t;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)Tr(e,n);return}r.kind==="status"&&Ar(r.status)&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card);}function Er(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...kn,...e.corsHeaders||{}},n=e.boardId||"",o=e.logger||{info:console.log,warn:console.warn,error:console.error},s=e.invocationAdapter,a=e.notificationTransport||null,c=e.serverUrl||null,u=e.executionExtra||{},y=new Map,k=new Map,R=null;function p(i){let d=br(i.baseRef,i.boardAdapter),l=i.boardAdapter.kvStorageForRef(i.cardStoreRef),S=Rr(pt({readIndex:()=>l.read("_index"),writeIndex:L=>l.write("_index",L),readCard:L=>l.read(L),writeCard:(L,K)=>(l.write(L,K),L),cardExists:L=>l.read(L)!==null,defaultCardKey:L=>L},o.warn)),w=i.artifactsAdapter||i.boardAdapter,$=null,B=null;return {label:i.label,board:d,cardStore:S,get filesArtifacts(){return $??($=$t(w.blobStorage("files")))},get chatsArtifacts(){return B??(B=$t(w.blobStorage("chats")))},boardAdapter:i.boardAdapter,cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef,notifyRef:i.notifyRef,taskExecutorRef:i.taskExecutorRef,chatHandlerRef:i.chatHandlerRef,inferenceAdapterRef:i.inferenceAdapterRef,notification:Rn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let g=e.boards.map(p),h=new Map;function f(i){return h.get(i)??0}function j(i){let d=g[f(i)];return {files:d?d.filesArtifacts:null,chats:d?d.chatsArtifacts:null}}function E(i){let d=j(i);return d.chats?wr(d.chats,{indexFileName:".index.json"}):null}function C(i){let d=j(i);return d.files?xr(d.files):null}function x(){return _r()}function P(i){return String(i||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function T(i){if(!i||i.notificationTeardown||!a||!i.notifyRef)return;let d=await a.subscribe(i.notifyRef,l=>{Tr(i.notification,l);let b=l.kind==="notification-batch"?l.notifications:[l];X(b);});i.notificationTeardown=d;}async function I(i){if(!i||i.initialized)return;let d={cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef},l={};i.taskExecutorRef&&(l["task-executor-ref"]=i.taskExecutorRef),i.chatHandlerRef&&(l["chat-handler-ref"]=i.chatHandlerRef),i.inferenceAdapterRef&&(l["inference-adapter-ref"]=i.inferenceAdapterRef);let b=i.board.init({params:d,body:l});if(b.status!=="success")throw Object.assign(new Error(b.error||`init failed for ${i.label}`),{statusCode:500});if(await T(i),i.chatHandlerRef&&s.describe)try{let S=await s.describe(i.chatHandlerRef);S&&S.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${S.kind}", expected "chat-handler" for ${i.label}`):S&&o.info(`[init] chat-handler validated: ${S.name} (protocol ${S.protocolVersion}) for ${i.label}`);}catch(S){o.warn(`[init] chat-handler describe failed for ${i.label}: ${S?.message||String(S)}`);}i.initialized=true;}function _(i){if(!i.boardAdapter.publishBoardChangeNotifications)return;let d=[],l=i.board.status({});l.status==="success"&&l.data!=null&&Ar(l.data)&&d.push({kind:"status",status:l.data});let b=i.board.getAllOutputsDataObjects({});if(b.status==="success"&&b.data!=null)for(let[w,$]of Object.entries(b.data))w&&d.push({kind:"data_object",key:w,payload:$});let S=i.board.getAllOutputsComputedValues({});if(S.status==="success"&&S.data!=null)for(let[w,$]of Object.entries(S.data))w&&d.push({kind:"computed_values",cardId:w,values:$});d.length>0&&i.boardAdapter.publishBoardChangeNotifications(d);}function O(i,d){if(!i||i.cardsBootstrapped)return;let l=i.cardStore.get({}),b=l.status==="success"&&Array.isArray(l.data?.cards)?l.data.cards:[];for(let S of b)typeof S.id=="string"&&(h.set(S.id,d),i.board.upsertCard({params:{cardId:S.id}}));i.cardsBootstrapped=true;}async function U(){for(let i of g)await I(i);}async function G(){await U();for(let i=0;i<g.length;i++)_(g[i]),O(g[i],i);}function W(i){return g[f(i)]??null}function re(i){let d=W(i);if(!d)return null;let l=d.cardStore.get({params:{id:i}});if(l.status!=="success")return null;let b=Array.isArray(l.data?.cards)?l.data.cards:[];return b.length>0?b[0]:null}function ne(){let i=l=>{if(!l||!l.cardStore)return [];let b=l.cardStore.get({});return b.status!=="success"||!Array.isArray(b.data?.cards)?[]:b.data.cards},d=[];for(let l of g)d.push(...i(l));return d}function Te(){let i=g.map(w=>{try{let B=w.boardAdapter.kvStorageForRef(w.outputsStoreRef).read("status");if(B!=null)return B}catch{}return w.notification.status}).filter(Boolean);if(i.length===0)return null;if(i.length===1)return i[0];let d=[],l=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],b={};for(let w of l)b[w]=0;for(let w of i){let $=w,B=Array.isArray($.cards)?$.cards:[];d.push(...B);for(let L of l)b[L]+=Number($?.summary?.[L]||0);}let S=i[0];return {...S,cards:d,summary:{...S.summary||{},card_count:d.length,...b}}}function Ee(){let i={},d=l=>{for(let[b,S]of Object.entries(l.notification.computedValues)){let w=l.notification.cards[b];i[b]={schema_version:"v1",card_id:b,card_data:w?.card_data??{},computed_values:S??{}};}};for(let l of g)d(l);return i}function Qe(){let i={};for(let d of g)Object.assign(i,d.notification.dataObjects||{});return i}function q(i){let d=P(i),l=E(i);return l?l.readSignal(d):{count:0,latest_mtime_ms:0,processing:false}}function M(){let i=ne(),d=Ee(),l=Qe(),b={};for(let w of i){if(!w?.id)continue;let $=w.id,B=d[$]||{},L={...B.card_data&&typeof B.card_data=="object"?B.card_data:w.card_data&&typeof w.card_data=="object"?w.card_data:{}};b[$]={schema_version:B.schema_version||"v1",card_id:B.card_id||$,card_data:L,computed_values:B.computed_values&&typeof B.computed_values=="object"?B.computed_values:{}};}let S={};for(let w of i){if(!w?.id)continue;let $=w.id;try{let B=q($),L=ie($);(L.length>0||B.processing)&&(S[$]={messages:L.map(K=>({role:String(K.role||"system"),text:String(K.text||""),files:Array.isArray(K.files)?K.files:[]})),receiving:!1,processing:!!B.processing});}catch{}}return {boardId:n,cardDefinitions:i,statusSnapshot:Te(),dataObjectsByToken:l,cardRuntimeById:b,cardChatsByCardId:S}}function v(i,d,l){let b=l?.syncBoard!==false,S=W(i);if(!S)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let w=re(i);if(!w)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let $=d(w)||w,B=S.cardStore.set({body:$});if(B.status!=="success")throw Object.assign(new Error(B.error||`Failed to persist card: ${i}`),{statusCode:500});if(b){let L=S.board.upsertCard({params:{cardId:i,restart:true}});if(L.status!=="success")throw Object.assign(new Error(L.error||`Failed to upsert card: ${i}`),{statusCode:500})}}function m(i,d){v(i,d,{syncBoard:true});}function A(i,d){v(i,d,{syncBoard:false});}function F(i,d){m(i,l=>{if(!d||typeof d!="object"||Object.keys(d).length===0)return l;function b(S,w,$){let B=String(w||"").split(".").filter(Boolean);if(!B.length)return;let L=S;for(let K=0;K<B.length-1;K++){let Y=B[K];(!L[Y]||typeof L[Y]!="object")&&(L[Y]={}),L=L[Y];}L[B[B.length-1]]=$;}if(d.fieldValues!==void 0&&d.fieldValues!==null){let S=null,w=l.view;if(w&&Array.isArray(w.elements)){for(let $ of w.elements)if($?.data&&$.data.writeTo){S=$.data.writeTo;break}}S?b(l,S,d.fieldValues):typeof d.fieldValues=="object"&&!Array.isArray(d.fieldValues)&&(l.card_data={...l.card_data||{},...d.fieldValues});}else {if(Array.isArray(d._stagedFiles)&&d._stagedFiles.length>0)return l;for(let[S,w]of Object.entries(d))S!=="_stagedFiles"&&(w!==null&&typeof w=="object"&&!Array.isArray(w)&&l[S]!==null&&typeof l[S]=="object"&&!Array.isArray(l[S])?l[S]={...l[S],...w}:l[S]=w);}return l});}function z(i){let d=String(i||"").match(/^(\d+)[-_]/);return d?parseInt(d[1],10):0}function Q(i){let d=String(i||"").trim();if(!d)return "upload.bin";let l=Math.max(d.lastIndexOf("/"),d.lastIndexOf("\\"));return (l>=0?d.slice(l+1):d)||"upload.bin"}function me(i){let d=P(i),l=E(i);l&&l.clear(d);}function ae(i,d){let l=P(i),b=E(i),S=b?b.nextSerial(l):1,w=String(d||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(S).padStart(3,"0")}_${w}.txt`}function le(i,d,l,b){let S=new Date().toISOString(),w=P(i),$=j(i),B=ae(i,d||"system"),L=`${w}/${B}`,K=[],Y=typeof l=="string"?l.trim():"";Y&&K.push(Y);let ce=Array.isArray(b)?b:[];if(ce.length){K.length&&K.push(""),K.push("files:");for(let H of ce){if(!H||typeof H!="object")continue;let ee=typeof H.name=="string"?H.name:"file",de=typeof H.stored_name=="string"?H.stored_name:"";K.push(de?`- ${ee} -> ${de}`:`- ${ee}`);}}$.chats&&$.chats.putText(L,`${K.join(`
2
2
  `)}
3
- `);let ke=z(B),V=E(i);return V&&V.appendIndexRecord(w,{serial:ke,role:u||"system",stored_name:B,path:`${i}/chats/${B}`,updated_at:S}),{at:S,role:u||"system",text:Y,files:ce,path:`${i}/chats/${B}`}}function ie(i){let u=P(i),l=E(i);return l?l.readRecords(u).map(b=>({...b,path:`${i}/chats/${b.stored_name}`})):[]}function be(i){let u=[];try{let l=re(i);if(!l)return u;let b=x().read(l.card_data&&typeof l.card_data=="object"?l.card_data:null);for(let S of b)u.push(S.stored_name);}catch{}return u}function Re(i,u,l,b){let S=P(i),w=j(i),$=Q(u),B=C(i),L=B?B.allocateStoredName(S,$,{seedNames:be(i),maxLen:bn}):`${String(Date.now())}-${$}`;return w.files&&w.files.putBytes(`${S}/${L}`,new Uint8Array(b),l||"application/octet-stream"),{name:$,stored_name:L,size:b.length,mime_type:l||"application/octet-stream",path:`${i}/files/${L}`,uploaded_at:new Date().toISOString()}}function ve(i,u,l){let b=W(i);if(!b)return;let S=b.board.getConfig({params:{key:"chat-handler"}});if(S.status!=="success")return;let w=S.data?.value;if(!w||typeof w!="object")return;let $=P(i),B=j(i),L=`${$}/.processing`;try{B.chats?.putText(L,"","text/plain; charset=utf-8");}catch{}let K={boardId:n,cardId:String(i),chatsKeyPrefix:u,chatProcessingMarkerKey:L,lastChatFile:l,...d,...c?{serverUrl:c}:{}};s.invoke(w,K).then(Y=>{if(Y.dispatched)o.info(`[chat-handler] invoked for card "${i}" (boardId: "${n}")`);else {try{B.chats?.remove(L);}catch{}o.warn(`[chat-handler] dispatch failed for card "${i}": ${Y.error||"unknown"}`);}},Y=>{try{B.chats?.remove(L);}catch{}o.warn(`[chat-handler] invoke failed for card "${i}": ${Y?.message||String(Y)}`);});}function we(i,u,l){let b=u==="chat-send"?A:m,S;b(i,w=>{let $=new Date().toISOString(),B=w.card_data&&typeof w.card_data=="object"?w.card_data:{};if(w.card_data=B,u==="chat-send"){let L=l&&typeof l.text=="string"?l.text.trim():"",K=[];if(Array.isArray(l?.files)){for(let Y of l.files)if(Y){if(typeof Y=="string"){K.push({name:Y});continue}if(typeof Y=="object"){let ce=Y;typeof ce.name=="string"&&K.push({name:ce.name,size:ce.size,mime_type:ce.mime_type,path:ce.path,uploaded_at:ce.uploaded_at,stored_name:ce.stored_name});}}}if(L||K.length>0){let Y=P(i),ke=le(i,"user",L,K).path,V=ke.includes("/")?ke.slice(ke.lastIndexOf("/")+1):ke;S={chatsKeyPrefix:`${Y}/chats`,lastChatFile:V};for(let H of K){if(!H||typeof H!="object")continue;let ee=typeof H.name=="string"?H.name:"file",ue=typeof H.stored_name=="string"?H.stored_name:null;ue&&le(i,"system",`File ${ee} uploaded as ${ue}.`,[]);}try{let H=ie(i),ee=q(i);X([{kind:"card_chats",cardId:i,messages:H.map(ue=>({role:String(ue.role||"system"),text:String(ue.text||""),files:Array.isArray(ue.files)?ue.files:[]})),receiving:!0,processing:!!ee.processing}]);}catch{}}return w}if(u==="file-upload"){let L=x().normalizeIncoming(l?.files,$);return L.length>0&&x().merge(B,L),w}if(u==="action"){let L=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!L)return w;B.lastAction={buttonId:L,at:$},B.lastActionText=`${L} @ ${$}`;}return w}),S&&ve(i,S.chatsKeyPrefix,S.lastChatFile);}function J(i,u,l){let b=JSON.stringify(l),S=typeof Buffer<"u"?Buffer.byteLength(b):new TextEncoder().encode(b).length;i.writeHead(u,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":S}),i.end(b);}async function xe(i){let u=[];for await(let b of i)u.push(b);let l=typeof Buffer<"u"?Buffer.concat(u).toString("utf-8").trim():new TextDecoder().decode(Ue(u)).trim();return l?JSON.parse(l):{}}async function He(i){let u=[];for await(let l of i)u.push(l);return typeof Buffer<"u"?Buffer.concat(u):Ue(u)}function Ue(i){let u=i.reduce((S,w)=>S+w.length,0),l=new Uint8Array(u),b=0;for(let S of i)l.set(S,b),b+=S.length;return l}let Ze=0;function Ve(i){let u=JSON.stringify(i);return Ze++,`id: ${Ze}
4
- data: ${u}
3
+ `);let ye=z(B),V=E(i);return V&&V.appendIndexRecord(w,{serial:ye,role:d||"system",stored_name:B,path:`${i}/chats/${B}`,updated_at:S}),{at:S,role:d||"system",text:Y,files:ce,path:`${i}/chats/${B}`}}function ie(i){let d=P(i),l=E(i);return l?l.readRecords(d).map(b=>({...b,path:`${i}/chats/${b.stored_name}`})):[]}function be(i){let d=[];try{let l=re(i);if(!l)return d;let b=x().read(l.card_data&&typeof l.card_data=="object"?l.card_data:null);for(let S of b)d.push(S.stored_name);}catch{}return d}function Re(i,d,l,b){let S=P(i),w=j(i),$=Q(d),B=C(i),L=B?B.allocateStoredName(S,$,{seedNames:be(i),maxLen:bn}):`${String(Date.now())}-${$}`;return w.files&&w.files.putBytes(`${S}/${L}`,new Uint8Array(b),l||"application/octet-stream"),{name:$,stored_name:L,size:b.length,mime_type:l||"application/octet-stream",path:`${i}/files/${L}`,uploaded_at:new Date().toISOString()}}function ve(i,d,l){let b=W(i);if(!b)return;let S=b.board.getConfig({params:{key:"chat-handler"}});if(S.status!=="success")return;let w=S.data?.value;if(!w||typeof w!="object")return;let $=P(i),B=j(i),L=`${$}/.processing`;try{B.chats?.putText(L,"","text/plain; charset=utf-8");}catch{}let K={boardId:n,cardId:String(i),chatsKeyPrefix:d,chatProcessingMarkerKey:L,lastChatFile:l,...u,...c?{serverUrl:c}:{}};s.invoke(w,K).then(Y=>{if(Y.dispatched)o.info(`[chat-handler] invoked for card "${i}" (boardId: "${n}")`);else {try{B.chats?.remove(L);}catch{}o.warn(`[chat-handler] dispatch failed for card "${i}": ${Y.error||"unknown"}`);}},Y=>{try{B.chats?.remove(L);}catch{}o.warn(`[chat-handler] invoke failed for card "${i}": ${Y?.message||String(Y)}`);});}function we(i,d,l){let b=d==="chat-send"?A:m,S;b(i,w=>{let $=new Date().toISOString(),B=w.card_data&&typeof w.card_data=="object"?w.card_data:{};if(w.card_data=B,d==="chat-send"){let L=l&&typeof l.text=="string"?l.text.trim():"",K=[];if(Array.isArray(l?.files)){for(let Y of l.files)if(Y){if(typeof Y=="string"){K.push({name:Y});continue}if(typeof Y=="object"){let ce=Y;typeof ce.name=="string"&&K.push({name:ce.name,size:ce.size,mime_type:ce.mime_type,path:ce.path,uploaded_at:ce.uploaded_at,stored_name:ce.stored_name});}}}if(L||K.length>0){let Y=P(i),ye=le(i,"user",L,K).path,V=ye.includes("/")?ye.slice(ye.lastIndexOf("/")+1):ye;S={chatsKeyPrefix:`${Y}/chats`,lastChatFile:V};for(let H of K){if(!H||typeof H!="object")continue;let ee=typeof H.name=="string"?H.name:"file",de=typeof H.stored_name=="string"?H.stored_name:null;de&&le(i,"system",`File ${ee} uploaded as ${de}.`,[]);}try{let H=ie(i),ee=q(i);X([{kind:"card_chats",cardId:i,messages:H.map(de=>({role:String(de.role||"system"),text:String(de.text||""),files:Array.isArray(de.files)?de.files:[]})),receiving:!0,processing:!!ee.processing}]);}catch{}}return w}if(d==="file-upload"){let L=x().normalizeIncoming(l?.files,$);return L.length>0&&x().merge(B,L),w}if(d==="action"){let L=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!L)return w;B.lastAction={buttonId:L,at:$},B.lastActionText=`${L} @ ${$}`;}return w}),S&&ve(i,S.chatsKeyPrefix,S.lastChatFile);}function J(i,d,l){let b=JSON.stringify(l),S=typeof Buffer<"u"?Buffer.byteLength(b):new TextEncoder().encode(b).length;i.writeHead(d,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":S}),i.end(b);}async function xe(i){let d=[];for await(let b of i)d.push(b);let l=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(Ue(d)).trim();return l?JSON.parse(l):{}}async function He(i){let d=[];for await(let l of i)d.push(l);return typeof Buffer<"u"?Buffer.concat(d):Ue(d)}function Ue(i){let d=i.reduce((S,w)=>S+w.length,0),l=new Uint8Array(d),b=0;for(let S of i)l.set(S,b),b+=S.length;return l}let Ze=0;function Ve(i){let d=JSON.stringify(i);return Ze++,`id: ${Ze}
4
+ data: ${d}
5
5
 
6
- `}function et(i,u){let l=k.get(i);if(!l)return;let b=Ve(u);try{l.res.write(b);}catch{k.delete(i);}}function tt(){let i=new Set;for(let u of k.values())for(let l of u.subscribedChatCardIds)i.add(l);return Array.from(i)}function Ie(i){let u=q(i);return `${u.count}:${u.latest_mtime_ms}:${u.processing?1:0}`}function Je(i,u=true){let l=ie(i),b=q(i);return {kind:"card_chats",cardId:i,messages:l.map(S=>({role:String(S.role||"system"),text:String(S.text||""),files:Array.isArray(S.files)?S.files:[]})),receiving:u,processing:!!b.processing}}function rt(i,u=true){let l={kind:"notification-batch",notifications:[Je(i,u)]};for(let[b,S]of k.entries())S.subscribedChatCardIds.has(i)&&et(b,l);}function _e(){tt().length>0||(R&&(clearInterval(R),R=null),y.clear());}function Oe(){R||(R=setInterval(()=>{let i=tt();if(i.length===0){_e();return}let u=new Set(i);for(let l of Array.from(y.keys()))u.has(l)||y.delete(l);for(let l of i){let b=Ie(l);y.get(l)!==b&&(y.set(l,b),rt(l,true));}},1e3));}function St(i,u){let l=k.get(i);return l?(l.subscribedChatCardIds.add(u),y.set(u,Ie(u)),Oe(),et(i,{kind:"notification-batch",notifications:[Je(u,true)]}),true):false}function N(i,u){let l=k.get(i);return l?(l.subscribedChatCardIds.delete(u),tt().includes(u)||y.delete(u),_e(),true):false}function D(i){if(!i||typeof i!="object")return false;let u=i.kind;return u==="card_chats"||u==="chat_messages"}function X(i){if(!i||i.length===0)return;let u=[],l=new Set;for(let b of i)D(b)&&typeof b.cardId=="string"?l.add(String(b.cardId)):u.push(b);if(u.length>0){let b={kind:"notification-batch",notifications:u};for(let S of k.keys())et(S,b);}for(let b of l)rt(b,true);}function Ae(i,u,l){let b=k.get(l),S=b?new Set(b.subscribedChatCardIds):new Set;if(b)try{b.res.end();}catch{}u.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),k.set(l,{res:u,subscribedChatCardIds:S});let w=G(),$=Ve(w);u.write($);let B=setInterval(()=>{try{u.write(`: keepalive
6
+ `}function et(i,d){let l=y.get(i);if(!l)return;let b=Ve(d);try{l.res.write(b);}catch{y.delete(i);}}function tt(){let i=new Set;for(let d of y.values())for(let l of d.subscribedChatCardIds)i.add(l);return Array.from(i)}function Ie(i){let d=q(i);return `${d.count}:${d.latest_mtime_ms}:${d.processing?1:0}`}function Je(i,d=true){let l=ie(i),b=q(i);return {kind:"card_chats",cardId:i,messages:l.map(S=>({role:String(S.role||"system"),text:String(S.text||""),files:Array.isArray(S.files)?S.files:[]})),receiving:d,processing:!!b.processing}}function rt(i,d=true){let l={kind:"notification-batch",notifications:[Je(i,d)]};for(let[b,S]of y.entries())S.subscribedChatCardIds.has(i)&&et(b,l);}function _e(){tt().length>0||(R&&(clearInterval(R),R=null),k.clear());}function Oe(){R||(R=setInterval(()=>{let i=tt();if(i.length===0){_e();return}let d=new Set(i);for(let l of Array.from(k.keys()))d.has(l)||k.delete(l);for(let l of i){let b=Ie(l);k.get(l)!==b&&(k.set(l,b),rt(l,true));}},1e3));}function St(i,d){let l=y.get(i);return l?(l.subscribedChatCardIds.add(d),k.set(d,Ie(d)),Oe(),et(i,{kind:"notification-batch",notifications:[Je(d,true)]}),true):false}function N(i,d){let l=y.get(i);return l?(l.subscribedChatCardIds.delete(d),tt().includes(d)||k.delete(d),_e(),true):false}function D(i){if(!i||typeof i!="object")return false;let d=i.kind;return d==="card_chats"||d==="chat_messages"}function X(i){if(!i||i.length===0)return;let d=[],l=new Set;for(let b of i)D(b)&&typeof b.cardId=="string"?l.add(String(b.cardId)):d.push(b);if(d.length>0){let b={kind:"notification-batch",notifications:d};for(let S of y.keys())et(S,b);}for(let b of l)rt(b,true);}function Ae(i,d,l){let b=y.get(l),S=b?new Set(b.subscribedChatCardIds):new Set;if(b)try{b.res.end();}catch{}d.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),y.set(l,{res:d,subscribedChatCardIds:S});let w=M(),$=Ve(w);d.write($);let B=setInterval(()=>{try{d.write(`: keepalive
7
7
 
8
- `);}catch{}},15e3);i.on("close",()=>{clearInterval(B),k.delete(l),_e(),u.end();});}async function he(i,u,l){let b=i.method||"GET",S=l,w=S.pathname;try{if(b==="GET"&&w===`${t}/init-board`)return await U(),J(u,200,G()),!0;if(b==="GET"&&w===`${t}/sse`){await U();let V=String(S.searchParams.get("clientId")||"").trim();if(!V)return J(u,400,{error:"clientId query param is required for SSE"}),!0;Ae(i,u,V);for(let H=0;H<g.length;H++)_(g[H]),O(g[H],H);return !0}if(b==="GET"&&w===`${t}/board-status`)return J(u,200,G()),!0;let $=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)$`));if(b==="GET"&&$){await M();let V=decodeURIComponent($[1]),H=re(V);return H?(J(u,200,H),!0):(J(u,404,{error:`card not found: ${V}`}),!0)}if(b==="PATCH"&&$){await M();let V=decodeURIComponent($[1]),H=await xe(i);return F(V,H),J(u,200,{ok:!0}),!0}let B=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/actions$`));if(b==="POST"&&B){await M();let V=decodeURIComponent(B[1]),H=await xe(i);return we(V,H?.actionType,H?.payload),J(u,200,{ok:!0}),!0}let L=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/chats$`));if(b==="GET"&&L){await M();let V=decodeURIComponent(L[1]);return J(u,200,{ok:!0,messages:ie(V)}),!0}let K=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(b==="POST"&&K){await M();let V=decodeURIComponent(K[1]),H=await xe(i),ee=typeof H?.clientId=="string"?H.clientId.trim():"";return ee?St(ee,V)?(J(u,200,{ok:!0,clientId:ee,cardId:V,subscribed:!0}),!0):(J(u,404,{error:`SSE client not connected: ${ee}`}),!0):(J(u,400,{error:"clientId is required"}),!0)}let Y=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(b==="POST"&&Y){await M();let V=decodeURIComponent(Y[1]),H=await xe(i),ee=typeof H?.clientId=="string"?H.clientId.trim():"";return ee?N(ee,V)?(J(u,200,{ok:!0,clientId:ee,cardId:V,subscribed:!1}),!0):(J(u,404,{error:`SSE client not connected: ${ee}`}),!0):(J(u,400,{error:"clientId is required"}),!0)}let ce=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/files$`));if(b==="POST"&&ce){await M();let V=decodeURIComponent(ce[1]),H=String(S.searchParams.get("inChat")||"").toLowerCase()==="true",ee=i.headers["x-file-name"],ue=String(i.headers["content-type"]||"application/octet-stream"),je=Array.isArray(ee)?ee[0]:ee,Fe=je?decodeURIComponent(String(je)):"upload.bin",nt=await He(i);if(!nt.length)return J(u,400,{error:"Empty upload body"}),!0;let pe=Re(V,Fe,ue,nt);return H&&(A(V,Ne=>{let Pe=new Date().toISOString(),st=Ne.card_data&&typeof Ne.card_data=="object"?Ne.card_data:{};Ne.card_data=st;let Ct=x().normalizeIncoming([{name:pe.name,stored_name:pe.stored_name,size:pe.size,mime_type:pe.mime_type,path:pe.path,uploaded_at:pe.uploaded_at||Pe}],Pe);return x().merge(st,Ct),Ne}),le(V,"system",`file uploaded: ${pe.name} as ${pe.stored_name}`,[])),J(u,200,{ok:!0,file:pe}),!0}let ke=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/files/(\\d+)$`));if(b==="GET"&&ke){let V=decodeURIComponent(ke[1]),H=parseInt(ke[2],10),ee=S.searchParams.get("sn"),ue=re(V);if(!ue)return J(u,404,{error:"Card not found"}),!0;let je=x().resolve(ue.card_data,H,ee);if(!je.ok&&je.reason==="stale_reference")return J(u,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!je.ok)return J(u,404,{error:"File not found"}),!0;let Fe=je.file,nt=P(V),pe=j(V),Ne=`${nt}/${Fe.stored_name}`,Pe=pe.files?pe.files.getBytes(Ne):null;if(!Pe)return J(u,404,{error:"File not found"}),!0;let st=Fe.name||Fe.stored_name,Ct=Fe.mime_type||"application/octet-stream";return u.writeHead(200,{"Content-Type":Ct,"Content-Disposition":`attachment; filename="${st}"`,"Content-Length":Pe.length}),u.end(Pe),!0}return !1}catch($){let B=$?.statusCode||500;return J(u,B,{error:String($?.message||$)}),true}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleRuntimeApi:he,buildPublishedRuntimePayload:G,clearChatRecords:me,reportSourceFetched(i,u){let l=g[0];return l?l.board.sourceDataFetched({params:{token:i,ref:u}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(i,u){let l=g[0];return l?l.board.sourceDataFetchFailure({params:{token:i,reason:u}}):{status:"fail",error:"no board context"}},get cardStore(){return g[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function $e(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ft(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(Ft).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Ft(t[n])}`).join(",")}}`}function yt(e,t){let r=t>>>0;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function Ir(e){let t=Ft(e),r=yt(t,2166136261),n=yt(t,3735928559),o=yt(t,19088743),s=yt(t,4277009102);return [r,n,o,s].map(a=>a.toString(16).padStart(8,"0")).join("")}function Pt(e){function t(s){return `${e}:blob:${s}`}let r=new TextEncoder;function n(s){if(typeof btoa=="function"){let a="";for(let c=0;c<s.length;c++)a+=String.fromCharCode(s[c]);return btoa(a)}return ""}function o(s){if(typeof atob=="function"){let a=atob(s),c=new Uint8Array(a.length);for(let d=0;d<a.length;d++)c[d]=a.charCodeAt(d);return c}return new Uint8Array}return {read(s){return globalThis.localStorage.getItem(t(s))},write(s,a){globalThis.localStorage.setItem(t(s),a);},exists(s){return globalThis.localStorage.getItem(t(s))!==null},remove(s){globalThis.localStorage.removeItem(t(s));},readBytes(s){let a=globalThis.localStorage.getItem(t(s));if(a===null)return null;try{let c=JSON.parse(a);if(c&&c.__kind==="bytes-b64"&&typeof c.data=="string")return o(c.data)}catch{}return r.encode(a)},writeBytes(s,a){let c=JSON.stringify({__kind:"bytes-b64",data:n(a)});globalThis.localStorage.setItem(t(s),c);},listKeys(s){let a=t(s??""),c=[];for(let d=0;d<globalThis.localStorage.length;d++){let k=globalThis.localStorage.key(d);k&&k.startsWith(a)&&c.push(k.slice(t("").length));}return c.sort()},stat(s){let a=globalThis.localStorage.getItem(t(s));if(a===null)return null;let c=r.encode(a).byteLength;try{let d=JSON.parse(a);d&&d.__kind==="bytes-b64"&&typeof d.data=="string"&&(c=o(d.data).byteLength);}catch{}return {key:s,size:c}}}}function Dt(e){function t(r){return `${e}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(t(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(t(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(t(r));},listKeys(r){let n=t(r??""),o=[];for(let s=0;s<globalThis.localStorage.length;s++){let a=globalThis.localStorage.key(s);a!==null&&a.startsWith(n)&&o.push(a.slice(t("").length));}return o}}}function Or(e){function t(){let n=globalThis.localStorage.getItem(e);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(e,JSON.stringify(n));}return {readAllEntries(){return t()},appendEntry(n){let o=t();o.push(n),r(o);},generateId(){return globalThis.crypto.randomUUID()}}}function Sn(){let e=false;return {tryAcquire(){return e?null:(e=true,()=>{e=false;})}}}var jr=new Map;function bt(e){let t=jr.get(e);if(!t){let r=new Set;t={publish(n){for(let o of r)o(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},jr.set(e,t);}return t}function Nr(){return {async subscribe(e,t){return e.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${e.kind}`),()=>{}):bt(e.value).subscribe(n=>{let o=n;if(o&&o.kind==="notification-batch"&&Array.isArray(o.notifications)){for(let s of o.notifications)t(s);return}t(n);})}}}function Br(e,t){let r=t?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:t.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:te({kind:"in-browser",value:e})},n=new Map,o=new Map,s=Sn();return {kvStorage:a=>Dt(`${e}:${a}`),blobStorage:a=>Pt(a?`${e}:${a}`:e),journalAdapter:()=>Or(`${e}:journal`),lock:s,selfRef:r,async dispatchExecution(a,c){if(a.howToRun==="http:post")try{let d=a.whatToRun,k=typeof d=="object"?d.value:Se(d).value,y=await fetch(k,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});return y.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${y.status}: ${y.statusText}`}}catch(d){return {dispatched:false,error:d instanceof Error?d.message:String(d)}}if(a.howToRun==="http:get")try{let d=a.whatToRun,k=typeof d=="object"?d.value:Se(d).value,y=new URLSearchParams(Object.entries(c).filter(([,g])=>g!=null).map(([g,h])=>[g,String(h)])),R=`${k}?${y.toString()}`,p=await fetch(R);return p.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${p.status}: ${p.statusText}`}}catch(d){return {dispatched:false,error:d instanceof Error?d.message:String(d)}}if(a.howToRun==="in-browser"){let d=a.whatToRun,k=typeof d=="object"?d.value:Se(d).value,y=n.get(k);return y?y(a,c):{dispatched:false,error:`No in-browser handler registered for: ${k}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${a.howToRun})`}},resolveBlob(a){if(a.kind==="in-memory"){let k=o.get(a.value);if(k==null)throw new Error(`resolveBlob: in-memory blob not found: ${te(a)}`);return k}let d=Pt(e).read(a.value);if(d===null)throw new Error(`resolveBlob: blob not found: ${te(a)}`);return d},hashFn:Ir,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:a=>Dt(Se(a).value),publishBoardChangeNotifications(a){if(!t?.notifyChannel||a.length===0)return;bt(t.notifyChannel).publish({kind:"notification-batch",notifications:a});},onWarn:t?.onWarn,registerHandler(a,c){n.set(a,c);},writeMemoryBlob(a,c){return o.set(a,c),te({kind:"in-memory",value:a})}}}function Lr(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function An(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function Ye(e,t){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!t)throw new Error("cardId is required");let n=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(x=>x.id===t);if(!n)throw new Error(`cardDefinitions has no entry with id ${t}`);let o=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},s=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},a=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},d=(Array.isArray(o.cards)?o.cards:[]).find(x=>x.name===t),k=structuredClone(n),y=An(t,s[t]),p={...k.card_data&&typeof k.card_data=="object"&&!Array.isArray(k.card_data)?k.card_data:{},...y.card_data||{},status:Lr(d?.status),lastRun:d?.runtime?.last_transition_at??null};d?.error?.message&&(p.error=d.error.message);let g=d?{task_status:d.status??null,card_status:Lr(d.status),runtime:structuredClone(d.runtime??{}),error:d.error?structuredClone(d.error):null,blocked_by:Array.isArray(d.blocked_by)?structuredClone(d.blocked_by):[],requires_missing:Array.isArray(d.requires_missing)?structuredClone(d.requires_missing):[]}:{task_status:null,card_status:p.status??"fresh",runtime:{last_transition_at:p.lastRun??null},error:p.error?{message:p.error}:null,blocked_by:[],requires_missing:[]},h=Array.isArray(k.requires)?k.requires:[],f={};for(let[x,P]of Object.entries(a))f[x]=structuredClone(P);for(let x of h)Object.prototype.hasOwnProperty.call(f,x)||(f[x]=null);let E=(e.cardChatsByCardId&&typeof e.cardChatsByCardId=="object"?e.cardChatsByCardId:{})[t],C=E?{messages:Array.isArray(E.messages)?E.messages:[],receiving:!!E.receiving,processing:!!E.processing}:null;return {id:t,card:k,card_data:p,requires:f,computed_values:y.computed_values,runtime_state:g,card_chats:C}}function Tn(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(r=>Ye(e,r.id))}function Rt(e){return JSON.parse(JSON.stringify(e))}function Me(e,t){if(e===t)return e;try{if(JSON.stringify(e)===JSON.stringify(t))return e}catch{}return t}function ge(e,t){if(e===t)return true;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}}function En(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function $r(e,t,r){let n=e,s=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(d=>d.id),a=t&&t.modelsById||{},c={};for(let d of s){let k=r(e,d),y=a[d];if(!y){c[d]=k;continue}let R=k.card_chats!=null?Me(y.card_chats,k.card_chats??null):y.card_chats??null,p={id:k.id,card:Me(y.card,k.card),card_data:Me(y.card_data,k.card_data),requires:Me(y.requires,k.requires),computed_values:Me(y.computed_values,k.computed_values),runtime_state:Me(y.runtime_state,k.runtime_state),card_chats:R};c[d]=p.card===y.card&&p.card_data===y.card_data&&p.requires===y.requires&&p.computed_values===y.computed_values&&p.runtime_state===y.runtime_state&&p.card_chats===y.card_chats?y:p;}return {payload:e,cardIds:s,modelsById:c}}function Fr(e,t,r,n){if(!e||!Array.isArray(t)||t.length===0)return e;let o=e.modelsById,s=e.cardIds,a=false,c=false,d={};for(let y of s){let R=o[y],p=R&&R.requires;if(p&&typeof p=="object")for(let g of Object.keys(p))(d[g]=d[g]||[]).push(y);}function k(){a||(o={...o},a=true);}for(let y of t)if(!(!y||!y.kind)){if(y.kind==="computed_values"){let R=y.cardId,p=o[R];if(!p)continue;let g=y.values||{};if(ge(p.computed_values,g))continue;k(),o[R]={...p,computed_values:g},c=true;}else if(y.kind==="data_object"){let R=y.key,p=y.payload,g=d[R]||[];for(let h of g){let f=o[h];if(!f)continue;let j=f.requires||{};ge(j[R],p)||(k(),o[h]={...f,requires:{...j,[R]:p}},c=true);}}else if(y.kind==="card_refreshed"){let R=y.cardId,p=null,g=o[R],h=y.card;if(g&&h&&typeof h=="object"&&!Array.isArray(h)){let f=h,j=f.card_data&&typeof f.card_data=="object"&&!Array.isArray(f.card_data)?f.card_data:g.card_data,E=f.requires&&typeof f.requires=="object"&&!Array.isArray(f.requires)?f.requires:g.requires,C=f.computed_values&&typeof f.computed_values=="object"&&!Array.isArray(f.computed_values)?f.computed_values:g.computed_values,x=f.runtime_state&&typeof f.runtime_state=="object"&&!Array.isArray(f.runtime_state)?f.runtime_state:g.runtime_state;p={...g,card:h,card_data:j,requires:E,computed_values:C,runtime_state:x};}if(!p)try{let f=n();f&&(p=r(f,R));}catch{}if(!p||g&&ge(g.card,p.card)&&ge(g.card_data,p.card_data)&&ge(g.requires,p.requires)&&ge(g.computed_values,p.computed_values)&&ge(g.runtime_state,p.runtime_state))continue;k(),o[R]=p,s.includes(R)||(s=[...s,R]),c=true;}else if(y.kind==="card_chats"){let R=y.cardId,p=o[R];if(!p)continue;let g=Array.isArray(y.messages)?y.messages:p.card_chats?.messages??[],h=typeof y.receiving=="boolean"?y.receiving:p.card_chats?.receiving??false,f=typeof y.processing=="boolean"?y.processing:p.card_chats?.processing??false,j={messages:g,receiving:h,processing:f};if(ge(p.card_chats,j))continue;k(),o[R]={...p,card_chats:j},c=true;}else if(y.kind==="chat_messages"){let R=y.cardId,p=o[R];if(!p)continue;let g=Array.isArray(y.messages)?y.messages:[],h=p.card_chats||{receiving:false,processing:false},f={messages:g,receiving:h.receiving,processing:!!h.processing};if(ge(p.card_chats,f))continue;k(),o[R]={...p,card_chats:f},c=true;}else if(y.kind==="status"){let R=y.status?.cards??[];for(let p of R){let g=p?.name;if(!g||!o[g])continue;let h=o[g],f=En(p.status),j={...h.card_data||{},status:f,lastRun:p.runtime?.last_transition_at??null,...p.error?.message?{error:p.error.message}:{}};p.error?.message||delete j.error;let E={task_status:p.status??null,card_status:f,runtime:p.runtime?Rt(p.runtime):{},error:p.error?Rt(p.error):null,blocked_by:Array.isArray(p.blocked_by)?Rt(p.blocked_by):[],requires_missing:Array.isArray(p.requires_missing)?Rt(p.requires_missing):[]};ge(h.card_data,j)&&ge(h.runtime_state,E)||(k(),o[g]={...h,card_data:j,runtime_state:E},c=true);}}}return c?{payload:e.payload,cardIds:s,modelsById:o}:e}function Lo(e,t){let r=t?.cards??[],n=t?.onWarn??(()=>{}),o=`${e}:notify`,s=Br(e,{callbackBaseUrl:t?.callbackBaseUrl,notifyChannel:o,onWarn:n}),a=Se(te({kind:"localstorage",value:e})),c=te({kind:"localstorage",value:`${e}:card-store`}),d=te({kind:"localstorage",value:`${e}:outputs`}),k=t?.taskExecutor??null,y=t?.chatHandler??null,R=te({kind:"in-browser",value:`${e}:task-executor`}),p=te({kind:"in-browser",value:`${e}:chat-handler`});k&&s.registerHandler(R,k),y&&s.registerHandler(p,y);let g={async invoke(T,I){return T.howToRun==="in-browser",s.dispatchExecution(T,I)}},h=t?.taskExecutorRef??(k?{meta:"task-executor",howToRun:"in-browser",whatToRun:R}:void 0),f=t?.chatHandlerRef??(y?{meta:"chat-handler",howToRun:"in-browser",whatToRun:p}:void 0),j=Nr(),E=Er({boardId:e,boards:[{label:e,boardAdapter:s,baseRef:a,cardStoreRef:c,outputsStoreRef:d,notifyRef:{kind:"in-memory-bus",value:o},taskExecutorRef:h,chatHandlerRef:f}],invocationAdapter:g,notificationTransport:j,logger:{info:(...T)=>console.log("[board]",...T),warn:(...T)=>{n(String(T[0])),console.warn("[board]",...T);},error:(...T)=>console.error("[board]",...T)}});r.length&&E.cardStore.set({body:r}),t?.onBoardChange&&bt(o).subscribe(I=>{let _=I;!_||_.kind!=="notification-batch"||!Array.isArray(_.notifications)||_.notifications.length===0||t.onBoardChange?.({notifications:_.notifications});});function C(T,I,_){let O=_?JSON.stringify(_):"",U=new TextEncoder().encode(O),M=false;return {method:T,url:I,headers:{"content-type":"application/json"},on(W,re){},[Symbol.asyncIterator](){let W={async next(){return M?{done:true,value:void 0}:(M=true,{done:false,value:U})},[Symbol.asyncIterator](){return W}};return W}}}function x(){let T=200,I=[];return {res:{writeHead(O){T=O;},write(O){return I.push(typeof O=="string"?O:new TextDecoder().decode(O)),true},end(O){O&&I.push(typeof O=="string"?O:new TextDecoder().decode(O));}},getResult:()=>{let O=I.join(""),U;try{U=JSON.parse(O);}catch{U=O;}return {status:T,body:U}}}}let P=E.apiBasePath;return {async bootstrap(){let T=C("GET",`${P}/bootstrap`),{res:I}=x();await E.handleRuntimeApi(T,I,new URL(`http://localhost${P}/bootstrap`));},getState(){return E.buildPublishedRuntimePayload()},async patchCard(T,I){let _=`${P}/cards/${encodeURIComponent(T)}`,O=C("PATCH",_,I),{res:U}=x();await E.handleRuntimeApi(O,U,new URL(`http://localhost${_}`));},async applyCardAction(T,I,_){let O=`${P}/cards/${encodeURIComponent(T)}/actions`,U=C("POST",O,{actionType:I,payload:_}),{res:M}=x();await E.handleRuntimeApi(U,M,new URL(`http://localhost${O}`));},readChatRecords(T){let I=`${P}/cards/${encodeURIComponent(T)}/chats`,_=C("GET",I),O=x();E.handleRuntimeApi(_,O.res,new URL(`http://localhost${I}`));let M=O.getResult().body;return Array.isArray(M?.messages)?M.messages:[]},clearChatRecords(T){E.clearChatRecords(T);},writeMemoryBlob(T,I){return s.writeMemoryBlob(T,I)},reportSourceFetched(T,I){E.reportSourceFetched(T,I);},reportSourceFetchFailure(T,I){E.reportSourceFetchFailure(T,I);},get runtime(){return E}}}function Po(e,t){return $r(e,t,Ye)}function Do(e,t,r){return Fr(e,t,Ye,r)}
8
+ `);}catch{}},15e3);i.on("close",()=>{clearInterval(B),y.delete(l),_e(),d.end();});}async function he(i,d,l){let b=i.method||"GET",S=l,w=S.pathname;try{if(b==="GET"&&w===`${t}/init-board`)return await U(),J(d,200,M()),!0;if(b==="GET"&&w===`${t}/sse`){await U();let V=String(S.searchParams.get("clientId")||"").trim();if(!V)return J(d,400,{error:"clientId query param is required for SSE"}),!0;Ae(i,d,V);for(let H=0;H<g.length;H++)_(g[H]),O(g[H],H);return !0}if(b==="GET"&&w===`${t}/board-status`)return J(d,200,M()),!0;let $=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)$`));if(b==="GET"&&$){await G();let V=decodeURIComponent($[1]),H=re(V);return H?(J(d,200,H),!0):(J(d,404,{error:`card not found: ${V}`}),!0)}if(b==="PATCH"&&$){await G();let V=decodeURIComponent($[1]),H=await xe(i);return F(V,H),J(d,200,{ok:!0}),!0}let B=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/actions$`));if(b==="POST"&&B){await G();let V=decodeURIComponent(B[1]),H=await xe(i);return we(V,H?.actionType,H?.payload),J(d,200,{ok:!0}),!0}let L=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/chats$`));if(b==="GET"&&L){await G();let V=decodeURIComponent(L[1]);return J(d,200,{ok:!0,messages:ie(V)}),!0}let K=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(b==="POST"&&K){await G();let V=decodeURIComponent(K[1]),H=await xe(i),ee=typeof H?.clientId=="string"?H.clientId.trim():"";return ee?St(ee,V)?(J(d,200,{ok:!0,clientId:ee,cardId:V,subscribed:!0}),!0):(J(d,404,{error:`SSE client not connected: ${ee}`}),!0):(J(d,400,{error:"clientId is required"}),!0)}let Y=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(b==="POST"&&Y){await G();let V=decodeURIComponent(Y[1]),H=await xe(i),ee=typeof H?.clientId=="string"?H.clientId.trim():"";return ee?N(ee,V)?(J(d,200,{ok:!0,clientId:ee,cardId:V,subscribed:!1}),!0):(J(d,404,{error:`SSE client not connected: ${ee}`}),!0):(J(d,400,{error:"clientId is required"}),!0)}let ce=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/files$`));if(b==="POST"&&ce){await G();let V=decodeURIComponent(ce[1]),H=String(S.searchParams.get("inChat")||"").toLowerCase()==="true",ee=i.headers["x-file-name"],de=String(i.headers["content-type"]||"application/octet-stream"),je=Array.isArray(ee)?ee[0]:ee,Fe=je?decodeURIComponent(String(je)):"upload.bin",nt=await He(i);if(!nt.length)return J(d,400,{error:"Empty upload body"}),!0;let pe=Re(V,Fe,de,nt);return H&&(A(V,Ne=>{let Pe=new Date().toISOString(),st=Ne.card_data&&typeof Ne.card_data=="object"?Ne.card_data:{};Ne.card_data=st;let Ct=x().normalizeIncoming([{name:pe.name,stored_name:pe.stored_name,size:pe.size,mime_type:pe.mime_type,path:pe.path,uploaded_at:pe.uploaded_at||Pe}],Pe);return x().merge(st,Ct),Ne}),le(V,"system",`file uploaded: ${pe.name} as ${pe.stored_name}`,[])),J(d,200,{ok:!0,file:pe}),!0}let ye=w.match(new RegExp(`^${$e(t)}/cards/([^/]+)/files/(\\d+)$`));if(b==="GET"&&ye){let V=decodeURIComponent(ye[1]),H=parseInt(ye[2],10),ee=S.searchParams.get("sn"),de=re(V);if(!de)return J(d,404,{error:"Card not found"}),!0;let je=x().resolve(de.card_data,H,ee);if(!je.ok&&je.reason==="stale_reference")return J(d,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!je.ok)return J(d,404,{error:"File not found"}),!0;let Fe=je.file,nt=P(V),pe=j(V),Ne=`${nt}/${Fe.stored_name}`,Pe=pe.files?pe.files.getBytes(Ne):null;if(!Pe)return J(d,404,{error:"File not found"}),!0;let st=Fe.name||Fe.stored_name,Ct=Fe.mime_type||"application/octet-stream";return d.writeHead(200,{"Content-Type":Ct,"Content-Disposition":`attachment; filename="${st}"`,"Content-Length":Pe.length}),d.end(Pe),!0}return !1}catch($){let B=$?.statusCode||500;return J(d,B,{error:String($?.message||$)}),true}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleRuntimeApi:he,buildPublishedRuntimePayload:M,clearChatRecords:me,reportSourceFetched(i,d){let l=g[0];return l?l.board.sourceDataFetched({params:{token:i,ref:d}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(i,d){let l=g[0];return l?l.board.sourceDataFetchFailure({params:{token:i,reason:d}}):{status:"fail",error:"no board context"}},get cardStore(){return g[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function $e(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ft(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(Ft).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Ft(t[n])}`).join(",")}}`}function kt(e,t){let r=t>>>0;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function Ir(e){let t=Ft(e),r=kt(t,2166136261),n=kt(t,3735928559),o=kt(t,19088743),s=kt(t,4277009102);return [r,n,o,s].map(a=>a.toString(16).padStart(8,"0")).join("")}function Pt(e){function t(s){return `${e}:blob:${s}`}let r=new TextEncoder;function n(s){if(typeof btoa=="function"){let a="";for(let c=0;c<s.length;c++)a+=String.fromCharCode(s[c]);return btoa(a)}return ""}function o(s){if(typeof atob=="function"){let a=atob(s),c=new Uint8Array(a.length);for(let u=0;u<a.length;u++)c[u]=a.charCodeAt(u);return c}return new Uint8Array}return {read(s){return globalThis.localStorage.getItem(t(s))},write(s,a){globalThis.localStorage.setItem(t(s),a);},exists(s){return globalThis.localStorage.getItem(t(s))!==null},remove(s){globalThis.localStorage.removeItem(t(s));},readBytes(s){let a=globalThis.localStorage.getItem(t(s));if(a===null)return null;try{let c=JSON.parse(a);if(c&&c.__kind==="bytes-b64"&&typeof c.data=="string")return o(c.data)}catch{}return r.encode(a)},writeBytes(s,a){let c=JSON.stringify({__kind:"bytes-b64",data:n(a)});globalThis.localStorage.setItem(t(s),c);},listKeys(s){let a=t(s??""),c=[];for(let u=0;u<globalThis.localStorage.length;u++){let y=globalThis.localStorage.key(u);y&&y.startsWith(a)&&c.push(y.slice(t("").length));}return c.sort()},stat(s){let a=globalThis.localStorage.getItem(t(s));if(a===null)return null;let c=r.encode(a).byteLength;try{let u=JSON.parse(a);u&&u.__kind==="bytes-b64"&&typeof u.data=="string"&&(c=o(u.data).byteLength);}catch{}return {key:s,size:c}}}}function Dt(e){function t(r){return `${e}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(t(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(t(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(t(r));},listKeys(r){let n=t(r??""),o=[];for(let s=0;s<globalThis.localStorage.length;s++){let a=globalThis.localStorage.key(s);a!==null&&a.startsWith(n)&&o.push(a.slice(t("").length));}return o}}}function Or(e){function t(){let n=globalThis.localStorage.getItem(e);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(e,JSON.stringify(n));}return {readAllEntries(){return t()},appendEntry(n){let o=t();o.push(n),r(o);},generateId(){return globalThis.crypto.randomUUID()}}}function Sn(){let e=false;return {tryAcquire(){return e?null:(e=true,()=>{e=false;})}}}var jr=new Map;function bt(e){let t=jr.get(e);if(!t){let r=new Set;t={publish(n){for(let o of r)o(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},jr.set(e,t);}return t}function Nr(){return {async subscribe(e,t){return e.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${e.kind}`),()=>{}):bt(e.value).subscribe(n=>{let o=n;if(o&&o.kind==="notification-batch"&&Array.isArray(o.notifications)){for(let s of o.notifications)t(s);return}t(n);})}}}function Br(e,t){let r=t?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:t.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:te({kind:"in-browser",value:e})},n=new Map,o=new Map,s=Sn();return {kvStorage:a=>Dt(`${e}:${a}`),blobStorage:a=>Pt(a?`${e}:${a}`:e),journalAdapter:()=>Or(`${e}:journal`),lock:s,selfRef:r,async dispatchExecution(a,c){if(a.howToRun==="http:post")try{let u=a.whatToRun,y=typeof u=="object"?u.value:Se(u).value,k=await fetch(y,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});return k.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${k.status}: ${k.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(a.howToRun==="http:get")try{let u=a.whatToRun,y=typeof u=="object"?u.value:Se(u).value,k=new URLSearchParams(Object.entries(c).filter(([,g])=>g!=null).map(([g,h])=>[g,String(h)])),R=`${y}?${k.toString()}`,p=await fetch(R);return p.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${p.status}: ${p.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(a.howToRun==="in-browser"){let u=a.whatToRun,y=typeof u=="object"?u.value:Se(u).value,k=n.get(y);return k?k(a,c):{dispatched:false,error:`No in-browser handler registered for: ${y}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${a.howToRun})`}},resolveBlob(a){if(a.kind==="in-memory"){let y=o.get(a.value);if(y==null)throw new Error(`resolveBlob: in-memory blob not found: ${te(a)}`);return y}let u=Pt(e).read(a.value);if(u===null)throw new Error(`resolveBlob: blob not found: ${te(a)}`);return u},hashFn:Ir,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:a=>Dt(Se(a).value),publishBoardChangeNotifications(a){if(!t?.notifyChannel||a.length===0)return;bt(t.notifyChannel).publish({kind:"notification-batch",notifications:a});},onWarn:t?.onWarn,registerHandler(a,c){n.set(a,c);},writeMemoryBlob(a,c){return o.set(a,c),te({kind:"in-memory",value:a})}}}function Lr(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function An(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function Ye(e,t){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!t)throw new Error("cardId is required");let n=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(x=>x.id===t);if(!n)throw new Error(`cardDefinitions has no entry with id ${t}`);let o=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},s=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},a=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},u=(Array.isArray(o.cards)?o.cards:[]).find(x=>x.name===t),y=structuredClone(n),k=An(t,s[t]),p={...y.card_data&&typeof y.card_data=="object"&&!Array.isArray(y.card_data)?y.card_data:{},...k.card_data||{},status:Lr(u?.status),lastRun:u?.runtime?.last_transition_at??null};u?.error?.message&&(p.error=u.error.message);let g=u?{task_status:u.status??null,card_status:Lr(u.status),runtime:structuredClone(u.runtime??{}),error:u.error?structuredClone(u.error):null,blocked_by:Array.isArray(u.blocked_by)?structuredClone(u.blocked_by):[],requires_missing:Array.isArray(u.requires_missing)?structuredClone(u.requires_missing):[]}:{task_status:null,card_status:p.status??"fresh",runtime:{last_transition_at:p.lastRun??null},error:p.error?{message:p.error}:null,blocked_by:[],requires_missing:[]},h=Array.isArray(y.requires)?y.requires:[],f={};for(let[x,P]of Object.entries(a))f[x]=structuredClone(P);for(let x of h)Object.prototype.hasOwnProperty.call(f,x)||(f[x]=null);let E=(e.cardChatsByCardId&&typeof e.cardChatsByCardId=="object"?e.cardChatsByCardId:{})[t],C=E?{messages:Array.isArray(E.messages)?E.messages:[],receiving:!!E.receiving,processing:!!E.processing}:null;return {id:t,card:y,card_data:p,requires:f,computed_values:k.computed_values,runtime_state:g,card_chats:C}}function Tn(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(r=>Ye(e,r.id))}function Rt(e){return JSON.parse(JSON.stringify(e))}function Ge(e,t){if(e===t)return e;try{if(JSON.stringify(e)===JSON.stringify(t))return e}catch{}return t}function ge(e,t){if(e===t)return true;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}}function En(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function $r(e,t,r){let n=e,s=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(u=>u.id),a=t&&t.modelsById||{},c={};for(let u of s){let y=r(e,u),k=a[u];if(!k){c[u]=y;continue}let R=y.card_chats!=null?Ge(k.card_chats,y.card_chats??null):k.card_chats??null,p={id:y.id,card:Ge(k.card,y.card),card_data:Ge(k.card_data,y.card_data),requires:Ge(k.requires,y.requires),computed_values:Ge(k.computed_values,y.computed_values),runtime_state:Ge(k.runtime_state,y.runtime_state),card_chats:R};c[u]=p.card===k.card&&p.card_data===k.card_data&&p.requires===k.requires&&p.computed_values===k.computed_values&&p.runtime_state===k.runtime_state&&p.card_chats===k.card_chats?k:p;}return {payload:e,cardIds:s,modelsById:c}}function Fr(e,t,r,n){if(!e||!Array.isArray(t)||t.length===0)return e;let o=e.modelsById,s=e.cardIds,a=false,c=false,u={};for(let k of s){let R=o[k],p=R&&R.requires;if(p&&typeof p=="object")for(let g of Object.keys(p))(u[g]=u[g]||[]).push(k);}function y(){a||(o={...o},a=true);}for(let k of t)if(!(!k||!k.kind)){if(k.kind==="computed_values"){let R=k.cardId,p=o[R];if(!p)continue;let g=k.values||{};if(ge(p.computed_values,g))continue;y(),o[R]={...p,computed_values:g},c=true;}else if(k.kind==="data_object"){let R=k.key,p=k.payload,g=u[R]||[];for(let h of g){let f=o[h];if(!f)continue;let j=f.requires||{};ge(j[R],p)||(y(),o[h]={...f,requires:{...j,[R]:p}},c=true);}}else if(k.kind==="card_refreshed"){let R=k.cardId,p=null,g=o[R],h=k.card;if(g&&h&&typeof h=="object"&&!Array.isArray(h)){let f=h,j=f.card_data&&typeof f.card_data=="object"&&!Array.isArray(f.card_data)?f.card_data:g.card_data,E=f.requires&&typeof f.requires=="object"&&!Array.isArray(f.requires)?f.requires:g.requires,C=f.computed_values&&typeof f.computed_values=="object"&&!Array.isArray(f.computed_values)?f.computed_values:g.computed_values,x=f.runtime_state&&typeof f.runtime_state=="object"&&!Array.isArray(f.runtime_state)?f.runtime_state:g.runtime_state;p={...g,card:h,card_data:j,requires:E,computed_values:C,runtime_state:x};}if(!p)try{let f=n();f&&(p=r(f,R));}catch{}if(!p||g&&ge(g.card,p.card)&&ge(g.card_data,p.card_data)&&ge(g.requires,p.requires)&&ge(g.computed_values,p.computed_values)&&ge(g.runtime_state,p.runtime_state))continue;y(),o[R]=p,s.includes(R)||(s=[...s,R]),c=true;}else if(k.kind==="card_chats"){let R=k.cardId,p=o[R];if(!p)continue;let g=Array.isArray(k.messages)?k.messages:p.card_chats?.messages??[],h=typeof k.receiving=="boolean"?k.receiving:p.card_chats?.receiving??false,f=typeof k.processing=="boolean"?k.processing:p.card_chats?.processing??false,j={messages:g,receiving:h,processing:f};if(ge(p.card_chats,j))continue;y(),o[R]={...p,card_chats:j},c=true;}else if(k.kind==="chat_messages"){let R=k.cardId,p=o[R];if(!p)continue;let g=Array.isArray(k.messages)?k.messages:[],h=p.card_chats||{receiving:false,processing:false},f={messages:g,receiving:h.receiving,processing:!!h.processing};if(ge(p.card_chats,f))continue;y(),o[R]={...p,card_chats:f},c=true;}else if(k.kind==="status"){let R=k.status?.cards??[];for(let p of R){let g=p?.name;if(!g||!o[g])continue;let h=o[g],f=En(p.status),j={...h.card_data||{},status:f,lastRun:p.runtime?.last_transition_at??null,...p.error?.message?{error:p.error.message}:{}};p.error?.message||delete j.error;let E={task_status:p.status??null,card_status:f,runtime:p.runtime?Rt(p.runtime):{},error:p.error?Rt(p.error):null,blocked_by:Array.isArray(p.blocked_by)?Rt(p.blocked_by):[],requires_missing:Array.isArray(p.requires_missing)?Rt(p.requires_missing):[]};ge(h.card_data,j)&&ge(h.runtime_state,E)||(y(),o[g]={...h,card_data:j,runtime_state:E},c=true);}}}return c?{payload:e.payload,cardIds:s,modelsById:o}:e}function Lo(e,t){let r=t?.cards??[],n=t?.onWarn??(()=>{}),o=`${e}:notify`,s=Br(e,{callbackBaseUrl:t?.callbackBaseUrl,notifyChannel:o,onWarn:n}),a=Se(te({kind:"localstorage",value:e})),c=te({kind:"localstorage",value:`${e}:card-store`}),u=te({kind:"localstorage",value:`${e}:outputs`}),y=t?.taskExecutor??null,k=t?.chatHandler??null,R=te({kind:"in-browser",value:`${e}:task-executor`}),p=te({kind:"in-browser",value:`${e}:chat-handler`});y&&s.registerHandler(R,y),k&&s.registerHandler(p,k);let g={async invoke(T,I){return T.howToRun==="in-browser",s.dispatchExecution(T,I)}},h=t?.taskExecutorRef??(y?{meta:"task-executor",howToRun:"in-browser",whatToRun:R}:void 0),f=t?.chatHandlerRef??(k?{meta:"chat-handler",howToRun:"in-browser",whatToRun:p}:void 0),j=Nr(),E=Er({boardId:e,boards:[{label:e,boardAdapter:s,baseRef:a,cardStoreRef:c,outputsStoreRef:u,notifyRef:{kind:"in-memory-bus",value:o},taskExecutorRef:h,chatHandlerRef:f}],invocationAdapter:g,notificationTransport:j,logger:{info:(...T)=>console.log("[board]",...T),warn:(...T)=>{n(String(T[0])),console.warn("[board]",...T);},error:(...T)=>console.error("[board]",...T)}});r.length&&E.cardStore.set({body:r}),t?.onBoardChange&&bt(o).subscribe(I=>{let _=I;!_||_.kind!=="notification-batch"||!Array.isArray(_.notifications)||_.notifications.length===0||t.onBoardChange?.({notifications:_.notifications});});function C(T,I,_){let O=_?JSON.stringify(_):"",U=new TextEncoder().encode(O),G=false;return {method:T,url:I,headers:{"content-type":"application/json"},on(W,re){},[Symbol.asyncIterator](){let W={async next(){return G?{done:true,value:void 0}:(G=true,{done:false,value:U})},[Symbol.asyncIterator](){return W}};return W}}}function x(){let T=200,I=[];return {res:{writeHead(O){T=O;},write(O){return I.push(typeof O=="string"?O:new TextDecoder().decode(O)),true},end(O){O&&I.push(typeof O=="string"?O:new TextDecoder().decode(O));}},getResult:()=>{let O=I.join(""),U;try{U=JSON.parse(O);}catch{U=O;}return {status:T,body:U}}}}let P=E.apiBasePath;return {async bootstrap(){let T=C("GET",`${P}/bootstrap`),{res:I}=x();await E.handleRuntimeApi(T,I,new URL(`http://localhost${P}/bootstrap`));},getState(){return E.buildPublishedRuntimePayload()},async patchCard(T,I){let _=`${P}/cards/${encodeURIComponent(T)}`,O=C("PATCH",_,I),{res:U}=x();await E.handleRuntimeApi(O,U,new URL(`http://localhost${_}`));},async applyCardAction(T,I,_){let O=`${P}/cards/${encodeURIComponent(T)}/actions`,U=C("POST",O,{actionType:I,payload:_}),{res:G}=x();await E.handleRuntimeApi(U,G,new URL(`http://localhost${O}`));},readChatRecords(T){let I=`${P}/cards/${encodeURIComponent(T)}/chats`,_=C("GET",I),O=x();E.handleRuntimeApi(_,O.res,new URL(`http://localhost${I}`));let G=O.getResult().body;return Array.isArray(G?.messages)?G.messages:[]},clearChatRecords(T){E.clearChatRecords(T);},writeMemoryBlob(T,I){return s.writeMemoryBlob(T,I)},reportSourceFetched(T,I){E.reportSourceFetched(T,I);},reportSourceFetchFailure(T,I){E.reportSourceFetchFailure(T,I);},get runtime(){return E}}}function Po(e,t){return $r(e,t,Ye)}function Do(e,t,r){return Fr(e,t,Ye,r)}
9
9
  exports.applyNotification=Do;exports.buildBoardState=Po;exports.create=Lo;exports.selectAllLiveCardModels=Tn;exports.selectLiveCardModel=Ye;return exports;})({});//# sourceMappingURL=board-livecards-localstorage.js.map
10
10
  //# sourceMappingURL=board-livecards-localstorage.js.map
@@ -19,8 +19,8 @@
19
19
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
20
20
  <script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
21
21
  <script src="https://cdn.jsdelivr.net/npm/leader-line/leader-line.min.js"></script>
22
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/live-cards.js"></script>
23
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/board-livecards-client.js"></script>
22
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.1/browser/live-cards.js"></script>
23
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.1/browser/board-livecards-client.js"></script>
24
24
  </head>
25
25
  <body class="bg-light">
26
26
  <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.1.0/browser/compute-jsonata.js"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.1/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.1.0/browser/live-cards.js"></script>
15
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/board-livecards-localstorage.js"></script>
14
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.1/browser/live-cards.js"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.1/browser/board-livecards-localstorage.js"></script>
16
16
  </head>
17
17
  <body class="bg-light">
18
18
  <div class="container-fluid py-3">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yaml-flow",
3
- "version": "8.1.0",
3
+ "version": "8.1.1",
4
4
  "description": "Unified workflow engine: step-machine (sequential) + event-graph (stateless DAG) with pluggable storage",
5
5
  "author": "",
6
6
  "license": "MIT",