yaml-flow 6.0.0 → 7.0.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/board-live-cards-cli.js +4 -4
- package/browser/asset-integrity.json +3 -3
- package/browser/board-livecards-client.js +2 -0
- package/browser/board-livecards-client.js.map +1 -0
- package/browser/board-livecards-localstorage.js +10 -0
- package/browser/board-livecards-localstorage.js.map +1 -0
- package/browser/board-livegraph-engine.js +2 -2
- package/browser/board-livegraph-engine.js.map +1 -1
- package/browser/card-compute.js +28 -28
- package/browser/compute-jsonata.js +5 -0
- package/browser/compute-jsonata.js.map +1 -0
- package/browser/live-cards.js +261 -150
- package/card-store.js +4 -4
- package/dist/{board-live-cards-public-CltXYgaY.d.cts → board-live-cards-public-CW5074xr.d.cts} +9 -5
- package/dist/{board-live-cards-public-f-E-FAyp.d.ts → board-live-cards-public-hnZo0mAf.d.ts} +9 -5
- package/dist/board-livegraph-runtime/index.cjs +2 -2
- package/dist/board-livegraph-runtime/index.cjs.map +1 -1
- package/dist/board-livegraph-runtime/index.d.cts +11 -9
- package/dist/board-livegraph-runtime/index.d.ts +11 -9
- package/dist/board-livegraph-runtime/index.js +2 -2
- package/dist/board-livegraph-runtime/index.js.map +1 -1
- package/dist/board-livegraph-runtime/jsonata-sync.cjs +37 -1
- package/dist/card-compute/index.cjs +4 -4
- package/dist/card-compute/index.cjs.map +1 -1
- package/dist/card-compute/index.d.cts +5 -1
- package/dist/card-compute/index.d.ts +5 -1
- package/dist/card-compute/index.js +4 -4
- package/dist/card-compute/index.js.map +1 -1
- package/dist/card-compute/jsonata-sync.cjs +37 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +2 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +1 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +27 -14
- package/dist/cli/browser-api/board-live-cards-browser-adapter.d.ts +27 -14
- package/dist/cli/browser-api/board-live-cards-browser-adapter.js +2 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +1 -1
- package/dist/cli/browser-api/card-store-browser-api.cjs +1 -1
- package/dist/cli/browser-api/card-store-browser-api.cjs.map +1 -1
- package/dist/cli/browser-api/card-store-browser-api.js +1 -1
- package/dist/cli/browser-api/card-store-browser-api.js.map +1 -1
- package/dist/cli/browser-api/jsonata-sync.cjs +37 -1
- package/dist/cli/node/artifacts-store-cli.cjs +8 -8
- package/dist/cli/node/artifacts-store-cli.cjs.map +1 -1
- package/dist/cli/node/artifacts-store-cli.js +8 -8
- package/dist/cli/node/artifacts-store-cli.js.map +1 -1
- package/dist/cli/node/board-live-cards-cli.cjs +7 -7
- package/dist/cli/node/board-live-cards-cli.cjs.map +1 -1
- package/dist/cli/node/board-live-cards-cli.js +7 -7
- package/dist/cli/node/board-live-cards-cli.js.map +1 -1
- package/dist/cli/node/card-store-cli.cjs +5 -5
- package/dist/cli/node/card-store-cli.cjs.map +1 -1
- package/dist/cli/node/card-store-cli.js +5 -5
- package/dist/cli/node/card-store-cli.js.map +1 -1
- package/dist/cli/node/execution-adapter.cjs +3 -0
- package/dist/cli/node/execution-adapter.cjs.map +1 -0
- package/dist/cli/node/execution-adapter.d.cts +174 -0
- package/dist/cli/node/execution-adapter.d.ts +174 -0
- package/dist/cli/node/execution-adapter.js +3 -0
- package/dist/cli/node/execution-adapter.js.map +1 -0
- package/dist/cli/node/fs-board-adapter.cjs +7 -7
- package/dist/cli/node/fs-board-adapter.cjs.map +1 -1
- package/dist/cli/node/fs-board-adapter.d.cts +2 -2
- package/dist/cli/node/fs-board-adapter.d.ts +2 -2
- package/dist/cli/node/fs-board-adapter.js +7 -7
- package/dist/cli/node/fs-board-adapter.js.map +1 -1
- package/dist/cli/node/jsonata-sync.cjs +37 -1
- package/dist/cli/node/source-cli-task-executor.cjs +4 -4
- package/dist/cli/node/source-cli-task-executor.cjs.map +1 -1
- package/dist/cli/node/source-cli-task-executor.js +4 -4
- package/dist/cli/node/source-cli-task-executor.js.map +1 -1
- package/dist/continuous-event-graph/index.cjs +2 -2
- package/dist/continuous-event-graph/index.cjs.map +1 -1
- package/dist/continuous-event-graph/index.js +2 -2
- package/dist/continuous-event-graph/index.js.map +1 -1
- package/dist/continuous-event-graph/jsonata-sync.cjs +37 -1
- package/dist/execution-refs.cjs +2 -1
- package/dist/execution-refs.cjs.map +1 -1
- package/dist/execution-refs.d.cts +49 -11
- package/dist/execution-refs.d.ts +49 -11
- package/dist/execution-refs.js +2 -1
- package/dist/execution-refs.js.map +1 -1
- package/dist/index.cjs +10 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/jsonata-sync.cjs +37 -1
- package/dist/server-runtime/index.cjs +9 -0
- package/dist/server-runtime/index.cjs.map +1 -0
- package/dist/server-runtime/index.d.cts +31 -0
- package/dist/server-runtime/index.d.ts +31 -0
- package/dist/server-runtime/index.js +9 -0
- package/dist/server-runtime/index.js.map +1 -0
- package/dist/server-runtime/jsonata-sync.cjs +7623 -0
- package/dist/step-machine-public/index.cjs +2 -0
- package/dist/step-machine-public/index.cjs.map +1 -0
- package/dist/step-machine-public/index.d.cts +159 -0
- package/dist/step-machine-public/index.d.ts +159 -0
- package/dist/step-machine-public/index.js +2 -0
- package/dist/step-machine-public/index.js.map +1 -0
- package/dist/step-machine-public/jsonata-sync.cjs +7623 -0
- package/dist/storage-refs.cjs +2 -2
- package/dist/storage-refs.cjs.map +1 -1
- package/dist/storage-refs.d.cts +7 -6
- package/dist/storage-refs.d.ts +7 -6
- package/dist/storage-refs.js +2 -2
- package/dist/storage-refs.js.map +1 -1
- package/dist/types-B1ZRa4aI.d.ts +147 -0
- package/dist/types-BxEFcVK9.d.cts +147 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-t4.js +9 -10
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +357 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-public.js +9 -10
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +300 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +617 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-sse-worker.js +48 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +11 -10
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +19 -4
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +4 -8
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +6 -10
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +8 -16
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +2 -6
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +4 -8
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +3 -7
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +4 -8
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +7 -16
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +2 -6
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +13 -3
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +2 -1
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +2 -1
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +2 -1
- package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +20 -24
- package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -3
- package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +8 -13
- package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +33 -9
- package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +3 -1
- package/examples/cli/step-machine-demo/step2-double-cli.js +6 -12
- package/examples/cli/step-machine-demo/two-step-math.flow.yaml +66 -4
- package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +13 -5
- package/examples/example-board/cards/_index.json +47 -0
- package/examples/example-board/cards/card-market-prices.json +33 -9
- package/examples/example-board/cards/card-my-identity.json +30 -6
- package/examples/example-board/cards/card-portfolio-action.json +24 -6
- package/examples/example-board/cards/card-portfolio-intelligence.json +97 -0
- package/examples/example-board/cards/card-portfolio-risks.json +24 -6
- package/examples/example-board/cards/card-portfolio-value.json +38 -10
- package/examples/example-board/cards/card-portfolio.json +57 -13
- package/examples/example-board/cards/card-rebalance-impact.json +22 -6
- package/examples/example-board/cards/card-rebalance-sim.json +66 -15
- package/examples/example-board/demo-server.js +360 -69
- package/examples/example-board/demo-shell-localstorage.html +774 -0
- package/examples/example-board/demo-shell-with-server.html +18 -36
- package/examples/example-board/demo-shell.html +5 -4
- package/examples/example-board/demo-task-executor.js +217 -265
- package/package.json +15 -13
- package/step-machine-cli.js +43 -310
- package/board-livecards-server-runtime.js +0 -1513
- package/browser/board-livecards-runtime-client.js +0 -263
- package/dist/pycli/quickjs-board-runtime.global.js +0 -9
- package/dist/pycli/quickjs-board-runtime.global.js.map +0 -1
- package/dist/pycli/quickjs-step-machine-runtime.global.js +0 -5
- package/dist/pycli/quickjs-step-machine-runtime.global.js.map +0 -1
- package/examples/cli/step-machine-demo/two-step-math-handlers.js +0 -32
- package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +0 -24
- package/examples/example-board/demo-shell-browser.html +0 -675
package/board-live-cards-cli.js
CHANGED
|
@@ -10,10 +10,7 @@ const distCli = path.join(__dirname, 'dist', 'cli', 'node', 'board-live-cards-cl
|
|
|
10
10
|
const srcCli = path.join(__dirname, 'src', 'cli', 'node', 'board-live-cards-cli.ts');
|
|
11
11
|
const tsxCli = path.join(__dirname, 'node_modules', 'tsx', 'dist', 'cli.mjs');
|
|
12
12
|
|
|
13
|
-
if (fs.existsSync(
|
|
14
|
-
const { cli } = await import(pathToFileUrl(distCli).href);
|
|
15
|
-
await cli(process.argv.slice(2));
|
|
16
|
-
} else if (fs.existsSync(srcCli)) {
|
|
13
|
+
if (fs.existsSync(srcCli)) {
|
|
17
14
|
const result = spawnSync(process.execPath, [tsxCli, srcCli, ...process.argv.slice(2)], {
|
|
18
15
|
stdio: 'inherit',
|
|
19
16
|
shell: false,
|
|
@@ -26,6 +23,9 @@ if (fs.existsSync(distCli)) {
|
|
|
26
23
|
}
|
|
27
24
|
|
|
28
25
|
process.exit(result.status ?? 0);
|
|
26
|
+
} else if (fs.existsSync(distCli)) {
|
|
27
|
+
const { cli } = await import(pathToFileUrl(distCli).href);
|
|
28
|
+
await cli(process.argv.slice(2));
|
|
29
29
|
} else {
|
|
30
30
|
console.error('[board-live-cards-cli] Could not find dist or src CLI entrypoint.');
|
|
31
31
|
process.exit(1);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-05-
|
|
2
|
+
"generatedAt": "2026-05-10T15:19:54.429Z",
|
|
3
3
|
"algorithm": "sha256",
|
|
4
4
|
"files": {
|
|
5
5
|
"browser/board-livegraph-engine.js": {
|
|
6
|
-
"sha256": "sha256-
|
|
7
|
-
"bytes":
|
|
6
|
+
"sha256": "sha256-aogh+wM1FJXP9sBA7fhjEpjoxMtx2EQXhRvwNGAzWX8=",
|
|
7
|
+
"bytes": 31107
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var BoardLiveCardsClient=(function(exports){'use strict';function X(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function he(e,n){let o=n&&typeof n=="object"&&!Array.isArray(n)?n:{};return {schema_version:o.schema_version||"v1",card_id:typeof o.card_id=="string"?o.card_id:e,card_data:o.card_data&&typeof o.card_data=="object"&&!Array.isArray(o.card_data)?structuredClone(o.card_data):{},computed_values:o.computed_values&&typeof o.computed_values=="object"&&!Array.isArray(o.computed_values)?structuredClone(o.computed_values):{}}}function L(e,n){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!n)throw new Error("cardId is required");let g=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(k=>k.id===n);if(!g)throw new Error(`cardDefinitions has no entry with id ${n}`);let m=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},l=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},c=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},s=(Array.isArray(m.cards)?m.cards:[]).find(k=>k.name===n),d=structuredClone(g),r=he(n,l[n]),t={...d.card_data&&typeof d.card_data=="object"&&!Array.isArray(d.card_data)?d.card_data:{},...r.card_data||{},status:X(s?.status),lastRun:s?.runtime?.last_transition_at??null};s?.error?.message&&(t.error=s.error.message);let i=s?{task_status:s.status??null,card_status:X(s.status),runtime:structuredClone(s.runtime??{}),error:s.error?structuredClone(s.error):null,blocked_by:Array.isArray(s.blocked_by)?structuredClone(s.blocked_by):[],requires_missing:Array.isArray(s.requires_missing)?structuredClone(s.requires_missing):[]}:{task_status:null,card_status:t.status??"fresh",runtime:{last_transition_at:t.lastRun??null},error:t.error?{message:t.error}:null,blocked_by:[],requires_missing:[]},y=Array.isArray(d.requires)?d.requires:[],S={};for(let[k,G]of Object.entries(c))S[k]=structuredClone(G);for(let k of y)Object.prototype.hasOwnProperty.call(S,k)||(S[k]=null);return {id:n,card:d,card_data:t,requires:S,computed_values:r.computed_values,runtime_state:i}}function U(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(o=>L(e,o.id))}function H(e){return JSON.parse(JSON.stringify(e))}function j(e,n){if(e===n)return e;try{if(JSON.stringify(e)===JSON.stringify(n))return e}catch{}return n}function _(e,n){if(e===n)return true;try{return JSON.stringify(e)===JSON.stringify(n)}catch{return false}}function ve(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function J(e,n,o){let g=e,l=(g&&Array.isArray(g.cardDefinitions)?g.cardDefinitions:[]).map(s=>s.id),c=n&&n.modelsById||{},h={};for(let s of l){let d=o(e,s),r=c[s];if(!r){h[s]=d;continue}let a={id:d.id,card:j(r.card,d.card),card_data:j(r.card_data,d.card_data),requires:j(r.requires,d.requires),computed_values:j(r.computed_values,d.computed_values),runtime_state:j(r.runtime_state,d.runtime_state)};h[s]=a.card===r.card&&a.card_data===r.card_data&&a.requires===r.requires&&a.computed_values===r.computed_values&&a.runtime_state===r.runtime_state?r:a;}return {payload:e,cardIds:l,modelsById:h}}function Y(e,n,o,g){if(!e||!Array.isArray(n)||n.length===0)return e;let m=e.modelsById,l=e.cardIds,c=false,h=false,s={};for(let r of l){let a=m[r],t=a&&a.requires;if(t&&typeof t=="object")for(let i of Object.keys(t))(s[i]=s[i]||[]).push(r);}function d(){c||(m={...m},c=true);}for(let r of n)if(!(!r||!r.kind)){if(r.kind==="computed_values"){let a=r.cardId,t=m[a];if(!t)continue;let i=r.values||{};if(_(t.computed_values,i))continue;d(),m[a]={...t,computed_values:i},h=true;}else if(r.kind==="data_object"){let a=r.key,t=r.payload,i=s[a]||[];for(let y of i){let S=m[y];if(!S)continue;let k=S.requires||{};_(k[a],t)||(d(),m[y]={...S,requires:{...k,[a]:t}},h=true);}}else if(r.kind==="card_refreshed"){let a=r.cardId,t=null;try{let y=g();y&&(t=o(y,a));}catch{}if(!t)continue;let i=m[a];if(i&&_(i.card,t.card)&&_(i.card_data,t.card_data)&&_(i.requires,t.requires)&&_(i.computed_values,t.computed_values)&&_(i.runtime_state,t.runtime_state))continue;d(),m[a]=t,l.includes(a)||(l=[...l,a]),h=true;}else if(r.kind==="status"){let a=r.status?.cards??[];for(let t of a){let i=t?.name;if(!i||!m[i])continue;let y=m[i],S=ve(t.status),k={...y.card_data||{},status:S,lastRun:t.runtime?.last_transition_at??null,...t.error?.message?{error:t.error.message}:{}};t.error?.message||delete k.error;let G={task_status:t.status??null,card_status:S,runtime:t.runtime?H(t.runtime):{},error:t.error?H(t.error):null,blocked_by:Array.isArray(t.blocked_by)?H(t.blocked_by):[],requires_missing:Array.isArray(t.requires_missing)?H(t.requires_missing):[]};_(y.card_data,k)&&_(y.runtime_state,G)||(d(),m[i]={...y,card_data:k,runtime_state:G},h=true);}}}return h?{payload:e.payload,cardIds:l,modelsById:m}:e}function un(e){let o=`/api/boards/${encodeURIComponent(e||"default")}`;return {initBoard:`${o}/init-board`,stream:`${o}/sse`,patchCard:g=>`${o}/cards/${encodeURIComponent(g)}`,cardAction:g=>`${o}/cards/${encodeURIComponent(g)}/actions`,cardFile:g=>`${o}/cards/${encodeURIComponent(g)}/files`,cardChats:g=>`${o}/cards/${encodeURIComponent(g)}/chats`}}function ln(e){if(!e||typeof e!="object")throw new Error("options are required");let{fetchServer:n,boardPaths:o,getServerOrigin:g}=e;if(typeof n!="function")throw new Error("options.fetchServer is required");if(typeof o!="function")throw new Error("options.boardPaths is required");if(typeof g!="function")throw new Error("options.getServerOrigin is required");let m=e.canvas&&typeof e.canvas=="object"?e.canvas:{height:"72vh",overflow:"auto"},l={current:null},c=null,h=null,s=String(e.initialMode||"board");function d(){return l.current?l.current.payload:null}async function r(p,b,w,x){if(!w)return null;let T=x?.inChat===true,C=typeof w.name=="string"?w.name:"upload.bin",N=w.type||"application/octet-stream",E=o(p),A=T?`${E.cardFile(b)}?inChat=true`:E.cardFile(b),O=await n(A,{method:"POST",headers:{"content-type":N,"x-file-name":encodeURIComponent(C)},body:w});if(!O.ok){let q=await O.text();throw new Error(`Upload failed (${O.status}): ${q||"unknown error"}`)}return (await O.json())?.file??null}async function a(p,b,w,x){if(w!=="chat-send"&&w!=="file-upload")return x||{};let T={...x||{}},C=Array.isArray(T.files)?T.files:[];if(!C.length)return T.files=[],T;let N=[];for(let E of C){let A=await r(p,b,E,{inChat:w==="chat-send"});A&&N.push(A);}return T.files=w==="chat-send"?[]:N,T}async function t(p){let b=String(p?.boardId||"default"),w=typeof p?.taskExecutorPath=="string"?p.taskExecutorPath.trim():"",x=String(p?.mode||s||"board"),T=p?.rootElement;if(!T)throw new Error("bootstrapBoard requires params.rootElement");let C=o(b),N=w?`${C.initBoard}?taskExecutorPath=${encodeURIComponent(w)}`:C.initBoard,E=await n(N);if(!E.ok)throw new Error(`Server init-board failed (${E.status}).`);let A=g();if(!A)throw new Error("Server origin not resolved before SSE start");let O=await new Promise((u,f)=>{let R=new EventSource(`${A}${C.stream}`);h=R;let v=false,I=setTimeout(()=>{v||f(new Error("SSE initial payload timeout (15s)"));},15e3);R.onmessage=z=>{try{let B=JSON.parse(z.data||"{}");!v&&(B?.cardDefinitions||U(B))&&(v=!0,clearTimeout(I),u(B));}catch{}},R.onerror=()=>{v||(clearTimeout(I),f(new Error("SSE connection failed during bootstrap")));};});if(!U(O))throw new Error("SSE payload missing published runtime artifacts");l.current=J(O,null,L);let D=globalThis.LiveCard;if(!D)throw new Error("LiveCard global not loaded \u2014 include live-cards.js before this script");let q=D.init({resolve:u=>l.current?.modelsById[u],chartLib:globalThis.Chart??null,markdown:globalThis.marked?u=>globalThis.marked.parse(u):null,sanitize:globalThis.DOMPurify?u=>globalThis.DOMPurify.sanitize(u):null,onPatchState:async(u,f)=>{await n(C.patchCard(u),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(f||{})});},onRefresh:async u=>{await n(C.patchCard(u),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({})});},onAction:async(u,f,R)=>{let v=await a(b,u,f,R);await n(C.cardAction(u),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actionType:f,payload:v||{}})});},getChatMessages:async u=>{let f=await n(C.cardChats(u));return f.ok?((await f.json())?.messages??[]).map(v=>({role:typeof v?.role=="string"?v.role:"system",text:typeof v?.text=="string"?v.text:"",files:[]})):[]}});return T.innerHTML="",c=D.Board(q,T,{initialState:l.current,getNodeIds:u=>u.cardIds,selectNode:(u,f)=>u.modelsById[f],mode:x,canvas:m}),s=x,h.onmessage=u=>{try{let f=JSON.parse(u.data||"{}");if(f?.kind==="notification-batch"&&Array.isArray(f.notifications))c&&c.setState(v=>{let I=Y(v,f.notifications,L,d);return l.current=I,I});else if(f?.cardDefinitions){let v=J(f,l.current,L);l.current=v,c&&c.setState(()=>v);}let R=c&&c.engine;R&&typeof R.onServerSseEvent=="function"?R.onServerSseEvent():R&&typeof R.refreshOpenChatModal=="function"&&R.refreshOpenChatModal();}catch(f){console.warn("Bad SSE payload",f);}},c}function i(){h&&(h.close(),h=null),c=null,l.current=null;}function y(p){s=String(p||"board");let b=c&&c.core;b&&typeof b.setMode=="function"&&b.setMode(s);}function S(){if(!c)return;s="canvas";let p=c.core;p&&typeof p.setMode=="function"&&p.setMode("canvas"),p&&typeof p.autoLayout=="function"&&p.autoLayout();}function k(p){let b=c&&c.core;b&&typeof b.setDevMode=="function"&&b.setDevMode(!!p);}function G(){return s}return {bootstrapBoard:t,dispose:i,setMode:y,autoLayout:S,setDevMode:k,getCurrentMode:G}}exports.applyNotification=Y;exports.buildBoardState=J;exports.createBoardRuntimeClient=ln;exports.defaultBoardPaths=un;exports.selectAllLiveCardModels=U;exports.selectLiveCardModel=L;return exports;})({});//# sourceMappingURL=board-livecards-client.js.map
|
|
2
|
+
//# sourceMappingURL=board-livecards-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/board-livegraph-runtime/index.ts","../src/cli/common/board-state-reducer.ts","../src/board-livecards-client/index.ts"],"names":["taskStatusToCardStatus","taskStatus","normalizeCardRuntimeArtifact","cardId","artifact","safe","selectLiveCardModel","payload","cardDefinition","c","statusSnapshot","cardRuntimeById","dataObjectsByToken","statusCard","card","runtimeArtifact","card_data","runtime_state","requiresTokens","requires","token","value","selectAllLiveCardModels","clone","x","stableEq","prev","next","deepEqJson","a","b","buildBoardState","prevState","p","cardIds","prevModels","modelsById","id","fresh","stab","applyNotification","notifications","getFullPayload","cloned","changed","consumersByToken","cid","m","reqs","t","ensureClone","note","nextValues","key","notePayload","consumers","prevC","prevReqs","fp","existing","statusCards","sid","prevS","nextCardStatus","nextCardData","nextRuntimeState","defaultBoardPaths","boardId","base","createBoardRuntimeClient","options","fetchServer","boardPaths","getServerOrigin","canvas","stateRef","board","sse","currentMode","uploadCardFile","file","opts","inChat","fileName","contentType","paths","uploadPath","upload","errText","uploadActionFiles","actionType","nextPayload","rawFiles","uploaded","fileMeta","bootstrapBoard","params","taskExecutorPath","mode","rootEl","initBoardPath","initBoardRes","origin","initialPayload","resolve","reject","sseConn","gotInitialPayload","timeout","evt","update","LiveCard","engine","text","html","patch","actionPayload","uploadedPayload","res","s","eng","err","dispose","setMode","core","autoLayout","setDevMode","enabled","getCurrentMode"],"mappings":"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","file":"board-livecards-client.js","sourcesContent":["import type { GraphConfig, GraphEvent, TaskConfig } from '../event-graph/types.js';\nimport { CardCompute } from '../card-compute/index.js';\nimport type { ComputeNode } from '../card-compute/index.js';\nimport {\n createReactiveGraph,\n type ReactiveGraph,\n type ReactiveGraphOptions,\n type TaskHandlerFn,\n type TaskHandlerInput,\n type TaskHandlerReturn,\n type LiveGraph,\n schedule,\n} from '../continuous-event-graph/index.js';\nimport type { LiveCard, LiveBoard } from '../continuous-event-graph/live-cards-bridge.js';\n\nexport interface BrowserSourceAdapterContext {\n card: LiveCard;\n input: TaskHandlerInput;\n}\n\nexport type BrowserSourceAdapter =\n (ctx: BrowserSourceAdapterContext) => Promise<Record<string, unknown>> | Record<string, unknown>;\n\nexport interface BoardTaskExecutorContext {\n card: LiveCard;\n input: TaskHandlerInput;\n}\n\n/**\n * Opaque task executor hook.\n * Runtime does not interpret source descriptors — executor owns that contract.\n * For source cards, return a map keyed by source.bindTo.\n */\nexport type BoardTaskExecutor =\n (ctx: BoardTaskExecutorContext) => Promise<Record<string, unknown> | undefined> | Record<string, unknown> | undefined;\n\nexport interface BoardLiveGraphRuntimeOptions {\n /** Preferred opaque source/task executor. */\n taskExecutor?: BoardTaskExecutor;\n /** Per-card source adapters keyed by card ID. */\n sourceAdapters?: Record<string, BrowserSourceAdapter>;\n /** Default source adapter applied when no per-card adapter matches. */\n defaultSourceAdapter?: BrowserSourceAdapter;\n reactiveOptions?: Partial<Omit<ReactiveGraphOptions, 'handlers'>>;\n graphSettings?: Partial<GraphConfig['settings']>;\n executionId?: string;\n}\n\nexport interface LiveCardRuntimeModel {\n id: string;\n card: LiveCard;\n card_data: Record<string, unknown>;\n requires: Record<string, unknown>;\n computed_values: Record<string, unknown>;\n runtime_state: Record<string, unknown>;\n}\n\nexport interface BoardRuntimeView {\n id?: string;\n title?: string;\n mode?: 'board' | 'canvas';\n positions?: Record<string, { x?: number; y?: number; w?: number; h?: number }>;\n settings?: Partial<GraphConfig['settings']>;\n nodes: LiveCardRuntimeModel[];\n}\n\nexport interface BoardLiveGraphRuntimeUpdate {\n events: GraphEvent[];\n graph: LiveGraph;\n nodes: LiveCardRuntimeModel[];\n}\n\nexport interface BoardLiveGraphRuntime {\n getGraph(): ReactiveGraph;\n getState(): LiveGraph;\n getNodes(): LiveCardRuntimeModel[];\n getBoard(): BoardRuntimeView;\n getSchedule(): ReturnType<typeof schedule>;\n subscribe(listener: (update: BoardLiveGraphRuntimeUpdate) => void): () => void;\n addCard(card: LiveCard): void;\n upsertCard(card: LiveCard): void;\n removeCard(cardId: string): void;\n patchCardState(cardId: string, patch: Record<string, unknown>): void;\n retrigger(cardId: string): void;\n retriggerAll(): void;\n push(event: GraphEvent): void;\n pushAll(events: GraphEvent[]): void;\n dispose(): void;\n}\n\nfunction deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction toTaskConfig(card: LiveCard): TaskConfig {\n const provides = (card.provides && card.provides.length > 0)\n ? card.provides.map(p => p.bindTo)\n : [card.id];\n\n return {\n requires: card.requires && card.requires.length > 0 ? [...card.requires] : undefined,\n provides,\n taskHandlers: [card.id],\n description: card.meta?.title ?? card.id,\n };\n}\n\nfunction buildTokenProviders(cards: Map<string, LiveCard>): Map<string, string> {\n const tokenToCardId = new Map<string, string>();\n for (const [cardId, card] of cards.entries()) {\n const bindings = card.provides && card.provides.length > 0\n ? card.provides\n : [{ bindTo: cardId, ref: 'card_data' }];\n for (const binding of bindings) tokenToCardId.set(binding.bindTo, cardId);\n }\n return tokenToCardId;\n}\n\nfunction validateRequires(cards: Map<string, LiveCard>, changedCardId: string): void {\n const tokenProviders = buildTokenProviders(cards);\n const card = cards.get(changedCardId);\n if (!card) return;\n\n for (const req of card.requires ?? []) {\n if (!tokenProviders.has(req)) {\n throw new Error(`Card \"${changedCardId}\" requires token \"${req}\" but no card provides it`);\n }\n }\n}\n\n/**\n * LocalStorageService — browser-side persistence layer for card artifacts\n * Mirrors CLI's file-based persistence (cards, computed artifacts, status)\n * \n * Keys:\n * - 'yf:cards:<id>' → card definitions (mirrors tmp/cards/<id>.json)\n * - 'yf:runtime-out:cards:<id>' → computed artifacts (mirrors runtime-out/cards/<id>.computed.json)\n * - 'yf:runtime-out:status' → board status snapshot (mirrors runtime-out/board-livegraph-status.json)\n */\nexport const LocalStorageService = {\n // Keys\n CARD_PREFIX: 'yf:cards:',\n RUNTIME_OUT_PREFIX: 'yf:runtime-out:cards:',\n STATUS_KEY: 'yf:runtime-out:status',\n\n // Read/write cards (mirrors tmp/cards/<id>.json)\n writeCard(cardId: string, cardObject: Record<string, unknown>): void {\n try {\n localStorage.setItem(this.CARD_PREFIX + cardId, JSON.stringify(cardObject));\n } catch (e) {\n console.warn(`Failed to write card ${cardId} to localStorage:`, e);\n }\n },\n readCard(cardId: string): Record<string, unknown> | null {\n try {\n const raw = localStorage.getItem(this.CARD_PREFIX + cardId);\n return raw ? JSON.parse(raw) : null;\n } catch (e) {\n console.warn(`Failed to read card ${cardId} from localStorage:`, e);\n return null;\n }\n },\n readAllCards(cardIds: string[]): Record<string, Record<string, unknown>> {\n const result: Record<string, Record<string, unknown>> = {};\n for (const id of cardIds) {\n const card = this.readCard(id);\n if (card) result[id] = card;\n }\n return result;\n },\n\n // Read/write computed artifacts (mirrors runtime-out/cards/<id>.computed.json)\n writeComputedArtifact(artifact: Record<string, unknown>): void {\n if (!artifact || !artifact.card_id) return;\n try {\n localStorage.setItem(\n this.RUNTIME_OUT_PREFIX + String(artifact.card_id),\n JSON.stringify(artifact)\n );\n } catch (e) {\n console.warn(`Failed to write computed artifact ${artifact.card_id}:`, e);\n }\n },\n readComputedArtifact(cardId: string): Record<string, unknown> | null {\n try {\n const raw = localStorage.getItem(this.RUNTIME_OUT_PREFIX + cardId);\n return raw ? JSON.parse(raw) : null;\n } catch (e) {\n console.warn(`Failed to read computed artifact ${cardId}:`, e);\n return null;\n }\n },\n readAllComputedArtifacts(cardIds: string[]): Record<string, Record<string, unknown>> {\n const result: Record<string, Record<string, unknown>> = {};\n for (const id of cardIds) {\n const artifact = this.readComputedArtifact(id);\n if (artifact) result[id] = artifact;\n }\n return result;\n },\n\n // Read/write board status snapshot (mirrors runtime-out/board-livegraph-status.json)\n writeStatusSnapshot(snapshot: Record<string, unknown>): void {\n try {\n localStorage.setItem(this.STATUS_KEY, JSON.stringify(snapshot));\n } catch (e) {\n console.warn('Failed to write status snapshot to localStorage:', e);\n }\n },\n readStatusSnapshot(): Record<string, unknown> | null {\n try {\n const raw = localStorage.getItem(this.STATUS_KEY);\n return raw ? JSON.parse(raw) : null;\n } catch (e) {\n console.warn('Failed to read status snapshot from localStorage:', e);\n return null;\n }\n },\n\n // Clear all (useful for reset/demo)\n clear(): void {\n const keysToDelete: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && (key.startsWith(this.CARD_PREFIX) || key.startsWith(this.RUNTIME_OUT_PREFIX) || key === this.STATUS_KEY)) {\n keysToDelete.push(key);\n }\n }\n for (const key of keysToDelete) {\n localStorage.removeItem(key);\n }\n }\n};\n\nexport function createBoardLiveGraphRuntime(\n input: LiveCard[] | LiveBoard,\n options: BoardLiveGraphRuntimeOptions = {},\n): BoardLiveGraphRuntime {\n const boardMeta: Pick<LiveBoard, 'id' | 'title' | 'mode' | 'positions' | 'settings'> = Array.isArray(input)\n ? {}\n : {\n id: input.id,\n title: input.title,\n mode: input.mode,\n positions: input.positions,\n settings: input.settings,\n };\n\n const initialCards = Array.isArray(input) ? input : input.nodes;\n const cards = new Map<string, LiveCard>();\n for (const card of initialCards) {\n if (cards.has(card.id)) throw new Error(`Duplicate card ID: \"${card.id}\"`);\n cards.set(card.id, deepClone(card));\n }\n\n const listeners = new Set<(update: BoardLiveGraphRuntimeUpdate) => void>();\n const taskExecutor = options.taskExecutor;\n const sourceAdapters = options.sourceAdapters ?? {};\n const defaultSourceAdapter = options.defaultSourceAdapter;\n\n let graphRef: ReactiveGraph | null = null;\n\n const notifyListeners = (events: GraphEvent[], graph: LiveGraph): void => {\n const update: BoardLiveGraphRuntimeUpdate = {\n events,\n graph,\n nodes: getRenderableNodes(),\n };\n for (const listener of listeners) listener(update);\n };\n\n const makeHandler = (cardId: string): TaskHandlerFn => {\n return async (inputArgs: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const card = cards.get(cardId);\n if (!card) return 'task-initiate-failure';\n\n const requiresData: Record<string, unknown> = {};\n for (const token of card.requires ?? []) {\n const upstream = inputArgs.state[token] as Record<string, unknown> | undefined;\n if (!upstream || typeof upstream !== 'object') continue;\n const providesData = upstream.provides_data as Record<string, unknown> | undefined;\n if (!providesData || typeof providesData !== 'object') continue;\n if (!Object.prototype.hasOwnProperty.call(providesData, token)) continue;\n requiresData[token] = providesData[token];\n }\n\n const sourcesData: Record<string, unknown> = {};\n if (card.source_defs && card.source_defs.length > 0) {\n const adapter = sourceAdapters[cardId] ?? defaultSourceAdapter;\n const fetched = taskExecutor\n ? await taskExecutor({ card, input: inputArgs })\n : (adapter ? await adapter({ card, input: inputArgs }) : undefined);\n if (fetched && typeof fetched === 'object') {\n for (const src of card.source_defs) {\n if (Object.prototype.hasOwnProperty.call(fetched, src.bindTo)) {\n sourcesData[src.bindTo] = fetched[src.bindTo];\n } else if (card.source_defs.length === 1) {\n sourcesData[src.bindTo] = fetched;\n }\n }\n }\n }\n\n const computeNode: ComputeNode = {\n id: card.id,\n card_data: deepClone(card.card_data ?? {}),\n requires: requiresData,\n source_defs: card.source_defs,\n compute: card.compute as ComputeNode['compute'] | undefined,\n };\n computeNode._sourcesData = sourcesData;\n\n if (computeNode.compute && computeNode.compute.length > 0) {\n await CardCompute.run(computeNode, { sourcesData });\n }\n\n const providesData: Record<string, unknown> = {};\n if (card.provides && card.provides.length > 0) {\n for (const { bindTo, ref } of card.provides) {\n providesData[bindTo] = CardCompute.resolve(computeNode, ref);\n }\n } else {\n providesData[card.id] = {\n ...(computeNode.card_data ?? {}),\n ...(computeNode.computed_values ?? {}),\n ...(computeNode._sourcesData ?? {}),\n };\n }\n\n const resultData: Record<string, unknown> = {\n provides_data: providesData,\n card_data: computeNode.card_data ?? {},\n computed_values: computeNode.computed_values ?? {},\n fetched_sources: sourcesData,\n requires: requiresData,\n };\n\n graphRef?.resolveCallback(inputArgs.callbackToken, resultData);\n return 'task-initiated';\n };\n };\n\n const tasks: Record<string, TaskConfig> = {};\n const handlers: Record<string, TaskHandlerFn> = {};\n for (const [cardId, card] of cards.entries()) {\n validateRequires(cards, cardId);\n tasks[cardId] = toTaskConfig(card);\n handlers[cardId] = makeHandler(cardId);\n }\n\n const config: GraphConfig = {\n id: boardMeta.id ?? `browser-board-${Date.now()}`,\n settings: {\n completion: 'manual',\n execution_mode: 'eligibility-mode',\n ...(boardMeta.settings ?? {}),\n ...(options.graphSettings ?? {}),\n },\n tasks,\n };\n\n const userOnDrain = options.reactiveOptions?.onDrain;\n const graph = createReactiveGraph(\n config,\n {\n ...(options.reactiveOptions ?? {}),\n handlers,\n onDrain: (events, live, scheduleResult) => {\n userOnDrain?.(events, live, scheduleResult);\n notifyListeners(events, live);\n },\n },\n options.executionId,\n );\n graphRef = graph;\n\n function getRenderableNodes(): LiveCardRuntimeModel[] {\n const live = graph.getState();\n const out: LiveCardRuntimeModel[] = [];\n\n for (const [cardId, baseCard] of cards.entries()) {\n const data = live.state.tasks[cardId]?.data as Record<string, unknown> | undefined;\n const runtimeState = live.state.tasks[cardId];\n\n const mergedCardData = {\n ...(baseCard.card_data ?? {}),\n ...(data && typeof data.card_data === 'object' ? data.card_data as Record<string, unknown> : {}),\n };\n\n const cardStatus = runtimeState?.status === 'running' ? 'loading' : runtimeState?.status;\n const cardDataForView = {\n ...mergedCardData,\n ...(cardStatus ? { status: cardStatus } : {}),\n ...(runtimeState?.lastUpdated ? { lastRun: runtimeState.lastUpdated } : {}),\n ...(runtimeState?.status === 'failed' && runtimeState.error ? { error: runtimeState.error } : {}),\n };\n\n out.push({\n id: cardId,\n card: deepClone(baseCard),\n card_data: cardDataForView,\n requires: data && typeof data.requires === 'object' ? deepClone(data.requires as Record<string, unknown>) : {},\n computed_values: data && typeof data.computed_values === 'object' ? deepClone(data.computed_values as Record<string, unknown>) : {},\n runtime_state: runtimeState ? deepClone(runtimeState as unknown as Record<string, unknown>) : {},\n });\n }\n\n return out;\n }\n\n const runtime: BoardLiveGraphRuntime = {\n getGraph: () => graph,\n getState: () => graph.getState(),\n getSchedule: () => graph.getSchedule(),\n getNodes: () => getRenderableNodes(),\n getBoard: () => ({\n ...boardMeta,\n nodes: getRenderableNodes(),\n }),\n subscribe(listener: (update: BoardLiveGraphRuntimeUpdate) => void): () => void {\n listeners.add(listener);\n listener({ events: [], graph: graph.getState(), nodes: getRenderableNodes() });\n return () => listeners.delete(listener);\n },\n addCard(card: LiveCard): void {\n if (cards.has(card.id)) throw new Error(`Card \"${card.id}\" already exists`);\n cards.set(card.id, deepClone(card));\n validateRequires(cards, card.id);\n graph.registerHandler(card.id, makeHandler(card.id));\n graph.addNode(card.id, toTaskConfig(card));\n },\n upsertCard(card: LiveCard): void {\n cards.set(card.id, deepClone(card));\n validateRequires(cards, card.id);\n graph.registerHandler(card.id, makeHandler(card.id));\n graph.addNode(card.id, toTaskConfig(card));\n },\n removeCard(cardId: string): void {\n cards.delete(cardId);\n graph.unregisterHandler(cardId);\n graph.removeNode(cardId);\n },\n patchCardState(cardId: string, patch: Record<string, unknown>): void {\n const card = cards.get(cardId);\n if (!card) throw new Error(`Card \"${cardId}\" not found`);\n card.card_data = { ...(card.card_data ?? {}), ...patch };\n graph.retrigger(cardId);\n },\n retrigger(cardId: string): void {\n graph.retrigger(cardId);\n },\n retriggerAll(): void {\n graph.retriggerAll(Array.from(cards.keys()));\n },\n push(event: GraphEvent): void {\n graph.push(event);\n },\n pushAll(events: GraphEvent[]): void {\n graph.pushAll(events);\n },\n dispose(): void {\n listeners.clear();\n graph.dispose();\n },\n };\n\n return runtime;\n}\n\n// ---------------------------------------------------------------------------\n// Runtime-artifacts adapter (ported from reusable-runtime-artifacts-adapter.js)\n// ---------------------------------------------------------------------------\n\nexport interface CardRuntimeArtifact {\n schema_version?: string;\n card_id?: string;\n card_data?: Record<string, unknown>;\n computed_values?: Record<string, unknown>;\n}\n\nexport interface BoardRuntimeArtifactsPayload {\n cardDefinitions: LiveCard[];\n cardRuntimeById?: Record<string, CardRuntimeArtifact>;\n dataObjectsByToken?: Record<string, unknown>;\n statusSnapshot?: {\n cards?: Array<{\n name: string;\n status?: string;\n error?: { message?: string } | null;\n runtime?: { last_transition_at?: string | null };\n blocked_by?: string[];\n requires_missing?: string[];\n }>;\n };\n}\n\nfunction taskStatusToCardStatus(taskStatus: string | null | undefined): string {\n if (taskStatus === 'running' || taskStatus === 'in-progress') return 'loading';\n if (taskStatus === 'failed') return 'error';\n if (taskStatus === 'completed') return 'fresh';\n return 'fresh';\n}\n\nfunction cardStatusToTaskStatus(cardStatus: string | null | undefined): string {\n if (cardStatus === 'loading') return 'in-progress';\n if (cardStatus === 'error') return 'failed';\n if (cardStatus === 'stale') return 'pending';\n if (cardStatus === 'fresh') return 'completed';\n return 'pending';\n}\n\nfunction normalizeCardRuntimeArtifact(cardId: string, artifact: CardRuntimeArtifact | undefined): Required<CardRuntimeArtifact> {\n const safe = artifact && typeof artifact === 'object' && !Array.isArray(artifact) ? artifact : {};\n return {\n schema_version: (safe.schema_version as string) || 'v1',\n card_id: typeof safe.card_id === 'string' ? safe.card_id : cardId,\n card_data: safe.card_data && typeof safe.card_data === 'object' && !Array.isArray(safe.card_data)\n ? structuredClone(safe.card_data) : {},\n computed_values: safe.computed_values && typeof safe.computed_values === 'object' && !Array.isArray(safe.computed_values)\n ? structuredClone(safe.computed_values) : {},\n };\n}\n\n/**\n * Selects a single per-card render model from a runtime state payload.\n * Pure: same input → same output. Used by reactive Board to recompute\n * only the slice for one card.\n */\nexport function selectLiveCardModel(\n payload: BoardRuntimeArtifactsPayload,\n cardId: string,\n): LiveCardRuntimeModel {\n if (!payload || typeof payload !== 'object') throw new Error('payload must be an object');\n if (!cardId) throw new Error('cardId is required');\n\n const cardDefinitions = Array.isArray(payload.cardDefinitions) ? payload.cardDefinitions : [];\n const cardDefinition = cardDefinitions.find((c) => (c as { id?: string }).id === cardId);\n if (!cardDefinition) throw new Error(`cardDefinitions has no entry with id ${cardId}`);\n\n const statusSnapshot = payload.statusSnapshot && typeof payload.statusSnapshot === 'object' ? payload.statusSnapshot : {};\n const cardRuntimeById = payload.cardRuntimeById && typeof payload.cardRuntimeById === 'object' ? payload.cardRuntimeById : {};\n const dataObjectsByToken = payload.dataObjectsByToken && typeof payload.dataObjectsByToken === 'object' ? payload.dataObjectsByToken : {};\n const statusCards = Array.isArray((statusSnapshot as { cards?: unknown[] }).cards)\n ? (statusSnapshot as { cards: Array<{ name: string; status?: string; error?: { message?: string } | null; runtime?: { last_transition_at?: string | null }; blocked_by?: string[]; requires_missing?: string[] }> }).cards\n : [];\n const statusCard = statusCards.find((c) => c.name === cardId);\n\n const card = structuredClone(cardDefinition) as LiveCard & Record<string, unknown>;\n const runtimeArtifact = normalizeCardRuntimeArtifact(cardId, cardRuntimeById[cardId]);\n\n const baseCardData = card.card_data && typeof card.card_data === 'object' && !Array.isArray(card.card_data)\n ? card.card_data as Record<string, unknown> : {};\n\n const card_data: Record<string, unknown> = {\n ...baseCardData,\n ...(runtimeArtifact.card_data || {}),\n status: taskStatusToCardStatus(statusCard?.status),\n lastRun: (statusCard?.runtime?.last_transition_at) ?? null,\n };\n if (statusCard?.error?.message) card_data['error'] = statusCard.error.message;\n\n const runtime_state: Record<string, unknown> = statusCard\n ? {\n task_status: statusCard.status ?? null,\n card_status: taskStatusToCardStatus(statusCard.status),\n runtime: structuredClone(statusCard.runtime ?? {}),\n error: statusCard.error ? structuredClone(statusCard.error) : null,\n blocked_by: Array.isArray(statusCard.blocked_by) ? structuredClone(statusCard.blocked_by) : [],\n requires_missing: Array.isArray(statusCard.requires_missing) ? structuredClone(statusCard.requires_missing) : [],\n }\n : {\n task_status: null,\n card_status: card_data['status'] ?? 'fresh',\n runtime: { last_transition_at: card_data['lastRun'] ?? null },\n error: card_data['error'] ? { message: card_data['error'] } : null,\n blocked_by: [],\n requires_missing: [],\n };\n\n const requiresTokens = Array.isArray((card as { requires?: unknown }).requires) ? (card as { requires: string[] }).requires : [];\n // Include ALL data objects in the state, not just the statically declared requires tokens.\n // This handles dynamic requires, runtime token additions, and cards whose declared requires\n // may not reflect what data is currently available. The board's stable-ref diff handles\n // no-op cases where a card doesn't actually use a given token.\n const requires: Record<string, unknown> = {};\n for (const [token, value] of Object.entries(dataObjectsByToken as Record<string, unknown>)) {\n requires[token] = structuredClone(value);\n }\n // Also seed declared tokens not yet present in dataObjectsByToken as null,\n // so the applyNotification consumer map is always fully wired from init.\n for (const token of requiresTokens) {\n if (!Object.prototype.hasOwnProperty.call(requires, token)) {\n requires[token] = null;\n }\n }\n\n return {\n id: cardId,\n card: card as LiveCard,\n card_data,\n requires,\n computed_values: runtimeArtifact.computed_values,\n runtime_state,\n };\n}\n\n/**\n * Build per-card render models for every card in the payload.\n */\nexport function selectAllLiveCardModels(payload: BoardRuntimeArtifactsPayload): LiveCardRuntimeModel[] {\n if (!payload || typeof payload !== 'object') throw new Error('payload must be an object');\n const cardDefinitions = Array.isArray(payload.cardDefinitions) ? payload.cardDefinitions : [];\n return cardDefinitions.map((c) => selectLiveCardModel(payload, (c as { id: string }).id));\n}\n\nexport interface BuildBrowserArtifactsOptions {\n boardPath?: string;\n cardDefinitions: LiveCard[];\n runtimeModels: LiveCardRuntimeModel[];\n graphState: LiveGraph;\n}\n\n/**\n * Converts browser-runtime state (LiveCardRuntimeModel[] + LiveGraph) back into\n * the runtime payload shape consumed by selectLiveCardModel / selectAllLiveCardModels.\n * Used by the browser-only shell to keep the same selector path as the server shell.\n */\nexport function buildBrowserArtifactsFromRuntime({\n boardPath,\n cardDefinitions,\n runtimeModels,\n graphState,\n}: BuildBrowserArtifactsOptions): BoardRuntimeArtifactsPayload {\n const safeCardDefs = Array.isArray(cardDefinitions) ? cardDefinitions : [];\n const safeModels = Array.isArray(runtimeModels) ? runtimeModels : [];\n const runtimeModelById = new Map(safeModels.map((m) => [m.id, m]));\n type TaskEntry = { data?: { provides_data?: Record<string, unknown> }; status?: string; error?: string; executionCount?: number; retryCount?: number; startedAt?: string; lastUpdated?: string; completedAt?: string; failedAt?: string };\n const graphStateAny = graphState as { state?: { tasks?: Record<string, TaskEntry> } };\n const taskStates: Record<string, TaskEntry> = graphStateAny.state?.tasks ?? {};\n\n const cardRuntimeById: Record<string, CardRuntimeArtifact> = {};\n for (const model of safeModels) {\n if (!model?.id) continue;\n cardRuntimeById[model.id] = {\n schema_version: 'v1',\n card_id: model.id,\n card_data: structuredClone(model.card_data ?? {}),\n computed_values: structuredClone(model.computed_values ?? {}),\n };\n }\n\n const dataObjectsByToken: Record<string, unknown> = {};\n for (const taskName of Object.keys(taskStates)) {\n const providesData = taskStates[taskName]?.data?.provides_data;\n if (providesData && typeof providesData === 'object') {\n for (const token of Object.keys(providesData)) {\n dataObjectsByToken[token] = structuredClone(providesData[token]);\n }\n }\n }\n\n const statusCards = safeCardDefs.map((cardDef) => {\n const model = runtimeModelById.get(cardDef.id) ?? {} as Partial<LiveCardRuntimeModel>;\n const taskState = taskStates[cardDef.id];\n const taskStatus = typeof taskState?.status === 'string'\n ? taskState.status\n : cardStatusToTaskStatus((model.card_data as Record<string, unknown> | undefined)?.['status'] as string | undefined);\n const errorMessage = typeof taskState?.error === 'string'\n ? taskState.error\n : typeof (model.card_data as Record<string, unknown> | undefined)?.['error'] === 'string'\n ? (model.card_data as Record<string, unknown>)['error'] as string\n : null;\n return {\n name: cardDef.id,\n status: taskStatus,\n ...(errorMessage ? { error: { message: errorMessage, code: 'TASK_FAILED', at: taskState?.failedAt ?? null, source: 'browser-runtime' } } : {}),\n requires: Array.isArray((cardDef as { requires?: unknown }).requires) ? (cardDef as { requires: string[] }).requires : [],\n requires_satisfied: [] as string[],\n requires_missing: [] as string[],\n provides_declared: Array.isArray((cardDef as { provides?: Array<{ bindTo: string }> }).provides)\n ? (cardDef as { provides: Array<{ bindTo: string }> }).provides.map((e) => e.bindTo)\n : [cardDef.id],\n provides_runtime: Object.keys(taskState?.data?.provides_data ?? {}).sort(),\n blocked_by: [] as string[],\n unblocks: [] as string[],\n runtime: {\n attempt_count: taskState?.executionCount ?? 0,\n restart_count: taskState?.retryCount ?? 0,\n in_progress_since: taskStatus === 'in-progress' ? (taskState?.startedAt ?? null) : null,\n last_transition_at: taskState?.lastUpdated ?? (model.card_data as Record<string, unknown> | undefined)?.['lastRun'] as string ?? null,\n last_completed_at: taskState?.completedAt ?? null,\n last_restarted_at: taskState?.startedAt ?? null,\n status_age_ms: null as null,\n },\n };\n });\n\n return {\n cardDefinitions: structuredClone(safeCardDefs) as LiveCard[],\n cardRuntimeById,\n dataObjectsByToken,\n statusSnapshot: {\n schema_version: 'v1',\n meta: { board: { path: boardPath ?? 'browser-runtime' } },\n summary: {\n card_count: statusCards.length,\n completed: statusCards.filter((c) => c.status === 'completed').length,\n eligible: 0,\n pending: statusCards.filter((c) => c.status === 'pending').length,\n blocked: 0,\n unresolved: 0,\n failed: statusCards.filter((c) => c.status === 'failed').length,\n in_progress: statusCards.filter((c) => c.status === 'in-progress').length,\n orphan_cards: 0,\n topology: { edge_count: 0, max_fan_out_card: null, max_fan_out: 0 },\n },\n cards: statusCards,\n } as BoardRuntimeArtifactsPayload['statusSnapshot'],\n };\n}\n","/**\n * board-state-reducer — shared reactive state helpers for browser board shells.\n *\n * Used by both:\n * - board-livecards-localstorage-runtime (in-browser full engine)\n * - board-livecards-server-runtime-client (SSE/HTTP thin client)\n *\n * Pure functions; no side effects; no DOM/localStorage/fetch dependencies.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CardModel {\n id: string;\n card: unknown;\n card_data: unknown;\n requires: unknown;\n computed_values: unknown;\n runtime_state: unknown;\n}\n\nexport interface BoardState {\n payload: unknown;\n cardIds: string[];\n modelsById: Record<string, CardModel>;\n}\n\nexport type SelectLiveCardModelFn = (payload: unknown, cardId: string) => CardModel;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction clone<T>(x: T): T {\n return JSON.parse(JSON.stringify(x)) as T;\n}\n\nfunction stableEq<T>(prev: T, next: T): T {\n if (prev === next) return prev;\n try {\n if (JSON.stringify(prev) === JSON.stringify(next)) return prev;\n } catch (_) { /* ignore */ }\n return next;\n}\n\nfunction deepEqJson(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n try { return JSON.stringify(a) === JSON.stringify(b); } catch (_) { return false; }\n}\n\nfunction taskStatusToCardStatus(taskStatus: string | null | undefined): string {\n if (taskStatus === 'running' || taskStatus === 'in-progress') return 'loading';\n if (taskStatus === 'failed') return 'error';\n return 'fresh';\n}\n\n// ============================================================================\n// buildBoardState — full rebuild from a runtime payload snapshot\n// ============================================================================\n\nexport function buildBoardState(\n payload: unknown,\n prevState: BoardState | null,\n selectLiveCardModel: SelectLiveCardModelFn,\n): BoardState {\n const p = payload as { cardDefinitions?: Array<{ id: string }> } | null;\n const cardDefs = (p && Array.isArray(p.cardDefinitions)) ? p.cardDefinitions : [];\n const cardIds = cardDefs.map((c) => c.id);\n const prevModels = (prevState && prevState.modelsById) || {};\n const modelsById: Record<string, CardModel> = {};\n\n for (const id of cardIds) {\n const fresh = selectLiveCardModel(payload, id);\n const prev = prevModels[id];\n if (!prev) {\n modelsById[id] = fresh;\n continue;\n }\n const stab: CardModel = {\n id: fresh.id,\n card: stableEq(prev.card, fresh.card),\n card_data: stableEq(prev.card_data, fresh.card_data),\n requires: stableEq(prev.requires, fresh.requires),\n computed_values: stableEq(prev.computed_values, fresh.computed_values),\n runtime_state: stableEq(prev.runtime_state, fresh.runtime_state),\n };\n modelsById[id] = (\n stab.card === prev.card &&\n stab.card_data === prev.card_data &&\n stab.requires === prev.requires &&\n stab.computed_values === prev.computed_values &&\n stab.runtime_state === prev.runtime_state\n ) ? prev : stab;\n }\n\n return { payload, cardIds, modelsById };\n}\n\n// ============================================================================\n// applyNotification — incremental state reducer\n// ============================================================================\n\nexport function applyNotification(\n prevState: BoardState,\n notifications: Array<{ kind: string; [key: string]: unknown }>,\n selectLiveCardModel: SelectLiveCardModelFn,\n getFullPayload: () => unknown,\n): BoardState {\n if (!prevState || !Array.isArray(notifications) || notifications.length === 0) return prevState;\n\n let modelsById = prevState.modelsById;\n let cardIds = prevState.cardIds;\n let cloned = false;\n let changed = false;\n\n // Build token → [cardId, ...] map from current requires keys\n const consumersByToken: Record<string, string[]> = {};\n for (const cid of cardIds) {\n const m = modelsById[cid];\n const reqs = m && m.requires;\n if (reqs && typeof reqs === 'object') {\n for (const t of Object.keys(reqs as object)) {\n (consumersByToken[t] = consumersByToken[t] || []).push(cid);\n }\n }\n }\n\n function ensureClone() {\n if (!cloned) { modelsById = { ...modelsById }; cloned = true; }\n }\n\n for (const note of notifications) {\n if (!note || !note.kind) continue;\n\n if (note.kind === 'computed_values') {\n const cardId = note.cardId as string;\n const prev = modelsById[cardId];\n if (!prev) continue;\n const nextValues = (note.values || {}) as unknown;\n if (deepEqJson(prev.computed_values, nextValues)) continue;\n ensureClone();\n modelsById[cardId] = { ...prev, computed_values: nextValues };\n changed = true;\n\n } else if (note.kind === 'data_object') {\n const key = note.key as string;\n const notePayload = note.payload;\n const consumers = consumersByToken[key] || [];\n for (const cid of consumers) {\n const prevC = modelsById[cid];\n if (!prevC) continue;\n const prevReqs = (prevC.requires || {}) as Record<string, unknown>;\n if (deepEqJson(prevReqs[key], notePayload)) continue;\n ensureClone();\n modelsById[cid] = { ...prevC, requires: { ...prevReqs, [key]: notePayload } };\n changed = true;\n }\n\n } else if (note.kind === 'card_refreshed') {\n const cardId = note.cardId as string;\n let fresh: CardModel | null = null;\n try {\n const fp = getFullPayload();\n if (fp) fresh = selectLiveCardModel(fp, cardId);\n } catch (_) { /* ignore */ }\n if (!fresh) continue;\n const existing = modelsById[cardId];\n if (existing &&\n deepEqJson(existing.card, fresh.card) &&\n deepEqJson(existing.card_data, fresh.card_data) &&\n deepEqJson(existing.requires, fresh.requires) &&\n deepEqJson(existing.computed_values, fresh.computed_values) &&\n deepEqJson(existing.runtime_state, fresh.runtime_state)) {\n continue;\n }\n ensureClone();\n modelsById[cardId] = fresh;\n if (!cardIds.includes(cardId)) cardIds = [...cardIds, cardId];\n changed = true;\n\n } else if (note.kind === 'status') {\n const statusCards = (note.status as { cards?: Array<{\n name?: string;\n status?: string;\n runtime?: { last_transition_at?: string | null };\n error?: { message?: string } | null;\n blocked_by?: string[];\n requires_missing?: string[];\n }> })?.cards ?? [];\n\n for (const statusCard of statusCards) {\n const sid = statusCard?.name;\n if (!sid || !modelsById[sid]) continue;\n const prevS = modelsById[sid];\n const nextCardStatus = taskStatusToCardStatus(statusCard.status);\n const nextCardData = {\n ...(prevS.card_data as object || {}),\n status: nextCardStatus,\n lastRun: statusCard.runtime?.last_transition_at ?? null,\n ...(statusCard.error?.message ? { error: statusCard.error.message } : {}),\n };\n // Remove error key if no error\n if (!statusCard.error?.message) {\n delete (nextCardData as { error?: string }).error;\n }\n const nextRuntimeState = {\n task_status: statusCard.status ?? null,\n card_status: nextCardStatus,\n runtime: statusCard.runtime ? clone(statusCard.runtime) : {},\n error: statusCard.error ? clone(statusCard.error) : null,\n blocked_by: Array.isArray(statusCard.blocked_by) ? clone(statusCard.blocked_by) : [],\n requires_missing: Array.isArray(statusCard.requires_missing) ? clone(statusCard.requires_missing) : [],\n };\n if (deepEqJson(prevS.card_data, nextCardData) && deepEqJson(prevS.runtime_state, nextRuntimeState)) continue;\n ensureClone();\n modelsById[sid] = { ...prevS, card_data: nextCardData, runtime_state: nextRuntimeState };\n changed = true;\n }\n }\n }\n\n if (!changed) return prevState;\n return { payload: prevState.payload, cardIds, modelsById };\n}\n","/**\n * board-livecards-client — browser IIFE bundle.\n *\n * Two layers in one bundle:\n * 1. Platform-free state: buildBoardState, applyNotification, selectLiveCardModel,\n * selectAllLiveCardModels — usable with any transport (Firebase, WebSocket, SSE, etc.)\n * 2. SSE/HTTP transport: createBoardRuntimeClient — for yaml-flow server runtime.\n *\n * Usage (SSE/HTTP mode):\n * <script src=\"board-livecards-client.js\"></script>\n * <script>\n * const client = BoardLiveCardsClient.createBoardRuntimeClient({\n * fetchServer, boardPaths: BoardLiveCardsClient.defaultBoardPaths, getServerOrigin,\n * });\n * await client.bootstrapBoard({ boardId: 'default', rootElement: el });\n * </script>\n *\n * Usage (custom transport — e.g. Firebase):\n * <script src=\"board-livecards-client.js\"></script>\n * <script>\n * const { buildBoardState, applyNotification, selectLiveCardModel } = BoardLiveCardsClient;\n * // apply your own transport; drive UI state with these primitives.\n * </script>\n *\n * Global: window.BoardLiveCardsClient\n */\n\nimport { selectLiveCardModel, selectAllLiveCardModels } from '../board-livegraph-runtime/index.js';\nimport { buildBoardState, applyNotification, type BoardState, type CardModel } from '../cli/common/board-state-reducer.js';\n\n// ============================================================================\n// Platform-free state exports\n// Re-exported so consumers using any transport (Firebase, WS, SSE) can drive\n// the LiveCard UI without loading the full localstorage bundle.\n// ============================================================================\nexport { buildBoardState, applyNotification, selectLiveCardModel, selectAllLiveCardModels };\nexport type { BoardState, CardModel };\n\n// ============================================================================\n// Public types\n// ============================================================================\n\nexport interface BoardPaths {\n initBoard: string;\n stream: string;\n patchCard: (id: string) => string;\n cardAction: (id: string) => string;\n cardChats: (id: string) => string;\n cardFile: (id: string) => string;\n}\n\nexport interface BoardRuntimeClientOptions {\n /** Authenticated fetch wrapper (handles origin resolution, auth headers, etc). */\n fetchServer: (path: string, init?: RequestInit) => Promise<Response>;\n /** Returns the canonical BoardPaths for a given boardId. */\n boardPaths: (boardId: string) => BoardPaths;\n /** Returns the resolved server origin (e.g. 'http://localhost:7799'). Used for SSE URL. */\n getServerOrigin: () => string | null;\n /** Initial board render mode. Defaults to 'board'. */\n initialMode?: string;\n /** Canvas dimensions. Defaults to { height: '72vh', overflow: 'auto' }. */\n canvas?: { height?: string; overflow?: string };\n}\n\nexport interface BootstrapBoardParams {\n boardId?: string;\n /** Optional path passed to init-board for server-side executor resolution. */\n taskExecutorPath?: string;\n mode?: string;\n rootElement: HTMLElement;\n}\n\n/**\n * Build the standard BoardPaths for a yaml-flow server runtime board.\n *\n * Covers only the paths owned by the server runtime (SSE, patch, action, files, chats,\n * init-board). Demo-server-specific endpoints (demo-setup, board registry\n * CRUD) are not included — add those in the consumer if needed.\n *\n * @example\n * const client = createBoardRuntimeClient({\n * fetchServer,\n * boardPaths: defaultBoardPaths,\n * getServerOrigin: () => activeOrigin,\n * });\n */\nexport function defaultBoardPaths(boardId: string): BoardPaths {\n const b = encodeURIComponent(boardId || 'default');\n const base = `/api/boards/${b}`;\n return {\n initBoard: `${base}/init-board`,\n stream: `${base}/sse`,\n patchCard: (id: string) => `${base}/cards/${encodeURIComponent(id)}`,\n cardAction: (id: string) => `${base}/cards/${encodeURIComponent(id)}/actions`,\n cardFile: (id: string) => `${base}/cards/${encodeURIComponent(id)}/files`,\n cardChats: (id: string) => `${base}/cards/${encodeURIComponent(id)}/chats`,\n };\n}\n\nexport interface BoardRuntimeClient {\n /** Bootstrap the board: init-board → bootstrap-cards → LiveCard.Board + SSE. */\n bootstrapBoard(params: BootstrapBoardParams): Promise<unknown>;\n /** Tear down SSE and release references. */\n dispose(): void;\n setMode(mode: string): void;\n autoLayout(): void;\n setDevMode(enabled: boolean): void;\n getCurrentMode(): string;\n}\n\n// ============================================================================\n// createBoardRuntimeClient\n// ============================================================================\n\nexport function createBoardRuntimeClient(options: BoardRuntimeClientOptions): BoardRuntimeClient {\n if (!options || typeof options !== 'object') throw new Error('options are required');\n\n const { fetchServer, boardPaths, getServerOrigin } = options;\n if (typeof fetchServer !== 'function') throw new Error('options.fetchServer is required');\n if (typeof boardPaths !== 'function') throw new Error('options.boardPaths is required');\n if (typeof getServerOrigin !== 'function') throw new Error('options.getServerOrigin is required');\n\n const canvas = (options.canvas && typeof options.canvas === 'object')\n ? options.canvas\n : { height: '72vh', overflow: 'auto' };\n\n // Reactive state — single source of truth\n const stateRef: { current: BoardState | null } = { current: null };\n let board: { setState: (fn: (prev: BoardState) => BoardState) => void; core?: unknown; engine?: unknown } | null = null;\n let sse: EventSource | null = null;\n let currentMode = String(options.initialMode || 'board');\n\n function getFullPayload() {\n return stateRef.current ? stateRef.current.payload : null;\n }\n\n // ── File upload helpers ───────────────────────────────────────────────────\n\n async function uploadCardFile(\n boardId: string,\n cardId: string,\n file: File,\n opts?: { inChat?: boolean },\n ): Promise<unknown | null> {\n if (!file) return null;\n const inChat = opts?.inChat === true;\n const fileName = typeof file.name === 'string' ? file.name : 'upload.bin';\n const contentType = file.type || 'application/octet-stream';\n const paths = boardPaths(boardId);\n const uploadPath = inChat\n ? `${paths.cardFile(cardId)}?inChat=true`\n : paths.cardFile(cardId);\n\n const upload = await fetchServer(uploadPath, {\n method: 'POST',\n headers: {\n 'content-type': contentType,\n 'x-file-name': encodeURIComponent(fileName),\n },\n body: file,\n });\n\n if (!upload.ok) {\n const errText = await upload.text();\n throw new Error(`Upload failed (${upload.status}): ${errText || 'unknown error'}`);\n }\n\n const payload = await upload.json() as { file?: unknown };\n return payload?.file ?? null;\n }\n\n async function uploadActionFiles(\n boardId: string,\n cardId: string,\n actionType: string,\n payload: Record<string, unknown> | null,\n ): Promise<Record<string, unknown>> {\n if (actionType !== 'chat-send' && actionType !== 'file-upload') return payload || {};\n const nextPayload: Record<string, unknown> = { ...(payload || {}) };\n const rawFiles = Array.isArray(nextPayload.files) ? nextPayload.files as File[] : [];\n if (!rawFiles.length) {\n nextPayload.files = [];\n return nextPayload;\n }\n\n const uploaded: unknown[] = [];\n for (const file of rawFiles) {\n const fileMeta = await uploadCardFile(boardId, cardId, file, { inChat: actionType === 'chat-send' });\n if (fileMeta) uploaded.push(fileMeta);\n }\n\n // For chat uploads, server-side file API already records metadata and emits system chat logs.\n nextPayload.files = actionType === 'chat-send' ? [] : uploaded;\n return nextPayload;\n }\n\n // ── bootstrapBoard ────────────────────────────────────────────────────────\n\n async function bootstrapBoard(params: BootstrapBoardParams): Promise<unknown> {\n const boardId = String(params?.boardId || 'default');\n const taskExecutorPath = typeof params?.taskExecutorPath === 'string' ? params.taskExecutorPath.trim() : '';\n const mode = String(params?.mode || currentMode || 'board');\n const rootEl = params?.rootElement;\n if (!rootEl) throw new Error('bootstrapBoard requires params.rootElement');\n\n const paths = boardPaths(boardId);\n\n const initBoardPath = taskExecutorPath\n ? `${paths.initBoard}?taskExecutorPath=${encodeURIComponent(taskExecutorPath)}`\n : paths.initBoard;\n const initBoardRes = await fetchServer(initBoardPath);\n if (!initBoardRes.ok) throw new Error(`Server init-board failed (${initBoardRes.status}).`);\n\n const origin = getServerOrigin();\n if (!origin) throw new Error('Server origin not resolved before SSE start');\n\n // Open SSE first and wait for the initial full-payload frame.\n // The /sse endpoint calls bootstrapBoard() server-side, publishes the\n // persisted state snapshot via the notification channel, then sends the\n // full runtime payload as the first SSE frame.\n const initialPayload = await new Promise<unknown>((resolve, reject) => {\n const sseConn = new EventSource(`${origin}${paths.stream}`);\n sse = sseConn;\n let gotInitialPayload = false;\n const timeout = setTimeout(() => {\n if (!gotInitialPayload) reject(new Error('SSE initial payload timeout (15s)'));\n }, 15_000);\n sseConn.onmessage = (evt) => {\n try {\n const update = JSON.parse(evt.data || '{}');\n if (!gotInitialPayload && (update?.cardDefinitions || selectAllLiveCardModels(update))) {\n gotInitialPayload = true;\n clearTimeout(timeout);\n resolve(update);\n }\n } catch { /* wait for valid frame */ }\n };\n sseConn.onerror = () => {\n if (!gotInitialPayload) {\n clearTimeout(timeout);\n reject(new Error('SSE connection failed during bootstrap'));\n }\n };\n });\n\n if (!selectAllLiveCardModels(initialPayload)) throw new Error('SSE payload missing published runtime artifacts');\n\n // Build initial reactive state using bundled selectLiveCardModel\n stateRef.current = buildBoardState(initialPayload, null, selectLiveCardModel as Parameters<typeof buildBoardState>[2]);\n\n const LiveCard = (globalThis as unknown as { LiveCard?: { init: (opts: unknown) => unknown; Board: (engine: unknown, el: HTMLElement, opts: unknown) => typeof board } }).LiveCard;\n if (!LiveCard) throw new Error('LiveCard global not loaded — include live-cards.js before this script');\n\n const engine = LiveCard.init({\n resolve: (id: string) => stateRef.current?.modelsById[id],\n chartLib: (globalThis as { Chart?: unknown }).Chart ?? null,\n markdown: (globalThis as { marked?: { parse: (t: string) => string } }).marked\n ? (text: string) => (globalThis as { marked: { parse: (t: string) => string } }).marked.parse(text)\n : null,\n sanitize: (globalThis as { DOMPurify?: { sanitize: (h: string) => string } }).DOMPurify\n ? (html: string) => (globalThis as { DOMPurify: { sanitize: (h: string) => string } }).DOMPurify.sanitize(html)\n : null,\n onPatchState: async (id: string, patch: Record<string, unknown>) => {\n await fetchServer(paths.patchCard(id), {\n method: 'PATCH',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(patch || {}),\n });\n },\n onRefresh: async (id: string) => {\n await fetchServer(paths.patchCard(id), {\n method: 'PATCH',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({}),\n });\n },\n onAction: async (id: string, actionType: string, actionPayload: Record<string, unknown> | null) => {\n const uploadedPayload = await uploadActionFiles(boardId, id, actionType, actionPayload);\n await fetchServer(paths.cardAction(id), {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ actionType, payload: uploadedPayload || {} }),\n });\n },\n getChatMessages: async (id: string) => {\n const res = await fetchServer(paths.cardChats(id));\n if (!res.ok) return [];\n const chatPayload = await res.json() as { messages?: Array<{ role?: string; text?: string }> };\n return (chatPayload?.messages ?? []).map((m) => ({\n role: typeof m?.role === 'string' ? m.role : 'system',\n text: typeof m?.text === 'string' ? m.text : '',\n files: [],\n }));\n },\n });\n\n rootEl.innerHTML = '';\n board = LiveCard.Board(engine, rootEl, {\n initialState: stateRef.current,\n getNodeIds: (s: BoardState) => s.cardIds,\n selectNode: (s: BoardState, id: string) => s.modelsById[id],\n mode,\n canvas,\n });\n currentMode = mode;\n\n // Wire up the ongoing SSE message handler on the already-open connection.\n sse!.onmessage = (evt) => {\n try {\n const update = JSON.parse(evt.data || '{}') as {\n kind?: string;\n notifications?: Array<{ kind: string; [k: string]: unknown }>;\n cardDefinitions?: unknown[];\n engine?: { onServerSseEvent?: () => void; refreshOpenChatModal?: () => void };\n };\n\n if (update?.kind === 'notification-batch' && Array.isArray(update.notifications)) {\n if (board) {\n board.setState((prev: BoardState) => {\n const next = applyNotification(\n prev,\n update.notifications!,\n selectLiveCardModel as Parameters<typeof applyNotification>[2],\n getFullPayload,\n );\n stateRef.current = next;\n return next;\n });\n }\n } else if (update?.cardDefinitions) {\n const next = buildBoardState(update, stateRef.current, selectLiveCardModel as Parameters<typeof buildBoardState>[2]);\n stateRef.current = next;\n if (board) board.setState(() => next);\n }\n\n const eng = board && (board as { engine?: { onServerSseEvent?: () => void; refreshOpenChatModal?: () => void } }).engine;\n if (eng && typeof eng.onServerSseEvent === 'function') {\n eng.onServerSseEvent();\n } else if (eng && typeof eng.refreshOpenChatModal === 'function') {\n eng.refreshOpenChatModal();\n }\n } catch (err) {\n console.warn('Bad SSE payload', err);\n }\n };\n\n return board;\n }\n\n // ── Control methods ───────────────────────────────────────────────────────\n\n function dispose() {\n if (sse) { sse.close(); sse = null; }\n board = null;\n stateRef.current = null;\n }\n\n function setMode(mode: string) {\n currentMode = String(mode || 'board');\n const core = board && (board as { core?: { setMode?: (m: string) => void } }).core;\n if (core && typeof core.setMode === 'function') core.setMode(currentMode);\n }\n\n function autoLayout() {\n if (!board) return;\n currentMode = 'canvas';\n const core = (board as { core?: { setMode?: (m: string) => void; autoLayout?: () => void } }).core;\n if (core && typeof core.setMode === 'function') core.setMode('canvas');\n if (core && typeof core.autoLayout === 'function') core.autoLayout();\n }\n\n function setDevMode(enabled: boolean) {\n const core = board && (board as { core?: { setDevMode?: (e: boolean) => void } }).core;\n if (core && typeof core.setDevMode === 'function') core.setDevMode(Boolean(enabled));\n }\n\n function getCurrentMode() { return currentMode; }\n\n return { bootstrapBoard, dispose, setMode, autoLayout, setDevMode, getCurrentMode };\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var BoardLiveCardsLocalStorage=(function(exports){'use strict';var vr=Object.defineProperty;var wr=(e,t,r)=>t in e?vr(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var _t=(e,t,r)=>wr(e,t+"",r);var Ue="b64:";function Cr(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let s="";for(let o of t)s+=String.fromCharCode(o);n=btoa(s);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function xr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),s=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function Y(e){return `${Ue}${Cr(JSON.stringify(e))}`}function be(e){if(e.startsWith("::fs-path::"))return {kind:"fs-path",value:e.slice(11)};if(!e.startsWith(Ue))throw new Error(`Invalid ref format (expected ${Ue}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(xr(e.slice(Ue.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function At(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var pe={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function oe(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function ye(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Ve(e){return e.tasks??{}}function Je(e){return e?e.status===pe.FAILED||e.status===pe.INACTIVATED:false}function Tt(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Et(e){return e.maxExecutions}function It(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===pe.COMPLETED){let o=e.tasks[n];o&&oe(o).forEach(i=>r.add(i));}return Array.from(r)}function Ot(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;oe(s).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function Nt(e,t,r){let n=e.tasks[t]??Ke(),s={};if(r){let a=r.tasks[t],i=ye(a);for(let u of i)for(let[m,C]of Object.entries(r.tasks))if(oe(C).includes(u)){let g=e.tasks[m];g?.lastDataHash&&(s[u]=g.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function jt(e,t,r,n,s,o){let a=e.tasks[r]??Ke(),i=t.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let u;n&&i.on&&i.on[n]?u=i.on[n]:u=oe(i);let m=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let k=i.requires??[];for(let b of k)for(let[p,h]of Object.entries(t.tasks))if(oe(h).includes(b)){let B=e.tasks[p];B?.lastDataHash&&(m[b]=B.lastDataHash);break}}let C={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:m,error:void 0},g=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:C},availableOutputs:g,lastUpdated:new Date().toISOString()}}function Bt(e,t,r,n){let s=e.tasks[r]??Ke(),o=t.tasks[r];if(o?.retry){let u=s.retryCount+1;if(u<=o.retry.max_attempts){let m={...s,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:m},lastUpdated:new Date().toISOString()}}}let a={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},i=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(i=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&a.executionCount>=o.circuit_breaker.max_executions){let u=o.circuit_breaker.on_break;i=[...new Set([...i,...u])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:i,lastUpdated:new Date().toISOString()}}function Lt(e,t,r,n){let s=e.tasks[t]??Ke(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function $t(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Ke(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Be(e,t){let r=`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=Dt();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function Ft(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:Nt(n,t.taskName,r)};case "task-completed":return {config:r,state:jt(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:Bt(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Lt(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:$t(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:_r(n,t.action)};case "task-upsert":return ct(e,t.taskName,t.taskConfig);case "task-removal":return ut(e,t.taskName);case "node-requires-add":return dt(e,t.nodeName,t.tokens);case "node-requires-remove":return lt(e,t.nodeName,t.tokens);case "node-provides-add":return ft(e,t.nodeName,t.tokens);case "node-provides-remove":return pt(e,t.nodeName,t.tokens);default:return e}}function ze(e,t){return t.reduce((r,n)=>Ft(r,n),e)}function ct(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:Dt()},lastUpdated:new Date().toISOString()}}}function ut(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function dt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=ye(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function lt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=ye(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function ft(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=oe(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function pt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=oe(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function Ee(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Le(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function Dt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function _r(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function Ie(e){let{config:t,state:r}=e,n=Ve(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=Ar(n),a=It(t,r.tasks),i=new Set([...a,...r.availableOutputs]),u=[],m=[],C=[],g=[];for(let[b,p]of Object.entries(n)){let h=r.tasks[b],B=Tt(p,t.settings),N=B!=="once";if(h?.status===pe.RUNNING||Je(h))continue;let S=Et(p);if(S!==void 0&&h&&h.executionCount>=S||p.circuit_breaker&&h&&h.executionCount>=p.circuit_breaker.max_executions||!N&&h?.status===pe.COMPLETED)continue;if(N&&h?.status===pe.COMPLETED){let A=ye(p),T=false;switch(B){case "data-changed":{A.length>0&&A.some(q=>{for(let[J,se]of Object.entries(n))if(oe(se).includes(q)){let Z=r.tasks[J];if(!Z)continue;let Se=h.lastConsumedHashes?.[q];return Z.lastDataHash==null?Z.executionCount>h.lastEpoch:Z.lastDataHash!==Se}return false})||(T=true);break}case "epoch-changed":{A.length>0&&A.some(q=>{for(let[J,se]of Object.entries(n))if(oe(se).includes(q)){let Z=r.tasks[J];if(Z&&Z.executionCount>h.lastEpoch)return true}return false})||(T=true);break}case "time-based":{let M=p.refreshInterval??0;if(M<=0){T=true;break}let q=h.completedAt;if(!q){T=true;break}(Date.now()-Date.parse(q))/1e3<M&&(T=true);break}case "manual":T=true;break}if(T)continue}let j=ye(p);if(j.length===0){u.push(b);continue}let P=[],E=[],O=[];for(let A of j){if(i.has(A))continue;let T=o[A]||[];T.length===0?P.push(A):T.every(q=>Je(r.tasks[q]))?O.push({token:A,failedProducer:T[0]}):E.push(A);}P.length>0?C.push({taskName:b,missingTokens:P}):O.length>0?g.push({taskName:b,failedTokens:O.map(A=>A.token),failedProducers:[...new Set(O.map(A=>A.failedProducer))]}):E.length>0?m.push({taskName:b,waitingOn:E}):u.push(b);}let k={};if(u.length>1){let b=Ot(u,n);for(let[p,h]of Object.entries(b))h.length>1&&(k[p]=h);}return {eligible:u,pending:m,unresolved:C,blocked:g,conflicts:k}}function Ar(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of oe(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var Oe=class{constructor(){_t(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function We(e){let t=gt(e);return Tr(t)}function gt(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(gt).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+gt(t[n])).join(",")+"}"}function Tr(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Er(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Ir(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function Pt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Er(t)}function Or(e){try{let t=JSON.parse(Ir(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function $e(e,t,r){let{handlers:n,onDrain:s}=t,o=new Oe,a="state"in e&&"config"in e?e:Be(e),i=false,u=new Set,m=new Map(Object.entries(n)),C=new Oe,g=false,k=false;function b(){if(!i){if(g){k=true;return}g=true;try{do k=!1,p();while(k)}finally{g=false;}}}function p(){let S=C.drain(),j=o.drain(),P=[...S,...j];P.length>0&&(a=ze(a,P));let E=Ie(a);P.length>0&&s?.(P,a,E);for(let O of E.eligible)N(O);for(let O of P)if(O.type==="task-progress"){let{taskName:A,update:T}=O;if(!a.config.tasks[A])continue;let q=a.state.tasks[A];if(!q||q.status!=="running")continue;let J=Pt(A),se=B(A,J,T).catch(Z=>{i||(C.append({type:"task-failed",taskName:A,error:Z.message??String(Z),timestamp:new Date().toISOString()}),b());}).finally(()=>{u.delete(se);});u.add(se);}}function h(S){let P=a.config.tasks[S].requires??[],E=new Map;for(let[A,T]of Object.entries(a.config.tasks))for(let M of T.provides??[])E.set(M,A);let O={};for(let A of P){let T=E.get(A);T?O[A]=a.state.tasks[T]?.data:O[A]=void 0;}return O}async function B(S,j,P){let E=a.config.tasks[S],O=E.taskHandlers??[],A=h(S);for(let T of O){let M=m.get(T);if(!M)throw new Error(`Handler '${T}' not found in registry (task '${S}')`);let q={nodeId:S,state:A,taskState:a.state.tasks[S],config:E,callbackToken:j,update:P};if(await M(q)==="task-initiate-failure")throw new Error(`Handler '${T}' returned task-initiate-failure (task '${S}')`)}}function N(S){let P=a.config.tasks[S]?.taskHandlers;if(!P||P.length===0)return;C.append({type:"task-started",taskName:S,timestamp:new Date().toISOString()}),b();let E=Pt(S),O=B(S,E).catch(A=>{i||(C.append({type:"task-failed",taskName:S,error:A.message??String(A),timestamp:new Date().toISOString()}),b());}).finally(()=>{u.delete(O);});u.add(O);}return {push(S){i||(S.type==="task-completed"&&S.data&&!S.dataHash&&(S={...S,dataHash:We(S.data)}),o.append(S),b());},pushAll(S){if(!i){for(let j of S)j.type==="task-completed"&&j.data&&!j.dataHash?o.append({...j,dataHash:We(j.data)}):o.append(j);b();}},resolveCallback(S,j,P){if(i)return;let E=Or(S);if(!E)return;let{taskName:O}=E;if(a.config.tasks[O]){if(P&&P.length>0)o.append({type:"task-failed",taskName:O,error:P.join("; "),timestamp:new Date().toISOString()});else {let A=j&&Object.keys(j).length>0?We(j):void 0;o.append({type:"task-completed",taskName:O,data:j,dataHash:A,timestamp:new Date().toISOString()});}b();}},addNode(S,j){i||(o.append({type:"task-upsert",taskName:S,taskConfig:j,timestamp:new Date().toISOString()}),b());},removeNode(S){i||(o.append({type:"task-removal",taskName:S,timestamp:new Date().toISOString()}),b());},addRequires(S,j){i||(o.append({type:"node-requires-add",nodeName:S,tokens:j,timestamp:new Date().toISOString()}),b());},removeRequires(S,j){i||(o.append({type:"node-requires-remove",nodeName:S,tokens:j,timestamp:new Date().toISOString()}),b());},addProvides(S,j){i||(o.append({type:"node-provides-add",nodeName:S,tokens:j,timestamp:new Date().toISOString()}),b());},removeProvides(S,j){i||(o.append({type:"node-provides-remove",nodeName:S,tokens:j,timestamp:new Date().toISOString()}),b());},registerHandler(S,j){m.set(S,j);},unregisterHandler(S){m.delete(S);},retrigger(S){i||a.config.tasks[S]&&(o.append({type:"task-restart",taskName:S,timestamp:new Date().toISOString()}),b());},retriggerAll(S){if(!i){for(let j of S)a.config.tasks[j]&&o.append({type:"task-restart",taskName:j,timestamp:new Date().toISOString()});b();}},snapshot(){return Ee(a)},getState(){return a},getSchedule(){return Ie(a)},async waitForHandlers(){u.size>0&&await Promise.allSettled([...u]);},async dispose(S){S?.wait&&u.size>0&&await Promise.allSettled([...u]),i=true;}}}function mt(e){return JSON.stringify(e)}function ht(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function Xe(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var Nr=Xe();Nr("./jsonata-sync.cjs");var jr=Xe(),Ye=jr("./jsonata-sync.cjs"),Ht=Ye;function Gt(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function Mt(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Br(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await Ye(s.expr).evaluate(n);Mt(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch(o){console.error(`CardCompute.run error on "${e.id??"?"}.${s.bindTo}":`,o);}return e}function Lr(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let a=Ht(o.expr).evaluate(n);Mt(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch(a){let i=a instanceof Error?a.message:String(a);s.push({bindTo:o.bindTo,error:i}),console.error(`CardCompute.runSync error on "${e.id??"?"}.${o.bindTo}":`,a);}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function $r(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Ye(e).evaluate(n)}function Fr(e,t){return t.startsWith("fetched_sources.")?Gt(e._sourcesData??{},t.slice(16)):Gt(e,t)}var qt=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Dr=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Pr(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Dr.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,a)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${a}]: must be an object`);else {let i=o;typeof i.bindTo!="string"||!i.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(s.has(i.outputFile)&&t.push(`source_defs[${a}]: outputFile "${i.outputFile}" is not unique across source_defs`),s.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):qt.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...qt].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Gr(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=await Ye(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function qr(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=Ht(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var Ne={run:Br,runSync:Lr,eval:$r,resolve:Fr,validate:Pr,enrichSources:Gr,enrichSourcesSync:qr};function Qe(e,t){function r(){return e.readIndex()??{}}function n(s,o,a){let i=String(o||"").split(".").filter(Boolean);if(i.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let u={...s},m=u;for(let C=0;C<i.length-1;C++){let g=i[C],k=m[g],b=k&&typeof k=="object"&&!Array.isArray(k)?{...k}:{};m[g]=b,m=b;}return m[i[i.length-1]]=a,u}return {readCard(s){let o=r()[s];return !o||!e.cardExists(o.key)?null:e.readCard(o.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[o,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let i=e.readCard(a.key);i?s.push(i):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,a]of Object.entries(r()))s[o]=a.checksum;return s},changedSince(s){let o=r(),a=[];for(let[i,u]of Object.entries(o))s[i]!==u.checksum&&a.push(i);for(let i of Object.keys(s))o[i]||a.push(i);return a},validateUpsert(s,o){let a=r(),i=a[s],u=Object.entries(a).find(([,m])=>m.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:u&&u[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,a){let i=r(),u=a??i[s]?.key??e.defaultCardKey(s),m=e.writeCard(u,o);i[s]={key:u,checksum:m,updatedAt:new Date().toISOString()},e.writeIndex(i);},patchCard(s,o,a){let i=r(),u=i[s];if(!u||!e.cardExists(u.key))throw new Error(`card "${s}" not found`);let m=e.readCard(u.key);if(!m||typeof m!="object"||Array.isArray(m))throw new Error(`card "${s}" is not patchable`);let C=n(m,o,a),g=e.writeCard(u.key,C);i[s]={key:u.key,checksum:g,updatedAt:new Date().toISOString()},e.writeIndex(i);},removeCard(s){let o=r();o[s]&&(delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function kt(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let o=s.trim();if(!o)return null;try{return JSON.parse(o)}catch{return o}},ingestSourceDataStaged(r,n,s,o){let a=t(s);e.write(`${r}/.staged/${o}/${n}`,a);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,a=e.read(o);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function Vt(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(o=>o.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function Jt(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let o of s)try{n(o);}catch(a){let i=a instanceof Error?a.message:String(a);try{t(o,i);}catch{}}e.delete(r);}}}}var Ze="v1",xe="board/graph",Kt="board/lastJournalProcessedId";function Ut(e){return `cards/${e}/runtime`}function zt(e){return {readRuntime(t){return e.read(Ut(t))??{_sources:{}}},writeRuntime(t,r){e.write(Ut(t),r);}}}function Hr(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Wt(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==Ze)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=Hr(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function Xt(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return ht(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",mt(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return ht(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",mt(r));},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function Yt(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Mr(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function Ur(e,t){return e?.lastRequestedAt?Mr(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function Vr(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function Jr(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function et(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=Ie(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let p of o.pending)i.set(p.taskName,p.waitingOn);for(let p of o.unresolved)i.set(p.taskName,p.missingTokens);for(let p of o.blocked)i.set(p.taskName,p.failedTokens);let u=new Map;for(let[p,h]of Object.entries(n))for(let B of h.requires??[]){let N=u.get(B)??[];N.push(p),u.set(B,N);}let m=s.sort().map(p=>{let h=r[p],B=n[p]??{requires:[],provides:[]};h.status==="completed"?a.completed+=1:h.status==="failed"?a.failed+=1:h.status==="in-progress"&&(a.in_progress+=1);let N=B.requires??[],S=B.provides??[],j=Object.keys(h.data??{}).sort(),P=N.filter(q=>t.state.availableOutputs.includes(q)),E=N.filter(q=>!t.state.availableOutputs.includes(q)),O=i.get(p)??E,A=new Set;for(let q of S)for(let J of u.get(q)??[])J!==p&&A.add(J);let T=h.failedAt,M=h.error?{message:h.error,code:"TASK_FAILED",at:T,source:"task-runtime"}:void 0;return {name:p,status:h.status,error:M,requires:N,requires_satisfied:P,requires_missing:E,provides_declared:S,provides_runtime:j,blocked_by:O,unblocks:Array.from(A).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}}});a.pending=o.pending.length,a.blocked=o.blocked.length,a.unresolved=o.unresolved.length;let C=m.map(p=>({name:p.name,fanOut:p.unblocks.length})).sort((p,h)=>h.fanOut-p.fanOut||p.name.localeCompare(h.name)),g=C.length>0?C[0]:{name:null,fanOut:0},k=new Set;for(let p of Object.values(n))for(let h of p.requires??[])k.add(h);let b=0;for(let[p,h]of Object.entries(n)){let B=(h.requires??[]).length===0,S=(h.provides??[]).some(j=>(u.get(j)??[]).some(P=>P!==p));B&&!S&&(b+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:a.completed,eligible:o.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(k).length,max_fan_out_card:g.name,max_fan_out:g.fanOut}},cards:m}}function Kr(){return new Date().toISOString()}function Qt(e,t,r,n,s,o,a){return async i=>{let u=[],m=r.cardStore.readCard(i.nodeId);if(!m)return "task-initiate-failure";let C=m.id,g=m.card_data??{},k=m.source_defs??[],b=k.filter(D=>D.optionalForCompletionGating!==true),p=r.cardRuntimeStore.readRuntime(C),h=false,B=()=>{h&&(r.cardRuntimeStore.writeRuntime(C,p),h=false);},N=D=>({...p._sources[D]??{}}),S=(D,G)=>{p._sources[D]=G,h=true;},j=i.taskState?.executionCount??0,P=p._lastExecutionCount;if(typeof P=="number"&&P!==j&&(p._sources={},h=true),P!==j&&(p._lastExecutionCount=j,h=true),i.update){let D=i.update,G=D.outputFile;if(G){let w=N(G);if(D.failure)S(G,Jr(w,D.reason??"unknown"));else {let f=D.rqt;if(!w.lastFetchedAt||f>w.lastFetchedAt){let I=typeof D.deliveryToken=="string"?D.deliveryToken:void 0;I&&r.fetchedSourcesStore.commitSourceData(C,G,I),S(G,Vr(w,f));}}B();}}let E={};for(let D of k)if(D.outputFile){let G=r.fetchedSourcesStore.readSourceData(C,D.outputFile);G!==null&&(E[D.bindTo]=G);}let O={};for(let[D,G]of Object.entries(i.state??{}))if(G!==null&&typeof G=="object"&&!Array.isArray(G)){let w=G[D];O[D]=w!==void 0?w:G;}else O[D]=G;let A={id:C,card_data:{...g},requires:O,source_defs:k,compute:m.compute};A._sourcesData=E,m.compute&&Ne.runSync(A,{sourcesData:E}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(C,A.computed_values??{});let T={...m},M=Ne.enrichSourcesSync(Array.isArray(m.source_defs)?m.source_defs:void 0,{card_data:m.card_data,requires:O}),q=e.value;T.source_defs=Array.isArray(M)?M.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:q})):M;let J=Kr(),se=i.update?void 0:J,Z=b.filter(D=>{let G=D.outputFile;if(typeof G!="string"||!G)return true;let w=N(G);se&&(w={...w,queueRequestedAt:se},S(G,w));let f=w.queueRequestedAt??w.lastRequestedAt??J,I=Ur(w,f);return I==="in-flight"?false:I==="dispatch"});if(B(),Z.length>0){let D=false,G=J;for(let w of Z){let f=w.outputFile;if(typeof f!="string"||!f)continue;let I=N(f),$=I.queueRequestedAt??J;S(f,{...I,lastRequestedAt:$}),G=$,D=true;}return D&&B(),D&&(u.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:T,callbackToken:i.callbackToken,rqt:G}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}let Se=m.provides??[],ve={};for(let{bindTo:D,ref:G}of Se)ve[D]=Ne.resolve(A,G);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(ve),k.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let G=N(D.outputFile);return !G.lastRequestedAt||!G.lastFetchedAt?true:G.lastFetchedAt<=G.lastRequestedAt}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:Y(e),enrichedCard:T,callbackToken:i.callbackToken,rqt:J}}),n(i.nodeId,ve),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var yt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Zt(e){return {[xe]:e.graph,[Kt]:e.lastDrainedJournalId}}function er(e){let t=e[xe],r=e[Kt];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${xe}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function tr(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function te(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function z(e){return {status:"fail",error:e}}function re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function zr(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function nr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(s)}function tt(e){try{let t=JSON.parse(nr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Wr(e){return zr(JSON.stringify(e))}function rr(e){try{let t=JSON.parse(nr(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ae(){return new Date().toISOString()}function or(e,t){let r=t.onWarn??(()=>{}),n=Y(e);function s(w){if(w.length!==0)try{let f=t.publishBoardChangeNotifications?.(w);f&&typeof f.catch=="function"&&f.catch(I=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${I instanceof Error?I.message:String(I)}`));}catch(f){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${f instanceof Error?f.message:String(f)}`);}}function o(){let w=i().readCardStoreRef();if(!w)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let f=t.kvStorageForRef(w);return {readIndex(){return f.read("_index")},writeIndex(I){f.write("_index",I);},readCard(I){return f.read(I)},writeCard(I,$){return f.write(I,$),t.hashFn($)},cardExists(I){return f.read(I)!==null},defaultCardKey(I){return I}}}let a={readValues(w){let f=t.kvStorage("state-snapshot"),I=f.listKeys().sort();if(I.length===0)return {version:null,values:{}};let $={};for(let V of I)$[V]=f.read(V);return {version:t.hashFn($),values:$}},writeValues(w,f,I){let $=t.kvStorage("state-snapshot");for(let V of I)$.delete(V);for(let[V,K]of Object.entries(f))$.write(V,K);return t.hashFn(f)}},i=()=>Xt(t.kvStorage("config")),u=()=>Wt(a),m=()=>Vt(t.journalAdapter()),C=()=>Qe(o(),r),g=()=>{let w=i().readOutputsStoreRef();if(!w)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Yt(t.kvStorageForRef(w))};function k(){return !!u().readSnapshot(e.value).values[xe]}function b(){let w=u().readSnapshot(e.value);if(!w.values[xe])throw new Error(`Board not initialized at ${e.value}`);return er(w.values)}function p(w,f){let I=u().commitSnapshot(e.value,{schemaVersion:Ze,expectedVersion:f,commitId:t.genId(),committedAt:ae(),deleteKeys:[],shallowMerge:Zt(w)});if(!I.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${f??"null"} current=${I.currentVersion??"null"}`)}function h(w){m().appendEvent(w);}async function B(){let w=(y,R)=>{let F=y.payload,H=(F?.enrichedCard??{}).id??F?.cardId??"unknown";h({type:"task-failed",taskName:H,error:R,timestamp:ae()});},f=Jt(t.kvStorage("execution-requests"),w),I=zt(t.kvStorage("card-runtime")),$=kt(t.blobStorage("sources"),y=>t.resolveBlob(y)),V=new Map,K={readRuntime(y){return V.get(y)??I.readRuntime(y)},writeRuntime(y,R){V.set(y,R);}},ie=[],ne=new Map,fe={readSourceData(y,R){let F=`${y}/${R}`;return ne.has(F)?ne.get(F):$.readSourceData(y,R)},ingestSourceDataStaged(y,R,F,U){$.ingestSourceDataStaged(y,R,F,U);},commitSourceData(y,R,F){let U=`${y}/.staged/${F}/${R}`,X=t.blobStorage("sources").read(U);if(X==null)return false;let ee=`${y}/${R}`,W=X.trim();try{ne.set(ee,JSON.parse(W));}catch{ne.set(ee,W);}return ie.push({cardId:y,outputFile:R,deliveryToken:F}),true},hasSource(y,R){let F=`${y}/${R}`;return ne.has(F)?true:$.hasSource(y,R)}},ce={cardStore:C(),cardRuntimeStore:K,fetchedSourcesStore:fe,outputStore:g(),executionRequestStore:f},ge=b(),me=Le(ge.graph),{events:Q,newCursor:he}=m().readEntriesAfterCursor(ge.lastDrainedJournalId),ke=[],_e=[],Ae=[],je=new Map,at=(y,R)=>{ke.push({type:"task-completed",taskName:y,data:R,timestamp:ae()});},qe=(y,R)=>h({type:"task-failed",taskName:y,error:R,timestamp:ae()}),d=$e(me,{handlers:{"card-handler":Qt(e,he,ce,at,qe,(y,R)=>{_e.push({cardId:y,values:R});},y=>{Ae.push(y);})}});for(ke=Q;ke.length>0;){let y=ke;ke=[];for(let R of y)if(R.type==="task-restart"){let F=ce.cardStore.readCard(R.taskName);F&&je.set(R.taskName,F);}d.pushAll(y),await d.waitForHandlers();}let l=d.getState();await d.dispose({wait:true});let _=u().readSnapshot(e.value).version;p({lastDrainedJournalId:he,graph:Ee(l)},_);for(let{cardId:y,values:R}of _e)ce.outputStore.writeComputedValues(y,R);for(let y of Ae)ce.outputStore.writeDataObjects(y);for(let[y,R]of V)I.writeRuntime(y,R);for(let{cardId:y,outputFile:R,deliveryToken:F}of ie)$.commitSourceData(y,R,F);let v;try{v=et(n,l),ce.outputStore.writeStatusSnapshot(v);}catch(y){r(`[board-live-cards-public] status publish failed: ${y instanceof Error?y.message:String(y)}`);}let x=[];for(let{cardId:y,values:R}of _e)x.push({kind:"computed_values",cardId:y,values:R});for(let y of Ae)for(let[R,F]of Object.entries(y))R&&x.push({kind:"data_object",key:R,payload:F});for(let[y,R]of je)x.push({kind:"card_refreshed",cardId:y,card:R});v!==void 0&&x.push({kind:"status",status:v}),s(x);let L=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:Y({kind:"built-in",value:"source-cli-task-executor"})};f.dispatchEntriesForJournalId(he,y=>{if(y.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${y.taskKind}" \u2014 skipping`);return}let R=y.payload,F=R.enrichedCard?.id??"unknown",U=R.enrichedCard?.source_defs??[];for(let H of U){if(!H.outputFile){r(`[dispatch] source "${H.bindTo}" has no outputFile \u2014 skipping`);continue}let X=Wr({cbk:R.callbackToken,rg:e.value,br:Y(e),cid:F,b:H.bindTo,d:H.outputFile,cs:void 0,rqt:R.rqt});t.dispatchExecution(L,{source_def:H,base_ref:Y(e),callback:{token:X,via:t.selfRef}}).catch(ee=>qe(F,ee instanceof Error?ee.message:String(ee)));}});}async function N(){try{let w=()=>{let I=b(),{events:$}=m().readEntriesAfterCursor(I.lastDrainedJournalId);$.length<=0||(N(),t.requestProcessAccumulated?.());},f=await At(t.lock,B,w);return te({ran:f!==!1})}catch(w){return re(w)}}function S(w){try{let f=w.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(!k()){let K=Be(yt);p({lastDrainedJournalId:"",graph:Ee(K)},null);}let I=w.params?.outputsStoreRef;if(!I)return z("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let $=i();$.writeCardStoreRef(f),$.writeOutputsStoreRef(I);let V=w.body??{};V["task-executor-ref"]&&$.writeTaskExecutorRef(V["task-executor-ref"]),V["chat-handler-ref"]&&$.writeChatHandlerRef(V["chat-handler-ref"]);try{g().writeStatusSnapshot(et(n,Le(b().graph)));}catch{}return te()}catch(f){return re(f)}}function j(w){try{let f=g().readStatusSnapshot();if(!f){f=et(n,Le(b().graph));try{g().writeStatusSnapshot(f);}catch{}}return te(f)}catch(f){return re(f)}}function P(w){try{let f=w.params?.id;return f?(h({type:"task-removal",taskName:f,timestamp:ae()}),N(),te()):z("removeCard requires params.id")}catch(f){return re(f)}}function E(w){try{let f=w.params?.id;return f?(h({type:"task-restart",taskName:f,timestamp:ae()}),N(),te()):z("retrigger requires params.id")}catch(f){return re(f)}}async function O(w){return N()}function A(w){try{let f=w.params?.cardId,I=w.params?.all,$=!!w.params?.restart;if(!f&&!I)return z("upsertCard requires --card-id <id> or --all");let V=I?C().readAllCards().map(K=>K.id):[f];for(let K of V)if(!C().readCard(K))return z(`Card "${K}" not found in board at ${e.value}`);for(let K of V){let ie=C().readCard(K),ne=tr(ie),fe=t.hashFn(ne),ce=t.kvStorage("card-upsert"),ge=ce.read(K),me=ge?.taskConfigHash!==fe;if(!(!me&&!$)){if(me){let Q=ge?.blobRef??C().readCardKey(K)??K;h({type:"task-upsert",taskName:K,taskConfig:ne,timestamp:ae()}),ce.write(K,{blobRef:Q,taskConfigHash:fe,updatedAt:ae()});}$&&h({type:"task-restart",taskName:K,timestamp:ae()});}}return N(),te()}catch(f){return re(f)}}function T(w){try{let f=w.params?.token;if(!f)return z("taskFailed requires params.token");let I=w.params?.error??"unknown error",$=tt(f);return $?(h({type:"task-failed",taskName:$.taskName,error:I,timestamp:ae()}),N(),te()):z("Invalid callback token")}catch(f){return re(f)}}function M(w){try{let f=w.params?.token;if(!f)return z("taskProgress requires params.token");let $=(w.body??{}).update??{},V=tt(f);return V?(h({type:"task-progress",taskName:V.taskName,update:$,timestamp:ae()}),N(),te()):z("Invalid callback token")}catch(f){return re(f)}}function q(w){try{let f=w.params?.token,I=w.params?.ref;if(!f)return z("sourceDataFetched requires params.token");if(!I)return z("sourceDataFetched requires params.ref");let $=rr(f);if(!$)return z("Invalid source token");let{cbk:V,cid:K,b:ie,d:ne,cs:fe,rqt:ce}=$,ge=kt(t.blobStorage("sources"),ke=>t.resolveBlob(ke)),me=t.genId();ge.ingestSourceDataStaged(K,ne,be(I),me);let Q=tt(V);if(!Q)return z("Invalid callback token embedded in source token");let he=ae();return h({type:"task-progress",taskName:Q.taskName,update:{bindTo:ie,outputFile:ne,fetchedAt:he,deliveryToken:me,sourceChecksum:fe,rqt:ce},timestamp:he}),N(),te()}catch(f){return re(f)}}function J(w){try{let f=w.params?.token,I=w.params?.reason??"unknown";if(!f)return z("sourceDataFetchFailure requires params.token");let $=rr(f);if(!$)return z("Invalid source token");let{cbk:V,b:K,d:ie,cs:ne}=$,fe=tt(V);return fe?(h({type:"task-progress",taskName:fe.taskName,update:{bindTo:K,outputFile:ie,failure:!0,reason:I,sourceChecksum:ne},timestamp:ae()}),N(),te()):z("Invalid callback token embedded in source token")}catch(f){return re(f)}}function se(w){try{let f=i().readCardStoreRef();return f?te({storeRef:f}):z(`Board at ${e.value} has no card store configured`)}catch(f){return re(f)}}function Z(w){try{let f=i().readOutputsStoreRef();return f?te({storeRef:f}):z(`Board at ${e.value} has no outputs store configured`)}catch(f){return re(f)}}function Se(w){try{let f=w.params?.key;if(!f)return z("getConfig requires params.key");let I=i(),$;switch(f){case "task-executor":$=I.readTaskExecutorRef()??null;break;case "chat-handler":$=I.readChatHandlerRef()??null;break;case "card-store-ref":$=I.readCardStoreRef();break;case "outputs-store-ref":$=I.readOutputsStoreRef();break;default:return z(`getConfig: unknown key "${f}"`)}return te({value:$})}catch(f){return re(f)}}function ve(w){try{let f=w.params?.key;if(!f)return z("getOutputsDataObject requires params.key");let I=g().readDataObject(f);return te(I)}catch(f){return re(f)}}function we(w){try{return te(g().readAllDataObjects())}catch(f){return re(f)}}function D(w){try{let f=w.params?.key;if(!f)return z("getOutputsComputedValues requires params.key");let I=g().readComputedValues(f);return te(I)}catch(f){return re(f)}}function G(w){try{return te(g().readAllComputedValues())}catch(f){return re(f)}}return {init:S,status:j,getCardStoreRef:se,getOutputsStoreRef:Z,getConfig:Se,getOutputsDataObject:ve,getAllOutputsDataObjects:we,getOutputsComputedValues:D,getAllOutputsComputedValues:G,removeCard:P,retrigger:E,processAccumulatedEvents:O,upsertCard:A,taskFailed:T,taskProgress:M,sourceDataFetched:q,sourceDataFetchFailure:J}}function sr(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {get(s){try{let o=s.params?.id;if(o){let a=e.readCard(o);return a?t({cards:[a]}):r(`card "${o}" not found`)}return t({cards:e.readAllCards()})}catch(o){return n(o)}},set(s){try{let o=s.body;if(o==null)return r("set requires a body (card object or array of cards)");let a=Array.isArray(o)?o:[o];for(let i of a){if(typeof i.id!="string")return r("each card must have a string `id` field");e.writeCard(i.id,i);}return t({count:a.length})}catch(o){return n(o)}},del(s){try{let o=s.body?.ids??[],a=s.params?.id,i=a?[...o,a]:o;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let u of i)e.removeCard(u);return t({count:i.length})}catch(o){return n(o)}},patch(s){try{let o=s.params?.id,a=s.params?.path;if(!o)return r("patch requires params.id");if(!a)return r("patch requires params.path");let i=s.body,u=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:s.body;return e.patchCard(o,a,u),t({count:1})}catch(o){return n(o)}}}}var rt=".artifacts-index.json";function ar(){return new Date().toISOString()}function ir(e){return new TextEncoder().encode(e).byteLength}function Fe(e){let t=e.read(rt);if(!t)return {entries:{}};try{let r=JSON.parse(t);if(r&&r.entries&&typeof r.entries=="object")return r}catch{}return {entries:{}}}function Rt(e,t){e.write(rt,JSON.stringify(t,null,2));}function Xr(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function cr(e,t,r){e.entries[t]={key:t,size:r.size,updatedAt:r.updatedAt,contentType:r.contentType};}function bt(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function Yr(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function Qr(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Zr(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function en(e){let t=Yr(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function tn(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function St(e){function t(r){let n=e.stat?Xr(e.stat(r)):null;if(n)return n;let o=Fe(e).entries[r];if(o)return {...o};if(!e.exists(r))return null;let a=e.read(r);return a===null?{key:r}:{key:r,size:ir(a)}}return {exists(r){return e.exists(r)},putText(r,n,s="text/plain; charset=utf-8"){e.write(r,n);let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??ar(),o.size=o.size??ir(n);let a=Fe(e);return cr(a,r,o),Rt(e,a),o},putBytes(r,n,s="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,i);}let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??ar(),o.size=o.size??n.byteLength;let a=Fe(e);return cr(a,r,o),Rt(e,a),o},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let s=e.readBytes(r);return s===null?null:Buffer.from(s).toString("utf-8")}try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new TextDecoder("utf-8").decode(new Uint8Array(s.data))}catch{}return n},getBytes(r){if(e.readBytes){let s=e.readBytes(r);if(s!==null)return s}let n=e.read(r);if(n===null)return null;try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new Uint8Array(s.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){let n=new Map;if(e.listKeys)for(let o of e.listKeys(r)){if(o===rt)continue;let a=t(o)??{key:o};n.set(o,a);}let s=Fe(e);for(let[o,a]of Object.entries(s.entries))o===rt||r&&!o.startsWith(r)||n.has(o)||n.set(o,{...a});return [...n.values()].sort((o,a)=>o.key.localeCompare(a.key))},remove(r){e.remove(r);let n=Fe(e);delete n.entries[r],Rt(e,n);}}}function ur(e,t){let r=t?.indexFileName;function n(g){return `${g}/${r}`}function s(g){let k=e.getText(n(g));if(!k)return [];try{let b=JSON.parse(k);return Array.isArray(b)?b.filter(p=>p&&typeof p.stored_name=="string").map(p=>({serial:Number(p.serial||bt(String(p.stored_name))||0),role:String(p.role||"system").toLowerCase(),stored_name:String(p.stored_name),path:typeof p.path=="string"?p.path:`${g}/chats/${String(p.stored_name)}`,updated_at:typeof p.updated_at=="string"?p.updated_at:null})):[]}catch{return []}}function o(g,k){e.putText(n(g),JSON.stringify(k,null,2),"application/json; charset=utf-8");}function a(g){let k=s(g),b=0;for(let p of k){let h=Number(p.serial||0);Number.isFinite(h)&&h>b&&(b=h);}return b+1}function i(g,k){let b=s(g);b.push(k),o(g,b);}function u(g){let k=s(g),b=[];for(let p of k){let h=`${g}/${p.stored_name}`,B=e.getText(h);B!==null&&b.push({serial:Number(p.serial||bt(p.stored_name)||0),role:String(p.role||"system").toLowerCase(),text:B,path:typeof p.path=="string"?p.path:`${g}/chats/${p.stored_name}`,stored_name:p.stored_name,updated_at:p.updated_at||null});}return b.sort((p,h)=>p.serial-h.serial||p.stored_name.localeCompare(h.stored_name)),b}function m(g){let k=`${g}/`;for(let b of e.list(k))e.remove(b.key);}function C(g){let k=`${g}/`,b=e.list(k),p=0,h=0,B=false;for(let N of b){let S=N.key.slice(k.length);if(S===".processing"){B=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(S))continue;p+=1;let j=N.updatedAt?Number(new Date(N.updatedAt).getTime()||0):0;j>h&&(h=j);}return {count:p,latest_mtime_ms:h,processing:B}}return {indexKey:n,loadIndex:s,saveIndex:o,nextSerial:a,appendIndexRecord:i,readRecords:u,clear:m,readSignal:C}}function dr(e){function t(s,o){let a=0,i=[];Array.isArray(o)&&i.push(...o);for(let u of e.list(`${s}/`))i.push(tn(u.key));for(let u of i){let m=bt(u);Number.isFinite(m)&&m>a&&(a=m);}return a+1}function r(s,o,a){let i=Number(a?.maxLen||32),{stem:u,ext:m}=en(s),C=Zr(m),g=Qr(u),k=`${String(o).padStart(3,"0")}-`,b=C,p=i-k.length-b.length;p<1&&(b="",p=i-k.length);let h=g.slice(0,Math.max(1,p)),B=`${k}${h}${b}`;return B.length>i&&(B=B.slice(0,i).replace(/\.$/,"")),B}function n(s,o,a){let i=t(s,a?.seedNames),u=r(o,i,{maxLen:a?.maxLen});for(;e.exists(`${s}/${u}`);)i+=1,u=r(o,i,{maxLen:a?.maxLen});return u}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function lr(){function e(s,o){if(!Array.isArray(s))return [];let a=[];for(let i of s){if(!i||typeof i!="object")continue;let u=i;typeof u.stored_name=="string"&&a.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,path:typeof u.path=="string"?u.path:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:o||null});}return a}function t(s){return !s||typeof s!="object"?[]:e(s.files,void 0)}function r(s,o){let a=t(s);if(o.length===0)return s.files=a,a;let i=new Set(a.map(u=>u.stored_name));for(let u of o)i.has(u.stored_name)||(a.push(u),i.add(u.stored_name));return s.files=a,a}function n(s,o,a){let i=t(s);if(!Number.isInteger(o)||o<0||o>=i.length)return {ok:false,reason:"index_out_of_range"};let u=i[o];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}var rn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},nn=32;function on(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function fr(e,t){if(!t||typeof t!="object")return;let r=t;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)fr(e,n);return}r.kind==="status"&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card);}function pr(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...rn,...e.corsHeaders||{}},n=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},o=e.invocationAdapter,a=e.notificationTransport||null,i=e.serverUrl||null,u=e.executionExtra||{},m=new Set;function C(c){let d=or(c.baseRef,c.boardAdapter),l=c.boardAdapter.kvStorageForRef(c.cardStoreRef),v=sr(Qe({readIndex:()=>l.read("_index"),writeIndex:R=>l.write("_index",R),readCard:R=>l.read(R),writeCard:(R,F)=>(l.write(R,F),R),cardExists:R=>l.read(R)!==null,defaultCardKey:R=>R},s.warn)),x=c.artifactsAdapter||c.boardAdapter,L=null,y=null;return {label:c.label,board:d,cardStore:v,get filesArtifacts(){return L??(L=St(x.blobStorage("files")))},get chatsArtifacts(){return y??(y=St(x.blobStorage("chats")))},boardAdapter:c.boardAdapter,cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef,notifyRef:c.notifyRef,taskExecutorRef:c.taskExecutorRef,chatHandlerRef:c.chatHandlerRef,inferenceAdapterRef:c.inferenceAdapterRef,notification:on(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let g=e.boards.map(C),k=new Map;function b(c){return k.get(c)??0}function p(c){let d=g[b(c)];return {files:d?d.filesArtifacts:null,chats:d?d.chatsArtifacts:null}}function h(c){let d=p(c);return d.chats?ur(d.chats,{indexFileName:".index.json"}):null}function B(c){let d=p(c);return d.files?dr(d.files):null}function N(){return lr()}function S(c){return String(c||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function j(c){if(!c||c.notificationTeardown||!a||!c.notifyRef)return;let d=await a.subscribe(c.notifyRef,l=>{fr(c.notification,l);let _=l.kind==="notification-batch"?l.notifications:[l];at(_);});c.notificationTeardown=d;}async function P(c){if(!c||c.initialized)return;let d={cardStoreRef:c.cardStoreRef,outputsStoreRef:c.outputsStoreRef},l={};c.taskExecutorRef&&(l["task-executor-ref"]=c.taskExecutorRef),c.chatHandlerRef&&(l["chat-handler-ref"]=c.chatHandlerRef),c.inferenceAdapterRef&&(l["inference-adapter-ref"]=c.inferenceAdapterRef);let _=c.board.init({params:d,body:l});if(_.status!=="success")throw Object.assign(new Error(_.error||`init failed for ${c.label}`),{statusCode:500});if(await j(c),c.chatHandlerRef&&o.describe)try{let v=await o.describe(c.chatHandlerRef);v&&v.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${v.kind}", expected "chat-handler" for ${c.label}`):v&&s.info(`[init] chat-handler validated: ${v.name} (protocol ${v.protocolVersion}) for ${c.label}`);}catch(v){s.warn(`[init] chat-handler describe failed for ${c.label}: ${v?.message||String(v)}`);}c.initialized=true;}function E(c){if(!c.boardAdapter.publishBoardChangeNotifications)return;let d=[],l=c.board.status({});l.status==="success"&&l.data!=null&&d.push({kind:"status",status:l.data});let _=c.board.getAllOutputsDataObjects({});if(_.status==="success"&&_.data!=null)for(let[x,L]of Object.entries(_.data))x&&d.push({kind:"data_object",key:x,payload:L});let v=c.board.getAllOutputsComputedValues({});if(v.status==="success"&&v.data!=null)for(let[x,L]of Object.entries(v.data))x&&d.push({kind:"computed_values",cardId:x,values:L});d.length>0&&c.boardAdapter.publishBoardChangeNotifications(d);}function O(c,d){if(!c||c.cardsBootstrapped)return;let l=c.cardStore.get({}),_=l.status==="success"&&Array.isArray(l.data?.cards)?l.data.cards:[];for(let v of _)typeof v.id=="string"&&(k.set(v.id,d),c.board.upsertCard({params:{cardId:v.id}}));c.cardsBootstrapped=true;}async function A(){for(let c of g)await P(c);}async function T(){await A();for(let c=0;c<g.length;c++)E(g[c]),O(g[c],c);}function M(c){return g[b(c)]??null}function q(c){let d=M(c);if(!d)return null;let l=d.cardStore.get({params:{id:c}});if(l.status!=="success")return null;let _=Array.isArray(l.data?.cards)?l.data.cards:[];return _.length>0?_[0]:null}function J(){let c=l=>{if(!l||!l.cardStore)return [];let _=l.cardStore.get({});return _.status!=="success"||!Array.isArray(_.data?.cards)?[]:_.data.cards},d=[];for(let l of g)d.push(...c(l));return d}function se(){let c=g.map(x=>{try{let y=x.boardAdapter.kvStorageForRef(x.outputsStoreRef).read("status");if(y!=null)return y}catch{}return x.notification.status}).filter(Boolean);if(c.length===0)return null;if(c.length===1)return c[0];let d=[],l=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],_={};for(let x of l)_[x]=0;for(let x of c){let L=x,y=Array.isArray(L.cards)?L.cards:[];d.push(...y);for(let R of l)_[R]+=Number(L?.summary?.[R]||0);}let v=c[0];return {...v,cards:d,summary:{...v.summary||{},card_count:d.length,..._}}}function Z(){let c={},d=l=>{for(let[_,v]of Object.entries(l.notification.computedValues)){let x=l.notification.cards[_];c[_]={schema_version:"v1",card_id:_,card_data:x?.card_data??{},computed_values:v??{}};}};for(let l of g)d(l);return c}function Se(){let c={};for(let d of g)Object.assign(c,d.notification.dataObjects||{});return c}function ve(c){let d=S(c),l=h(c);return l?l.readSignal(d):{count:0,latest_mtime_ms:0,processing:false}}function we(){let c=J(),d=Z(),l=Se(),_={};for(let v of c){if(!v?.id)continue;let x=v.id,L=d[x]||{},y=ve(x),R={...L.card_data&&typeof L.card_data=="object"?L.card_data:v.card_data&&typeof v.card_data=="object"?v.card_data:{},__chat_signal:y};_[x]={schema_version:L.schema_version||"v1",card_id:L.card_id||x,card_data:R,computed_values:L.computed_values&&typeof L.computed_values=="object"?L.computed_values:{}};}return {boardId:n,cardDefinitions:c,statusSnapshot:se(),dataObjectsByToken:l,cardRuntimeById:_}}function D(c,d,l){let _=l?.syncBoard!==false,v=M(c);if(!v)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let x=q(c);if(!x)throw Object.assign(new Error(`Card not found: ${c}`),{statusCode:404});let L=d(x)||x,y=v.cardStore.set({body:L});if(y.status!=="success")throw Object.assign(new Error(y.error||`Failed to persist card: ${c}`),{statusCode:500});if(_){let R=v.board.upsertCard({params:{cardId:c,restart:true}});if(R.status!=="success")throw Object.assign(new Error(R.error||`Failed to upsert card: ${c}`),{statusCode:500})}}function G(c,d){D(c,d,{syncBoard:true});}function w(c,d){D(c,d,{syncBoard:false});}function f(c,d){G(c,l=>{if(!d||typeof d!="object"||Object.keys(d).length===0)return l;function _(v,x,L){let y=String(x||"").split(".").filter(Boolean);if(!y.length)return;let R=v;for(let F=0;F<y.length-1;F++){let U=y[F];(!R[U]||typeof R[U]!="object")&&(R[U]={}),R=R[U];}R[y[y.length-1]]=L;}if(d.fieldValues&&typeof d.fieldValues=="object"){let v=null,x=l.view;if(x&&Array.isArray(x.elements)){for(let L of x.elements)if(L?.data&&L.data.writeTo){v=L.data.writeTo;break}}v?_(l,v,d.fieldValues):l.card_data={...l.card_data||{},...d.fieldValues};}else {if(Array.isArray(d._stagedFiles)&&d._stagedFiles.length>0)return l;for(let[v,x]of Object.entries(d))v!=="_stagedFiles"&&(x!==null&&typeof x=="object"&&!Array.isArray(x)&&l[v]!==null&&typeof l[v]=="object"&&!Array.isArray(l[v])?l[v]={...l[v],...x}:l[v]=x);}return l});}function I(c){let d=String(c||"").match(/^(\d+)[-_]/);return d?parseInt(d[1],10):0}function $(c){let d=String(c||"").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 V(c){let d=S(c),l=h(c);l&&l.clear(d);}function K(c,d){let l=S(c),_=h(c),v=_?_.nextSerial(l):1,x=String(d||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(v).padStart(3,"0")}_${x}.txt`}function ie(c,d,l,_){let v=new Date().toISOString(),x=S(c),L=p(c),y=K(c,d||"system"),R=`${x}/${y}`,F=[],U=typeof l=="string"?l.trim():"";U&&F.push(U);let H=Array.isArray(_)?_:[];if(H.length){F.length&&F.push(""),F.push("files:");for(let W of H){if(!W||typeof W!="object")continue;let ue=typeof W.name=="string"?W.name:"file",de=typeof W.stored_name=="string"?W.stored_name:"";F.push(de?`- ${ue} -> ${de}`:`- ${ue}`);}}L.chats&&L.chats.putText(R,`${F.join(`
|
|
2
|
+
`)}
|
|
3
|
+
`);let X=I(y),ee=h(c);return ee&&ee.appendIndexRecord(x,{serial:X,role:d||"system",stored_name:y,path:`${c}/chats/${y}`,updated_at:v}),{at:v,role:d||"system",text:U,files:H,path:`${c}/chats/${y}`}}function ne(c){let d=S(c),l=h(c);return l?l.readRecords(d).map(_=>({..._,path:`${c}/chats/${_.stored_name}`})):[]}function fe(c){let d=[];try{let l=q(c);if(!l)return d;let _=N().read(l.card_data&&typeof l.card_data=="object"?l.card_data:null);for(let v of _)d.push(v.stored_name);}catch{}return d}function ce(c,d,l,_){let v=S(c),x=p(c),L=$(d),y=B(c),R=y?y.allocateStoredName(v,L,{seedNames:fe(c),maxLen:nn}):`${String(Date.now())}-${L}`;return x.files&&x.files.putBytes(`${v}/${R}`,new Uint8Array(_),l||"application/octet-stream"),{name:L,stored_name:R,size:_.length,mime_type:l||"application/octet-stream",path:`${c}/files/${R}`,uploaded_at:new Date().toISOString()}}function ge(c,d,l){let _=M(c);if(!_)return;let v=_.board.getConfig({params:{key:"chat-handler"}});if(v.status!=="success")return;let x=v.data?.value;if(!x||typeof x!="object")return;let L=S(c),y=p(c),R=`${L}/.processing`;try{y.chats?.putText(R,"","text/plain; charset=utf-8");}catch{}let F={boardId:n,cardId:String(c),chatsKeyPrefix:d,chatProcessingMarkerKey:R,lastChatFile:l,...u,...i?{serverUrl:i}:{}};o.invoke(x,F).then(U=>{if(U.dispatched)s.info(`[chat-handler] invoked for card "${c}" (boardId: "${n}")`);else {try{y.chats?.remove(R);}catch{}s.warn(`[chat-handler] dispatch failed for card "${c}": ${U.error||"unknown"}`);}},U=>{try{y.chats?.remove(R);}catch{}s.warn(`[chat-handler] invoke failed for card "${c}": ${U?.message||String(U)}`);});}function me(c,d,l){let _=d==="chat-send"?w:G,v;_(c,x=>{let L=new Date().toISOString(),y=x.card_data&&typeof x.card_data=="object"?x.card_data:{};if(x.card_data=y,d==="chat-send"){let R=l&&typeof l.text=="string"?l.text.trim():"",F=[];if(Array.isArray(l?.files)){for(let U of l.files)if(U){if(typeof U=="string"){F.push({name:U});continue}if(typeof U=="object"){let H=U;typeof H.name=="string"&&F.push({name:H.name,size:H.size,mime_type:H.mime_type,path:H.path,uploaded_at:H.uploaded_at,stored_name:H.stored_name});}}}if(R||F.length>0){let U=S(c),X=ie(c,"user",R,F).path,ee=X.includes("/")?X.slice(X.lastIndexOf("/")+1):X;v={chatsKeyPrefix:`${U}/chats`,lastChatFile:ee};for(let W of F){if(!W||typeof W!="object")continue;let ue=typeof W.name=="string"?W.name:"file",de=typeof W.stored_name=="string"?W.stored_name:null;de&&ie(c,"system",`File ${ue} uploaded as ${de}.`,[]);}}return x}if(d==="file-upload"){let R=N().normalizeIncoming(l?.files,L);return R.length>0&&N().merge(y,R),x}if(d==="action"){let R=l&&typeof l.buttonId=="string"?l.buttonId:"";if(!R)return x;y.lastAction={buttonId:R,at:L},y.lastActionText=`${R} @ ${L}`;}return x}),v&&ge(c,v.chatsKeyPrefix,v.lastChatFile);}function Q(c,d,l){let _=JSON.stringify(l),v=typeof Buffer<"u"?Buffer.byteLength(_):new TextEncoder().encode(_).length;c.writeHead(d,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":v}),c.end(_);}async function he(c){let d=[];for await(let _ of c)d.push(_);let l=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(_e(d)).trim();return l?JSON.parse(l):{}}async function ke(c){let d=[];for await(let l of c)d.push(l);return typeof Buffer<"u"?Buffer.concat(d):_e(d)}function _e(c){let d=c.reduce((v,x)=>v+x.length,0),l=new Uint8Array(d),_=0;for(let v of c)l.set(v,_),_+=v.length;return l}let Ae=0;function je(c){let d=JSON.stringify(c);return Ae++,`id: ${Ae}
|
|
4
|
+
data: ${d}
|
|
5
|
+
|
|
6
|
+
`}function at(c){if(!c||c.length===0)return;let d=je({kind:"notification-batch",notifications:c});for(let l of m)try{l.write(d);}catch{m.delete(l);}}function qe(c,d){d.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),m.add(d);let l=we(),_=je(l);d.write(_);let v=setInterval(()=>{try{d.write(`: keepalive
|
|
7
|
+
|
|
8
|
+
`);}catch{}},15e3);c.on("close",()=>{clearInterval(v),m.delete(d),d.end();});}async function xt(c,d,l){let _=c.method||"GET",v=l,x=v.pathname;try{if(_==="GET"&&x===`${t}/init-board`)return await A(),Q(d,200,we()),!0;if(_==="GET"&&x===`${t}/sse`)return await T(),qe(c,d),!0;if(_==="GET"&&x===`${t}/board-status`)return Q(d,200,we()),!0;let L=x.match(new RegExp(`^${De(t)}/cards/([^/]+)$`));if(_==="PATCH"&&L){await T();let H=decodeURIComponent(L[1]),X=await he(c);return f(H,X),Q(d,200,{ok:!0}),!0}let y=x.match(new RegExp(`^${De(t)}/cards/([^/]+)/actions$`));if(_==="POST"&&y){await T();let H=decodeURIComponent(y[1]),X=await he(c);return me(H,X?.actionType,X?.payload),Q(d,200,{ok:!0}),!0}let R=x.match(new RegExp(`^${De(t)}/cards/([^/]+)/chats$`));if(_==="GET"&&R){await T();let H=decodeURIComponent(R[1]);return Q(d,200,{ok:!0,messages:ne(H)}),!0}let F=x.match(new RegExp(`^${De(t)}/cards/([^/]+)/files$`));if(_==="POST"&&F){await T();let H=decodeURIComponent(F[1]),X=String(v.searchParams.get("inChat")||"").toLowerCase()==="true",ee=c.headers["x-file-name"],W=String(c.headers["content-type"]||"application/octet-stream"),ue=Array.isArray(ee)?ee[0]:ee,de=ue?decodeURIComponent(String(ue)):"upload.bin",He=await ke(c);if(!He.length)return Q(d,400,{error:"Empty upload body"}),!0;let le=ce(H,de,W,He);return X&&(w(H,Ce=>{let Te=new Date().toISOString(),Me=Ce.card_data&&typeof Ce.card_data=="object"?Ce.card_data:{};Ce.card_data=Me;let it=N().normalizeIncoming([{name:le.name,stored_name:le.stored_name,size:le.size,mime_type:le.mime_type,path:le.path,uploaded_at:le.uploaded_at||Te}],Te);return N().merge(Me,it),Ce}),ie(H,"system",`file uploaded: ${le.name} as ${le.stored_name}`,[])),Q(d,200,{ok:!0,file:le}),!0}let U=x.match(new RegExp(`^${De(t)}/cards/([^/]+)/files/(\\d+)$`));if(_==="GET"&&U){let H=decodeURIComponent(U[1]),X=parseInt(U[2],10),ee=v.searchParams.get("sn"),W=q(H);if(!W)return Q(d,404,{error:"Card not found"}),!0;let ue=N().resolve(W.card_data,X,ee);if(!ue.ok&&ue.reason==="stale_reference")return Q(d,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ue.ok)return Q(d,404,{error:"File not found"}),!0;let de=ue.file,He=S(H),le=p(H),Ce=`${He}/${de.stored_name}`,Te=le.files?le.files.getBytes(Ce):null;if(!Te)return Q(d,404,{error:"File not found"}),!0;let Me=de.name||de.stored_name,it=de.mime_type||"application/octet-stream";return d.writeHead(200,{"Content-Type":it,"Content-Disposition":`attachment; filename="${Me}"`,"Content-Length":Te.length}),d.end(Te),!0}return !1}catch(L){let y=L?.statusCode||500;return Q(d,y,{error:String(L?.message||L)}),true}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleRuntimeApi:xt,buildPublishedRuntimePayload:we,clearChatRecords:V,reportSourceFetched(c,d){let l=g[0];return l?l.board.sourceDataFetched({params:{token:c,ref:d}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(c,d){let l=g[0];return l?l.board.sourceDataFetchFailure({params:{token:c,reason:d}}):{status:"fail",error:"no board context"}},get cardStore(){return g[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function De(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function vt(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(vt).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${vt(t[n])}`).join(",")}}`}function nt(e,t){let r=t>>>0;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function gr(e){let t=vt(e),r=nt(t,2166136261),n=nt(t,3735928559),s=nt(t,19088743),o=nt(t,4277009102);return [r,n,s,o].map(a=>a.toString(16).padStart(8,"0")).join("")}function wt(e){function t(o){return `${e}:blob:${o}`}let r=new TextEncoder;function n(o){if(typeof btoa=="function"){let a="";for(let i=0;i<o.length;i++)a+=String.fromCharCode(o[i]);return btoa(a)}return ""}function s(o){if(typeof atob=="function"){let a=atob(o),i=new Uint8Array(a.length);for(let u=0;u<a.length;u++)i[u]=a.charCodeAt(u);return i}return new Uint8Array}return {read(o){return globalThis.localStorage.getItem(t(o))},write(o,a){globalThis.localStorage.setItem(t(o),a);},exists(o){return globalThis.localStorage.getItem(t(o))!==null},remove(o){globalThis.localStorage.removeItem(t(o));},readBytes(o){let a=globalThis.localStorage.getItem(t(o));if(a===null)return null;try{let i=JSON.parse(a);if(i&&i.__kind==="bytes-b64"&&typeof i.data=="string")return s(i.data)}catch{}return r.encode(a)},writeBytes(o,a){let i=JSON.stringify({__kind:"bytes-b64",data:n(a)});globalThis.localStorage.setItem(t(o),i);},listKeys(o){let a=t(o??""),i=[];for(let u=0;u<globalThis.localStorage.length;u++){let m=globalThis.localStorage.key(u);m&&m.startsWith(a)&&i.push(m.slice(t("").length));}return i.sort()},stat(o){let a=globalThis.localStorage.getItem(t(o));if(a===null)return null;let i=r.encode(a).byteLength;try{let u=JSON.parse(a);u&&u.__kind==="bytes-b64"&&typeof u.data=="string"&&(i=s(u.data).byteLength);}catch{}return {key:o,size:i}}}}function Ct(e){function t(r){return `${e}:kv:${r}`}return {read(r){let n=globalThis.localStorage.getItem(t(r));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(r,n){globalThis.localStorage.setItem(t(r),JSON.stringify(n));},delete(r){globalThis.localStorage.removeItem(t(r));},listKeys(r){let n=t(r??""),s=[];for(let o=0;o<globalThis.localStorage.length;o++){let a=globalThis.localStorage.key(o);a!==null&&a.startsWith(n)&&s.push(a.slice(t("").length));}return s}}}function mr(e){function t(){let n=globalThis.localStorage.getItem(e);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function r(n){globalThis.localStorage.setItem(e,JSON.stringify(n));}return {readAllEntries(){return t()},appendEntry(n){let s=t();s.push(n),r(s);},generateId(){return globalThis.crypto.randomUUID()}}}function sn(){let e=false;return {tryAcquire(){return e?null:(e=true,()=>{e=false;})}}}var hr=new Map;function ot(e){let t=hr.get(e);if(!t){let r=new Set;t={publish(n){for(let s of r)s(n);},subscribe(n){return r.add(n),()=>{r.delete(n);}}},hr.set(e,t);}return t}function kr(){return {async subscribe(e,t){return e.kind!=="in-memory-bus"?(console.warn(`[in-memory-transport] unsupported kind: ${e.kind}`),()=>{}):ot(e.value).subscribe(n=>{let s=n;if(s&&s.kind==="notification-batch"&&Array.isArray(s.notifications)){for(let o of s.notifications)t(o);return}t(n);})}}}function yr(e,t){let r=t?.callbackBaseUrl?{meta:"board-live-cards",howToRun:"http:post",whatToRun:t.callbackBaseUrl}:{meta:"board-live-cards",howToRun:"in-browser",whatToRun:Y({kind:"in-browser",value:e})},n=new Map,s=new Map,o=sn();return {kvStorage:a=>Ct(`${e}:${a}`),blobStorage:a=>wt(a?`${e}:${a}`:e),journalAdapter:()=>mr(`${e}:journal`),lock:o,selfRef:r,async dispatchExecution(a,i){if(a.howToRun==="http:post")try{let u=a.whatToRun.startsWith("b64:")?be(a.whatToRun).value:a.whatToRun,m=await fetch(u,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return m.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${m.status}: ${m.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(a.howToRun==="http:get")try{let u=a.whatToRun.startsWith("b64:")?be(a.whatToRun).value:a.whatToRun,m=new URLSearchParams(Object.entries(i).filter(([,k])=>k!=null).map(([k,b])=>[k,String(b)])),C=`${u}?${m.toString()}`,g=await fetch(C);return g.ok?{dispatched:!0}:{dispatched:!1,error:`HTTP ${g.status}: ${g.statusText}`}}catch(u){return {dispatched:false,error:u instanceof Error?u.message:String(u)}}if(a.howToRun==="in-browser"){let u=n.get(a.whatToRun);return u?u(a,i):{dispatched:false,error:`No in-browser handler registered for: ${a.whatToRun}`}}return {dispatched:false,error:`Browser adapter: unsupported dispatch kind (got: ${a.howToRun})`}},resolveBlob(a){if(a.kind==="in-memory"){let m=s.get(a.value);if(m==null)throw new Error(`resolveBlob: in-memory blob not found: ${Y(a)}`);return m}let u=wt(e).read(a.value);if(u===null)throw new Error(`resolveBlob: blob not found: ${Y(a)}`);return u},hashFn:gr,genId:()=>globalThis.crypto.randomUUID().replace(/-/g,""),kvStorageForRef:a=>Ct(be(a).value),publishBoardChangeNotifications(a){if(!t?.notifyChannel||a.length===0)return;ot(t.notifyChannel).publish({kind:"notification-batch",notifications:a});},onWarn:t?.onWarn,registerHandler(a,i){n.set(a,i);},writeMemoryBlob(a,i){return s.set(a,i),Y({kind:"in-memory",value:a})}}}function Rr(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function fn(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function Pe(e,t){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!t)throw new Error("cardId is required");let n=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(B=>B.id===t);if(!n)throw new Error(`cardDefinitions has no entry with id ${t}`);let s=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},o=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},a=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},u=(Array.isArray(s.cards)?s.cards:[]).find(B=>B.name===t),m=structuredClone(n),C=fn(t,o[t]),k={...m.card_data&&typeof m.card_data=="object"&&!Array.isArray(m.card_data)?m.card_data:{},...C.card_data||{},status:Rr(u?.status),lastRun:u?.runtime?.last_transition_at??null};u?.error?.message&&(k.error=u.error.message);let b=u?{task_status:u.status??null,card_status:Rr(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:k.status??"fresh",runtime:{last_transition_at:k.lastRun??null},error:k.error?{message:k.error}:null,blocked_by:[],requires_missing:[]},p=Array.isArray(m.requires)?m.requires:[],h={};for(let[B,N]of Object.entries(a))h[B]=structuredClone(N);for(let B of p)Object.prototype.hasOwnProperty.call(h,B)||(h[B]=null);return {id:t,card:m,card_data:k,requires:h,computed_values:C.computed_values,runtime_state:b}}function pn(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(r=>Pe(e,r.id))}function st(e){return JSON.parse(JSON.stringify(e))}function Ge(e,t){if(e===t)return e;try{if(JSON.stringify(e)===JSON.stringify(t))return e}catch{}return t}function Re(e,t){if(e===t)return true;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}}function gn(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function br(e,t,r){let n=e,o=(n&&Array.isArray(n.cardDefinitions)?n.cardDefinitions:[]).map(u=>u.id),a=t&&t.modelsById||{},i={};for(let u of o){let m=r(e,u),C=a[u];if(!C){i[u]=m;continue}let g={id:m.id,card:Ge(C.card,m.card),card_data:Ge(C.card_data,m.card_data),requires:Ge(C.requires,m.requires),computed_values:Ge(C.computed_values,m.computed_values),runtime_state:Ge(C.runtime_state,m.runtime_state)};i[u]=g.card===C.card&&g.card_data===C.card_data&&g.requires===C.requires&&g.computed_values===C.computed_values&&g.runtime_state===C.runtime_state?C:g;}return {payload:e,cardIds:o,modelsById:i}}function Sr(e,t,r,n){if(!e||!Array.isArray(t)||t.length===0)return e;let s=e.modelsById,o=e.cardIds,a=false,i=false,u={};for(let C of o){let g=s[C],k=g&&g.requires;if(k&&typeof k=="object")for(let b of Object.keys(k))(u[b]=u[b]||[]).push(C);}function m(){a||(s={...s},a=true);}for(let C of t)if(!(!C||!C.kind)){if(C.kind==="computed_values"){let g=C.cardId,k=s[g];if(!k)continue;let b=C.values||{};if(Re(k.computed_values,b))continue;m(),s[g]={...k,computed_values:b},i=true;}else if(C.kind==="data_object"){let g=C.key,k=C.payload,b=u[g]||[];for(let p of b){let h=s[p];if(!h)continue;let B=h.requires||{};Re(B[g],k)||(m(),s[p]={...h,requires:{...B,[g]:k}},i=true);}}else if(C.kind==="card_refreshed"){let g=C.cardId,k=null;try{let p=n();p&&(k=r(p,g));}catch{}if(!k)continue;let b=s[g];if(b&&Re(b.card,k.card)&&Re(b.card_data,k.card_data)&&Re(b.requires,k.requires)&&Re(b.computed_values,k.computed_values)&&Re(b.runtime_state,k.runtime_state))continue;m(),s[g]=k,o.includes(g)||(o=[...o,g]),i=true;}else if(C.kind==="status"){let g=C.status?.cards??[];for(let k of g){let b=k?.name;if(!b||!s[b])continue;let p=s[b],h=gn(k.status),B={...p.card_data||{},status:h,lastRun:k.runtime?.last_transition_at??null,...k.error?.message?{error:k.error.message}:{}};k.error?.message||delete B.error;let N={task_status:k.status??null,card_status:h,runtime:k.runtime?st(k.runtime):{},error:k.error?st(k.error):null,blocked_by:Array.isArray(k.blocked_by)?st(k.blocked_by):[],requires_missing:Array.isArray(k.requires_missing)?st(k.requires_missing):[]};Re(p.card_data,B)&&Re(p.runtime_state,N)||(m(),s[b]={...p,card_data:B,runtime_state:N},i=true);}}}return i?{payload:e.payload,cardIds:o,modelsById:s}:e}function Rs(e,t){let r=t?.cards??[],n=t?.onWarn??(()=>{}),s=`${e}:notify`,o=yr(e,{callbackBaseUrl:t?.callbackBaseUrl,notifyChannel:s,onWarn:n}),a=be(Y({kind:"localstorage",value:e})),i=Y({kind:"localstorage",value:`${e}:card-store`}),u=Y({kind:"localstorage",value:`${e}:outputs`}),m=t?.taskExecutor??null,C=t?.chatHandler??null,g=Y({kind:"in-browser",value:`${e}:task-executor`}),k=Y({kind:"in-browser",value:`${e}:chat-handler`});m&&o.registerHandler(g,m),C&&o.registerHandler(k,C);let b={async invoke(E,O){return E.howToRun==="in-browser",o.dispatchExecution(E,O)}},p=t?.taskExecutorRef??(m?{meta:"task-executor",howToRun:"in-browser",whatToRun:g}:void 0),h=t?.chatHandlerRef??(C?{meta:"chat-handler",howToRun:"in-browser",whatToRun:k}:void 0),B=kr(),N=pr({boardId:e,boards:[{label:e,boardAdapter:o,baseRef:a,cardStoreRef:i,outputsStoreRef:u,notifyRef:{kind:"in-memory-bus",value:s},taskExecutorRef:p,chatHandlerRef:h}],invocationAdapter:b,notificationTransport:B,logger:{info:(...E)=>console.log("[board]",...E),warn:(...E)=>{n(String(E[0])),console.warn("[board]",...E);},error:(...E)=>console.error("[board]",...E)}});r.length&&N.cardStore.set({body:r}),t?.onBoardChange&&ot(s).subscribe(O=>{let A=O;!A||A.kind!=="notification-batch"||!Array.isArray(A.notifications)||A.notifications.length===0||t.onBoardChange?.({notifications:A.notifications});});function S(E,O,A){let T=A?JSON.stringify(A):"",M=new TextEncoder().encode(T),q=false;return {method:E,url:O,headers:{"content-type":"application/json"},on(J,se){},[Symbol.asyncIterator](){let J={async next(){return q?{done:true,value:void 0}:(q=true,{done:false,value:M})},[Symbol.asyncIterator](){return J}};return J}}}function j(){let E=200,O=[];return {res:{writeHead(T){E=T;},write(T){return O.push(typeof T=="string"?T:new TextDecoder().decode(T)),true},end(T){T&&O.push(typeof T=="string"?T:new TextDecoder().decode(T));}},getResult:()=>{let T=O.join(""),M;try{M=JSON.parse(T);}catch{M=T;}return {status:E,body:M}}}}let P=N.apiBasePath;return {async bootstrap(){let E=S("GET",`${P}/bootstrap`),{res:O}=j();await N.handleRuntimeApi(E,O,new URL(`http://localhost${P}/bootstrap`));},getState(){return N.buildPublishedRuntimePayload()},async patchCard(E,O){let A=`${P}/cards/${encodeURIComponent(E)}`,T=S("PATCH",A,O),{res:M}=j();await N.handleRuntimeApi(T,M,new URL(`http://localhost${A}`));},async applyCardAction(E,O,A){let T=`${P}/cards/${encodeURIComponent(E)}/actions`,M=S("POST",T,{actionType:O,payload:A}),{res:q}=j();await N.handleRuntimeApi(M,q,new URL(`http://localhost${T}`));},readChatRecords(E){let O=`${P}/cards/${encodeURIComponent(E)}/chats`,A=S("GET",O),T=j();N.handleRuntimeApi(A,T.res,new URL(`http://localhost${O}`));let q=T.getResult().body;return Array.isArray(q?.messages)?q.messages:[]},clearChatRecords(E){N.clearChatRecords(E);},writeMemoryBlob(E,O){return o.writeMemoryBlob(E,O)},reportSourceFetched(E,O){N.reportSourceFetched(E,O);},reportSourceFetchFailure(E,O){N.reportSourceFetchFailure(E,O);},get runtime(){return N}}}function vs(e,t){return br(e,t,Pe)}function ws(e,t,r){return Sr(e,t,Pe,r)}
|
|
9
|
+
exports.applyNotification=ws;exports.buildBoardState=vs;exports.create=Rs;exports.selectAllLiveCardModels=pn;exports.selectLiveCardModel=Pe;return exports;})({});//# sourceMappingURL=board-livecards-localstorage.js.map
|
|
10
|
+
//# sourceMappingURL=board-livecards-localstorage.js.map
|