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