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