yaml-flow 8.7.1 → 8.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/adapters/firebase-storage.js +2 -2
- package/browser/adapters/firestore-storage.js +2 -2
- package/browser/adapters/localstorage-storage.js +3 -3
- package/browser/asset-integrity.json +9 -13
- package/browser/server-runtime-controlface.js +5 -5
- package/examples/ARCHITECTURE.md +0 -27
- package/examples/board/server/board-server.js +150 -100
- package/examples/board/server/board-worker/source_def_flows.json +0 -8
- package/examples/board/server/board-worker/task-executor.js +1 -3
- package/examples/board/test/server-http-test.js +108 -73
- package/examples/board-firestore/server/worker.js +8 -0
- package/examples/portfolio-tracker/portfolio-tracker.js +11 -1
- package/examples/portfolio-tracker/test/portfolio-t4.js +12 -2
- package/lib/{artifacts-store-lib-D9nMkVcE.d.cts → artifacts-store-lib-C6qBpMfU.d.cts} +1 -1
- package/lib/{artifacts-store-lib-DSSMqVL2.d.ts → artifacts-store-lib-D4qf7Q-7.d.ts} +1 -1
- package/lib/artifacts-store-public.d.cts +3 -3
- package/lib/artifacts-store-public.d.ts +3 -3
- package/lib/board-live-cards-mcp.cjs +1 -1
- package/lib/board-live-cards-mcp.d.cts +6 -7
- package/lib/board-live-cards-mcp.d.ts +6 -7
- package/lib/board-live-cards-mcp.js +1 -1
- package/lib/board-live-cards-node.cjs +8 -8
- package/lib/board-live-cards-node.d.cts +15 -14
- package/lib/board-live-cards-node.d.ts +15 -14
- package/lib/board-live-cards-node.js +8 -8
- package/lib/{board-live-cards-public-LlVUQPL2.d.cts → board-live-cards-public-BT5HrgqZ.d.cts} +82 -59
- package/lib/{board-live-cards-public-JNRKfBZy.d.ts → board-live-cards-public-DSRamFm8.d.ts} +82 -59
- package/lib/{board-live-cards-public-async-Di9QB141.d.cts → board-live-cards-public-async-CYjr4mgX.d.cts} +18 -8
- package/lib/{board-live-cards-public-async-fwd1QI82.d.ts → board-live-cards-public-async-DlyC3PgC.d.ts} +18 -8
- package/lib/board-live-cards-public.cjs +1 -1
- package/lib/board-live-cards-public.d.cts +2 -2
- package/lib/board-live-cards-public.d.ts +2 -2
- package/lib/board-live-cards-public.js +1 -1
- package/lib/board-live-cards-server-runtime.cjs +1 -1
- package/lib/board-live-cards-server-runtime.d.cts +6 -8
- package/lib/board-live-cards-server-runtime.d.ts +6 -8
- package/lib/board-live-cards-server-runtime.js +1 -1
- package/lib/{board-platform-adapter-async-BfHmHdx2.d.cts → board-platform-adapter-async-BZIftm36.d.cts} +18 -14
- package/lib/{board-platform-adapter-async-DYahVzIK.d.ts → board-platform-adapter-async-JP9V-U5E.d.ts} +18 -14
- package/lib/board-worker-adapter.cjs +1 -24
- package/lib/board-worker-adapter.d.cts +68 -3
- package/lib/board-worker-adapter.d.ts +68 -3
- package/lib/board-worker-adapter.js +1 -24
- package/lib/card-store-public.d.cts +2 -2
- package/lib/card-store-public.d.ts +2 -2
- package/lib/chat-store-public.cjs +1 -1
- package/lib/chat-store-public.d.cts +20 -20
- package/lib/chat-store-public.d.ts +20 -20
- package/lib/chat-store-public.js +1 -1
- package/lib/chunk-2GSI6C45.js +7 -0
- package/lib/chunk-35N7ONTH.js +2 -0
- package/lib/chunk-37HDEW26.cjs +2 -0
- package/lib/{chunk-PMUSJQSR.cjs → chunk-3CZCGNY4.cjs} +2 -2
- package/lib/{chunk-BQS3EIEK.js → chunk-44L64VQ2.js} +3 -3
- package/lib/chunk-6OPXQPSC.js +2 -0
- package/lib/chunk-7BTZCOT5.js +2 -0
- package/lib/{chunk-U2N6MCD5.cjs → chunk-7JVHYHT2.cjs} +2 -2
- package/lib/chunk-7QZ267XP.cjs +2 -0
- package/lib/{chunk-XQRNDX4Q.js → chunk-ANKA7HEJ.js} +2 -2
- package/lib/{chunk-KAWQPLIE.cjs → chunk-BQUQTOPB.cjs} +2 -2
- package/lib/chunk-CMFD27ZC.cjs +3 -0
- package/lib/chunk-DOFNXJ4C.js +3 -0
- package/lib/chunk-ETW3BXHD.cjs +2 -0
- package/lib/{chunk-SGV7PU4H.js → chunk-FOFGEABN.js} +2 -2
- package/lib/chunk-GPCMBPLK.cjs +2 -0
- package/lib/chunk-GU3T75C4.js +3 -0
- package/lib/chunk-H3EHFCDZ.js +3 -0
- package/lib/chunk-H4TYOSMD.cjs +45 -0
- package/lib/chunk-HFW7E2Z7.cjs +4 -0
- package/lib/chunk-IQIZA7TN.cjs +7 -0
- package/lib/chunk-J4MHQ7JF.js +45 -0
- package/lib/chunk-MCPADH33.cjs +2 -0
- package/lib/chunk-NBJTYAYN.cjs +2 -0
- package/lib/chunk-NDAKMJQK.cjs +3 -0
- package/lib/chunk-NNSBBO5R.js +2 -0
- package/lib/chunk-NU5NO5NM.js +2 -0
- package/lib/chunk-O4RKTQBP.cjs +3 -0
- package/lib/chunk-O5UYCGIN.js +2 -0
- package/lib/chunk-Q3OTUDIE.js +2 -0
- package/lib/chunk-R44X3RQB.cjs +2 -0
- package/lib/chunk-RKKSVOP2.js +2 -0
- package/lib/chunk-UB54HZA4.cjs +2 -0
- package/lib/{chunk-CIAJNUR4.js → chunk-VGDLSS2H.js} +2 -2
- package/lib/{chunk-SFVO2LB2.cjs → chunk-VQCIOKJV.cjs} +3 -3
- package/lib/chunk-VS3BXEYK.js +4 -0
- package/lib/chunk-Y4WK7HE4.js +2 -0
- package/lib/chunk-ZK3E7L4Y.cjs +2 -0
- package/lib/cloud-storage.cjs +1 -1
- package/lib/cloud-storage.d.cts +6 -6
- package/lib/cloud-storage.d.ts +6 -6
- package/lib/cloud-storage.js +1 -1
- package/lib/execution-refs.cjs +1 -1
- package/lib/execution-refs.js +1 -1
- package/lib/firebase-storage/index.cjs +2 -2
- package/lib/firebase-storage/index.d.cts +2 -2
- package/lib/firebase-storage/index.d.ts +2 -2
- package/lib/firebase-storage/index.js +2 -2
- package/lib/firestore-storage/index.cjs +2 -2
- package/lib/firestore-storage/index.d.cts +12 -10
- package/lib/firestore-storage/index.d.ts +12 -10
- package/lib/firestore-storage/index.js +2 -2
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/localstorage-storage/index.cjs +1 -1
- package/lib/localstorage-storage/index.d.cts +10 -6
- package/lib/localstorage-storage/index.d.ts +10 -6
- package/lib/localstorage-storage/index.js +1 -1
- package/lib/{mcp-tool-registries-W3TRj6O5.d.cts → mcp-tool-registries-CRtea2x4.d.cts} +3 -0
- package/lib/{mcp-tool-registries-BBObLYga.d.ts → mcp-tool-registries-D3rWSppt.d.ts} +3 -0
- package/lib/server-jobs-queue-runner/index.cjs +1 -1
- package/lib/server-jobs-queue-runner/index.d.cts +12 -9
- package/lib/server-jobs-queue-runner/index.d.ts +12 -9
- package/lib/server-jobs-queue-runner/index.js +1 -1
- package/lib/server-runtime/index.cjs +1 -1
- package/lib/server-runtime/index.d.cts +7 -9
- package/lib/server-runtime/index.d.ts +7 -9
- package/lib/server-runtime/index.js +1 -1
- package/lib/server-runtime-agentface/index.d.cts +7 -9
- package/lib/server-runtime-agentface/index.d.ts +7 -9
- package/lib/server-runtime-controlface/index.cjs +1 -1
- package/lib/server-runtime-controlface/index.d.cts +8 -9
- package/lib/server-runtime-controlface/index.d.ts +8 -9
- package/lib/server-runtime-controlface/index.js +1 -1
- package/lib/server-runtime-core/index.cjs +1 -1
- package/lib/server-runtime-core/index.d.cts +59 -21
- package/lib/server-runtime-core/index.d.ts +59 -21
- package/lib/server-runtime-core/index.js +1 -1
- package/lib/server-runtime-watchers/index.cjs +1 -1
- package/lib/server-runtime-watchers/index.d.cts +9 -65
- package/lib/server-runtime-watchers/index.d.ts +9 -65
- package/lib/server-runtime-watchers/index.js +1 -1
- package/lib/server-runtime-webhooks/index.d.cts +7 -9
- package/lib/server-runtime-webhooks/index.d.ts +7 -9
- package/lib/sse-hub-CYXisfXJ.d.cts +63 -0
- package/lib/sse-hub-Dodwtc3_.d.ts +63 -0
- package/lib/step-machine-public/index.cjs +1 -1
- package/lib/step-machine-public/index.d.cts +1 -1
- package/lib/step-machine-public/index.d.ts +1 -1
- package/lib/step-machine-public/index.js +1 -1
- package/lib/{storage-async-interface-BRR4eBjx.d.cts → storage-async-interface-CG0bMqvE.d.ts} +20 -1
- package/lib/{storage-async-interface-DhlOVPSp.d.ts → storage-async-interface-CyO-zwVQ.d.cts} +20 -1
- package/lib/{storage-interface-BFiD3kyB.d.ts → storage-interface-D-iEiTJA.d.cts} +45 -1
- package/lib/{storage-interface-BFiD3kyB.d.cts → storage-interface-D-iEiTJA.d.ts} +45 -1
- package/lib/stores/index.d.cts +1 -1
- package/lib/stores/index.d.ts +1 -1
- package/lib/stores/kv.d.cts +1 -1
- package/lib/stores/kv.d.ts +1 -1
- package/lib/{types-SO5OZm4s.d.ts → types-BtH3scgE.d.ts} +64 -29
- package/lib/{types-Ba8H5_Wo.d.cts → types-Ch0u3FKP.d.cts} +64 -29
- package/package.json +4 -5
- package/browser/board-livecards-client.js +0 -2
- package/examples/board/demo-shell-with-server.html +0 -272
- package/examples/board/doc.html +0 -465
- package/examples/board/server-config.json +0 -24
- package/lib/chat-storage-lib-B9Q34Dyv.d.cts +0 -54
- package/lib/chat-storage-lib-DB9iSai2.d.ts +0 -54
- package/lib/chunk-5XHOHTLZ.cjs +0 -2
- package/lib/chunk-6APH25VI.js +0 -2
- package/lib/chunk-76C7N4YT.js +0 -3
- package/lib/chunk-76ON3V7R.js +0 -2
- package/lib/chunk-7ICPAABP.cjs +0 -7
- package/lib/chunk-ASR44K7H.cjs +0 -3
- package/lib/chunk-CPAXTVBQ.cjs +0 -2
- package/lib/chunk-EGRHWZRV.js +0 -2
- package/lib/chunk-EZENHAVZ.cjs +0 -2
- package/lib/chunk-GL2OHR2E.cjs +0 -2
- package/lib/chunk-GYQXDNNI.cjs +0 -2
- package/lib/chunk-IPLSRN6P.cjs +0 -4
- package/lib/chunk-J6EGN6S4.cjs +0 -3
- package/lib/chunk-JH37NJGP.js +0 -3
- package/lib/chunk-JJL5VOQZ.cjs +0 -3
- package/lib/chunk-NJJ7WEDT.cjs +0 -2
- package/lib/chunk-NKIQRCOM.cjs +0 -2
- package/lib/chunk-PBOQ4HYB.cjs +0 -2
- package/lib/chunk-PRKRXAVN.js +0 -3
- package/lib/chunk-QJVR3FWQ.js +0 -2
- package/lib/chunk-S44QZUDX.js +0 -2
- package/lib/chunk-TSN3RTXT.js +0 -4
- package/lib/chunk-VXJHBWK3.js +0 -2
- package/lib/chunk-WHDEBJLT.js +0 -7
- package/lib/chunk-YGALANRO.js +0 -2
- package/lib/chunk-ZCNN6XPV.js +0 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var ServerRuntimeControlface=(function(exports){'use strict';var Yn=Object.defineProperty;var Xn=(e,t,r)=>t in e?Yn(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Er=(e,t,r)=>Xn(e,t+"",r);var Pt="b64:";function Zn(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function eo(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ve(e){return `${Pt}${Zn(JSON.stringify(e))}`}function Qe(e){if(!e.startsWith(Pt))throw new Error(`Invalid ref format (expected ${Pt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(eo(e.slice(Pt.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 Or(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function ze(e){return typeof e.journalStorage=="function"}function Br(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?Qe(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function We(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function lr(e){let t=e.reduce((o,s)=>o+s.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}async function mt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,i=s.status;if(i==="success")return Object.prototype.hasOwnProperty.call(s,"data")?o:{status:"success",data:{}};if(i==="fail"||i==="error")return o}return {status:"success",data:o}}function Ze(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let s=n.data;if(s&&typeof s=="object"&&!Array.isArray(s)){let i=s.issues;if(Array.isArray(i)){let u=i.find(b=>typeof b=="string"&&b.trim());if(typeof u=="string")return `Validation failed: ${u}`}let a=s.errors;if(Array.isArray(a)&&a.length>0)return "Validation failed"}}return "Validation failed"}return t}function fr(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,buildPublishedRuntimePayload:i,createMcpControlplaneToolRegistry:a,retriggerCard:u,applyCardAction:b,resolveChatHandlerTarget:A,sendCardFileDownloadResponse:f}=e;async function g(v,C,R){let l=v.method||"GET",y=R,O=y.pathname;try{if(l==="GET"&&O===`${t}/init-board`)return await o(),r(C,200,await i()),!0;if(l==="POST"&&O===`${t}/mcp-controlplane`){await s();let p=await n(v),k=typeof p.tool=="string"?p.tool.trim():"",S=p.args&&typeof p.args=="object"&&!Array.isArray(p.args)?p.args:{};if(!k)return r(C,400,{error:"tool is required"}),!0;try{let B=await mt(k,S,a());if(B&&typeof B=="object"&&!Array.isArray(B)){let x=B;if(x.status==="fail")return r(C,400,{error:Ze(B,"Request failed")}),!0;if(x.status==="error")return r(C,500,{error:Ze(B,"Internal error")}),!0}r(C,200,B);}catch(B){let x=typeof B?.statusCode=="number"?Number(B.statusCode):500,h=B instanceof Error?B.message:String(B);r(C,x,{error:h});}return !0}let w=O.match(new RegExp(`^${We(t)}/cards/([^/]+)/retrigger$`));if(l==="POST"&&w){await s();let p=decodeURIComponent(w[1]);return await u(p),r(C,200,{ok:!0}),!0}let _=O.match(new RegExp(`^${We(t)}/cards/([^/]+)/actions$`));if(l==="POST"&&_){await s();let p=decodeURIComponent(_[1]),k=Date.now(),S=new Date(k).toISOString(),B=await n(v),x=B?.actionType;if(x==="chat-send"&&!await A(p)){let D=Date.now();return r(C,409,{error:`chat handler is not configured for card: ${p}`,requestReceivedAt:S,requestReceivedAtMs:k,responseSentAt:new Date(D).toISOString(),responseSentAtMs:D,responseStatus:409}),!0}if(x==="chat-send"){let D=B?.payload??{},j=typeof D["turn-id"]=="string"?D["turn-id"]:typeof D.turnId=="string"?D.turnId:typeof D.turn=="string"?D.turn:"";if(!j||!String(j).trim()){let X=Date.now();return r(C,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${p}`,requestReceivedAt:S,requestReceivedAtMs:k,responseSentAt:new Date(X).toISOString(),responseSentAtMs:X,responseStatus:400}),!0}}await b(p,x,B?.payload);let h=Date.now();return r(C,200,{ok:!0,requestReceivedAt:S,requestReceivedAtMs:k,responseSentAt:new Date(h).toISOString(),responseSentAtMs:h,responseStatus:200}),!0}let m=O.match(new RegExp(`^${We(t)}/cards/([^/]+)/files/(\\d+)$`));if(l==="GET"&&m){let p=decodeURIComponent(m[1]),k=parseInt(m[2],10),S=y.searchParams.get("sn");return await f(C,p,k,S),!0}return !1}catch(w){let _=w?.statusCode||500;return r(C,_,{error:String(w?.message||w)}),true}}return {handleRuntimeApi:g}}function _t(e,t){if(!e||typeof e!="object")throw new Error(`${t}: adapter.callbackTransport is required`);if(typeof e.createCallback!="function")throw new Error(`${t}: adapter.callbackTransport.createCallback is required`)}var st={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Je(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function at(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Fr(e){return e.tasks??{}}function pr(e){return e?e.status===st.FAILED||e.status===st.INACTIVATED:false}function qr(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function jr(e){return e.maxExecutions}function Lr(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===st.COMPLETED){let s=e.tasks[n];s&&Je(s).forEach(a=>r.add(a));}return Array.from(r)}function Dr(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Je(o).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function Mr(e,t,r){let n=e.tasks[t]??Et(),o={};if(r){let i=r.tasks[t],a=at(i);for(let u of a)for(let[b,A]of Object.entries(r.tasks))if(Je(A).includes(u)){let f=e.tasks[b];f?.lastDataHash&&(o[u]=f.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Nr(e,t,r,n,o,s){let i=e.tasks[r]??Et(),a=t.tasks[r];if(!a)throw new Error(`Task "${r}" not found in graph`);let u;n&&a.on&&a.on[n]?u=a.on[n]:u=Je(a);let b=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let g=a.requires??[];for(let v of g)for(let[C,R]of Object.entries(t.tasks))if(Je(R).includes(v)){let l=e.tasks[C];l?.lastDataHash&&(b[v]=l.lastDataHash);break}}let A={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:b,error:void 0},f=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:A},availableOutputs:f,lastUpdated:new Date().toISOString()}}function $r(e,t,r,n){let o=e.tasks[r]??Et(),s=t.tasks[r];if(s?.retry){let u=o.retryCount+1;if(u<=s.retry.max_attempts){let b={...o,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:b},lastUpdated:new Date().toISOString()}}}let i={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},a=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(a=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&i.executionCount>=s.circuit_breaker.max_executions){let u=s.circuit_breaker.on_break;a=[...new Set([...a,...u])];}return {...e,tasks:{...e.tasks,[r]:i},availableOutputs:a,lastUpdated:new Date().toISOString()}}function Ur(e,t,r,n){let o=e.tasks[t]??Et(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Vr(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 Et(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function gt(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=Hr();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function to(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:Mr(n,t.taskName,r)};case "task-completed":return {config:r,state:Nr(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:$r(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Ur(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Vr(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:co(n,t.action)};case "task-upsert":return ro(e,t.taskName,t.taskConfig);case "task-removal":return no(e,t.taskName);case "node-requires-add":return oo(e,t.nodeName,t.tokens);case "node-requires-remove":return so(e,t.nodeName,t.tokens);case "node-provides-add":return ao(e,t.nodeName,t.tokens);case "node-provides-remove":return io(e,t.nodeName,t.tokens);default:return e}}function Kr(e,t){return t.reduce((r,n)=>to(r,n),e)}function ro(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]:Hr()},lastUpdated:new Date().toISOString()}}}function no(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function oo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=at(n),s=r.filter(i=>!o.includes(i));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function so(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=at(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function ao(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Je(n),s=r.filter(i=>!o.includes(i));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function io(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Je(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function it(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function dt(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 Hr(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function co(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 wt(e){let{config:t,state:r}=e,n=Fr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=uo(n),i=Lr(t,r.tasks),a=new Set([...i,...r.availableOutputs]),u=[],b=[],A=[],f=[];for(let[v,C]of Object.entries(n)){let R=r.tasks[v],l=qr(C,t.settings),y=l!=="once";if(R?.status===st.RUNNING||pr(R))continue;let O=jr(C);if(O!==void 0&&R&&R.executionCount>=O||C.circuit_breaker&&R&&R.executionCount>=C.circuit_breaker.max_executions||!y&&R?.status===st.COMPLETED)continue;if(y&&R?.status===st.COMPLETED){let k=at(C),S=false;switch(l){case "data-changed":{k.length>0&&k.some(x=>{for(let[h,D]of Object.entries(n))if(Je(D).includes(x)){let j=r.tasks[h];if(!j)continue;let X=R.lastConsumedHashes?.[x];return j.lastDataHash==null?j.executionCount>R.lastEpoch:j.lastDataHash!==X}return false})||(S=true);break}case "epoch-changed":{k.length>0&&k.some(x=>{for(let[h,D]of Object.entries(n))if(Je(D).includes(x)){let j=r.tasks[h];if(j&&j.executionCount>R.lastEpoch)return true}return false})||(S=true);break}case "time-based":{let B=C.refreshInterval??0;if(B<=0){S=true;break}let x=R.completedAt;if(!x){S=true;break}(Date.now()-Date.parse(x))/1e3<B&&(S=true);break}case "manual":S=true;break}if(S)continue}let w=at(C);if(w.length===0){u.push(v);continue}let _=[],m=[],p=[];for(let k of w){if(a.has(k))continue;let S=s[k]||[];S.length===0?_.push(k):S.every(x=>pr(r.tasks[x]))?p.push({token:k,failedProducer:S[0]}):m.push(k);}_.length>0?A.push({taskName:v,missingTokens:_}):p.length>0?f.push({taskName:v,failedTokens:p.map(k=>k.token),failedProducers:[...new Set(p.map(k=>k.failedProducer))]}):m.length>0?b.push({taskName:v,waitingOn:m}):u.push(v);}let g={};if(u.length>1){let v=Dr(u,n);for(let[C,R]of Object.entries(v))R.length>1&&(g[C]=R);}return {eligible:u,pending:b,unresolved:A,blocked:f,conflicts:g}}function uo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of Je(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var St=class{constructor(){Er(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function mr(e){let t=gr(e);return lo(t)}function gr(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(gr).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+gr(t[n])).join(",")+"}"}function lo(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function fo(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 po(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Jr(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return fo(t)}function mo(e){try{let t=JSON.parse(po(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Ot(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:s}=t,i=new St,a="state"in e&&"config"in e?e:gt(e),u=false,b=new Set,A=new Map(Object.entries(n)),f=new St,g=false,v=false;function C(){if(!u){if(g){v=true;return}g=true;try{do v=!1,R();while(v)}finally{g=false;}}}function R(){let w=f.drain(),_=i.drain(),m=[...w,..._];if(m.length>0&&(a=Kr(a,m),o)){for(let k of m)if(k.type==="task-removal")try{o(k.taskName);}catch(S){console.warn("[reactive] onNodeRemoved failed:",S instanceof Error?S.message:String(S));}}let p=wt(a);m.length>0&&s?.(m,a,p);for(let k of p.eligible)O(k);for(let k of m)if(k.type==="task-progress"){let{taskName:S,update:B}=k;if(!a.config.tasks[S])continue;let h=a.state.tasks[S];if(!h||h.status!=="running")continue;let D=Jr(S),j=y(S,D,B).catch(X=>{u||(f.append({type:"task-failed",taskName:S,error:X.message??String(X),timestamp:new Date().toISOString()}),C());}).finally(()=>{b.delete(j);});b.add(j);}}function l(w){let m=a.config.tasks[w].requires??[],p=new Map;for(let[S,B]of Object.entries(a.config.tasks))for(let x of B.provides??[])p.set(x,S);let k={};for(let S of m){let B=p.get(S);B?k[S]=a.state.tasks[B]?.data:k[S]=void 0;}return k}async function y(w,_,m){let p=a.config.tasks[w],k=p.taskHandlers??[],S=l(w);for(let B of k){let x=A.get(B);if(!x)throw new Error(`Handler '${B}' not found in registry (task '${w}')`);let h={nodeId:w,state:S,taskState:a.state.tasks[w],config:p,callbackToken:_,update:m};if(await x(h)==="task-initiate-failure")throw new Error(`Handler '${B}' returned task-initiate-failure (task '${w}')`)}}function O(w){let m=a.config.tasks[w]?.taskHandlers;if(!m||m.length===0)return;f.append({type:"task-started",taskName:w,timestamp:new Date().toISOString()}),C();let p=Jr(w),k=y(w,p).catch(S=>{u||(f.append({type:"task-failed",taskName:w,error:S.message??String(S),timestamp:new Date().toISOString()}),C());}).finally(()=>{b.delete(k);});b.add(k);}return {push(w){u||(w.type==="task-completed"&&w.data&&!w.dataHash&&(w={...w,dataHash:mr(w.data)}),i.append(w),C());},pushAll(w){if(!u){for(let _ of w)_.type==="task-completed"&&_.data&&!_.dataHash?i.append({..._,dataHash:mr(_.data)}):i.append(_);C();}},resolveCallback(w,_,m){if(u)return;let p=mo(w);if(!p)return;let{taskName:k}=p;if(a.config.tasks[k]){if(m&&m.length>0)i.append({type:"task-failed",taskName:k,error:m.join("; "),timestamp:new Date().toISOString()});else {let S=_&&Object.keys(_).length>0?mr(_):void 0;i.append({type:"task-completed",taskName:k,data:_,dataHash:S,timestamp:new Date().toISOString()});}C();}},addNode(w,_){u||(i.append({type:"task-upsert",taskName:w,taskConfig:_,timestamp:new Date().toISOString()}),C());},removeNode(w){u||(i.append({type:"task-removal",taskName:w,timestamp:new Date().toISOString()}),C());},addRequires(w,_){u||(i.append({type:"node-requires-add",nodeName:w,tokens:_,timestamp:new Date().toISOString()}),C());},removeRequires(w,_){u||(i.append({type:"node-requires-remove",nodeName:w,tokens:_,timestamp:new Date().toISOString()}),C());},addProvides(w,_){u||(i.append({type:"node-provides-add",nodeName:w,tokens:_,timestamp:new Date().toISOString()}),C());},removeProvides(w,_){u||(i.append({type:"node-provides-remove",nodeName:w,tokens:_,timestamp:new Date().toISOString()}),C());},registerHandler(w,_){A.set(w,_);},unregisterHandler(w){A.delete(w);},retrigger(w){u||a.config.tasks[w]&&(i.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()}),C());},retriggerAll(w){if(!u){for(let _ of w)a.config.tasks[_]&&i.append({type:"task-restart",taskName:_,timestamp:new Date().toISOString()});C();}},snapshot(){return it(a)},getState(){return a},getSchedule(){return wt(a)},async waitForHandlers(){b.size>0&&await Promise.allSettled([...b]);},async dispose(w){w?.wait&&b.size>0&&await Promise.allSettled([...b]),u=true;}}}function Bt(){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 go=Bt();go("./jsonata-sync.cjs");var yo=Bt(),Ft=yo("./jsonata-sync.cjs"),Qr=Ft;function Gr(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function zr(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function ho(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await Ft(o.expr).evaluate(n);zr(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function ko(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let i=Qr(s.expr).evaluate(n);zr(e.computed_values,s.bindTo,i),n.computed_values=e.computed_values;}catch(i){let a=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:a});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Co(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Ft(e).evaluate(n)}function Ro(e,t){return t.startsWith("fetched_sources.")?Gr(e._sourcesData??{},t.slice(16)):Gr(e,t)}var Wr=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),wo=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function So(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))wo.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${i}]: must be an object`);else {let a=s;typeof a.bindTo!="string"||!a.bindTo?t.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(a.bindTo)&&t.push(`source_defs[${i}]: bindTo "${a.bindTo}" is not unique across source_defs`),n.add(a.bindTo)),typeof a.outputFile!="string"||!a.outputFile?t.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(a.outputFile)&&t.push(`source_defs[${i}]: outputFile "${a.outputFile}" is not unique across source_defs`),o.add(a.outputFile)),a.optionalForCompletionGating!=null&&typeof a.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):Wr.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...Wr].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function bo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await Ft(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function vo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=Qr(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var $e={run:ho,runSync:ko,eval:Co,resolve:Ro,validate:So,enrichSources:bo,enrichSourcesSync:vo};function qt(e){return JSON.stringify(e)}function jt(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 Lt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function yr(e,t){return Lt(e)?e.then(t):t(e)}function Xr(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function hr(e,t){return {readValues(n){let o=e(n);return yr(o.listKeys(),s=>{let i=[...s].sort();if(i.length===0)return {version:null,values:{}};let a={},u=null;for(let b of i){let A=o.read(b);Lt(A)?u=(u??Promise.resolve()).then(async()=>{a[b]=await A;}):a[b]=A;}return u?u.then(()=>({version:t(a),values:a})):{version:t(a),values:a}})},writeValues(n,o,s){let i=e(n),a=null;for(let u of s){let b=i.delete(u);Lt(b)&&(a=(a??Promise.resolve()).then(()=>b).then(()=>{}));}for(let[u,b]of Object.entries(o)){let A=i.write(u,b);Lt(A)&&(a=(a??Promise.resolve()).then(()=>A).then(()=>{}));}return a?a.then(()=>t(o)):t(o)}}}function Dt(e,t){return {readSnapshot(r){return e.readValues(r)},commitSnapshot(r,n){if(n.schemaVersion!==t)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);return yr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let s=Xr(o.values,n);return yr(e.writeValues(r,s,n.deleteKeys),i=>({ok:true,newVersion:i}))})}}}function Yr(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function Zr(e){return {readEntriesAfterCursor(t){let r=Yr(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return Yr(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function en(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function Mt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function De(e,t){return Mt(e)?e.then(t):t(e)}function kr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);Mt(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function Ao(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function xo(e,t){let r=e.match(t);return r?r[1]:null}function tn(e,t,r){let n={},o=kr(e,s=>{let i=r(s);if(i)return De(t(s),a=>{n[i]=a;})});return Mt(o)?o.then(()=>n):n}function Nt(e,t){let r=n=>De(e.read(n),o=>o??(e.keyRef?De(e.keyRef(n),s=>s?De(t(s),i=>i??null):null):null));return {readSourceData(n,o){return De(e.read(`${n}/${o}`),Ao)},ingestSourceDataStaged(n,o,s,i){return De(t(s),a=>e.write(`${n}/.staged/${i}/${o}`,a))},commitSourceData(n,o,s){let i=`${n}/.staged/${s}/${o}`;return De(r(i),a=>a==null?false:De(e.write(`${n}/${o}`,a),()=>De(e.remove(i),()=>true)))},hasSource(n,o){return e.exists(`${n}/${o}`)},listSources(n){return De(e.listKeys(`${n}/`),o=>o.filter(s=>!s.includes("/.staged/")).map(s=>s.slice(`${n}/`.length)))}}}function $t(e,t){let r=(n,o)=>{try{let s=o(n);return Mt(s)?s.catch(i=>t(n,i instanceof Error?i.message:String(i))):void 0}catch(s){try{return t(n,s instanceof Error?s.message:String(s))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return De(e.read(n),s=>e.write(n,[...s??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return De(e.read(n),s=>{let i=s;if(!(!i||i.length===0))return De(kr(i,a=>r(a,o)),()=>e.delete(n))})}}}function Ut(e,t,r){return {readRuntime(n){return De(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function Vt(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return De(e.listKeys("cards/"),t=>tn(t,r=>e.read(r),r=>xo(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return kr(Object.entries(t),([r,n])=>{if(r)return e.write(`data-objects/${r}`,n)})},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){return De(e.listKeys("data-objects/"),t=>tn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function xt(e,t){function r(){return e.readIndex()??{}}function n(o,s,i){let a=String(s||"").split(".").filter(Boolean);if(a.length===0)return i&&typeof i=="object"&&!Array.isArray(i)?i:{value:i};let u={...o},b=u;for(let A=0;A<a.length-1;A++){let f=a[A],g=b[f],v=g&&typeof g=="object"&&!Array.isArray(g)?{...g}:{};b[f]=v,b=v;}return b[a[a.length-1]]=i,u}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,i]of Object.entries(r())){if(!e.cardExists(i.key))continue;let a=e.readCard(i.key);a?o.push(a):t?.(`[card-store] could not read card "${s}" at key "${i.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,i]of Object.entries(r()))o[s]=i.checksum;return o},changedSince(o){let s=r(),i=[];for(let[a,u]of Object.entries(s))o[a]!==u.checksum&&i.push(a);for(let a of Object.keys(o))s[a]||i.push(a);return i},validateUpsert(o,s){let i=r(),a=i[o],u=Object.entries(i).find(([,b])=>b.key===s);return a&&a.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${a.key}", cannot remap to "${s}"`}:u&&u[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${u[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,i){let a=r(),u=i??a[o]?.key??e.defaultCardKey(o),b=e.writeCard(u,s);a[o]={key:u,checksum:b,updatedAt:new Date().toISOString()},e.writeIndex(a);},patchCard(o,s,i){let a=r(),u=a[o];if(!u||!e.cardExists(u.key))throw new Error(`card "${o}" not found`);let b=e.readCard(u.key);if(!b||typeof b!="object"||Array.isArray(b))throw new Error(`card "${o}" is not patchable`);let A=n(b,s,i),f=e.writeCard(u.key,A);a[o]={key:u.key,checksum:f,updatedAt:new Date().toISOString()},e.writeIndex(a);},removeCard(o){let s=r(),i=s[o];i&&(e.removeCard(i.key),delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function Kt(e,t){return Nt(e,t)}function rn(e){return Zr(e)}function nn(e,t){return $t(e,t)}var Ht="v1",Ye="board/graph",on="board/lastJournalProcessedId";function Cr(e){return `cards/${e}/runtime`}function sn(e){return Ut(e,Cr,()=>({_sources:{}}))}function an(e){return Dt(e,Ht)}function Rr(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 jt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",qt(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",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);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){e.write("archive-store-ref",r);},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){e.write("chat-store-ref",r);},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){e.write("artifacts-store-ref",r);}}}function dn(e){return Vt(e)}function bt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Io(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function vt(e,t){return e?.lastRequestedToken?Io(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function wr(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function At(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function ct(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=wt(t),i={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},a=new Map;for(let C of s.pending)a.set(C.taskName,C.waitingOn);for(let C of s.unresolved)a.set(C.taskName,C.missingTokens);for(let C of s.blocked)a.set(C.taskName,C.failedTokens);let u=new Map;for(let[C,R]of Object.entries(n))for(let l of R.requires??[]){let y=u.get(l)??[];y.push(C),u.set(l,y);}let b=o.sort().map(C=>{let R=r[C],l=n[C]??{requires:[],provides:[]};R.status==="completed"?i.completed+=1:R.status==="failed"?i.failed+=1:R.status==="in-progress"&&(i.in_progress+=1);let y=l.requires??[],O=l.provides??[],w=Object.keys(R.data??{}).sort(),_=y.filter(x=>t.state.availableOutputs.includes(x)),m=y.filter(x=>!t.state.availableOutputs.includes(x)),p=a.get(C)??m,k=new Set;for(let x of O)for(let h of u.get(x)??[])h!==C&&k.add(h);let S=R.failedAt,B=R.error?{message:R.error,code:"TASK_FAILED",at:S,source:"task-runtime"}:void 0;return {name:C,status:R.status,error:B,requires:y,requires_satisfied:_,requires_missing:m,provides_declared:O,provides_runtime:w,blocked_by:p,unblocks:Array.from(k).sort(),runtime:{attempt_count:R.executionCount??0,restart_count:R.retryCount??0,in_progress_since:R.status==="in-progress"?R.startedAt??null:null,last_transition_at:R.lastUpdated??null,last_completed_at:R.completedAt??null,last_restarted_at:R.startedAt??null,status_age_ms:R.lastUpdated?0:null}}});i.pending=s.pending.length,i.blocked=s.blocked.length,i.unresolved=s.unresolved.length;let A=b.map(C=>({name:C.name,fanOut:C.unblocks.length})).sort((C,R)=>R.fanOut-C.fanOut||C.name.localeCompare(R.name)),f=A.length>0?A[0]:{name:null,fanOut:0},g=new Set;for(let C of Object.values(n))for(let R of C.requires??[])g.add(R);let v=0;for(let[C,R]of Object.entries(n)){let l=(R.requires??[]).length===0,O=(R.provides??[]).some(w=>(u.get(w)??[]).some(_=>_!==C));l&&!O&&(v+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:i.completed,eligible:s.eligible.length,pending:i.pending,blocked:i.blocked,unresolved:i.unresolved,failed:i.failed,in_progress:i.in_progress,orphan_cards:v,topology:{edge_count:Array.from(g).length,max_fan_out_card:f.name,max_fan_out:f.fanOut}},cards:b}}function To(){return new Date().toISOString()}function cn(e,t,r,n,o,s,i){return async a=>{let u=[],b=r.cardStore.readCard(a.nodeId);if(!b)return "task-initiate-failure";let A=b.id,f=b.card_data??{},g=b.source_defs??[],v=g.filter(H=>H.optionalForCompletionGating!==true),C=r.cardRuntimeStore.readRuntime(A),R=false,l=()=>{R&&(r.cardRuntimeStore.writeRuntime(A,C),R=false);},y=H=>bt(C._sources[H]),O=(H,M)=>{C._sources[H]=bt(M),R=true;},w=a.taskState?.executionCount??0;if(C._lastExecutionCount!==w&&(C._sources={},C._lastExecutionCount=w,R=true),a.update){let H=a.update,M=H.outputFile;if(M){let z=y(M);if(H.failure){let oe=H.rqt??z.lastRequestedToken??z.queueRequestedToken;oe&&O(M,At(z,oe));}else {let oe=H.rqt;if(!z.lastCompletedToken||oe>z.lastCompletedToken){let we=typeof H.deliveryToken=="string"?H.deliveryToken:void 0,T=false;we&&(T=r.fetchedSourcesStore.commitSourceData(A,M,we)),T?O(M,wr(z,oe)):O(M,At(z,oe));}}l();}}let m={};for(let H of g)if(H.outputFile){let M=r.fetchedSourcesStore.readSourceData(A,H.outputFile);M!==null&&(m[H.bindTo]=M);}let p={};for(let[H,M]of Object.entries(a.state??{}))if(M!==null&&typeof M=="object"&&!Array.isArray(M)){let z=M[H];p[H]=z!==void 0?z:M;}else p[H]=M;let k={id:A,card_data:{...f},requires:p,source_defs:g,compute:b.compute};k._sourcesData=m,b.compute&&$e.runSync(k,{sourcesData:m}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(A,k.computed_values??{});let S={...b},B=$e.enrichSourcesSync(Array.isArray(b.source_defs)?b.source_defs:void 0,{card_data:b.card_data,requires:p}),x=e.value;S.source_defs=Array.isArray(B)?B.map(H=>({...H,boardDir:typeof H.boardDir=="string"&&H.boardDir?H.boardDir:x})):B;let h=To(),D=a.update?void 0:h,j=v.filter(H=>{let M=H.outputFile;if(typeof M!="string"||!M)return true;let z=y(M);D&&(z={...z,queueRequestedToken:D},O(M,z));let oe=z.queueRequestedToken??z.lastRequestedToken??h,we=vt(z,oe);return we==="in-flight"?false:we==="dispatch"});if(l(),j.length>0){let H=false,M=h;for(let z of j){let oe=z.outputFile;if(typeof oe!="string"||!oe)continue;let we=y(oe),T=we.queueRequestedToken??h;O(oe,{...we,lastRequestedToken:T}),M=T,H=true;}return H&&l(),H&&(u.push({taskKind:"source-fetch",payload:{boardRef:ve(e),enrichedCard:S,callbackToken:a.callbackToken,rqt:M}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(v.some(H=>{let M=H.outputFile;if(typeof M!="string"||!M)return false;let z=y(M),oe=z.queueRequestedToken??z.lastRequestedToken??h;return vt(z,oe)==="in-flight"}))return "task-initiated";let N=b.provides??[],$={};for(let{bindTo:H,ref:M}of N)$[H]=$e.resolve(k,M);return (i??r.outputStore.writeDataObjects.bind(r.outputStore))($),g.filter(H=>{if(H.optionalForCompletionGating!==true)return false;let M=y(H.outputFile);return !M.lastRequestedToken||!M.lastCompletedToken?true:M.lastCompletedToken<=M.lastRequestedToken}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:ve(e),enrichedCard:S,callbackToken:a.callbackToken,rqt:h}}),n(a.nodeId,$),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var It={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Jt(e){return {[Ye]:e.graph,[on]:e.lastDrainedJournalId}}function Gt(e){let t=e[Ye],r=e[on];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${Ye}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function Wt(e){let t=e.requires;return {provides:e.provides?.map(n=>n.bindTo)??[],taskHandlers:["card-handler"],description:e.meta?.title??e.id,...t&&t.length>0?{requires:t}:{}}}function Qt(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)}}function o(s){if(Array.isArray(s))return s;if(s&&typeof s=="object"){let i=s;return Array.isArray(i.files)?i.files:[s]}return null}return {get(s){try{let i=s.params?.id;if(i){let a=e.readCard(i);return a?t({cards:[a]}):r(`card "${i}" not found`)}return t({cards:e.readAllCards()})}catch(i){return n(i)}},set(s){try{let i=s.body;if(i==null)return r("set requires a body (card object or array of cards)");let a=Array.isArray(i)?i:[i];for(let u of a){if(typeof u.id!="string")return r("each card must have a string `id` field");e.writeCard(u.id,u);}return t({count:a.length})}catch(i){return n(i)}},del(s){try{let i=s.body?.ids??[],a=s.params?.id,u=a?[...i,a]:i;if(u.length===0)return r("del requires body.ids (string[]) or params.id");for(let b of u)e.removeCard(b);return t({count:u.length})}catch(i){return n(i)}},patch(s){try{let i=s.params?.id,a=s.params?.path;if(!i)return r("patch requires params.id");if(!a)return r("patch requires params.path");let u=s.body,b=u&&Object.prototype.hasOwnProperty.call(u,"value")?u.value:s.body;return e.patchCard(i,a,b),t({count:1})}catch(i){return n(i)}},appendFiles(s){try{let i=s.params?.id;if(!i)return r("appendFiles requires params.id");let a=e.readCard(i);if(!a)return r(`card "${i}" not found`);let u=o(s.body);if(!u||u.length===0)return r("appendFiles requires a file metadata object, array, or body.files array");let b=a.card_data&&typeof a.card_data=="object"&&!Array.isArray(a.card_data)?a.card_data:{},A=Array.isArray(b.files)?b.files:[],f=[...A,...u],g=u.map((C,R)=>({idx:A.length+R,entry:C})),v=this.patch({params:{id:i,path:"card_data.files"},body:{value:f}});return v.status!=="success"?v:t({files_added:g})}catch(i){return n(i)}}}}function ce(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ae(e){return {status:"fail",error:e}}function me(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Po(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 ln(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function zt(e){try{let t=JSON.parse(ln(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function _o(e){return Po(JSON.stringify(e))}function un(e){try{let t=JSON.parse(ln(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Me(){return new Date().toISOString()}function fn(e,t){_t(t.callbackTransport,"createBoardLiveCardsPublic");let r=t.callbackTransport,n=t.onWarn??(()=>{}),o=ve(e);function s(q){if(q.length!==0)try{let c=t.publishBoardChangeNotifications?.(q);c&&typeof c.catch=="function"&&c.catch(E=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${E instanceof Error?E.message:String(E)}`));}catch(c){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${c instanceof Error?c.message:String(c)}`);}}function i(){let q=u().readCardStoreRef();if(!q)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let c=t.kvStorageForRef(q);return {readIndex(){return c.read("_index")},writeIndex(E){c.write("_index",E);},readCard(E){return c.read(E)},writeCard(E,L){return c.write(E,L),t.hashFn(L)},removeCard(E){c.delete(E);},cardExists(E){return c.read(E)!==null},defaultCardKey(E){return E}}}let a={readValues(q){let c=t.kvStorage("state-snapshot"),E=c.listKeys().sort();if(E.length===0)return {version:null,values:{}};let L={};for(let ee of E)L[ee]=c.read(ee);return {version:t.hashFn(L),values:L}},writeValues(q,c,E){let L=t.kvStorage("state-snapshot");for(let ee of E)L.delete(ee);for(let[ee,ne]of Object.entries(c))L.write(ee,ne);return t.hashFn(c)}},u=()=>Rr(t.kvStorage("config")),b=()=>an(a),A=()=>rn(t.journalAdapter()),f=()=>xt(i(),n),g=()=>{let q=u().readOutputsStoreRef();if(!q)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return dn(t.kvStorageForRef(q))},v=()=>{let q=u().readArchiveStoreRef();return q?t.archiveFactoryForRef(q):t.archiveFactory()};function C(){return !!b().readSnapshot(e.value).values[Ye]}function R(){let q=b().readSnapshot(e.value);if(!q.values[Ye])throw new Error(`Board not initialized at ${e.value}`);return Gt(q.values)}function l(q,c){let E=b().commitSnapshot(e.value,{schemaVersion:Ht,expectedVersion:c,commitId:t.genId(),committedAt:Me(),deleteKeys:[],shallowMerge:Jt(q)});if(!E.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${c??"null"} current=${E.currentVersion??"null"}`)}function y(q){A().appendEvent(q);}async function O(){let q=(Q,d)=>{let P=Q.payload,V=(P?.enrichedCard??{}).id??P?.cardId??"unknown";y({type:"task-failed",taskName:V,error:d,timestamp:Me()});},c=nn(t.kvStorage("execution-requests"),q),E=sn(t.kvStorage("card-runtime")),L=Kt(t.blobStorage("sources"),Q=>t.resolveBlob(Q)),ee=new Map,ne={readRuntime(Q){return ee.get(Q)??E.readRuntime(Q)},writeRuntime(Q,d){ee.set(Q,d);}},te=[],le=new Map,Se={readSourceData(Q,d){let P=`${Q}/${d}`;return le.has(P)?le.get(P):L.readSourceData(Q,d)},ingestSourceDataStaged(Q,d,P,F){L.ingestSourceDataStaged(Q,d,P,F);},commitSourceData(Q,d,P){let F=`${Q}/.staged/${P}/${d}`,V=t.blobStorage("sources"),K=V.read(F);if(K==null){let _e=V.keyRef?.(F);_e&&(K=t.resolveBlob(_e));}if(K==null)return false;let se=`${Q}/${d}`,fe=K.trim();try{le.set(se,JSON.parse(fe));}catch{le.set(se,fe);}return te.push({cardId:Q,outputFile:d,deliveryToken:P}),true},hasSource(Q,d){let P=`${Q}/${d}`;return le.has(P)?true:L.hasSource(Q,d)},listSources(Q){let d=L.listSources(Q),P=new Set;for(let V of le.keys())V.startsWith(`${Q}/`)&&P.add(V.slice(`${Q}/`.length));let F=new Set([...d,...P]);return Array.from(F)}},be={cardStore:f(),cardRuntimeStore:ne,fetchedSourcesStore:Se,outputStore:g(),executionRequestStore:c},Ve=R(),je=dt(Ve.graph),{events:tt,newCursor:rt}=A().readEntriesAfterCursor(Ve.lastDrainedJournalId),Ke=[],nt=[],ht=[],kt=new Map,Tt=new Set,lt=(Q,d)=>{Ke.push({type:"task-completed",taskName:Q,data:d,timestamp:Me()});try{v().stream("exec-history").append({taskName:Q,status:"completed",completedAt:Me()});}catch{}},Ct=(Q,d)=>{y({type:"task-failed",taskName:Q,error:d,timestamp:Me()});try{v().stream("exec-history").append({taskName:Q,status:"failed",error:d,completedAt:Me()});}catch{}},ft=Ot(je,{handlers:{"card-handler":cn(e,rt,be,lt,Ct,(Q,d)=>{nt.push({cardId:Q,values:d});},Q=>{ht.push(Q);})},onNodeRemoved:Q=>{kt.delete(Q),ee.delete(Q),Tt.add(Q);}});for(Ke=tt;Ke.length>0;){let Q=Ke;Ke=[];for(let d of Q)if(d.type==="task-restart"){let P=be.cardStore.readCard(d.taskName);P&&kt.set(d.taskName,P);}ft.pushAll(Q),await ft.waitForHandlers();}let ir=ft.getState();await ft.dispose({wait:true});let dr=b().readSnapshot(e.value).version;l({lastDrainedJournalId:rt,graph:it(ir)},dr);for(let{cardId:Q,values:d}of nt)be.outputStore.writeComputedValues(Q,d);for(let Q of ht)be.outputStore.writeDataObjects(Q);for(let[Q,d]of ee)E.writeRuntime(Q,d);for(let{cardId:Q,outputFile:d,deliveryToken:P}of te)L.commitSourceData(Q,d,P);let Rt;try{Rt=ct(o,ir),be.outputStore.writeStatusSnapshot(Rt);}catch(Q){n(`[board-live-cards-public] status publish failed: ${Q instanceof Error?Q.message:String(Q)}`);}let ot=[];for(let{cardId:Q,values:d}of nt)ot.push({kind:"computed_values",cardId:Q,values:d});for(let Q of ht)for(let[d,P]of Object.entries(Q))d&&ot.push({kind:"data_object",key:d,payload:P});for(let[Q,d]of kt)ot.push({kind:"card_refreshed",cardId:Q,card:d});for(let Q of Tt)ot.push({kind:"card_removed",cardId:Q});Rt!==void 0&&ot.push({kind:"status",status:Rt}),s(ot);let cr=u().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:ve({kind:"built-in",value:"source-cli-task-executor"})},ur=t.supportsDirectSourceOutput?.(cr)===true;c.dispatchEntriesForJournalId(rt,Q=>{if(Q.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${Q.taskKind}" \u2014 skipping`);return}let d=Q.payload,P=d.enrichedCard?.id??"unknown",F=d.enrichedCard?.source_defs??[];for(let V of F){if(!V.outputFile){n(`[dispatch] source "${V.bindTo}" has no outputFile \u2014 skipping`);continue}let K;if(ur){let fe=t.genId(),_e=`${P}/.staged/${fe}/${V.outputFile}`,Pe=t.blobStorage("sources").keyRef?.(_e);Pe?K={ref:ve(Pe),deliveryToken:fe,outputFile:V.outputFile,cardId:P}:n("[dispatch] hosted board-worker requested but sources BlobStorage cannot produce portable refs; falling back to scratch protocol");}let se=_o({cbk:d.callbackToken,rg:e.value,br:ve(e),cid:P,b:V.bindTo,d:V.outputFile,cs:void 0,rqt:d.rqt,...K?{dt:K.deliveryToken}:{}});t.dispatchExecution(cr,{source_def:V,base_ref:ve(e),callback:r.createCallback(se),...K?{output:K}:{}}).catch(fe=>Ct(P,fe instanceof Error?fe.message:String(fe)));}});}function w(){let q=t.processAccumulatedStore();q.enqueueIfAbsent?q.enqueueIfAbsent({boardRef:ve(e)},`process-accumulated:${ve(e)}`):q.enqueue({boardRef:ve(e)}),t.requestProcessAccumulated?.();}function _(){let q=t.processAccumulatedStore();for(;;){let c=q.lease({max:64,visibilityMs:1e3});if(c.length<=0)return;for(let E of c)q.ack(E.id,E.leaseToken);if(c.length<64)return}}async function m(){try{let q=()=>{let E=R(),{events:L}=A().readEntriesAfterCursor(E.lastDrainedJournalId);L.length<=0||w();},c=await Or(t.lock,O,q);return ce({ran:c!==!1})}catch(q){return me(q)}}function p(){w();}function k(q){try{let c=q.params?.cardStoreRef;if(!c)return ae("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!C()){let be=gt(It);l({lastDrainedJournalId:"",graph:it(be)},null);}let E=q.params?.outputsStoreRef;if(!E)return ae("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let L=q.params?.scratchStoreRef,ee=q.params?.archiveStoreRef,ne=q.params?.chatStoreRef,te=q.params?.artifactsStoreRef,le=u();le.writeCardStoreRef(c),le.writeOutputsStoreRef(E),L&&le.writeScratchStoreRef(L),ee&&le.writeArchiveStoreRef(ee),ne&&le.writeChatStoreRef(ne),te&&le.writeArtifactsStoreRef(te);let Se=q.body??{};Se["task-executor-ref"]&&le.writeTaskExecutorRef(Se["task-executor-ref"]),Object.prototype.hasOwnProperty.call(Se,"chat-handler-flow")&&le.writeChatHandlerFlow(Se["chat-handler-flow"]);try{g().writeStatusSnapshot(ct(o,dt(R().graph)));}catch{}return ce()}catch(c){return me(c)}}function S(q){try{let c=g().readStatusSnapshot();if(!c){c=ct(o,dt(R().graph));try{g().writeStatusSnapshot(c);}catch{}}return ce(c)}catch(c){return me(c)}}function B(q){try{let c=q.params?.id;if(!c)return ae("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(c);}catch{}return y({type:"task-removal",taskName:c,timestamp:Me()}),p(),ce()}catch(c){return me(c)}}function x(q){try{let c=q.params?.cardId;if(!c)return ae("addCardFiles requires params.cardId");let E=Qt(f()).appendFiles({params:{id:c},body:q.body});if(E.status!=="success")return E;let L=h({params:{cardId:c}});return L.status!=="success"?L:ce({cardId:c,files_added:E.data.files_added,notified:!0})}catch(c){return me(c)}}function h(q){try{let c=q.params?.cardId;if(!c)return ae("cardRefreshedNotify requires params.cardId");let E=f().readCard(c);return E?(s([{kind:"card_refreshed",cardId:c,card:E}]),ce({cardId:c,notified:!0})):ae(`Card "${c}" not found in board at ${e.value}`)}catch(c){return me(c)}}function D(q){try{let c=q.params?.id;return c?(y({type:"task-restart",taskName:c,timestamp:Me()}),p(),ce()):ae("retrigger requires params.id")}catch(c){return me(c)}}async function j(q){return _(),m()}function X(q){try{let c=q.params?.cardId,E=q.params?.all,L=!!q.params?.restart;if(!c&&!E)return ae("upsertCard requires --card-id <id> or --all");let ee=E?f().readAllCards().map(ne=>ne.id):[c];for(let ne of ee)if(!f().readCard(ne))return ae(`Card "${ne}" not found in board at ${e.value}`);for(let ne of ee){let te=f().readCard(ne),le=Wt(te),Se=t.hashFn(le),be=t.kvStorage("card-upsert"),Ve=be.read(ne),je=Ve?.taskConfigHash!==Se;if(!(!je&&!L)){if(je){let tt=Ve?.blobRef??f().readCardKey(ne)??ne;y({type:"task-upsert",taskName:ne,taskConfig:le,timestamp:Me()}),be.write(ne,{blobRef:tt,taskConfigHash:Se,updatedAt:Me()});}L&&y({type:"task-restart",taskName:ne,timestamp:Me()});}}return p(),ce()}catch(c){return me(c)}}function N(q){try{let c=q.params?.token;if(!c)return ae("taskFailed requires params.token");let E=q.params?.error??"unknown error",L=zt(c);if(!L)return ae("Invalid callback token");y({type:"task-failed",taskName:L.taskName,error:E,timestamp:Me()});try{v().stream("exec-history").append({taskName:L.taskName,status:"failed",error:E,completedAt:Me()});}catch{}return p(),ce()}catch(c){return me(c)}}function $(q){try{let c=q.params?.token;if(!c)return ae("taskProgress requires params.token");let L=(q.body??{}).update??{},ee=zt(c);return ee?(y({type:"task-progress",taskName:ee.taskName,update:L,timestamp:Me()}),p(),ce()):ae("Invalid callback token")}catch(c){return me(c)}}function Z(q){try{let c=q.params?.token,E=q.params?.ref;if(!c)return ae("sourceDataFetched requires params.token");if(!E)return ae("sourceDataFetched requires params.ref");let L=un(c);if(!L)return ae("Invalid source token");let{cbk:ee,cid:ne,b:te,d:le,cs:Se,rqt:be,dt:Ve}=L,je=Kt(t.blobStorage("sources"),nt=>t.resolveBlob(nt)),tt=Ve||t.genId();Ve||je.ingestSourceDataStaged(ne,le,Qe(E),tt);let rt=zt(ee);if(!rt)return ae("Invalid callback token embedded in source token");let Ke=Me();return y({type:"task-progress",taskName:rt.taskName,update:{bindTo:te,outputFile:le,fetchedAt:Ke,deliveryToken:tt,sourceChecksum:Se,rqt:be},timestamp:Ke}),p(),ce()}catch(c){return me(c)}}function H(q){try{let c=q.params?.token,E=q.params?.reason??"unknown";if(!c)return ae("sourceDataFetchFailure requires params.token");let L=un(c);if(!L)return ae("Invalid source token");let{cbk:ee,b:ne,d:te,cs:le,rqt:Se}=L,be=zt(ee);return be?(y({type:"task-progress",taskName:be.taskName,update:{bindTo:ne,outputFile:te,failure:!0,reason:E,sourceChecksum:le,rqt:Se},timestamp:Me()}),p(),ce()):ae("Invalid callback token embedded in source token")}catch(c){return me(c)}}function M(q){try{let c=u().readCardStoreRef();return c?ce({storeRef:c}):ae(`Board at ${e.value} has no card store configured`)}catch(c){return me(c)}}function z(q){try{let c=u().readOutputsStoreRef();return c?ce({storeRef:c}):ae(`Board at ${e.value} has no outputs store configured`)}catch(c){return me(c)}}function oe(q){try{let c=u().readScratchStoreRef();return ce({storeRef:c})}catch(c){return me(c)}}function we(q){try{let c=u().readArchiveStoreRef();return ce({storeRef:c})}catch(c){return me(c)}}function T(q){try{let c=u().readChatStoreRef();return ce({storeRef:c})}catch(c){return me(c)}}function I(q){try{let c=u().readArtifactsStoreRef();return ce({storeRef:c})}catch(c){return me(c)}}function U(q){try{let c=q.params?.key;if(!c)return ae("getConfig requires params.key");let E=u(),L;switch(c){case "task-executor":L=E.readTaskExecutorRef()??null;break;case "chat-handler-flow":L=E.readChatHandlerFlow()??null;break;case "card-store-ref":L=E.readCardStoreRef();break;case "outputs-store-ref":L=E.readOutputsStoreRef();break;case "scratch-store-ref":L=E.readScratchStoreRef();break;case "archive-store-ref":L=E.readArchiveStoreRef();break;case "chat-store-ref":L=E.readChatStoreRef();break;case "artifacts-store-ref":L=E.readArtifactsStoreRef();break;default:return ae(`getConfig: unknown key "${c}"`)}return ce({value:L})}catch(c){return me(c)}}function J(q){try{let c=q.params?.key;if(!c)return ae("getOutputsDataObject requires params.key");let E=g().readDataObject(c);return ce(E)}catch(c){return me(c)}}function G(q){try{return ce(g().readAllDataObjects())}catch(c){return me(c)}}function re(q){try{let c=q.params?.key;if(!c)return ae("getOutputsComputedValues requires params.key");let E=g().readComputedValues(c);return ce(E)}catch(c){return me(c)}}function de(q){try{return ce(g().readAllComputedValues())}catch(c){return me(c)}}function pe(){return Kt(t.blobStorage("sources"),q=>t.resolveBlob(q))}function ye(q){let c=t.blobStorage("sources").keyRef?.(q);return c?ve(c):q}function he(q){try{let c=q.params?.key;if(!c)return ae("getOutputsFetchedSources requires params.key");let E=pe().listSources(c),L={};for(let ee of E)L[ee]=ye(`${c}/${ee}`);return ce(L)}catch(c){return me(c)}}function xe(q){try{let c=pe(),E=new Set;for(let ee of t.blobStorage("sources").listKeys()){let ne=ee.indexOf("/");ne>0&&!ee.includes("/.staged/")&&E.add(ee.slice(0,ne));}let L={};for(let ee of E){let ne=c.listSources(ee);if(ne.length>0){L[ee]={};for(let te of ne)L[ee][te]=ye(`${ee}/${te}`);}}return ce(L)}catch(c){return me(c)}}return {init:k,status:S,getCardStoreRef:M,getOutputsStoreRef:z,getScratchStoreRef:oe,getArchiveStoreRef:we,getChatStoreRef:T,getArtifactsStoreRef:I,getConfig:U,getOutputsDataObject:J,getAllOutputsDataObjects:G,getOutputsComputedValues:re,getAllOutputsComputedValues:de,getOutputsFetchedSources:he,getAllOutputsFetchedSources:xe,removeCard:B,addCardFiles:x,cardRefreshedNotify:h,retrigger:D,processAccumulatedEvents:j,upsertCard:X,taskFailed:N,taskProgress:$,sourceDataFetched:Z,sourceDataFetchFailure:H}}function pn(e,t){let r=()=>Rr(t.kvStorage("config"));function n(){let R=r().readCardStoreRef();if(!R)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let l=t.kvStorageForRef(R);return {readIndex(){return l.read("_index")},writeIndex(y){l.write("_index",y);},readCard(y){return l.read(y)},writeCard(y,O){return l.write(y,O),t.hashFn(O)},removeCard(y){l.delete(y);},cardExists(y){return l.read(y)!==null},defaultCardKey(y){return y}}}let o=()=>xt(n(),t.onWarn??(()=>{}));async function s(R,l){let y=t.validateSchema(l),O=[],w=r().readTaskExecutorRef();if(w&&Array.isArray(l.source_defs))for(let m of l.source_defs){let p=typeof m.bindTo=="string"?m.bindTo:"(unknown)";try{let k;try{k=await t.invokeExecutor(w,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(m)});}catch(B){let x=B;if(k=typeof x?.stdout=="string"?x.stdout:"",!k.trim()){O.push(`source "${p}": executor validate-source-def failed \u2014 ${B instanceof Error?B.message:String(B)}`);continue}}let S=JSON.parse(k.trim());if(!S.ok&&Array.isArray(S.errors))for(let B of S.errors)O.push(`source "${p}": ${B}`);}catch(k){O.push(`source "${p}": executor validate-source-def failed \u2014 ${k instanceof Error?k.message:String(k)}`);}}let _=[...y.errors,...O];return ce({cardId:R,isValid:_.length===0,issues:_})}function i(R,l){let y=R.params?.sourceIdx,O=R.params?.outRef;if(y===void 0)return ae(`${l} requires params.sourceIdx`);if(!R.body||typeof R.body!="object"||Array.isArray(R.body))return ae(`${l} requires card JSON object in body`);let w=R.body,_=w["card-content"]??w,m=w["mock-projections"]??{},p=_.source_defs??[];if(y<0||y>=p.length)return ae(`sourceIdx ${y} out of range (card has ${p.length} source(s))`);let k=p[y],S=typeof k.bindTo=="string"?k.bindTo:"source";return {src:k,bindTo:S,outRef:O,mockProjections:m}}async function a(R){try{if(!R.body||typeof R.body!="object"||Array.isArray(R.body))return ae("validateCardPreflight requires card JSON object in body");let l=R.body,y=l["card-content"]??l,O=typeof y.id=="string"?y.id:"(unknown)";return await s(O,y)}catch(l){return me(l)}}async function u(R){try{let l=i(R,"probeSourcePreflight");if("status"in l)return l;let y=r().readTaskExecutorRef();if(!y)return ae("No task-executor registered for this board");try{let O={...l.src,_projections:l.mockProjections},w=await t.invokeExecutor(y,"probe-source-preflight",{timeout:l.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(O)}),_=JSON.parse(w.trim());return _.ok?ce({bindTo:l.bindTo,reachable:_.reachable,latencyMs:_.latencyMs,note:_.note}):ae(_.error??"Preflight probe failed")}catch{return ae("Executor does not support probe-source-preflight")}}catch(l){return me(l)}}async function b(R){try{let l=i(R,"runSourcePreflight");if("status"in l)return l;let y=r().readTaskExecutorRef();if(!y)return ae("No task-executor registered for this board");try{let O={...l.src,_projections:l.mockProjections},w=await t.invokeExecutor(y,"run-source-preflight",{timeout:l.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(O)}),_=JSON.parse(w.trim());if(!_.ok)return ce({bindTo:l.bindTo,ok:!1,result:null,issues:[_.error??"Preflight run failed"]});if(l.outRef){let m=Qe(l.outRef);t.absoluteBlob.write(m.value,JSON.stringify(_.resultValue,null,2));}return ce({bindTo:typeof _.bindTo=="string"?_.bindTo:l.bindTo,ok:!0,result:_.resultValue??null,issues:[]})}catch(O){let w=O instanceof Error?O.message:String(O);return ce({bindTo:l.bindTo,ok:!1,result:null,issues:[w]})}}catch(l){return me(l)}}async function A(R){try{let l=r().readTaskExecutorRef();if(!l)return ae("No task-executor registered for this board");let y=await t.invokeExecutor(l,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return ce(JSON.parse(y.trim()))}catch(l){return me(l)}}function f(R){try{let l=R.body;if(!l||!Array.isArray(l.ops))return ae("updatesInCardStore requires body.ops array");let y=l.ops,O=o();for(let w of y){let _=w.op,m=w.id;if(!m)return ae('op is missing "id"');if(_==="update"){let p=w["card-content"];if(!p)return ae(`update op for "${m}" is missing "card-content"`);O.writeCard(m,p);}else return ae(`Unknown op type: "${_??"(none)"}"`)}return ce()}catch(l){return me(l)}}function g(R){try{let l=R.body;if(!l||!Array.isArray(l.ids))return ae("readFromCardStore requires body.ids array");let y=l.ids,O=o(),w=y.map(_=>({id:_,"card-content":O.readCard(_)}));return ce({cards:w})}catch(l){return me(l)}}function v(R){try{if(!R.body||typeof R.body!="object"||Array.isArray(R.body))return ae("evalCardCompute requires a JSON object in body");let l=R.body,y=l["card-content"]??l,O=typeof y.id=="string"?y.id:"(unknown)",w=l["mock-fetched-sources"]??{},_=l["mock-requires"]??{},m=y.compute;if(!m||!Array.isArray(m)||m.length===0)return ce({cardId:O,ok:!0,computed_values:{},errors:[]});let p={id:O,card_data:y.card_data??{},requires:_,source_defs:y.source_defs,compute:m},k=$e.runSync(p,{sourcesData:w}),S=k.node.computed_values??{},B=k.errors??[];return ce({cardId:O,ok:B.length===0,computed_values:S,errors:B})}catch(l){return me(l)}}async function C(R){try{if(!R.body||typeof R.body!="object"||Array.isArray(R.body))return ae("simulateCardCycle requires a JSON object in body");let l=R.body,y=l["card-content"]??l,O=typeof y.id=="string"?y.id:"(unknown)",w=l["mock-fetched-sources"]??{},_=l["mock-requires"]??{},m=await s(O,y),p=m.status==="success"?{isValid:m.data.isValid,issues:m.data.issues}:{isValid:!1,issues:[m.status==="fail"?m.error:"internal error"]},k=y.source_defs??[],S=y.card_data??{},B=[],x=[];if(k.length>0){B=$e.enrichSourcesSync(k,{card_data:S,requires:_});for(let M of B){let z=M.projections,oe=M._projections;if(z&&oe){for(let we of Object.keys(z))if(oe[we]===void 0){let T=typeof M.bindTo=="string"?M.bindTo:"(unknown)";x.push({bindTo:T,key:we,error:`Projection "${we}" resolved to undefined`});}}}}let h=[],D={...w},j=l["task-executor-ref"],X=(j?.howToRun&&j?.whatToRun?j:void 0)??r().readTaskExecutorRef();for(let M=0;M<B.length;M++){let z=B[M],oe=typeof z.bindTo=="string"?z.bindTo:`source_${M}`;if(!X){h.push({bindTo:oe,skipped:!0,error:"No task executor configured"});continue}try{let we={...z},T=await t.invokeExecutor(X,"run-source-preflight",{timeout:z.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(we)}),I=JSON.parse(T.trim());I.ok&&!Object.prototype.hasOwnProperty.call(w,oe)&&Object.prototype.hasOwnProperty.call(I,"resultValue")&&(D[oe]=I.resultValue),h.push({bindTo:oe,reachable:I.reachable,latencyMs:I.latencyMs,error:I.ok?void 0:I.error});}catch{h.push({bindTo:oe,skipped:!0,error:"Executor does not support run-source-preflight"});}}let N=y.compute,$={},Z=[];if(N&&Array.isArray(N)&&N.length>0){let M={id:O,card_data:S,requires:_,source_defs:y.source_defs,compute:N},z=$e.runSync(M,{sourcesData:D});$=z.node.computed_values??{},Z=z.errors??[];}let H=p.isValid&&x.length===0&&Z.length===0&&h.every(M=>M.reachable!==!1);return ce({cardId:O,ok:H,validation:p,source_probes:h,projection_errors:x,fetched_sources:D,computed_values:$,compute_errors:Z})}catch(l){return me(l)}}return {validateCardPreflight:a,probeSourcePreflight:u,runSourcePreflight:b,evalCardCompute:v,simulateCardCycle:C,describeTaskExecutorCapabilities:A,updatesInCardStore:f,readFromCardStore:g}}async function mn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function gn(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return jt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",qt(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){return e.write("card-store-ref",r)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){return e.write("outputs-store-ref",r)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){return e.write("scratch-store-ref",r)},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){return e.write("archive-store-ref",r)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){return e.write("chat-store-ref",r)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){return e.write("artifacts-store-ref",r)}}}function Eo(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Yt(e,t){return Eo(e)?e.then(t):t(e)}function yn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=yn(r[n],o):r[n]=o;return r}function Xt(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let s=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:Xt(s,o,r)}}function hn(e){return {read:r=>e.read(r),get(r,n){return Yt(e.read(r),o=>{if(o===null)return null;let s=o;for(let i of n.split(".").filter(Boolean)){if(s===null||typeof s!="object"||Array.isArray(s))return null;s=s[i]??null;}return s??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return Yt(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return Yt(e.read(r),o=>e.write(r,yn(o??{},n)))},patch(r,n,o){return Yt(e.read(r),s=>{let i=n.split(".").filter(Boolean);return e.write(r,Xt(s??{},i,o))})}}}function Zt(e){return hn(e)}function er(e,t){return {async readIndex(){return await e.read("_index")},writeIndex(r){return e.write("_index",r)},async readCard(r){return await e.read(r)},async writeCard(r,n){return await e.write(r,n),t(n)},removeCard(r){return e.delete(r)},async cardExists(r){return await e.read(r)!==null},defaultCardKey(r){return r}}}function tr(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,s]of Object.entries(await r())){if(!await e.cardExists(s.key))continue;let i=await e.readCard(s.key);i?n.push(i):t?.(`[card-store] could not read card "${o}" at key "${s.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,s]of Object.entries(await r()))n[o]=s.checksum;return n},async changedSince(n){let o=await r(),s=[];for(let[i,a]of Object.entries(o))n[i]!==a.checksum&&s.push(i);for(let i of Object.keys(n))o[i]||s.push(i);return s},async validateUpsert(n,o){let s=await r(),i=s[n],a=Object.entries(s).find(([,u])=>u.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:a&&a[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${a[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,s){let i=await r(),a=s??i[n]?.key??e.defaultCardKey(n),u=await e.writeCard(a,o);i[n]={key:a,checksum:u,updatedAt:new Date().toISOString()},await e.writeIndex(i);},async patchCard(n,o,s){let i=await r(),a=i[n];if(!a||!await e.cardExists(a.key))throw new Error(`card "${n}" not found`);let u=await e.readCard(a.key);if(!u||typeof u!="object"||Array.isArray(u))throw new Error(`card "${n}" is not patchable`);let b=String(o||"").split(".").filter(Boolean),A=Xt(u,b,s),f=await e.writeCard(a.key,A);i[n]={key:a.key,checksum:f,updatedAt:new Date().toISOString()},await e.writeIndex(i);},async removeCard(n){let o=await r(),s=o[n];s&&(await e.removeCard(s.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function Ie(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function Re(e){return {status:"fail",error:e}}function Te(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Ue(){return new Date().toISOString()}function Oo(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 Cn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function rr(e){try{let t=JSON.parse(Cn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Bo(e){return Oo(JSON.stringify(e))}function kn(e){try{let t=JSON.parse(Cn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Fo(e){return Ut(e,Cr,()=>({_sources:{}}))}function qo(e,t){return Nt(e,t)}function jo(e){return Vt(e)}function Lo(e,t){return $t(e,t)}function Do(e,t,r,n,o,s){return async i=>{let a=[],u=await r.cardStore.readCard(i.nodeId);if(!u)return "task-initiate-failure";let b=u.id,A=u.card_data??{},f=u.source_defs??[],g=f.filter(N=>N.optionalForCompletionGating!==true),v=await r.cardRuntimeStore.readRuntime(b),C=false,R=async()=>{C&&(await r.cardRuntimeStore.writeRuntime(b,v),C=false);},l=N=>bt(v._sources[N]),y=(N,$)=>{v._sources[N]=bt($),C=true;},O=i.taskState?.executionCount??0;if(v._lastExecutionCount!==O&&(v._sources={},v._lastExecutionCount=O,C=true),i.update){let N=i.update.outputFile;if(N){let $=l(N);if(i.update.failure){let Z=i.update.rqt??$.lastRequestedToken??$.queueRequestedToken;Z&&y(N,At($,Z));}else {let Z=i.update.rqt;if(!$.lastCompletedToken||Z>$.lastCompletedToken){let H=typeof i.update.deliveryToken=="string"?i.update.deliveryToken:void 0,M=H?await r.fetchedSourcesStore.commitSourceData(b,N,H):false;y(N,M?wr($,Z):At($,Z));}}await R();}}let w={};for(let N of f){if(!N.outputFile)continue;let $=await r.fetchedSourcesStore.readSourceData(b,N.outputFile);$!==null&&(w[N.bindTo]=$);}let _={};for(let[N,$]of Object.entries(i.state??{}))if($!==null&&typeof $=="object"&&!Array.isArray($)){let Z=$[N];_[N]=Z!==void 0?Z:$;}else _[N]=$;let m={id:b,card_data:{...A},requires:_,source_defs:f,compute:u.compute};m._sourcesData=w,u.compute&&$e.runSync(m,{sourcesData:w}),(o??(()=>{}))(b,m.computed_values??{});let p=$e.enrichSourcesSync(Array.isArray(u.source_defs)?u.source_defs:void 0,{card_data:u.card_data,requires:_}),k={...u,source_defs:Array.isArray(p)?p.map(N=>({...N,boardDir:typeof N.boardDir=="string"&&N.boardDir?N.boardDir:e.value})):p},S=Ue(),B=i.update?void 0:S,x=g.filter(N=>{let $=N.outputFile;if(typeof $!="string"||!$)return true;let Z=l($);B&&(Z={...Z,queueRequestedToken:B},y($,Z));let H=Z.queueRequestedToken??Z.lastRequestedToken??S;return vt(Z,H)==="dispatch"});if(await R(),x.length>0){let N=false,$=S;for(let Z of x){let H=Z.outputFile;if(typeof H!="string"||!H)continue;let M=l(H),z=M.queueRequestedToken??S;y(H,{...M,lastRequestedToken:z}),$=z,N=true;}return N&&await R(),N&&(a.push({taskKind:"source-fetch",payload:{boardRef:ve(e),enrichedCard:k,callbackToken:i.callbackToken,rqt:$}}),await r.executionRequestStore.appendEntries(t,a)),"task-initiated"}if(g.some(N=>{let $=N.outputFile;if(typeof $!="string"||!$)return false;let Z=l($),H=Z.queueRequestedToken??Z.lastRequestedToken??S;return vt(Z,H)==="in-flight"}))return "task-initiated";let D=u.provides??[],j={};for(let{bindTo:N,ref:$}of D)j[N]=$e.resolve(m,$);return (s??(()=>{}))(j),f.filter(N=>{if(N.optionalForCompletionGating!==true)return false;let $=l(N.outputFile);return !$.lastRequestedToken||!$.lastCompletedToken?true:$.lastCompletedToken<=$.lastRequestedToken}).length>0&&a.push({taskKind:"source-fetch",payload:{boardRef:ve(e),enrichedCard:k,callbackToken:i.callbackToken,rqt:S}}),n(i.nodeId,j),a.length>0&&await r.executionRequestStore.appendEntries(t,a),"task-initiated"}}function Rn(e,t){_t(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let r=t.callbackTransport,n=t.warn??(()=>{}),o=ve(e),s=null;function i(x){if(x.length!==0)try{return Promise.resolve(t.publishBoardChangeNotifications?.(x)).catch(h=>{n(`[async-board-live-cards-public] publishBoardChangeNotifications failed: ${h instanceof Error?h.message:String(h)}`);})}catch(h){n(`[async-board-live-cards-public] publishBoardChangeNotifications failed: ${h instanceof Error?h.message:String(h)}`);return}}let a=()=>gn(t.kvStorage("config")),u=()=>t.kvStorage("state-snapshot"),b=e.value,A=()=>Dt(hr(()=>u(),t.hashFn),"v1"),f=async()=>{let x=await a().readOutputsStoreRef();if(!x)throw new Error(`Board at ${e.value} has no outputs store configured.`);return jo(t.kvStorageForRef(x))},g=async()=>{let x=await a().readCardStoreRef();if(!x)throw new Error(`Board at ${e.value} has no card store configured.`);let h=t.kvStorageForRef(x);return tr(er(Zt(h),t.hashFn),n)};async function v(){return !!(await A().readSnapshot(b)).values[Ye]}async function C(){let x=await A().readSnapshot(b);if(!x.values[Ye])throw new Error(`Board not initialized at ${e.value}`);return Gt(x.values)}async function R(x,h){let D=await A().commitSnapshot(b,{schemaVersion:"v1",expectedVersion:h,deleteKeys:[],shallowMerge:Jt(x)});if(!D.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${h??"null"} current=${D.currentVersion??"null"}`)}let l=()=>en(t.journalStorage());async function y(x){await l().appendEvent(x);}function O(){return qo(t.blobStorage("sources"),x=>t.resolveBlob(x))}async function w(x){let h=await Promise.resolve(t.blobStorage("sources").keyRef?.(x));return h?ve(h):x}async function _(){let x=Lo(t.kvStorage("execution-requests"),async(c,E)=>{let L=c.payload,ne=(L.enrichedCard??{}).id??L.cardId??"unknown";await y({type:"task-failed",taskName:ne,error:E,timestamp:Ue()});}),h=Fo(t.kvStorage("card-runtime")),D=O(),j=await g(),X=await f(),N=new Map,$=new Map,Z=[],H=[],M=[],z=new Map,oe=new Set,we={async readRuntime(c){return N.get(c)??await h.readRuntime(c)},async writeRuntime(c,E){N.set(c,E);}},T={async readSourceData(c,E){let L=`${c}/${E}`;return $.has(L)?$.get(L):await D.readSourceData(c,E)},ingestSourceDataStaged(c,E,L,ee){return D.ingestSourceDataStaged(c,E,L,ee)},async commitSourceData(c,E,L){let ee=`${c}/.staged/${L}/${E}`,ne=t.blobStorage("sources"),te=await ne.read(ee);if(te==null){let be=await ne.keyRef?.(ee);be&&(te=await t.resolveBlob(be));}if(te==null)return false;let le=`${c}/${E}`,Se=te.trim();try{$.set(le,JSON.parse(Se));}catch{$.set(le,Se);}return Z.push({cardId:c,outputFile:E,deliveryToken:L}),true},async hasSource(c,E){let L=`${c}/${E}`;return $.has(L)||await D.hasSource(c,E)},async listSources(c){let E=await D.listSources(c),L=[...$.keys()].filter(ee=>ee.startsWith(`${c}/`)).map(ee=>ee.slice(`${c}/`.length));return [...new Set([...E,...L])]}},I=await C(),U=dt(I.graph),{events:J,newCursor:G}=await l().readEntriesAfterCursor(I.lastDrainedJournalId),re=J,de=Ot(U,{handlers:{"card-handler":Do(e,G,{cardStore:j,cardRuntimeStore:we,fetchedSourcesStore:T,executionRequestStore:x},(c,E)=>{re.push({type:"task-completed",taskName:c,data:E,timestamp:Ue()});},(c,E)=>{H.push({cardId:c,values:E});},c=>{M.push(c);})},onNodeRemoved:c=>{z.delete(c),N.delete(c),oe.add(c);}});for(;re.length>0;){let c=re;re=[];for(let E of c)if(E.type==="task-restart"){let L=await j.readCard(E.taskName);L&&z.set(E.taskName,L);}de.pushAll(c),await de.waitForHandlers();}let pe=de.getState();await de.dispose({wait:true}),await R({lastDrainedJournalId:G,graph:it(pe)},(await A().readSnapshot(b)).version);for(let{cardId:c,values:E}of H)await X.writeComputedValues(c,E);for(let c of M)await X.writeDataObjects(c);for(let[c,E]of N)await h.writeRuntime(c,E);for(let c of Z)await D.commitSourceData(c.cardId,c.outputFile,c.deliveryToken);let ye=ct(o,pe);await X.writeStatusSnapshot(ye);let he=[];for(let{cardId:c,values:E}of H)he.push({kind:"computed_values",cardId:c,values:E});for(let c of M)for(let[E,L]of Object.entries(c))he.push({kind:"data_object",key:E,payload:L});for(let[c,E]of z)he.push({kind:"card_refreshed",cardId:c,card:E});for(let c of oe)he.push({kind:"card_removed",cardId:c});he.push({kind:"status",status:ye}),await i(he);let xe=await a().readTaskExecutorRef();if(!xe)return;let q=t.supportsDirectSourceOutput?.(xe)===true;await x.dispatchEntriesForJournalId(G,async c=>{if(c.taskKind!=="source-fetch"){n(`[async-process-accumulated-events] unknown taskKind "${c.taskKind}" \u2014 skipping`);return}let E=c.payload,L=E.enrichedCard?.id??"unknown",ee=E.enrichedCard?.source_defs??[];for(let ne of ee){if(!ne.outputFile)continue;let te;if(q){let be=t.genId(),Ve=`${L}/.staged/${be}/${ne.outputFile}`,je=await Promise.resolve(t.blobStorage("sources").keyRef?.(Ve));je&&(te={ref:ve(je),deliveryToken:be,outputFile:ne.outputFile,cardId:L});}let le=Bo({cbk:E.callbackToken,rg:e.value,br:ve(e),cid:L,b:ne.bindTo,d:ne.outputFile,cs:void 0,rqt:E.rqt,...te?{dt:te.deliveryToken}:{}}),Se=await t.dispatchExecution(xe,{source_def:ne,base_ref:ve(e),callback:r.createCallback(le),...te?{output:te}:{}});Se.dispatched||await y({type:"task-failed",taskName:L,error:Se.error??"dispatch failed",timestamp:Ue()});}});}async function m(){try{let x=async()=>{let D=await C(),{events:j}=await l().readEntriesAfterCursor(D.lastDrainedJournalId);j.length>0&&await k();},h=await mn(t.lock,_,x);return Ie({ran:h!==!1})}catch(x){return Te(x)}}async function p(){return s||(s=m().finally(()=>{s=null;}),s)}async function k(){let x=t.processAccumulatedStore();x.enqueueIfAbsent?await x.enqueueIfAbsent({boardRef:ve(e)},`process-accumulated:${ve(e)}`):await x.enqueue({boardRef:ve(e)}),await t.requestProcessAccumulated?.();}async function S(){let x=t.processAccumulatedStore();for(;;){let h=await x.lease({max:64,visibilityMs:1e3});if(h.length<=0)return;for(let D of h)await x.ack(D.id,D.leaseToken);if(h.length<64)return}}function B(){k();}return {async init(x){try{let h=x.params?.cardStoreRef;if(!h)return Re("init requires params.cardStoreRef");let D=x.params?.outputsStoreRef;if(!D)return Re("init requires params.outputsStoreRef");await v()||await R({lastDrainedJournalId:"",graph:it(gt(It))},null);let j=a();await j.writeCardStoreRef(h),await j.writeOutputsStoreRef(D);let X=x.params?.scratchStoreRef,N=x.params?.archiveStoreRef,$=x.params?.chatStoreRef,Z=x.params?.artifactsStoreRef;X&&await j.writeScratchStoreRef(X),N&&await j.writeArchiveStoreRef(N),$&&await j.writeChatStoreRef($),Z&&await j.writeArtifactsStoreRef(Z);let H=x.body??{};return H["task-executor-ref"]&&await j.writeTaskExecutorRef(H["task-executor-ref"]),Object.prototype.hasOwnProperty.call(H,"chat-handler-flow")&&await j.writeChatHandlerFlow(H["chat-handler-flow"]),await(await f()).writeStatusSnapshot(ct(o,dt((await C()).graph))),Ie()}catch(h){return Te(h)}},async status(x){try{let h=await f(),D=await h.readStatusSnapshot();return D||(D=ct(o,dt((await C()).graph)),await h.writeStatusSnapshot(D)),Ie(D)}catch(h){return Te(h)}},async getCardStoreRef(x){try{let h=await a().readCardStoreRef();return h?Ie({storeRef:h}):Re(`Board at ${e.value} has no card store configured`)}catch(h){return Te(h)}},async getOutputsStoreRef(x){try{let h=await a().readOutputsStoreRef();return h?Ie({storeRef:h}):Re(`Board at ${e.value} has no outputs store configured`)}catch(h){return Te(h)}},async getScratchStoreRef(x){try{return Ie({storeRef:await a().readScratchStoreRef()})}catch(h){return Te(h)}},async getArchiveStoreRef(x){try{return Ie({storeRef:await a().readArchiveStoreRef()})}catch(h){return Te(h)}},async getChatStoreRef(x){try{return Ie({storeRef:await a().readChatStoreRef()})}catch(h){return Te(h)}},async getArtifactsStoreRef(x){try{return Ie({storeRef:await a().readArtifactsStoreRef()})}catch(h){return Te(h)}},async getConfig(x){try{let h=x.params?.key;if(!h)return Re("getConfig requires params.key");let D=a(),j;switch(h){case "task-executor":j=await D.readTaskExecutorRef()??null;break;case "chat-handler-flow":j=await D.readChatHandlerFlow()??null;break;case "card-store-ref":j=await D.readCardStoreRef();break;case "outputs-store-ref":j=await D.readOutputsStoreRef();break;case "scratch-store-ref":j=await D.readScratchStoreRef();break;case "archive-store-ref":j=await D.readArchiveStoreRef();break;case "chat-store-ref":j=await D.readChatStoreRef();break;case "artifacts-store-ref":j=await D.readArtifactsStoreRef();break;default:return Re(`getConfig: unknown key "${h}"`)}return Ie({value:j})}catch(h){return Te(h)}},async getOutputsDataObject(x){try{let h=x.params?.key;return h?Ie(await(await f()).readDataObject(h)):Re("getOutputsDataObject requires params.key")}catch(h){return Te(h)}},async getAllOutputsDataObjects(x){try{return Ie(await(await f()).readAllDataObjects())}catch(h){return Te(h)}},async getOutputsComputedValues(x){try{let h=x.params?.key;return h?Ie(await(await f()).readComputedValues(h)):Re("getOutputsComputedValues requires params.key")}catch(h){return Te(h)}},async getAllOutputsComputedValues(x){try{return Ie(await(await f()).readAllComputedValues())}catch(h){return Te(h)}},async getOutputsFetchedSources(x){try{let h=x.params?.key;if(!h)return Re("getOutputsFetchedSources requires params.key");let D=await O().listSources(h),j={};for(let X of D)j[X]=await w(`${h}/${X}`);return Ie(j)}catch(h){return Te(h)}},async getAllOutputsFetchedSources(x){try{let h=O(),D=await t.blobStorage("sources").listKeys(),j=new Set;for(let N of D){let $=N.indexOf("/");$>0&&!N.includes("/.staged/")&&j.add(N.slice(0,$));}let X={};for(let N of j){let $=await h.listSources(N);if($.length!==0){X[N]={};for(let Z of $)X[N][Z]=await w(`${N}/${Z}`);}}return Ie(X)}catch(h){return Te(h)}},async addCardFiles(x){try{let h=x.params?.cardId;if(!h)return Re("addCardFiles requires params.cardId");let D=await g(),j=await D.readCard(h);if(!j)return Re(`card "${h}" not found`);let X=x.body,N=Array.isArray(X)?X:X&&typeof X=="object"&&Array.isArray(X.files)?X.files:X!=null?[X]:null;if(!N||N.length===0)return Re("addCardFiles requires a file metadata object, array, or body.files array");let $=j.card_data&&typeof j.card_data=="object"&&!Array.isArray(j.card_data)?j.card_data:{},Z=Array.isArray($.files)?$.files:[],H=[...Z,...N],M=N.map((oe,we)=>({idx:Z.length+we,entry:oe}));await D.writeCard(h,{...j,card_data:{...$,files:H}});let z=await this.cardRefreshedNotify({params:{cardId:h}});return z.status!=="success"?z:Ie({cardId:h,files_added:M,notified:!0})}catch(h){return Te(h)}},async cardRefreshedNotify(x){try{let h=x.params?.cardId;if(!h)return Re("cardRefreshedNotify requires params.cardId");let D=await(await g()).readCard(h);return D?(await i([{kind:"card_refreshed",cardId:h,card:D}]),Ie({cardId:h,notified:!0})):Re(`Card "${h}" not found in board at ${e.value}`)}catch(h){return Te(h)}},async removeCard(x){try{let h=x.params?.id;if(!h)return Re("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(h);}catch{}return await y({type:"task-removal",taskName:h,timestamp:Ue()}),B(),Ie()}catch(h){return Te(h)}},async retrigger(x){try{let h=x.params?.id;return h?(await y({type:"task-restart",taskName:h,timestamp:Ue()}),B(),Ie()):Re("retrigger requires params.id")}catch(h){return Te(h)}},async processAccumulatedEvents(x){return await S(),p()},async upsertCard(x){try{let h=x.params?.cardId,D=x.params?.all,j=!!x.params?.restart;if(!h&&!D)return Re("upsertCard requires --card-id <id> or --all");let X=await g(),N=D?(await X.readAllCards()).map(Z=>Z.id):[h];for(let Z of N)if(!await X.readCard(Z))return Re(`Card "${Z}" not found in board at ${e.value}`);let $=t.kvStorage("card-upsert");for(let Z of N){let H=await X.readCard(Z);if(!H)continue;let M=Wt(H),z=t.hashFn(M),oe=await $.read(Z),we=oe?.taskConfigHash!==z;if(!(!we&&!j)){if(we){let T=oe?.blobRef??await X.readCardKey(Z)??Z;await y({type:"task-upsert",taskName:Z,taskConfig:M,timestamp:Ue()}),await $.write(Z,{blobRef:T,taskConfigHash:z,updatedAt:Ue()});}j&&await y({type:"task-restart",taskName:Z,timestamp:Ue()});}}return B(),Ie()}catch(h){return Te(h)}},async taskFailed(x){try{let h=x.params?.token;if(!h)return Re("taskFailed requires params.token");let D=x.params?.error??"unknown error",j=rr(h);return j?(await y({type:"task-failed",taskName:j.taskName,error:D,timestamp:Ue()}),B(),Ie()):Re("Invalid callback token")}catch(h){return Te(h)}},async taskProgress(x){try{let h=x.params?.token;if(!h)return Re("taskProgress requires params.token");let D=(x.body??{}).update??{},j=rr(h);return j?(await y({type:"task-progress",taskName:j.taskName,update:D,timestamp:Ue()}),B(),Ie()):Re("Invalid callback token")}catch(h){return Te(h)}},async sourceDataFetched(x){try{let h=x.params?.token,D=x.params?.ref;if(!h)return Re("sourceDataFetched requires params.token");if(!D)return Re("sourceDataFetched requires params.ref");let j=kn(h);if(!j)return Re("Invalid source token");let X=O(),N=j.dt||t.genId();j.dt||await X.ingestSourceDataStaged(j.cid,j.d,Qe(D),N);let $=rr(j.cbk);return $?(await y({type:"task-progress",taskName:$.taskName,update:{bindTo:j.b,outputFile:j.d,fetchedAt:Ue(),deliveryToken:N,sourceChecksum:j.cs,rqt:j.rqt},timestamp:Ue()}),B(),Ie()):Re("Invalid callback token embedded in source token")}catch(h){return Te(h)}},async sourceDataFetchFailure(x){try{let h=x.params?.token,D=x.params?.reason??"unknown";if(!h)return Re("sourceDataFetchFailure requires params.token");let j=kn(h);if(!j)return Re("Invalid source token");let X=rr(j.cbk);return X?(await y({type:"task-progress",taskName:X.taskName,update:{bindTo:j.b,outputFile:j.d,failure:!0,reason:D,sourceChecksum:j.cs,rqt:j.rqt},timestamp:Ue()}),B(),Ie()):Re("Invalid callback token embedded in source token")}catch(h){return Te(h)}}}}function wn(){return new Date().toISOString()}function Sn(e){return new TextEncoder().encode(e).byteLength}function Mo(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function bn(e){function t(r){let n=e.stat?Mo(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let o=e.read(r);return o===null?{key:r}:{key:r,size:Sn(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??wn(),s.size=s.size??Sn(n),s},putBytes(r,n,o="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 s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??wn(),s.size=s.size??n.byteLength,s},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function vn(){function e(o,s){if(!Array.isArray(o))return [];let i=[];for(let a of o){if(!a||typeof a!="object")continue;let u=a;typeof u.stored_name=="string"&&i.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,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:s||null,chat:u.chat===true});}return i}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let i=t(o);if(s.length===0)return o.files=i,i;let a=new Set(i.map(u=>u.stored_name));for(let u of s)a.has(u.stored_name)||(i.push(u),a.add(u.stored_name));return o.files=i,i}function n(o,s,i){let a=t(o);if(!Number.isInteger(s)||s<0||s>=a.length)return {ok:false,reason:"index_out_of_range"};let u=a[s];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:i&&i!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function No(){let e=globalThis.crypto;return typeof e?.randomUUID=="function"?String(e.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function An(){let e=new Map,t=new Map;function r(n){return e.has(n)||e.set(n,[]),e.get(n)}return {append(n,o,s,i=[],a=""){let u={id:No(),role:o,text:s,files:i,turn:a,updated_at:new Date().toISOString()};return r(n).push(u),u.id},readAll(n){return r(n).slice()},readAfter(n,o){let s=r(n);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let i=s.findIndex(u=>u.id===o),a=i===-1?s.slice():s.slice(i+1);return {records:a,cursor:a.length>0?a[a.length-1].id:o}},clear(n){e.set(n,[]);},setProcessing(n,o){o?t.set(`p:${n}`,true):t.delete(`p:${n}`);},isProcessing(n){return t.get(`p:${n}`)===true},getConfig(n){return t.get(`c:${n}`)??{}},setConfig(n,o){let s=t.get(`c:${n}`)??{};t.set(`c:${n}`,{...s,...o});}}}function xn(e){function t(f){let g=typeof f=="number"?f:Number(f);return Number.isInteger(g)&&g>0?g:null}function r(f,g){let v=g;for(let C=f.length-1;C>=0;C-=1)if(f[C]?.role==="user"&&(v-=1,v===0))return f.slice(C);return f}function n(f){return f.some(g=>typeof g?.turn=="string"&&g.turn!=="")}function o(f,g){if(g<=0)return [];if(!n(f))return r(f,g);let v=new Map,C=[];for(let l of f){let y=typeof l?.turn=="string"?l.turn:"";v.has(y)||(v.set(y,[]),C.push(y)),v.get(y).push(l);}return C.slice(Math.max(0,C.length-g)).flatMap(l=>v.get(l)??[])}function s(f){return {status:"success",data:f}}function i(f){return {status:"fail",error:f}}function a(f){return {status:"error",error:f instanceof Error?f.message:String(f)}}function u(f,g="command envelope"){let v=typeof f.cardId=="string"?f.cardId:void 0;if(!f.command)return i(`chat-store: ${g} missing "command"`);if(!v)return i(`chat-store: ${g} missing "cardId"`);if(f.command==="append")return A.append({params:{cardId:v},body:{role:f.role,text:f.text,files:f.files,turn:f.turn}});if(f.command==="read-all")return A.readAll({params:{cardId:v},body:{lastUserTurns:f.lastUserTurns,tailTurns:f.tailTurns,turnId:f.turnId,allTurns:f.allTurns,tailTurnsBeforeId:f.tailTurnsBeforeId}});if(f.command==="read-after")return A.readAfter({params:{cardId:v},body:{cursor:f.cursor??null}});if(f.command==="clear")return A.clear({params:{cardId:v}});if(f.command==="set-processing")return A.setProcessing({params:{cardId:v},body:{active:f.active}});if(f.command==="is-processing")return A.isProcessing({params:{cardId:v}});if(f.command==="get-config")return A.getConfig({params:{cardId:v}});if(f.command==="set-config"){let{command:C,cardId:R,...l}=f;return A.setConfig({params:{cardId:v},body:l})}return i(`chat-store: unknown command "${String(f.command)}"`)}function b(f){if(!Array.isArray(f.commands)||f.commands.length===0)return i('chat-store: command envelope must include a non-empty "commands" array');let g=[];for(let v=0;v<f.commands.length;v+=1){let C=f.commands[v];if(!C||typeof C!="object"||Array.isArray(C))return i(`chat-store: command envelope entry ${v} must be an object`);let R={cardId:f.cardId,...C},l=u(R,`command envelope entry ${v}`);if(l.status!=="success")return l;g.push({index:v,command:String(R.command),data:l.data});}return s({results:g})}let A={append(f){try{let g=f.params?.cardId;if(!g)return i("append requires params.cardId");let v=f.body??{},C=typeof v.role=="string"?v.role:"",R=typeof v.text=="string"?v.text:"",l=Array.isArray(v.files)?v.files:[],y=typeof v.turn=="string"?v.turn:"";if(!C)return i("append requires body.role");let O=e.append(g,C,R,l,y);return s({id:O})}catch(g){return a(g)}},readAll(f){try{let g=f.params?.cardId;if(!g)return i("readAll requires params.cardId");let v=f.body??{},C=typeof v.turnId=="string"?v.turnId:"",R=v.allTurns===!0,l=typeof v.tailTurnsBeforeId=="string"?v.tailTurnsBeforeId:"",y=v.tailTurns===void 0?v.lastUserTurns:v.tailTurns,O=y===void 0?R||C?void 0:1:t(y);if(y!==void 0&&O===null)return i("readAll requires body.tailTurns (positive integer)");let w=e.readAll(g),_=w.filter(m=>!C||String(m.turn||"")===C);if(l){let m=O;if(typeof m!="number"||!Number.isInteger(m)||m<=0)return i("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let p=new Map,k=[];for(let h of w){let D=String(h.turn||"");p.has(D)||(p.set(D,[]),k.push(D)),p.get(D).push(h);}let S=k.findIndex(h=>h===l),B=Math.max(0,S-m);return _=(S===-1?[]:k.slice(B,S)).flatMap(h=>p.get(h)??[]),s({records:_})}return s(typeof O=="number"?{records:o(_,O)}:{records:_})}catch(g){return a(g)}},readAfter(f){try{let g=f.params?.cardId;if(!g)return i("readAfter requires params.cardId");let C=(f.body??{}).cursor??null;return s(e.readAfter(g,C))}catch(g){return a(g)}},clear(f){try{let g=f.params?.cardId;return g?(e.clear(g),s({ok:!0})):i("clear requires params.cardId")}catch(g){return a(g)}},setProcessing(f){try{let g=f.params?.cardId;if(!g)return i("setProcessing requires params.cardId");let v=f.body??{};return typeof v.active!="boolean"?i("setProcessing requires body.active (boolean)"):(e.setProcessing(g,v.active),s({ok:!0}))}catch(g){return a(g)}},isProcessing(f){try{let g=f.params?.cardId;return g?s({active:e.isProcessing(g)}):i("isProcessing requires params.cardId")}catch(g){return a(g)}},getConfig(f){try{let g=f.params?.cardId;return g?s({config:e.getConfig(g)}):i("getConfig requires params.cardId")}catch(g){return a(g)}},setConfig(f){try{let g=f.params?.cardId;if(!g)return i("setConfig requires params.cardId");let v=f.body??{};return e.setConfig(g,v),s({ok:!0})}catch(g){return a(g)}},run:u,runBatch:b};return A}function In(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Sr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function br(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)br(e,n);return}r.kind==="status"&&Sr(r.status)&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card),r.kind==="card_removed"&&r.cardId&&(delete e.cards[r.cardId],delete e.computedValues[r.cardId]);}function Tn(e){let t=new Map,r=new Map,n=new Map,o=0,s=null;function i(m){let p=JSON.stringify(m);return o++,`id: ${o}
|
|
2
|
-
data: ${
|
|
1
|
+
var ServerRuntimeControlface=(function(exports){'use strict';var ao=Object.defineProperty;var io=(e,t,r)=>t in e?ao(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Nr=(e,t,r)=>io(e,t+"",r);var jt="b64:";function uo(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function co(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ke(e){return `${jt}${uo(JSON.stringify(e))}`}function at(e){if(!e.startsWith(jt))throw new Error(`Invalid ref format (expected ${jt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(co(e.slice(jt.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 $r(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function ot(e){return typeof e.journalStorage=="function"}function Ur(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?at(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function st(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pr(e){let t=e.reduce((o,s)=>o+s.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}function de(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function it(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function ut(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function ft(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Lt(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let s=Number(o);if(Number.isFinite(s))return s}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Vr(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function pt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,i=s.status;if(i==="success")return Object.prototype.hasOwnProperty.call(s,"data")?o:{status:"success",data:{}};if(i==="fail"||i==="error")return o}return {status:"success",data:o}}function rt(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let s=n.data;if(s&&typeof s=="object"&&!Array.isArray(s)){let i=s.issues;if(Array.isArray(i)){let p=i.find(T=>typeof T=="string"&&T.trim());if(typeof p=="string")return `Validation failed: ${p}`}let u=s.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function mr(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,buildPublishedRuntimePayload:i,createMcpControlplaneToolRegistry:u,retriggerCard:p,applyCardAction:T,resolveChatHandlerTarget:_,sendCardFileDownloadResponse:y}=e;async function C(S,R,I){let x=S.method||"GET",A=I,E=A.pathname;try{if(x==="POST"&&E===`${t}/mcp-actions`){await s();let f=Date.now(),l=new Date(f).toISOString(),k=await n(S),F=typeof k.tool=="string"?k.tool.trim():"",$=k.args&&typeof k.args=="object"&&!Array.isArray(k.args)?k.args:{};if(!F)return r(R,400,{error:"tool is required"}),!0;let J=de($,"card_id");if(!J)return r(R,400,{error:"MCP action requires card_id"}),!0;if(F==="retrigger-card"||F==="retrigger"){await p(J);let ie=Date.now();return r(R,200,{status:"success",data:{ok:!0,cardId:J,actionType:F,requestReceivedAt:l,requestReceivedAtMs:f,responseSentAt:new Date(ie).toISOString(),responseSentAtMs:ie,responseStatus:200}}),!0}let G=ut($,"payload");if(F==="chat-send"&&!await _(J)){let ie=Date.now();return r(R,409,{error:`chat handler is not configured for card: ${J}`,requestReceivedAt:l,requestReceivedAtMs:f,responseSentAt:new Date(ie).toISOString(),responseSentAtMs:ie,responseStatus:409}),!0}if(F==="chat-send"){let ie=typeof G["turn-id"]=="string"?G["turn-id"]:typeof G.turnId=="string"?G.turnId:typeof G.turn=="string"?G.turn:"";if(!ie||!String(ie).trim()){let Y=Date.now();return r(R,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${J}`,requestReceivedAt:l,requestReceivedAtMs:f,responseSentAt:new Date(Y).toISOString(),responseSentAtMs:Y,responseStatus:400}),!0}}await T(J,F,G);let te=Date.now();return r(R,200,{status:"success",data:{ok:!0,cardId:J,actionType:F,requestReceivedAt:l,requestReceivedAtMs:f,responseSentAt:new Date(te).toISOString(),responseSentAtMs:te,responseStatus:200}}),!0}if(x==="POST"&&E===`${t}/mcp-controlplane`){await s();let f=await n(S),l=typeof f.tool=="string"?f.tool.trim():"",k=f.args&&typeof f.args=="object"&&!Array.isArray(f.args)?f.args:{};if(!l)return r(R,400,{error:"tool is required"}),!0;try{let F=await pt(l,k,u());if(F&&typeof F=="object"&&!Array.isArray(F)){let $=F;if($.status==="fail")return r(R,400,{error:rt(F,"Request failed")}),!0;if($.status==="error")return r(R,500,{error:rt(F,"Internal error")}),!0}r(R,200,F);}catch(F){let $=typeof F?.statusCode=="number"?Number(F.statusCode):500,J=F instanceof Error?F.message:String(F);r(R,$,{error:J});}return !0}let c=E.match(new RegExp(`^${st(t)}/cards/([^/]+)/retrigger$`));if(x==="POST"&&c){await s();let f=decodeURIComponent(c[1]);return await p(f),r(R,200,{ok:!0}),!0}let h=E.match(new RegExp(`^${st(t)}/cards/([^/]+)/actions$`));if(x==="POST"&&h){await s();let f=decodeURIComponent(h[1]),l=Date.now(),k=new Date(l).toISOString(),F=await n(S),$=F?.actionType;if($==="chat-send"&&!await _(f)){let G=Date.now();return r(R,409,{error:`chat handler is not configured for card: ${f}`,requestReceivedAt:k,requestReceivedAtMs:l,responseSentAt:new Date(G).toISOString(),responseSentAtMs:G,responseStatus:409}),!0}if($==="chat-send"){let G=F?.payload??{},te=typeof G["turn-id"]=="string"?G["turn-id"]:typeof G.turnId=="string"?G.turnId:typeof G.turn=="string"?G.turn:"";if(!te||!String(te).trim()){let ie=Date.now();return r(R,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${f}`,requestReceivedAt:k,requestReceivedAtMs:l,responseSentAt:new Date(ie).toISOString(),responseSentAtMs:ie,responseStatus:400}),!0}}await T(f,$,F?.payload);let J=Date.now();return r(R,200,{ok:!0,requestReceivedAt:k,requestReceivedAtMs:l,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:200}),!0}let d=E.match(new RegExp(`^${st(t)}/cards/([^/]+)/files/(\\d+)$`));if(x==="GET"&&d){let f=decodeURIComponent(d[1]),l=parseInt(d[2],10),k=A.searchParams.get("sn");return await y(R,f,l,k),!0}return !1}catch(c){let h=c?.statusCode||500;return r(R,h,{error:String(c?.message||c)}),true}}return {handleRuntimeApi:C}}function Mt(e,t){if(!e||typeof e!="object")throw new Error(`${t}: adapter.callbackTransport is required`);if(typeof e.createCallback!="function")throw new Error(`${t}: adapter.callbackTransport.createCallback is required`)}var mt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ye(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function gt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Kr(e){return e.tasks??{}}function gr(e){return e?e.status===mt.FAILED||e.status===mt.INACTIVATED:false}function Hr(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Jr(e){return e.maxExecutions}function Gr(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===mt.COMPLETED){let s=e.tasks[n];s&&Ye(s).forEach(u=>r.add(u));}return Array.from(r)}function Wr(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Ye(o).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function Qr(e,t,r){let n=e.tasks[t]??Dt(),o={};if(r){let i=r.tasks[t],u=gt(i);for(let p of u)for(let[T,_]of Object.entries(r.tasks))if(Ye(_).includes(p)){let y=e.tasks[T];y?.lastDataHash&&(o[p]=y.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function zr(e,t,r,n,o,s){let i=e.tasks[r]??Dt(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let p;n&&u.on&&u.on[n]?p=u.on[n]:p=Ye(u);let T=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let C=u.requires??[];for(let S of C)for(let[R,I]of Object.entries(t.tasks))if(Ye(I).includes(S)){let x=e.tasks[R];x?.lastDataHash&&(T[S]=x.lastDataHash);break}}let _={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:T,error:void 0},y=[...new Set([...e.availableOutputs,...p])];return {...e,tasks:{...e.tasks,[r]:_},availableOutputs:y,lastUpdated:new Date().toISOString()}}function Yr(e,t,r,n){let o=e.tasks[r]??Dt(),s=t.tasks[r];if(s?.retry){let p=o.retryCount+1;if(p<=s.retry.max_attempts){let T={...o,status:"not-started",retryCount:p,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:T},lastUpdated:new Date().toISOString()}}}let i={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},u=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&i.executionCount>=s.circuit_breaker.max_executions){let p=s.circuit_breaker.on_break;u=[...new Set([...u,...p])];}return {...e,tasks:{...e.tasks,[r]:i},availableOutputs:u,lastUpdated:new Date().toISOString()}}function Xr(e,t,r,n){let o=e.tasks[t]??Dt(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Zr(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 Dt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function St(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=tn();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function lo(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:Qr(n,t.taskName,r)};case "task-completed":return {config:r,state:zr(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:Yr(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Xr(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Zr(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:Ro(n,t.action)};case "task-upsert":return fo(e,t.taskName,t.taskConfig);case "task-removal":return po(e,t.taskName);case "node-requires-add":return mo(e,t.nodeName,t.tokens);case "node-requires-remove":return go(e,t.nodeName,t.tokens);case "node-provides-add":return yo(e,t.nodeName,t.tokens);case "node-provides-remove":return ho(e,t.nodeName,t.tokens);default:return e}}function en(e,t){return t.reduce((r,n)=>lo(r,n),e)}function fo(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]:tn()},lastUpdated:new Date().toISOString()}}}function po(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function mo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=gt(n),s=r.filter(i=>!o.includes(i));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function go(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=gt(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function yo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=r.filter(i=>!o.includes(i));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function ho(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=o.filter(i=>!r.includes(i));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function yt(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function ht(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 tn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ro(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 xt(e){let{config:t,state:r}=e,n=Kr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=ko(n),i=Gr(t,r.tasks),u=new Set([...i,...r.availableOutputs]),p=[],T=[],_=[],y=[];for(let[S,R]of Object.entries(n)){let I=r.tasks[S],x=Hr(R,t.settings),A=x!=="once";if(I?.status===mt.RUNNING||gr(I))continue;let E=Jr(R);if(E!==void 0&&I&&I.executionCount>=E||R.circuit_breaker&&I&&I.executionCount>=R.circuit_breaker.max_executions||!A&&I?.status===mt.COMPLETED)continue;if(A&&I?.status===mt.COMPLETED){let l=gt(R),k=false;switch(x){case "data-changed":{l.length>0&&l.some($=>{for(let[J,G]of Object.entries(n))if(Ye(G).includes($)){let te=r.tasks[J];if(!te)continue;let ie=I.lastConsumedHashes?.[$];return te.lastDataHash==null?te.executionCount>I.lastEpoch:te.lastDataHash!==ie}return false})||(k=true);break}case "epoch-changed":{l.length>0&&l.some($=>{for(let[J,G]of Object.entries(n))if(Ye(G).includes($)){let te=r.tasks[J];if(te&&te.executionCount>I.lastEpoch)return true}return false})||(k=true);break}case "time-based":{let F=R.refreshInterval??0;if(F<=0){k=true;break}let $=I.completedAt;if(!$){k=true;break}(Date.now()-Date.parse($))/1e3<F&&(k=true);break}case "manual":k=true;break}if(k)continue}let c=gt(R);if(c.length===0){p.push(S);continue}let h=[],d=[],f=[];for(let l of c){if(u.has(l))continue;let k=s[l]||[];k.length===0?h.push(l):k.every($=>gr(r.tasks[$]))?f.push({token:l,failedProducer:k[0]}):d.push(l);}h.length>0?_.push({taskName:S,missingTokens:h}):f.length>0?y.push({taskName:S,failedTokens:f.map(l=>l.token),failedProducers:[...new Set(f.map(l=>l.failedProducer))]}):d.length>0?T.push({taskName:S,waitingOn:d}):p.push(S);}let C={};if(p.length>1){let S=Wr(p,n);for(let[R,I]of Object.entries(S))I.length>1&&(C[R]=I);}return {eligible:p,pending:T,unresolved:_,blocked:y,conflicts:C}}function ko(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of Ye(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var It=class{constructor(){Nr(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function yr(e){let t=hr(e);return Co(t)}function hr(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(hr).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+hr(t[n])).join(",")+"}"}function Co(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function wo(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 So(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function rn(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return wo(t)}function bo(e){try{let t=JSON.parse(So(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Nt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:s}=t,i=new It,u="state"in e&&"config"in e?e:St(e),p=false,T=new Set,_=new Map(Object.entries(n)),y=new It,C=false,S=false;function R(){if(!p){if(C){S=true;return}C=true;try{do S=!1,I();while(S)}finally{C=false;}}}function I(){let c=y.drain(),h=i.drain(),d=[...c,...h];if(d.length>0&&(u=en(u,d),o)){for(let l of d)if(l.type==="task-removal")try{o(l.taskName);}catch(k){console.warn("[reactive] onNodeRemoved failed:",k instanceof Error?k.message:String(k));}}let f=xt(u);d.length>0&&s?.(d,u,f);for(let l of f.eligible)E(l);for(let l of d)if(l.type==="task-progress"){let{taskName:k,update:F}=l;if(!u.config.tasks[k])continue;let J=u.state.tasks[k];if(!J||J.status!=="running")continue;let G=rn(k),te=A(k,G,F).catch(ie=>{p||(y.append({type:"task-failed",taskName:k,error:ie.message??String(ie),timestamp:new Date().toISOString()}),R());}).finally(()=>{T.delete(te);});T.add(te);}}function x(c){let d=u.config.tasks[c].requires??[],f=new Map;for(let[k,F]of Object.entries(u.config.tasks))for(let $ of F.provides??[])f.set($,k);let l={};for(let k of d){let F=f.get(k);F?l[k]=u.state.tasks[F]?.data:l[k]=void 0;}return l}async function A(c,h,d){let f=u.config.tasks[c],l=f.taskHandlers??[],k=x(c);for(let F of l){let $=_.get(F);if(!$)throw new Error(`Handler '${F}' not found in registry (task '${c}')`);let J={nodeId:c,state:k,taskState:u.state.tasks[c],config:f,callbackToken:h,update:d};if(await $(J)==="task-initiate-failure")throw new Error(`Handler '${F}' returned task-initiate-failure (task '${c}')`)}}function E(c){let d=u.config.tasks[c]?.taskHandlers;if(!d||d.length===0)return;y.append({type:"task-started",taskName:c,timestamp:new Date().toISOString()}),R();let f=rn(c),l=A(c,f).catch(k=>{p||(y.append({type:"task-failed",taskName:c,error:k.message??String(k),timestamp:new Date().toISOString()}),R());}).finally(()=>{T.delete(l);});T.add(l);}return {push(c){p||(c.type==="task-completed"&&c.data&&!c.dataHash&&(c={...c,dataHash:yr(c.data)}),i.append(c),R());},pushAll(c){if(!p){for(let h of c)h.type==="task-completed"&&h.data&&!h.dataHash?i.append({...h,dataHash:yr(h.data)}):i.append(h);R();}},resolveCallback(c,h,d){if(p)return;let f=bo(c);if(!f)return;let{taskName:l}=f;if(u.config.tasks[l]){if(d&&d.length>0)i.append({type:"task-failed",taskName:l,error:d.join("; "),timestamp:new Date().toISOString()});else {let k=h&&Object.keys(h).length>0?yr(h):void 0;i.append({type:"task-completed",taskName:l,data:h,dataHash:k,timestamp:new Date().toISOString()});}R();}},addNode(c,h){p||(i.append({type:"task-upsert",taskName:c,taskConfig:h,timestamp:new Date().toISOString()}),R());},removeNode(c){p||(i.append({type:"task-removal",taskName:c,timestamp:new Date().toISOString()}),R());},addRequires(c,h){p||(i.append({type:"node-requires-add",nodeName:c,tokens:h,timestamp:new Date().toISOString()}),R());},removeRequires(c,h){p||(i.append({type:"node-requires-remove",nodeName:c,tokens:h,timestamp:new Date().toISOString()}),R());},addProvides(c,h){p||(i.append({type:"node-provides-add",nodeName:c,tokens:h,timestamp:new Date().toISOString()}),R());},removeProvides(c,h){p||(i.append({type:"node-provides-remove",nodeName:c,tokens:h,timestamp:new Date().toISOString()}),R());},registerHandler(c,h){_.set(c,h);},unregisterHandler(c){_.delete(c);},retrigger(c){p||u.config.tasks[c]&&(i.append({type:"task-restart",taskName:c,timestamp:new Date().toISOString()}),R());},retriggerAll(c){if(!p){for(let h of c)u.config.tasks[h]&&i.append({type:"task-restart",taskName:h,timestamp:new Date().toISOString()});R();}},snapshot(){return yt(u)},getState(){return u},getSchedule(){return xt(u)},async waitForHandlers(){T.size>0&&await Promise.allSettled([...T]);},async dispose(c){c?.wait&&T.size>0&&await Promise.allSettled([...T]),p=true;}}}function $t(){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 vo=$t();vo("./jsonata-sync.cjs");var Ao=$t(),Ut=Ao("./jsonata-sync.cjs"),sn=Ut;function nn(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function an(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function xo(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await Ut(o.expr).evaluate(n);an(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Io(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let i=sn(s.expr).evaluate(n);an(e.computed_values,s.bindTo,i),n.computed_values=e.computed_values;}catch(i){let u=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function To(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Ut(e).evaluate(n)}function Po(e,t){return t.startsWith("fetched_sources.")?nn(e._sourcesData??{},t.slice(16)):nn(e,t)}var on=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),_o=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Eo(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))_o.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${i}]: must be an object`);else {let u=s;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(u.bindTo)&&t.push(`source_defs[${i}]: bindTo "${u.bindTo}" is not unique across source_defs`),n.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(u.outputFile)&&t.push(`source_defs[${i}]: outputFile "${u.outputFile}" is not unique across source_defs`),o.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):on.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...on].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Fo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await Ut(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Bo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=sn(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var ze={run:xo,runSync:Io,eval:To,resolve:Po,validate:Eo,enrichSources:Fo,enrichSourcesSync:Bo};function Vt(e){return JSON.stringify(e)}function Kt(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 Ht(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Rr(e,t){return Ht(e)?e.then(t):t(e)}function dn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function kr(e,t){return {readValues(n){let o=e(n);return Rr(o.listKeys(),s=>{let i=[...s].sort();if(i.length===0)return {version:null,values:{}};let u={},p=null;for(let T of i){let _=o.read(T);Ht(_)?p=(p??Promise.resolve()).then(async()=>{u[T]=await _;}):u[T]=_;}return p?p.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,s){let i=e(n),u=null;for(let p of s){let T=i.delete(p);Ht(T)&&(u=(u??Promise.resolve()).then(()=>T).then(()=>{}));}for(let[p,T]of Object.entries(o)){let _=i.write(p,T);Ht(_)&&(u=(u??Promise.resolve()).then(()=>_).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function Jt(e,t){return {readSnapshot(r){return e.readValues(r)},commitSnapshot(r,n){if(n.schemaVersion!==t)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);return Rr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let s=dn(o.values,n);return Rr(e.writeValues(r,s,n.deleteKeys),i=>({ok:true,newVersion:i}))})}}}function un(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function cn(e){return {readEntriesAfterCursor(t){let r=un(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return un(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function ln(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function Gt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function dt(e,t){return Gt(e)?e.then(t):t(e)}function Cr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);Gt(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function Oo(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function qo(e,t){let r=e.match(t);return r?r[1]:null}function fn(e,t,r){let n={},o=Cr(e,s=>{let i=r(s);if(i)return dt(t(s),u=>{n[i]=u;})});return Gt(o)?o.then(()=>n):n}function Wt(e,t){return {readSourceData(r,n){return dt(e.read(`${r}/${n}`),Oo)},ingestSourceDataStaged(r,n,o,s){return dt(t(o),i=>e.write(`${r}/.staged/${s}/${n}`,i))},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,i=`${r}/${n}`;return e.renameKey(s,i)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return dt(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function wr(e,t){let r=(n,o)=>{try{let s=o(n);return Gt(s)?s.catch(i=>t(n,i instanceof Error?i.message:String(i))):void 0}catch(s){try{return t(n,s instanceof Error?s.message:String(s))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return dt(e.read(n),s=>e.write(n,[...s??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return dt(e.read(n),s=>{let i=s;if(!(!i||i.length===0))return dt(Cr(i,u=>r(u,o)),()=>e.delete(n))})}}}function Sr(e,t,r){return {readRuntime(n){return dt(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function Qt(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return dt(e.listKeys("cards/"),t=>fn(t,r=>e.read(r),r=>qo(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return Cr(Object.entries(t),([r,n])=>{if(r)return n===void 0?e.delete(`data-objects/${r}`):e.write(`data-objects/${r}`,n)})},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){return dt(e.listKeys("data-objects/"),t=>fn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function Et(e,t){function r(){return e.readIndex()??{}}function n(o,s,i){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return i&&typeof i=="object"&&!Array.isArray(i)?i:{value:i};let p={...o},T=p;for(let _=0;_<u.length-1;_++){let y=u[_],C=T[y],S=C&&typeof C=="object"&&!Array.isArray(C)?{...C}:{};T[y]=S,T=S;}return T[u[u.length-1]]=i,p}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,i]of Object.entries(r())){if(!e.cardExists(i.key))continue;let u=e.readCard(i.key);u?o.push(u):t?.(`[card-store] could not read card "${s}" at key "${i.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,i]of Object.entries(r()))o[s]=i.checksum;return o},changedSince(o){let s=r(),i=[];for(let[u,p]of Object.entries(s))o[u]!==p.checksum&&i.push(u);for(let u of Object.keys(o))s[u]||i.push(u);return i},validateUpsert(o,s){let i=r(),u=i[o],p=Object.entries(i).find(([,T])=>T.key===s);return u&&u.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:p&&p[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${p[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,i){let u=r(),p=i??u[o]?.key??e.defaultCardKey(o),T=e.writeCard(p,s);u[o]={key:p,checksum:T,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,s,i){let u=r(),p=u[o];if(!p||!e.cardExists(p.key))throw new Error(`card "${o}" not found`);let T=e.readCard(p.key);if(!T||typeof T!="object"||Array.isArray(T))throw new Error(`card "${o}" is not patchable`);let _=n(T,s,i),y=e.writeCard(p.key,_);u[o]={key:p.key,checksum:y,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let s=r(),i=s[o];i&&(e.removeCard(i.key),delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function zt(e,t){return Wt(e,t)}function pn(e){return cn(e)}var Yt="v1",ct="board/graph",mn="board/lastJournalProcessedId";function gn(e){return `cards/${e}/runtime`}function yn(e){return Jt(e,Yt)}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 Kt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Vt(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){e.write("board-runtime-store-ref",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);},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){e.write("queue-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){e.write("chat-store-ref",r);},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){e.write("artifacts-store-ref",r);},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){e.write("fetched-sources-store-ref",r);}}}function hn(e){return Qt(e)}function Tt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function jo(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Pt(e,t){return e?.lastRequestedToken?jo(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function br(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function _t(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function Rt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=xt(t),i={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let R of s.pending)u.set(R.taskName,R.waitingOn);for(let R of s.unresolved)u.set(R.taskName,R.missingTokens);for(let R of s.blocked)u.set(R.taskName,R.failedTokens);let p=new Map;for(let[R,I]of Object.entries(n))for(let x of I.requires??[]){let A=p.get(x)??[];A.push(R),p.set(x,A);}let T=o.sort().map(R=>{let I=r[R],x=n[R]??{requires:[],provides:[]};I.status==="completed"?i.completed+=1:I.status==="failed"?i.failed+=1:I.status==="in-progress"&&(i.in_progress+=1);let A=x.requires??[],E=x.provides??[],c=Object.keys(I.data??{}).sort(),h=A.filter($=>t.state.availableOutputs.includes($)),d=A.filter($=>!t.state.availableOutputs.includes($)),f=u.get(R)??d,l=new Set;for(let $ of E)for(let J of p.get($)??[])J!==R&&l.add(J);let k=I.failedAt,F=I.error?{message:I.error,code:"TASK_FAILED",at:k,source:"task-runtime"}:void 0;return {name:R,status:I.status,error:F,requires:A,requires_satisfied:h,requires_missing:d,provides_declared:E,provides_runtime:c,blocked_by:f,unblocks:Array.from(l).sort(),runtime:{attempt_count:I.executionCount??0,restart_count:I.retryCount??0,in_progress_since:I.status==="in-progress"?I.startedAt??null:null,last_transition_at:I.lastUpdated??null,last_completed_at:I.completedAt??null,last_restarted_at:I.startedAt??null,status_age_ms:I.lastUpdated?0:null}}});i.pending=s.pending.length,i.blocked=s.blocked.length,i.unresolved=s.unresolved.length;let _=T.map(R=>({name:R.name,fanOut:R.unblocks.length})).sort((R,I)=>I.fanOut-R.fanOut||R.name.localeCompare(I.name)),y=_.length>0?_[0]:{name:null,fanOut:0},C=new Set;for(let R of Object.values(n))for(let I of R.requires??[])C.add(I);let S=0;for(let[R,I]of Object.entries(n)){let x=(I.requires??[]).length===0,E=(I.provides??[]).some(c=>(p.get(c)??[]).some(h=>h!==R));x&&!E&&(S+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:i.completed,eligible:s.eligible.length,pending:i.pending,blocked:i.blocked,unresolved:i.unresolved,failed:i.failed,in_progress:i.in_progress,orphan_cards:S,topology:{edge_count:Array.from(C).length,max_fan_out_card:y.name,max_fan_out:y.fanOut}},cards:T}}function Lo(){return new Date().toISOString()}function Rn(e,t,r,n,o,s,i){return async u=>{let p=[],T=r.cardStore.readCard(u.nodeId);if(!T)return "task-initiate-failure";let _=T.id,y=T.card_data??{},C=T.source_defs??[],S=C.filter(v=>v.optionalForCompletionGating!==true),R=r.cardRuntimeStore.readRuntime(_),I=false,x=()=>{I&&(r.cardRuntimeStore.writeRuntime(_,R),I=false);},A=v=>Tt(R._sources[v]),E=(v,g)=>{R._sources[v]=Tt(g),I=true;},c=u.taskState?.executionCount??0;if(R._lastExecutionCount!==c&&(R._sources={},R._lastExecutionCount=c,I=true),u.update){let v=u.update,g=v.outputFile;if(g){let L=A(g);if(v.failure){let D=v.rqt??L.lastRequestedToken??L.queueRequestedToken;D&&E(g,_t(L,D));}else {let D=v.rqt;if(!L.lastCompletedToken||D>L.lastCompletedToken){let H=typeof v.deliveryToken=="string"?v.deliveryToken:void 0,w=false;H&&(w=r.fetchedSourcesStore.commitSourceData(_,g,H)),w?E(g,br(L,D)):E(g,_t(L,D));}}x();}}let d={};for(let v of C)if(v.outputFile){let g=r.fetchedSourcesStore.readSourceData(_,v.outputFile);g!==null&&(d[v.bindTo]=g);}let f={};for(let[v,g]of Object.entries(u.state??{}))if(g!==null&&typeof g=="object"&&!Array.isArray(g)){let L=g[v];f[v]=L!==void 0?L:g;}else f[v]=g;let l={id:_,card_data:{...y},requires:f,source_defs:C,compute:T.compute};l._sourcesData=d,T.compute&&ze.runSync(l,{sourcesData:d}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(_,l.computed_values??{});let k={...T},F=ze.enrichSourcesSync(Array.isArray(T.source_defs)?T.source_defs:void 0,{card_data:T.card_data,requires:f}),$=e.value;k.source_defs=Array.isArray(F)?F.map(v=>({...v,boardDir:typeof v.boardDir=="string"&&v.boardDir?v.boardDir:$})):F;let J=Lo(),G=u.update?void 0:J,te=S.filter(v=>{let g=v.outputFile;if(typeof g!="string"||!g)return true;let L=A(g);G&&(L={...L,queueRequestedToken:G},E(g,L));let D=L.queueRequestedToken??L.lastRequestedToken??J,H=Pt(L,D);return H==="in-flight"?false:H==="dispatch"});if(x(),te.length>0){let v=false,g=J;for(let L of te){let D=L.outputFile;if(typeof D!="string"||!D)continue;let H=A(D),w=H.queueRequestedToken??J;E(D,{...H,lastRequestedToken:w}),g=w,v=true;}return v&&x(),v&&(p.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:k,callbackToken:u.callbackToken,rqt:g}}),r.executionRequestStore.appendEntries(t,p)),"task-initiated"}if(S.some(v=>{let g=v.outputFile;if(typeof g!="string"||!g)return false;let L=A(g),D=L.queueRequestedToken??L.lastRequestedToken??J;return Pt(L,D)==="in-flight"}))return "task-initiated";let Y=T.provides??[],ee={};for(let{bindTo:v,ref:g}of Y)ee[v]=ze.resolve(l,g);return (i??r.outputStore.writeDataObjects.bind(r.outputStore))(ee),C.filter(v=>{if(v.optionalForCompletionGating!==true)return false;let g=A(v.outputFile);return !g.lastRequestedToken||!g.lastCompletedToken?true:g.lastCompletedToken<=g.lastRequestedToken}).length>0&&p.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:k,callbackToken:u.callbackToken,rqt:J}}),n(u.nodeId,ee),p.length>0&&r.executionRequestStore.appendEntries(t,p),"task-initiated"}}var Ft={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Zt(e){return {[ct]:e.graph,[mn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function er(e){let t=e[ct],r=e[mn],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ct}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function tr(e){let t=e.requires;return {provides:e.provides?.map(n=>n.bindTo)??[],taskHandlers:["card-handler"],description:e.meta?.title??e.id,...t&&t.length>0?{requires:t}:{}}}function rr(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)}}function o(s){if(Array.isArray(s))return s;if(s&&typeof s=="object"){let i=s;return Array.isArray(i.files)?i.files:[s]}return null}return {get(s){try{let i=s.params?.id;if(i){let u=e.readCard(i);return u?t({cards:[u]}):r(`card "${i}" not found`)}return t({cards:e.readAllCards()})}catch(i){return n(i)}},set(s){try{let i=s.body;if(i==null)return r("set requires a body (card object or array of cards)");let u=Array.isArray(i)?i:[i];for(let p of u){if(typeof p.id!="string")return r("each card must have a string `id` field");e.writeCard(p.id,p);}return t({count:u.length})}catch(i){return n(i)}},del(s){try{let i=s.body?.ids??[],u=s.params?.id,p=u?[...i,u]:i;if(p.length===0)return r("del requires body.ids (string[]) or params.id");for(let T of p)e.removeCard(T);return t({count:p.length})}catch(i){return n(i)}},patch(s){try{let i=s.params?.id,u=s.params?.path;if(!i)return r("patch requires params.id");if(!u)return r("patch requires params.path");let p=s.body,T=p&&Object.prototype.hasOwnProperty.call(p,"value")?p.value:s.body;return e.patchCard(i,u,T),t({count:1})}catch(i){return n(i)}},appendFiles(s){try{let i=s.params?.id;if(!i)return r("appendFiles requires params.id");let u=e.readCard(i);if(!u)return r(`card "${i}" not found`);let p=o(s.body);if(!p||p.length===0)return r("appendFiles requires a file metadata object, array, or body.files array");let T=u.card_data&&typeof u.card_data=="object"&&!Array.isArray(u.card_data)?u.card_data:{},_=Array.isArray(T.files)?T.files:[],y=[..._,...p],C=p.map((R,I)=>({idx:_.length+I,entry:R})),S=this.patch({params:{id:i,path:"card_data.files"},body:{value:y}});return S.status!=="success"?S:t({files_added:C})}catch(i){return n(i)}}}}function pe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function se(e){return {status:"fail",error:e}}function Re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Mo(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 wn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function nr(e){try{let t=JSON.parse(wn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function kn(e){return Mo(JSON.stringify(e))}function Cn(e){try{let t=JSON.parse(wn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Xe(){return new Date().toISOString()}function Do(e){let t=new Map;return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.get(r)??[];t.set(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.get(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(i){try{e(s,i instanceof Error?i.message:String(i));}catch{}}t.delete(r);}}}}function Sn(e,t,r={}){Mt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),s=ke(e),i=r.boardRuntimeStoreRef,u=r.scratchStoreRef,p=r.taskExecutorRef,T=r.chatHandlerFlow;function _(){if(!i)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return i}function y(M){if(M.length!==0)try{let m=t.publishBoardChangeNotifications?.(M);m&&typeof m.catch=="function"&&m.catch(j=>o(`[board-live-cards-public] publishBoardChangeNotifications failed: ${j instanceof Error?j.message:String(j)}`));}catch(m){o(`[board-live-cards-public] publishBoardChangeNotifications failed: ${m instanceof Error?m.message:String(m)}`);}}function C(){let M=R().readCardStoreRef();if(!M)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let m=t.kvStorageForRef(M);return {readIndex(){return m.read("_index")},writeIndex(j){m.write("_index",j);},readCard(j){return m.read(j)},writeCard(j,K){return m.write(j,K),t.hashFn(K)},removeCard(j){m.delete(j);},cardExists(j){return m.read(j)!==null},defaultCardKey(j){return j}}}let S={readValues(M){let m=t.kvStorageForRef(_()),j=m.listKeys().sort();if(j.length===0)return {version:null,values:{}};let K={};for(let oe of j)K[oe]=m.read(oe);return {version:t.hashFn(K),values:K}},writeValues(M,m,j){let K=t.kvStorageForRef(_());for(let oe of j)K.delete(oe);for(let[oe,re]of Object.entries(m))K.write(oe,re);return t.hashFn(m)}},R=()=>Xt(t.kvStorageForRef(_())),I=()=>yn(S),x=()=>pn(t.journalAdapterForRef(_())),A=()=>Et(C(),o),E=()=>{let M=R().readOutputsStoreRef();if(!M)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return hn(t.kvStorageForRef(M))};function c(){return p??R().readTaskExecutorRef()}function h(){return !!I().readSnapshot(e.value).values[ct]}function d(){let M=I().readSnapshot(e.value);if(!M.values[ct])throw new Error(`Board not initialized at ${e.value}`);return er(M.values)}function f(M,m){let j=I().commitSnapshot(e.value,{schemaVersion:Yt,expectedVersion:m,commitId:t.genId(),committedAt:Xe(),deleteKeys:[],shallowMerge:Zt(M)});if(!j.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${m??"null"} current=${j.currentVersion??"null"}`)}function l(M){x().appendEvent(M);}async function k(){let m=Do((B,N)=>{let Z=B.payload,le=(Z?.enrichedCard??{}).id??Z?.cardId??"unknown";l({type:"task-failed",taskName:le,error:N,timestamp:Xe()});}),j=d(),K=ht(j.graph),{events:oe,newCursor:re}=x().readEntriesAfterCursor(j.lastDrainedJournalId),Ae=H(),be=zt(Ae,B=>t.resolveBlob(B)),Fe={...j.runtimeByCardId},Oe=new Map,$e={readRuntime(B){return Oe.get(B)??Fe[B]??{_sources:{}}},writeRuntime(B,N){Oe.set(B,N),Fe[B]=N;}},We=[],He=new Map,lt={readSourceData(B,N){let Z=`${B}/${N}`;return He.has(Z)?He.get(Z):be.readSourceData(B,N)},ingestSourceDataStaged(B,N,Z,me){be.ingestSourceDataStaged(B,N,Z,me);},commitSourceData(B,N,Z){let me=`${B}/.staged/${Z}/${N}`,le=Ae.read(me);if(le==null){let De=Ae.keyRef?.(me);De&&(le=t.resolveBlob(De));}if(le==null)return false;let Pe=`${B}/${N}`,je=le.trim();try{He.set(Pe,JSON.parse(je));}catch{He.set(Pe,je);}return We.push({cardId:B,outputFile:N,deliveryToken:Z}),true},hasSource(B,N){let Z=`${B}/${N}`;return He.has(Z)?true:be.hasSource(B,N)},listSources(B){let N=be.listSources(B),Z=new Set;for(let le of He.keys())le.startsWith(`${B}/`)&&Z.add(le.slice(`${B}/`.length));let me=new Set([...N,...Z]);return Array.from(me)}},et={cardStore:A(),cardRuntimeStore:$e,fetchedSourcesStore:lt,outputStore:E(),executionRequestStore:m},tt=[],kt=[],Ct=[],Bt=new Map,Ot=new Set,Lr=(B,N)=>{tt.push({type:"task-completed",taskName:B,data:N,timestamp:Xe()});},vt=(B,N)=>{l({type:"task-failed",taskName:B,error:N,timestamp:Xe()});},At=Nt(K,{handlers:{"card-handler":Rn(e,re,et,Lr,vt,(B,N)=>{kt.push({cardId:B,values:N});},B=>{Ct.push(B);})},onNodeRemoved:B=>{Bt.delete(B),Oe.delete(B),delete Fe[B],Ot.add(B);}});for(tt=oe;tt.length>0;){let B=tt;tt=[];for(let N of B)if(N.type==="task-restart"){let Z=et.cardStore.readCard(N.taskName);Z&&Bt.set(N.taskName,Z);}At.pushAll(B),await At.waitForHandlers();}let qt=At.getState();await At.dispose({wait:true});let fr=I().readSnapshot(e.value).version;f({lastDrainedJournalId:re,graph:yt(qt),runtimeByCardId:Fe},fr);for(let{cardId:B,values:N}of kt)et.outputStore.writeComputedValues(B,N);for(let B of Ct)et.outputStore.writeDataObjects(B);for(let{cardId:B,outputFile:N,deliveryToken:Z}of We)be.commitSourceData(B,N,Z);let a;try{a=Rt(s,qt),et.outputStore.writeStatusSnapshot(a);}catch(B){o(`[board-live-cards-public] status publish failed: ${B instanceof Error?B.message:String(B)}`);}let P=[];for(let{cardId:B,values:N}of kt)P.push({kind:"computed_values",cardId:B,values:N});for(let B of Ct)for(let[N,Z]of Object.entries(B))N&&P.push({kind:"data_object",key:N,payload:Z});for(let[B,N]of Bt)P.push({kind:"card_refreshed",cardId:B,card:N});for(let B of Ot)P.push({kind:"card_removed",cardId:B});a!==void 0&&P.push({kind:"status",status:a}),y(P);let q=c()??{howToRun:"built-in",whatToRun:ke({kind:"built-in",value:"source-cli-task-executor"})},W=t.supportsDirectSourceOutput?.(q)===true;m.dispatchEntriesForJournalId(re,B=>{if(B.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${B.taskKind}" \u2014 skipping`);return}let N=B.payload,Z=N.enrichedCard?.id??"unknown",me=N.enrichedCard?.source_defs??[];if(q.howToRun==="queue-storage"&&W){try{let le=t.queueStorageForRef(F(),"task-executor"),Pe=typeof q.extra?.boardId=="string"?q.extra.boardId:void 0,je=[];for(let De of me){if(!De.outputFile){o(`[dispatch] source "${De.bindTo}" has no outputFile \u2014 skipping`);continue}let Q=t.genId(),ue=`${Z}/.staged/${Q}/${De.outputFile}`,Ce=Ae.keyRef?.(ue);if(!Ce)continue;let ye={ref:ke(Ce),deliveryToken:Q,outputFile:De.outputFile,cardId:Z},Ie=kn({cbk:N.callbackToken,rg:e.value,br:ke(e),cid:Z,b:De.bindTo,d:De.outputFile,cs:void 0,rqt:N.rqt,dt:ye.deliveryToken});je.push({...Pe?{boardId:Pe}:{},ref:q,args:{source_def:De,base_ref:ke(e),callback:n.createCallback(Ie),output:ye}});}je.length>0&&le.enqueueMany(je);}catch(le){vt(Z,le instanceof Error?le.message:String(le));}return}for(let le of me){if(!le.outputFile){o(`[dispatch] source "${le.bindTo}" has no outputFile \u2014 skipping`);continue}let Pe;if(W){let De=t.genId(),Q=`${Z}/.staged/${De}/${le.outputFile}`,ue=Ae.keyRef?.(Q);ue&&(Pe={ref:ke(ue),deliveryToken:De,outputFile:le.outputFile,cardId:Z});}let je=kn({cbk:N.callbackToken,rg:e.value,br:ke(e),cid:Z,b:le.bindTo,d:le.outputFile,cs:void 0,rqt:N.rqt,...Pe?{dt:Pe.deliveryToken}:{}});t.dispatchExecution(q,{source_def:le,base_ref:ke(e),callback:n.createCallback(je),...Pe?{output:Pe}:{}}).catch(De=>vt(Z,De instanceof Error?De.message:String(De)));}});}function F(){let M=R().readQueueStoreRef();if(!M)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);return M}function $(){let M=t.queueStorageForRef(F(),"process-accumulated");M.enqueueIfAbsent?M.enqueueIfAbsent({boardRef:ke(e)},`process-accumulated:${ke(e)}`):M.enqueue({boardRef:ke(e)}),t.requestProcessAccumulated?.();}function J(){let M=t.queueStorageForRef(F(),"process-accumulated");for(;;){let m=M.lease({max:64,visibilityMs:1e3});if(m.length<=0)return;for(let j of m)M.ack(j.id,j.leaseToken);if(m.length<64)return}}async function G(){try{let M=()=>{let j=d(),{events:K}=x().readEntriesAfterCursor(j.lastDrainedJournalId);K.length<=0||$();},m=await $r(t.lock,k,M);return pe({ran:m!==!1})}catch(M){return Re(M)}}function te(){$();}function ie(M){try{let m=M.params?.cardStoreRef;if(!m)return se("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(i=M.params?.boardRuntimeStoreRef,!i)return se("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!h()){let Fe=St(Ft);f({lastDrainedJournalId:"",graph:yt(Fe),runtimeByCardId:{}},null);}let j=M.params?.outputsStoreRef;if(!j)return se("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let K=M.params?.queueStoreRef;if(!K)return se("init requires params.queueStoreRef \u2014 pass the queue store ref here");let oe=M.params?.fetchedSourcesStoreRef;if(!oe)return se("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");if(u=M.params?.scratchStoreRef,!u)return se("init requires params.scratchStoreRef \u2014 pass the scratch store ref here");let re=M.params?.chatStoreRef;if(!re)return se("init requires params.chatStoreRef \u2014 pass the chat store ref here");let Ae=M.params?.artifactsStoreRef;if(!Ae)return se("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let be=R();be.writeBoardRuntimeStoreRef(i),be.writeCardStoreRef(m),be.writeOutputsStoreRef(j),be.writeQueueStoreRef(K),be.writeFetchedSourcesStoreRef(oe),be.writeChatStoreRef(re),be.writeArtifactsStoreRef(Ae);try{E().writeStatusSnapshot(Rt(s,ht(d().graph)));}catch{}return pe()}catch(m){return Re(m)}}function Y(M){try{let m=E().readStatusSnapshot();if(!m){m=Rt(s,ht(d().graph));try{E().writeStatusSnapshot(m);}catch{}}return pe(m)}catch(m){return Re(m)}}function ee(M){try{let m=M.params?.id;if(!m)return se("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(m);}catch{}return l({type:"task-removal",taskName:m,timestamp:Xe()}),te(),pe()}catch(m){return Re(m)}}function ne(M){try{let m=M.params?.cardId;if(!m)return se("addCardFiles requires params.cardId");let j=rr(A()).appendFiles({params:{id:m},body:M.body});if(j.status!=="success")return j;let K=v({params:{cardId:m}});return K.status!=="success"?K:pe({cardId:m,files_added:j.data.files_added,notified:!0})}catch(m){return Re(m)}}function v(M){try{let m=M.params?.cardId;if(!m)return se("cardRefreshedNotify requires params.cardId");let j=A().readCard(m);return j?(y([{kind:"card_refreshed",cardId:m,card:j}]),pe({cardId:m,notified:!0})):se(`Card "${m}" not found in board at ${e.value}`)}catch(m){return Re(m)}}function g(M){try{let m=M.params?.id;return m?(l({type:"task-restart",taskName:m,timestamp:Xe()}),te(),pe()):se("retrigger requires params.id")}catch(m){return Re(m)}}async function L(M){return J(),G()}function D(){let M=R().readFetchedSourcesStoreRef();if(!M)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return M}function H(){return t.blobStorageForRef(D())}function w(M){try{let m=M.params?.cardId,j=M.params?.all,K=!!M.params?.restart;if(!m&&!j)return se("upsertCard requires --card-id <id> or --all");let oe=j?A().readAllCards().map(re=>re.id):[m];for(let re of oe)if(!A().readCard(re))return se(`Card "${re}" not found in board at ${e.value}`);for(let re of oe){let Ae=A().readCard(re),be=tr(Ae),Fe=t.hashFn(be),Oe=t.kvStorage("card-upsert"),$e=Oe.read(re),We=$e?.taskConfigHash!==Fe;if(!(!We&&!K)){if(We){let He=$e?.blobRef??A().readCardKey(re)??re;l({type:"task-upsert",taskName:re,taskConfig:be,timestamp:Xe()}),Oe.write(re,{blobRef:He,taskConfigHash:Fe,updatedAt:Xe()});}K&&l({type:"task-restart",taskName:re,timestamp:Xe()});}}return te(),pe()}catch(m){return Re(m)}}function b(M){try{let m=M.params?.token;if(!m)return se("taskFailed requires params.token");let j=M.params?.error??"unknown error",K=nr(m);return K?(l({type:"task-failed",taskName:K.taskName,error:j,timestamp:Xe()}),te(),pe()):se("Invalid callback token")}catch(m){return Re(m)}}function O(M){try{let m=M.params?.token;if(!m)return se("taskProgress requires params.token");let K=(M.body??{}).update??{},oe=nr(m);return oe?(l({type:"task-progress",taskName:oe.taskName,update:K,timestamp:Xe()}),te(),pe()):se("Invalid callback token")}catch(m){return Re(m)}}function U(M){try{let m=M.params?.token,j=M.params?.ref;if(!m)return se("sourceDataFetched requires params.token");if(!j)return se("sourceDataFetched requires params.ref");let K=Cn(m);if(!K)return se("Invalid source token");let{cbk:oe,cid:re,b:Ae,d:be,cs:Fe,rqt:Oe,dt:$e}=K,We=zt(H(),tt=>t.resolveBlob(tt)),He=$e||t.genId();$e||We.ingestSourceDataStaged(re,be,at(j),He);let lt=nr(oe);if(!lt)return se("Invalid callback token embedded in source token");let et=Xe();return l({type:"task-progress",taskName:lt.taskName,update:{bindTo:Ae,outputFile:be,fetchedAt:et,deliveryToken:He,sourceChecksum:Fe,rqt:Oe},timestamp:et}),te(),pe()}catch(m){return Re(m)}}function V(M){try{let m=M.params?.token,j=M.params?.reason??"unknown";if(!m)return se("sourceDataFetchFailure requires params.token");let K=Cn(m);if(!K)return se("Invalid source token");let{cbk:oe,b:re,d:Ae,cs:be,rqt:Fe}=K,Oe=nr(oe);return Oe?(l({type:"task-progress",taskName:Oe.taskName,update:{bindTo:re,outputFile:Ae,failure:!0,reason:j,sourceChecksum:be,rqt:Fe},timestamp:Xe()}),te(),pe()):se("Invalid callback token embedded in source token")}catch(m){return Re(m)}}function X(M){try{let m=R().readCardStoreRef();return m?pe({storeRef:m}):se(`Board at ${e.value} has no card store configured`)}catch(m){return Re(m)}}function ae(M){try{return pe({storeRef:i??null})}catch(m){return Re(m)}}function fe(M){try{let m=R().readOutputsStoreRef();return m?pe({storeRef:m}):se(`Board at ${e.value} has no outputs store configured`)}catch(m){return Re(m)}}function we(M){try{return pe({storeRef:u??null})}catch(m){return Re(m)}}function Te(M){try{let m=R().readChatStoreRef();return pe({storeRef:m})}catch(m){return Re(m)}}function Be(M){try{let m=R().readArtifactsStoreRef();return pe({storeRef:m})}catch(m){return Re(m)}}function Se(M){try{let m=R().readFetchedSourcesStoreRef();return pe({storeRef:m})}catch(m){return Re(m)}}function ce(M){try{let m=M.params?.key;if(!m)return se("getConfig requires params.key");let j=R(),K;switch(m){case "task-executor":K=p??null;break;case "chat-handler-flow":K=T??null;break;case "board-runtime-store-ref":K=j.readBoardRuntimeStoreRef();break;case "card-store-ref":K=j.readCardStoreRef();break;case "outputs-store-ref":K=j.readOutputsStoreRef();break;case "scratch-store-ref":K=u??null;break;case "chat-store-ref":K=j.readChatStoreRef();break;case "artifacts-store-ref":K=j.readArtifactsStoreRef();break;case "fetched-sources-store-ref":K=j.readFetchedSourcesStoreRef();break;default:return se(`getConfig: unknown key "${m}"`)}return pe({value:K})}catch(m){return Re(m)}}function Le(M){try{let m=M.params?.key;if(!m)return se("getOutputsDataObject requires params.key");let j=E().readDataObject(m);return pe(j)}catch(m){return Re(m)}}function ve(M){try{return pe(E().readAllDataObjects())}catch(m){return Re(m)}}function Me(M){try{let m=M.params?.key;if(!m)return se("getOutputsComputedValues requires params.key");let j=E().readComputedValues(m);return pe(j)}catch(m){return Re(m)}}function Ne(M){try{return pe(E().readAllComputedValues())}catch(m){return Re(m)}}function ge(){return zt(H(),M=>t.resolveBlob(M))}function Ze(M){let m=H().keyRef?.(M);if(!m)throw new Error("configured fetched-sources store does not support keyRef");return ke(m)}function Ke(M){try{let m=M.params?.key;if(!m)return se("getOutputsFetchedSources requires params.key");let j=ge().listSources(m),K={};for(let oe of j)K[oe]=Ze(`${m}/${oe}`);return pe(K)}catch(m){return Re(m)}}function Ge(M){try{let m=ge(),j=new Set;for(let oe of H().listKeys()){let re=oe.indexOf("/");re>0&&!oe.includes("/.staged/")&&j.add(oe.slice(0,re));}let K={};for(let oe of j){let re=m.listSources(oe);if(re.length>0){K[oe]={};for(let Ae of re)K[oe][Ae]=Ze(`${oe}/${Ae}`);}}return pe(K)}catch(m){return Re(m)}}return {init:ie,status:Y,getBoardRuntimeStoreRef:ae,getCardStoreRef:X,getOutputsStoreRef:fe,getScratchStoreRef:we,getChatStoreRef:Te,getArtifactsStoreRef:Be,getFetchedSourcesStoreRef:Se,getConfig:ce,getOutputsDataObject:Le,getAllOutputsDataObjects:ve,getOutputsComputedValues:Me,getAllOutputsComputedValues:Ne,getOutputsFetchedSources:Ke,getAllOutputsFetchedSources:Ge,removeCard:ee,addCardFiles:ne,cardRefreshedNotify:v,retrigger:g,processAccumulatedEvents:L,upsertCard:w,taskFailed:b,taskProgress:O,sourceDataFetched:U,sourceDataFetchFailure:V}}function bn(e,t,r){let n=r?.taskExecutorRef,o=()=>{if(r){if(!r.boardRuntimeStoreRef)throw new Error(`Board at ${e.value} requires boardRuntimeStoreRef for non-core runtime operations.`);return Xt(t.kvStorageForRef(r.boardRuntimeStoreRef))}return Xt(t.kvStorage("config"))};function s(){let E=o().readCardStoreRef();if(!E)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let c=t.kvStorageForRef(E);return {readIndex(){return c.read("_index")},writeIndex(h){c.write("_index",h);},readCard(h){return c.read(h)},writeCard(h,d){return c.write(h,d),t.hashFn(d)},removeCard(h){c.delete(h);},cardExists(h){return c.read(h)!==null},defaultCardKey(h){return h}}}let i=()=>Et(s(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function p(E,c){let h=t.validateSchema(c),d=[],f=u();if(f&&Array.isArray(c.source_defs))for(let k of c.source_defs){let F=typeof k.bindTo=="string"?k.bindTo:"(unknown)";try{let $;try{$=await t.invokeExecutor(f,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(k)});}catch(G){let te=G;if($=typeof te?.stdout=="string"?te.stdout:"",!$.trim()){d.push(`source "${F}": executor validate-source-def failed \u2014 ${G instanceof Error?G.message:String(G)}`);continue}}let J=JSON.parse($.trim());if(!J.ok&&Array.isArray(J.errors))for(let G of J.errors)d.push(`source "${F}": ${G}`);}catch($){d.push(`source "${F}": executor validate-source-def failed \u2014 ${$ instanceof Error?$.message:String($)}`);}}let l=[...h.errors,...d];return pe({cardId:E,isValid:l.length===0,issues:l})}function T(E,c){let h=E.params?.sourceIdx,d=E.params?.outRef;if(h===void 0)return se(`${c} requires params.sourceIdx`);if(!E.body||typeof E.body!="object"||Array.isArray(E.body))return se(`${c} requires card JSON object in body`);let f=E.body,l=f["card-content"]??f,k=f["mock-projections"]??{},F=l.source_defs??[];if(h<0||h>=F.length)return se(`sourceIdx ${h} out of range (card has ${F.length} source(s))`);let $=F[h],J=typeof $.bindTo=="string"?$.bindTo:"source";return {src:$,bindTo:J,outRef:d,mockProjections:k}}async function _(E){try{if(!E.body||typeof E.body!="object"||Array.isArray(E.body))return se("validateCardPreflight requires card JSON object in body");let c=E.body,h=c["card-content"]??c,d=typeof h.id=="string"?h.id:"(unknown)";return await p(d,h)}catch(c){return Re(c)}}async function y(E){try{let c=T(E,"probeSourcePreflight");if("status"in c)return c;let h=u();if(!h)return se("No task-executor registered for this board");try{let d={...c.src,_projections:c.mockProjections},f=await t.invokeExecutor(h,"probe-source-preflight",{timeout:c.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(d)}),l=JSON.parse(f.trim());return l.ok?pe({bindTo:c.bindTo,reachable:l.reachable,latencyMs:l.latencyMs,note:l.note}):se(l.error??"Preflight probe failed")}catch{return se("Executor does not support probe-source-preflight")}}catch(c){return Re(c)}}async function C(E){try{let c=T(E,"runSourcePreflight");if("status"in c)return c;let h=u();if(!h)return se("No task-executor registered for this board");try{let d={...c.src,_projections:c.mockProjections},f=await t.invokeExecutor(h,"run-source-preflight",{timeout:c.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(d)}),l=JSON.parse(f.trim());if(!l.ok)return pe({bindTo:c.bindTo,ok:!1,result:null,issues:[l.error??"Preflight run failed"]});if(c.outRef){let k=at(c.outRef);t.absoluteBlob.write(k.value,JSON.stringify(l.resultValue,null,2));}return pe({bindTo:typeof l.bindTo=="string"?l.bindTo:c.bindTo,ok:!0,result:l.resultValue??null,issues:[]})}catch(d){let f=d instanceof Error?d.message:String(d);return pe({bindTo:c.bindTo,ok:!1,result:null,issues:[f]})}}catch(c){return Re(c)}}async function S(E){try{let c=u();if(!c)return se("No task-executor registered for this board");let h=await t.invokeExecutor(c,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return pe(JSON.parse(h.trim()))}catch(c){return Re(c)}}function R(E){try{let c=E.body;if(!c||!Array.isArray(c.ops))return se("updatesInCardStore requires body.ops array");let h=c.ops,d=i();for(let f of h){let l=f.op,k=f.id;if(!k)return se('op is missing "id"');if(l==="update"){let F=f["card-content"];if(!F)return se(`update op for "${k}" is missing "card-content"`);d.writeCard(k,F);}else return se(`Unknown op type: "${l??"(none)"}"`)}return pe()}catch(c){return Re(c)}}function I(E){try{let c=E.body;if(!c||!Array.isArray(c.ids))return se("readFromCardStore requires body.ids array");let h=c.ids,d=i(),f=h.map(l=>({id:l,"card-content":d.readCard(l)}));return pe({cards:f})}catch(c){return Re(c)}}function x(E){try{if(!E.body||typeof E.body!="object"||Array.isArray(E.body))return se("evalCardCompute requires a JSON object in body");let c=E.body,h=c["card-content"]??c,d=typeof h.id=="string"?h.id:"(unknown)",f=c["mock-fetched-sources"]??{},l=c["mock-requires"]??{},k=h.compute;if(!k||!Array.isArray(k)||k.length===0)return pe({cardId:d,ok:!0,computed_values:{},errors:[]});let F={id:d,card_data:h.card_data??{},requires:l,source_defs:h.source_defs,compute:k},$=ze.runSync(F,{sourcesData:f}),J=$.node.computed_values??{},G=$.errors??[];return pe({cardId:d,ok:G.length===0,computed_values:J,errors:G})}catch(c){return Re(c)}}async function A(E){try{if(!E.body||typeof E.body!="object"||Array.isArray(E.body))return se("simulateCardCycle requires a JSON object in body");let c=E.body,h=c["card-content"]??c,d=typeof h.id=="string"?h.id:"(unknown)",f=c["mock-fetched-sources"]??{},l=c["mock-requires"]??{},k=await p(d,h),F=k.status==="success"?{isValid:k.data.isValid,issues:k.data.issues}:{isValid:!1,issues:[k.status==="fail"?k.error:"internal error"]},$=h.source_defs??[],J=h.card_data??{},G=[],te=[];if($.length>0){G=ze.enrichSourcesSync($,{card_data:J,requires:l});for(let H of G){let w=H.projections,b=H._projections;if(w&&b){for(let O of Object.keys(w))if(b[O]===void 0){let U=typeof H.bindTo=="string"?H.bindTo:"(unknown)";te.push({bindTo:U,key:O,error:`Projection "${O}" resolved to undefined`});}}}}let ie=[],Y={...f},ee=c["task-executor-ref"],ne=(ee?.howToRun&&ee?.whatToRun?ee:void 0)??u();for(let H=0;H<G.length;H++){let w=G[H],b=typeof w.bindTo=="string"?w.bindTo:`source_${H}`;if(!ne){ie.push({bindTo:b,skipped:!0,error:"No task executor configured"});continue}try{let O={...w},U=await t.invokeExecutor(ne,"run-source-preflight",{timeout:w.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(O)}),V=JSON.parse(U.trim());V.ok&&!Object.prototype.hasOwnProperty.call(f,b)&&Object.prototype.hasOwnProperty.call(V,"resultValue")&&(Y[b]=V.resultValue),ie.push({bindTo:b,reachable:V.reachable,latencyMs:V.latencyMs,error:V.ok?void 0:V.error});}catch{ie.push({bindTo:b,skipped:!0,error:"Executor does not support run-source-preflight"});}}let v=h.compute,g={},L=[];if(v&&Array.isArray(v)&&v.length>0){let H={id:d,card_data:J,requires:l,source_defs:h.source_defs,compute:v},w=ze.runSync(H,{sourcesData:Y});g=w.node.computed_values??{},L=w.errors??[];}let D=F.isValid&&te.length===0&&L.length===0&&ie.every(H=>H.reachable!==!1);return pe({cardId:d,ok:D,validation:F,source_probes:ie,projection_errors:te,fetched_sources:Y,computed_values:g,compute_errors:L})}catch(c){return Re(c)}}return {validateCardPreflight:_,probeSourcePreflight:y,runSourcePreflight:C,evalCardCompute:x,simulateCardCycle:A,describeTaskExecutorCapabilities:S,updatesInCardStore:R,readFromCardStore:I}}async function vn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function vr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Ar(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...vr(r),leaseToken:r.leaseToken,leaseExpiresAt:r.leaseExpiresAt}))},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},async peekActive(){return (await e.peekActive()).map(vr)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...vr(t),reason:t.reason}))}}}function An(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return Kt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Vt(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){return e.write("board-runtime-store-ref",r)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){return e.write("card-store-ref",r)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){return e.write("outputs-store-ref",r)},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){return e.write("queue-store-ref",r)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){return e.write("scratch-store-ref",r)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){return e.write("chat-store-ref",r)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){return e.write("artifacts-store-ref",r)},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){return e.write("fetched-sources-store-ref",r)}}}function No(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function or(e,t){return No(e)?e.then(t):t(e)}function xn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=xn(r[n],o):r[n]=o;return r}function sr(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let s=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:sr(s,o,r)}}function In(e){return {read:r=>e.read(r),get(r,n){return or(e.read(r),o=>{if(o===null)return null;let s=o;for(let i of n.split(".").filter(Boolean)){if(s===null||typeof s!="object"||Array.isArray(s))return null;s=s[i]??null;}return s??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return or(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return or(e.read(r),o=>e.write(r,xn(o??{},n)))},patch(r,n,o){return or(e.read(r),s=>{let i=n.split(".").filter(Boolean);return e.write(r,sr(s??{},i,o))})}}}function ar(e){return In(e)}function ir(e,t){return {async readIndex(){return await e.read("_index")},writeIndex(r){return e.write("_index",r)},async readCard(r){return await e.read(r)},async writeCard(r,n){return await e.write(r,n),t(n)},removeCard(r){return e.delete(r)},async cardExists(r){return await e.read(r)!==null},defaultCardKey(r){return r}}}function ur(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,s]of Object.entries(await r())){if(!await e.cardExists(s.key))continue;let i=await e.readCard(s.key);i?n.push(i):t?.(`[card-store] could not read card "${o}" at key "${s.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,s]of Object.entries(await r()))n[o]=s.checksum;return n},async changedSince(n){let o=await r(),s=[];for(let[i,u]of Object.entries(o))n[i]!==u.checksum&&s.push(i);for(let i of Object.keys(n))o[i]||s.push(i);return s},async validateUpsert(n,o){let s=await r(),i=s[n],u=Object.entries(s).find(([,p])=>p.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:u&&u[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,s){let i=await r(),u=s??i[n]?.key??e.defaultCardKey(n),p=await e.writeCard(u,o);i[n]={key:u,checksum:p,updatedAt:new Date().toISOString()},await e.writeIndex(i);},async patchCard(n,o,s){let i=await r(),u=i[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let p=await e.readCard(u.key);if(!p||typeof p!="object"||Array.isArray(p))throw new Error(`card "${n}" is not patchable`);let T=String(o||"").split(".").filter(Boolean),_=sr(p,T,s),y=await e.writeCard(u.key,_);i[n]={key:u.key,checksum:y,updatedAt:new Date().toISOString()},await e.writeIndex(i);},async removeCard(n){let o=await r(),s=o[n];s&&(await e.removeCard(s.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function _e(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function he(e){return {status:"fail",error:e}}function Ee(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Qe(){return new Date().toISOString()}function $o(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 _n(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function dr(e){try{let t=JSON.parse(_n(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Tn(e){return $o(JSON.stringify(e))}function Pn(e){try{let t=JSON.parse(_n(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Uo(e){return Sr(e,gn,()=>({_sources:{}}))}function Vo(e,t){return Wt(e,t)}function Ko(e){return Qt(e)}function Ho(e,t){return wr(e,t)}function Jo(e,t,r,n,o,s){return async i=>{let u=[],p=await r.cardStore.readCard(i.nodeId);if(!p)return "task-initiate-failure";let T=p.id,_=p.card_data??{},y=p.source_defs??[],C=y.filter(Y=>Y.optionalForCompletionGating!==true),S=await r.cardRuntimeStore.readRuntime(T),R=false,I=async()=>{R&&(await r.cardRuntimeStore.writeRuntime(T,S),R=false);},x=Y=>Tt(S._sources[Y]),A=(Y,ee)=>{S._sources[Y]=Tt(ee),R=true;},E=i.taskState?.executionCount??0;if(S._lastExecutionCount!==E&&(S._sources={},S._lastExecutionCount=E,R=true),i.update){let Y=i.update.outputFile;if(Y){let ee=x(Y);if(i.update.failure){let ne=i.update.rqt??ee.lastRequestedToken??ee.queueRequestedToken;ne&&A(Y,_t(ee,ne));}else {let ne=i.update.rqt;if(!ee.lastCompletedToken||ne>ee.lastCompletedToken){let v=typeof i.update.deliveryToken=="string"?i.update.deliveryToken:void 0,g=v?await r.fetchedSourcesStore.commitSourceData(T,Y,v):false;A(Y,g?br(ee,ne):_t(ee,ne));}}await I();}}let c={};for(let Y of y){if(!Y.outputFile)continue;let ee=await r.fetchedSourcesStore.readSourceData(T,Y.outputFile);ee!==null&&(c[Y.bindTo]=ee);}let h={};for(let[Y,ee]of Object.entries(i.state??{}))if(ee!==null&&typeof ee=="object"&&!Array.isArray(ee)){let ne=ee[Y];h[Y]=ne!==void 0?ne:ee;}else h[Y]=ee;let d={id:T,card_data:{..._},requires:h,source_defs:y,compute:p.compute};d._sourcesData=c,p.compute&&ze.runSync(d,{sourcesData:c}),(o??(()=>{}))(T,d.computed_values??{});let f=ze.enrichSourcesSync(Array.isArray(p.source_defs)?p.source_defs:void 0,{card_data:p.card_data,requires:h}),l={...p,source_defs:Array.isArray(f)?f.map(Y=>({...Y,boardDir:typeof Y.boardDir=="string"&&Y.boardDir?Y.boardDir:e.value})):f},k=Qe(),F=i.update?void 0:k,$=C.filter(Y=>{let ee=Y.outputFile;if(typeof ee!="string"||!ee)return true;let ne=x(ee);F&&(ne={...ne,queueRequestedToken:F},A(ee,ne));let v=ne.queueRequestedToken??ne.lastRequestedToken??k;return Pt(ne,v)==="dispatch"});if(await I(),$.length>0){let Y=false,ee=k;for(let ne of $){let v=ne.outputFile;if(typeof v!="string"||!v)continue;let g=x(v),L=g.queueRequestedToken??k;A(v,{...g,lastRequestedToken:L}),ee=L,Y=true;}return Y&&await I(),Y&&(u.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:l,callbackToken:i.callbackToken,rqt:ee}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(C.some(Y=>{let ee=Y.outputFile;if(typeof ee!="string"||!ee)return false;let ne=x(ee),v=ne.queueRequestedToken??ne.lastRequestedToken??k;return Pt(ne,v)==="in-flight"}))return "task-initiated";let G=p.provides??[],te={};for(let{bindTo:Y,ref:ee}of G)te[Y]=ze.resolve(d,ee);return (s??(()=>{}))(te),y.filter(Y=>{if(Y.optionalForCompletionGating!==true)return false;let ee=x(Y.outputFile);return !ee.lastRequestedToken||!ee.lastCompletedToken?true:ee.lastCompletedToken<=ee.lastRequestedToken}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:l,callbackToken:i.callbackToken,rqt:k}}),n(i.nodeId,te),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function En(e,t,r={}){Mt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),s=ke(e),i=null,u=r.boardRuntimeStoreRef,p=r.scratchStoreRef,T=r.taskExecutorRef,_=r.chatHandlerFlow;function y(){if(!u)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return u}function C(v){if(v.length!==0)try{return Promise.resolve(t.publishBoardChangeNotifications?.(v)).catch(g=>{o(`[async-board-live-cards-public] publishBoardChangeNotifications failed: ${g instanceof Error?g.message:String(g)}`);})}catch(g){o(`[async-board-live-cards-public] publishBoardChangeNotifications failed: ${g instanceof Error?g.message:String(g)}`);return}}let S=()=>An(t.kvStorageForRef(y())),R=e.value,I=()=>Jt(kr(()=>t.kvStorageForRef(y()),t.hashFn),"v1"),x=async()=>{let v=await S().readOutputsStoreRef();if(!v)throw new Error(`Board at ${e.value} has no outputs store configured.`);return Ko(t.kvStorageForRef(v))},A=async()=>{let v=await S().readCardStoreRef();if(!v)throw new Error(`Board at ${e.value} has no card store configured.`);let g=t.kvStorageForRef(v);return ur(ir(ar(g),t.hashFn),o)};async function E(){return !!(await I().readSnapshot(R)).values[ct]}async function c(){let v=await I().readSnapshot(R);if(!v.values[ct])throw new Error(`Board not initialized at ${e.value}`);return er(v.values)}async function h(v,g){let L=await I().commitSnapshot(R,{schemaVersion:"v1",expectedVersion:g,deleteKeys:[],shallowMerge:Zt(v)});if(!L.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${g??"null"} current=${L.currentVersion??"null"}`)}let d=()=>ln(t.journalStorageForRef(y()));async function f(){return T??await S().readTaskExecutorRef()}async function l(v){await d().appendEvent(v);}async function k(){let v=await S().readFetchedSourcesStoreRef();if(!v)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return v}async function F(){return t.blobStorageForRef(await k())}async function $(){return Vo(await F(),v=>t.resolveBlob(v))}async function J(v){let g=(await F()).keyRef?.(v);if(!g)throw new Error("configured fetched-sources store does not support keyRef");let L=await Promise.resolve(g);return ke(L)}async function G(){let v=Ho(t.kvStorageForRef(y()),async(m,j)=>{let K=m.payload,re=(K.enrichedCard??{}).id??K.cardId??"unknown";await l({type:"task-failed",taskName:re,error:j,timestamp:Qe()});}),g=Uo(t.kvStorageForRef(y())),L=await F(),D=await $(),H=await A(),w=await x(),b=new Map,O=new Map,U=[],V=[],X=[],ae=new Map,fe=new Set,we={async readRuntime(m){return b.get(m)??await g.readRuntime(m)},async writeRuntime(m,j){b.set(m,j),ce[m]=j;}},Te={async readSourceData(m,j){let K=`${m}/${j}`;return O.has(K)?O.get(K):await D.readSourceData(m,j)},ingestSourceDataStaged(m,j,K,oe){return D.ingestSourceDataStaged(m,j,K,oe)},async commitSourceData(m,j,K){let oe=`${m}/.staged/${K}/${j}`,re=await L.read(oe);if(re==null){let Fe=await Promise.resolve(L.keyRef?.(oe));Fe&&(re=await t.resolveBlob(Fe));}if(re==null)return false;let Ae=`${m}/${j}`,be=re.trim();try{O.set(Ae,JSON.parse(be));}catch{O.set(Ae,be);}return U.push({cardId:m,outputFile:j,deliveryToken:K}),true},async hasSource(m,j){let K=`${m}/${j}`;return O.has(K)||await D.hasSource(m,j)},async listSources(m){let j=await D.listSources(m),K=[...O.keys()].filter(oe=>oe.startsWith(`${m}/`)).map(oe=>oe.slice(`${m}/`.length));return [...new Set([...j,...K])]}},Be=await c(),Se=ht(Be.graph),ce={...Be.runtimeByCardId},{events:Le,newCursor:ve}=await d().readEntriesAfterCursor(Be.lastDrainedJournalId),Me=Le,Ne=Nt(Se,{handlers:{"card-handler":Jo(e,ve,{cardStore:H,cardRuntimeStore:we,fetchedSourcesStore:Te,executionRequestStore:v},(m,j)=>{Me.push({type:"task-completed",taskName:m,data:j,timestamp:Qe()});},(m,j)=>{V.push({cardId:m,values:j});},m=>{X.push(m);})},onNodeRemoved:m=>{ae.delete(m),b.delete(m),delete ce[m],fe.add(m);}});for(;Me.length>0;){let m=Me;Me=[];for(let j of m)if(j.type==="task-restart"){let K=await H.readCard(j.taskName);K&&ae.set(j.taskName,K);}Ne.pushAll(m),await Ne.waitForHandlers();}let ge=Ne.getState();await Ne.dispose({wait:true}),await h({lastDrainedJournalId:ve,graph:yt(ge),runtimeByCardId:ce},(await I().readSnapshot(R)).version);for(let{cardId:m,values:j}of V)await w.writeComputedValues(m,j);for(let m of X)await w.writeDataObjects(m);for(let[m,j]of b)await g.writeRuntime(m,j);for(let m of U)await D.commitSourceData(m.cardId,m.outputFile,m.deliveryToken);let Ze=Rt(s,ge);await w.writeStatusSnapshot(Ze);let Ke=[];for(let{cardId:m,values:j}of V)Ke.push({kind:"computed_values",cardId:m,values:j});for(let m of X)for(let[j,K]of Object.entries(m))Ke.push({kind:"data_object",key:j,payload:K});for(let[m,j]of ae)Ke.push({kind:"card_refreshed",cardId:m,card:j});for(let m of fe)Ke.push({kind:"card_removed",cardId:m});Ke.push({kind:"status",status:Ze}),await C(Ke);let Ge=await f();if(!Ge)return;let M=t.supportsDirectSourceOutput?.(Ge)===true;await v.dispatchEntriesForJournalId(ve,async m=>{if(m.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${m.taskKind}" \u2014 skipping`);return}let j=m.payload,K=j.enrichedCard?.id??"unknown",oe=j.enrichedCard?.source_defs??[];if(Ge.howToRun==="queue-storage"&&M){try{let re=await S().readQueueStoreRef();if(!re)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let Ae=t.queueStorageForRef(re,"task-executor"),be=typeof Ge.extra?.boardId=="string"?Ge.extra.boardId:void 0,Fe=[];for(let Oe of oe){if(!Oe.outputFile)continue;let $e=t.genId(),We=`${K}/.staged/${$e}/${Oe.outputFile}`,He=await Promise.resolve(L.keyRef?.(We));if(!He)continue;let lt={ref:ke(He),deliveryToken:$e,outputFile:Oe.outputFile,cardId:K},et=Tn({cbk:j.callbackToken,rg:e.value,br:ke(e),cid:K,b:Oe.bindTo,d:Oe.outputFile,cs:void 0,rqt:j.rqt,dt:lt.deliveryToken});Fe.push({...be?{boardId:be}:{},ref:Ge,args:{source_def:Oe,base_ref:ke(e),callback:n.createCallback(et),output:lt}});}Fe.length>0&&await Ae.enqueueMany(Fe);}catch(re){await l({type:"task-failed",taskName:K,error:re instanceof Error?re.message:String(re),timestamp:Qe()});}return}for(let re of oe){if(!re.outputFile)continue;let Ae;if(M){let Oe=t.genId(),$e=`${K}/.staged/${Oe}/${re.outputFile}`,We=await Promise.resolve(L.keyRef?.($e));We&&(Ae={ref:ke(We),deliveryToken:Oe,outputFile:re.outputFile,cardId:K});}let be=Tn({cbk:j.callbackToken,rg:e.value,br:ke(e),cid:K,b:re.bindTo,d:re.outputFile,cs:void 0,rqt:j.rqt,...Ae?{dt:Ae.deliveryToken}:{}}),Fe=await t.dispatchExecution(Ge,{source_def:re,base_ref:ke(e),callback:n.createCallback(be),...Ae?{output:Ae}:{}});Fe.dispatched||await l({type:"task-failed",taskName:K,error:Fe.error??"dispatch failed",timestamp:Qe()});}});}async function te(){try{let v=async()=>{let L=await c(),{events:D}=await d().readEntriesAfterCursor(L.lastDrainedJournalId);D.length>0&&await Y();},g=await vn(t.lock,G,v);return _e({ran:g!==!1})}catch(v){return Ee(v)}}async function ie(){return i||(i=te().finally(()=>{i=null;}),i)}async function Y(){let v=await S().readQueueStoreRef();if(!v)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let g=t.queueStorageForRef(v,"process-accumulated");g.enqueueIfAbsent?await g.enqueueIfAbsent({boardRef:ke(e)},`process-accumulated:${ke(e)}`):await g.enqueue({boardRef:ke(e)}),await t.requestProcessAccumulated?.();}async function ee(){let v=await S().readQueueStoreRef();if(!v)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let g=t.queueStorageForRef(v,"process-accumulated");for(;;){let L=await g.lease({max:64,visibilityMs:1e3});if(L.length<=0)return;for(let D of L)await g.ack(D.id,D.leaseToken);if(L.length<64)return}}function ne(){Y();}return {async init(v){try{let g=v.params?.cardStoreRef;if(!g)return he("init requires params.cardStoreRef");if(u=v.params?.boardRuntimeStoreRef,!u)return he("init requires params.boardRuntimeStoreRef");let L=v.params?.outputsStoreRef;if(!L)return he("init requires params.outputsStoreRef");let D=v.params?.queueStoreRef;if(!D)return he("init requires params.queueStoreRef");let H=v.params?.fetchedSourcesStoreRef;if(!H)return he("init requires params.fetchedSourcesStoreRef");if(p=v.params?.scratchStoreRef,!p)return he("init requires params.scratchStoreRef");let w=v.params?.chatStoreRef;if(!w)return he("init requires params.chatStoreRef");let b=v.params?.artifactsStoreRef;if(!b)return he("init requires params.artifactsStoreRef");await E()||await h({lastDrainedJournalId:"",graph:yt(St(Ft)),runtimeByCardId:{}},null);let O=S();return await O.writeBoardRuntimeStoreRef(u),await O.writeCardStoreRef(g),await O.writeOutputsStoreRef(L),await O.writeQueueStoreRef(D),await O.writeFetchedSourcesStoreRef(H),await O.writeChatStoreRef(w),await O.writeArtifactsStoreRef(b),await(await x()).writeStatusSnapshot(Rt(s,ht((await c()).graph))),_e()}catch(g){return Ee(g)}},async status(v){try{let g=await x(),L=await g.readStatusSnapshot();return L||(L=Rt(s,ht((await c()).graph)),await g.writeStatusSnapshot(L)),_e(L)}catch(g){return Ee(g)}},async getCardStoreRef(v){try{let g=await S().readCardStoreRef();return g?_e({storeRef:g}):he(`Board at ${e.value} has no card store configured`)}catch(g){return Ee(g)}},async getBoardRuntimeStoreRef(v){try{return _e({storeRef:u??null})}catch(g){return Ee(g)}},async getOutputsStoreRef(v){try{let g=await S().readOutputsStoreRef();return g?_e({storeRef:g}):he(`Board at ${e.value} has no outputs store configured`)}catch(g){return Ee(g)}},async getScratchStoreRef(v){try{return _e({storeRef:p??null})}catch(g){return Ee(g)}},async getChatStoreRef(v){try{return _e({storeRef:await S().readChatStoreRef()})}catch(g){return Ee(g)}},async getArtifactsStoreRef(v){try{return _e({storeRef:await S().readArtifactsStoreRef()})}catch(g){return Ee(g)}},async getFetchedSourcesStoreRef(v){try{return _e({storeRef:await S().readFetchedSourcesStoreRef()})}catch(g){return Ee(g)}},async getConfig(v){try{let g=v.params?.key;if(!g)return he("getConfig requires params.key");let L=S(),D;switch(g){case "task-executor":D=T??null;break;case "chat-handler-flow":D=_??null;break;case "board-runtime-store-ref":D=await L.readBoardRuntimeStoreRef();break;case "card-store-ref":D=await L.readCardStoreRef();break;case "outputs-store-ref":D=await L.readOutputsStoreRef();break;case "scratch-store-ref":D=p??null;break;case "chat-store-ref":D=await L.readChatStoreRef();break;case "artifacts-store-ref":D=await L.readArtifactsStoreRef();break;case "fetched-sources-store-ref":D=await L.readFetchedSourcesStoreRef();break;default:return he(`getConfig: unknown key "${g}"`)}return _e({value:D})}catch(g){return Ee(g)}},async getOutputsDataObject(v){try{let g=v.params?.key;return g?_e(await(await x()).readDataObject(g)):he("getOutputsDataObject requires params.key")}catch(g){return Ee(g)}},async getAllOutputsDataObjects(v){try{return _e(await(await x()).readAllDataObjects())}catch(g){return Ee(g)}},async getOutputsComputedValues(v){try{let g=v.params?.key;return g?_e(await(await x()).readComputedValues(g)):he("getOutputsComputedValues requires params.key")}catch(g){return Ee(g)}},async getAllOutputsComputedValues(v){try{return _e(await(await x()).readAllComputedValues())}catch(g){return Ee(g)}},async getOutputsFetchedSources(v){try{let g=v.params?.key;if(!g)return he("getOutputsFetchedSources requires params.key");let L=await(await $()).listSources(g),D={};for(let H of L)D[H]=await J(`${g}/${H}`);return _e(D)}catch(g){return Ee(g)}},async getAllOutputsFetchedSources(v){try{let g=await $(),L=await(await F()).listKeys(),D=new Set;for(let w of L){let b=w.indexOf("/");b>0&&!w.includes("/.staged/")&&D.add(w.slice(0,b));}let H={};for(let w of D){let b=await g.listSources(w);if(b.length!==0){H[w]={};for(let O of b)H[w][O]=await J(`${w}/${O}`);}}return _e(H)}catch(g){return Ee(g)}},async addCardFiles(v){try{let g=v.params?.cardId;if(!g)return he("addCardFiles requires params.cardId");let L=await A(),D=await L.readCard(g);if(!D)return he(`card "${g}" not found`);let H=v.body,w=Array.isArray(H)?H:H&&typeof H=="object"&&Array.isArray(H.files)?H.files:H!=null?[H]:null;if(!w||w.length===0)return he("addCardFiles requires a file metadata object, array, or body.files array");let b=D.card_data&&typeof D.card_data=="object"&&!Array.isArray(D.card_data)?D.card_data:{},O=Array.isArray(b.files)?b.files:[],U=[...O,...w],V=w.map((ae,fe)=>({idx:O.length+fe,entry:ae}));await L.writeCard(g,{...D,card_data:{...b,files:U}});let X=await this.cardRefreshedNotify({params:{cardId:g}});return X.status!=="success"?X:_e({cardId:g,files_added:V,notified:!0})}catch(g){return Ee(g)}},async cardRefreshedNotify(v){try{let g=v.params?.cardId;if(!g)return he("cardRefreshedNotify requires params.cardId");let L=await(await A()).readCard(g);return L?(await C([{kind:"card_refreshed",cardId:g,card:L}]),_e({cardId:g,notified:!0})):he(`Card "${g}" not found in board at ${e.value}`)}catch(g){return Ee(g)}},async removeCard(v){try{let g=v.params?.id;if(!g)return he("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(g);}catch{}return await l({type:"task-removal",taskName:g,timestamp:Qe()}),ne(),_e()}catch(g){return Ee(g)}},async retrigger(v){try{let g=v.params?.id;return g?(await l({type:"task-restart",taskName:g,timestamp:Qe()}),ne(),_e()):he("retrigger requires params.id")}catch(g){return Ee(g)}},async processAccumulatedEvents(v){return await ee(),ie()},async upsertCard(v){try{let g=v.params?.cardId,L=v.params?.all,D=!!v.params?.restart;if(!g&&!L)return he("upsertCard requires --card-id <id> or --all");let H=await A(),w=L?(await H.readAllCards()).map(O=>O.id):[g];for(let O of w)if(!await H.readCard(O))return he(`Card "${O}" not found in board at ${e.value}`);let b=t.kvStorage("card-upsert");for(let O of w){let U=await H.readCard(O);if(!U)continue;let V=tr(U),X=t.hashFn(V),ae=await b.read(O),fe=ae?.taskConfigHash!==X;if(!(!fe&&!D)){if(fe){let we=ae?.blobRef??await H.readCardKey(O)??O;await l({type:"task-upsert",taskName:O,taskConfig:V,timestamp:Qe()}),await b.write(O,{blobRef:we,taskConfigHash:X,updatedAt:Qe()});}D&&await l({type:"task-restart",taskName:O,timestamp:Qe()});}}return ne(),_e()}catch(g){return Ee(g)}},async taskFailed(v){try{let g=v.params?.token;if(!g)return he("taskFailed requires params.token");let L=v.params?.error??"unknown error",D=dr(g);return D?(await l({type:"task-failed",taskName:D.taskName,error:L,timestamp:Qe()}),ne(),_e()):he("Invalid callback token")}catch(g){return Ee(g)}},async taskProgress(v){try{let g=v.params?.token;if(!g)return he("taskProgress requires params.token");let L=(v.body??{}).update??{},D=dr(g);return D?(await l({type:"task-progress",taskName:D.taskName,update:L,timestamp:Qe()}),ne(),_e()):he("Invalid callback token")}catch(g){return Ee(g)}},async sourceDataFetched(v){try{let g=v.params?.token,L=v.params?.ref;if(!g)return he("sourceDataFetched requires params.token");if(!L)return he("sourceDataFetched requires params.ref");let D=Pn(g);if(!D)return he("Invalid source token");let H=await $(),w=D.dt||t.genId();D.dt||await H.ingestSourceDataStaged(D.cid,D.d,at(L),w);let b=dr(D.cbk);return b?(await l({type:"task-progress",taskName:b.taskName,update:{bindTo:D.b,outputFile:D.d,fetchedAt:Qe(),deliveryToken:w,sourceChecksum:D.cs,rqt:D.rqt},timestamp:Qe()}),ne(),_e()):he("Invalid callback token embedded in source token")}catch(g){return Ee(g)}},async sourceDataFetchFailure(v){try{let g=v.params?.token,L=v.params?.reason??"unknown";if(!g)return he("sourceDataFetchFailure requires params.token");let D=Pn(g);if(!D)return he("Invalid source token");let H=dr(D.cbk);return H?(await l({type:"task-progress",taskName:H.taskName,update:{bindTo:D.b,outputFile:D.d,failure:!0,reason:L,sourceChecksum:D.cs,rqt:D.rqt},timestamp:Qe()}),ne(),_e()):he("Invalid callback token embedded in source token")}catch(g){return Ee(g)}}}}function xr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Go(e){return {...xr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function Wo(e){return {...xr(e),reason:e.reason}}function Ir(e){return {enqueueRequest(t){return e.enqueue(t).id},enqueueRequestIfAbsent:e.enqueueIfAbsent?(t,r)=>{let n=e.enqueueIfAbsent(t,r);return n?n.id:null}:void 0,leaseRequests(t){return e.lease(t).map(Go)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(xr)},peekDeadLetter(){return e.peekDeadLetter().map(Wo)}}}function Fn(){return new Date().toISOString()}function Bn(e){return new TextEncoder().encode(e).byteLength}function Qo(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function On(e){function t(r){let n=e.stat?Qo(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let o=e.read(r);return o===null?{key:r}:{key:r,size:Bn(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Fn(),s.size=s.size??Bn(n),s},putBytes(r,n,o="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 s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Fn(),s.size=s.size??n.byteLength,s},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function qn(){function e(o,s){if(!Array.isArray(o))return [];let i=[];for(let u of o){if(!u||typeof u!="object")continue;let p=u;typeof p.stored_name=="string"&&i.push({name:typeof p.name=="string"?p.name:p.stored_name,stored_name:p.stored_name,size:typeof p.size=="number"&&Number.isFinite(p.size)?p.size:null,mime_type:typeof p.mime_type=="string"?p.mime_type:null,uploaded_at:typeof p.uploaded_at=="string"?p.uploaded_at:s||null,chat:p.chat===true});}return i}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let i=t(o);if(s.length===0)return o.files=i,i;let u=new Set(i.map(p=>p.stored_name));for(let p of s)u.has(p.stored_name)||(i.push(p),u.add(p.stored_name));return o.files=i,i}function n(o,s,i){let u=t(o);if(!Number.isInteger(s)||s<0||s>=u.length)return {ok:false,reason:"index_out_of_range"};let p=u[s];return !p||!p.stored_name?{ok:false,reason:"missing_stored_name"}:i&&i!==p.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:p}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function jn(e){function t(y){let C=typeof y=="number"?y:Number(y);return Number.isInteger(C)&&C>0?C:null}function r(y,C){let S=C;for(let R=y.length-1;R>=0;R-=1)if(y[R]?.role==="user"&&(S-=1,S===0))return y.slice(R);return y}function n(y){return y.some(C=>typeof C?.turn=="string"&&C.turn!=="")}function o(y,C){if(C<=0)return [];if(!n(y))return r(y,C);let S=new Map,R=[];for(let x of y){let A=typeof x?.turn=="string"?x.turn:"";S.has(A)||(S.set(A,[]),R.push(A)),S.get(A).push(x);}return R.slice(Math.max(0,R.length-C)).flatMap(x=>S.get(x)??[])}function s(y){return {status:"success",data:y}}function i(y){return {status:"fail",error:y}}function u(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}async function p(y,C="command envelope"){let S=typeof y.cardId=="string"?y.cardId:void 0;if(!y.command)return i(`chat-store: ${C} missing "command"`);if(!S)return i(`chat-store: ${C} missing "cardId"`);if(y.command==="append")return await _.append({params:{cardId:S},body:{role:y.role,text:y.text,files:y.files,turn:y.turn}});if(y.command==="read-all")return await _.readAll({params:{cardId:S},body:{lastUserTurns:y.lastUserTurns,tailTurns:y.tailTurns,turnId:y.turnId,allTurns:y.allTurns,tailTurnsBeforeId:y.tailTurnsBeforeId}});if(y.command==="read-after")return await _.readAfter({params:{cardId:S},body:{cursor:y.cursor??null}});if(y.command==="clear")return await _.clear({params:{cardId:S}});if(y.command==="set-processing")return await _.setProcessing({params:{cardId:S},body:{active:y.active}});if(y.command==="is-processing")return await _.isProcessing({params:{cardId:S}});if(y.command==="get-config")return await _.getConfig({params:{cardId:S}});if(y.command==="set-config"){let{command:R,cardId:I,...x}=y;return await _.setConfig({params:{cardId:S},body:x})}return i(`chat-store: unknown command "${String(y.command)}"`)}async function T(y){if(!Array.isArray(y.commands)||y.commands.length===0)return i('chat-store: command envelope must include a non-empty "commands" array');let C=[];for(let S=0;S<y.commands.length;S+=1){let R=y.commands[S];if(!R||typeof R!="object"||Array.isArray(R))return i(`chat-store: command envelope entry ${S} must be an object`);let I={cardId:y.cardId,...R},x=await p(I,`command envelope entry ${S}`);if(x.status!=="success")return x;C.push({index:S,command:String(I.command),data:x.data});}return s({results:C})}let _={async append(y){try{let C=y.params?.cardId;if(!C)return i("append requires params.cardId");let S=y.body??{},R=typeof S.role=="string"?S.role:"",I=typeof S.text=="string"?S.text:"",x=Array.isArray(S.files)?S.files:[],A=typeof S.turn=="string"?S.turn:"";if(!R)return i("append requires body.role");let E=await e.append(C,R,I,x,A);return s({id:E})}catch(C){return u(C)}},async readAll(y){try{let C=y.params?.cardId;if(!C)return i("readAll requires params.cardId");let S=y.body??{},R=typeof S.turnId=="string"?S.turnId:"",I=S.allTurns===!0,x=typeof S.tailTurnsBeforeId=="string"?S.tailTurnsBeforeId:"",A=S.tailTurns===void 0?S.lastUserTurns:S.tailTurns,E=A===void 0?I||R?void 0:1:t(A);if(A!==void 0&&E===null)return i("readAll requires body.tailTurns (positive integer)");let c=await e.readAll(C),h=c.filter(d=>!R||String(d.turn||"")===R);if(x){let d=E;if(typeof d!="number"||!Number.isInteger(d)||d<=0)return i("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let f=new Map,l=[];for(let J of c){let G=String(J.turn||"");f.has(G)||(f.set(G,[]),l.push(G)),f.get(G).push(J);}let k=l.findIndex(J=>J===x),F=Math.max(0,k-d);return h=(k===-1?[]:l.slice(F,k)).flatMap(J=>f.get(J)??[]),s({records:h})}return s(typeof E=="number"?{records:o(h,E)}:{records:h})}catch(C){return u(C)}},async readAfter(y){try{let C=y.params?.cardId;if(!C)return i("readAfter requires params.cardId");let R=(y.body??{}).cursor??null;return s(await e.readAfter(C,R))}catch(C){return u(C)}},async clear(y){try{let C=y.params?.cardId;return C?(await e.clear(C),s({ok:!0})):i("clear requires params.cardId")}catch(C){return u(C)}},async setProcessing(y){try{let C=y.params?.cardId;if(!C)return i("setProcessing requires params.cardId");let S=y.body??{};return typeof S.active!="boolean"?i("setProcessing requires body.active (boolean)"):(await e.setProcessing(C,S.active),s({ok:!0}))}catch(C){return u(C)}},async isProcessing(y){try{let C=y.params?.cardId;return C?s({active:await e.isProcessing(C)}):i("isProcessing requires params.cardId")}catch(C){return u(C)}},async getConfig(y){try{let C=y.params?.cardId;return C?s({config:await e.getConfig(C)}):i("getConfig requires params.cardId")}catch(C){return u(C)}},async setConfig(y){try{let C=y.params?.cardId;if(!C)return i("setConfig requires params.cardId");let S=y.body??{};return await e.setConfig(C,S),s({ok:!0})}catch(C){return u(C)}},run:p,runBatch:T};return _}function Ln(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Tr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function Pr(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)Pr(e,n);return}r.kind==="status"&&Tr(r.status)&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card),r.kind==="card_removed"&&r.cardId&&(delete e.cards[r.cardId],delete e.computedValues[r.cardId]);}function Mn(e){let t=new Map,r=new Map,n=new Map,o=0,s=null;function i(d){let f=JSON.stringify(d);return o++,`id: ${o}
|
|
2
|
+
data: ${f}
|
|
3
3
|
|
|
4
|
-
`}function a(m){let p=m;try{p.flushHeaders?.();}catch{}try{p.flush?.();}catch{}try{p.socket?.setNoDelay?.(!0);}catch{}try{p.socket?.uncork?.();}catch{}}function u(m,p){let k=t.get(m);if(k&&!(p&&k.res!==p)){t.delete(m),R();try{e.onSseClientDisconnected?.(m);}catch{}try{k.res.end();}catch{}}}function b(m,p,k){let S=t.get(m);S&&u(m,S.res),t.set(m,{res:p,subscribedChatCardIds:k??new Set});}function A(m,p){let k=t.get(m);if(!k)return;let S=i(p);try{k.res.write(S),a(k.res);}catch{u(m,k.res);}}function f(){let m=new Set;for(let p of t.values())for(let k of p.subscribedChatCardIds)m.add(k);return Array.from(m)}function g(m){let p=r.has(m)?r.get(m):null,{cursor:k}=e.chatStorage.readAfter(m,p),S=e.chatStorage.isProcessing(m),B=S!==(n.get(m)??false),x=k!==p;return x&&r.set(m,k),n.set(m,S),x||B}function v(m,p){let k=e.readChatRecords(m),S=Date.now();return {kind:"card_chats",cardId:m,sentAt:new Date(S).toISOString(),sentAtMs:S,messages:k.map(B=>({role:String(B.role||"system"),text:String(B.text||""),files:Array.isArray(B.files)?B.files:[]})),receiving:p,processing:e.chatStorage.isProcessing(m)}}function C(m,p=true){let k={kind:"notification-batch",notifications:[v(m,p)]};for(let[S,B]of t.entries())B.subscribedChatCardIds.has(m)&&A(S,k);}function R(){f().length>0||(s&&(clearInterval(s),s=null),r.clear(),n.clear());}function l(){if(s)return;let m=()=>{let p=f();if(p.length===0){R();return}let k=new Set(p);for(let S of Array.from(r.keys()))k.has(S)||r.delete(S);for(let S of Array.from(n.keys()))k.has(S)||n.delete(S);for(let S of p)g(S)&&C(S,true);};m(),s=setInterval(m,1e3);}function y(m,p){let k=t.get(m);if(!k)return false;k.subscribedChatCardIds.add(p);let{cursor:S}=e.chatStorage.readAfter(p,null);return r.set(p,S),n.set(p,e.chatStorage.isProcessing(p)),l(),A(m,{kind:"notification-batch",notifications:[v(p,true)]}),true}function O(m,p){let k=t.get(m);return k?(k.subscribedChatCardIds.delete(p),f().includes(p)||(r.delete(p),n.delete(p)),R(),true):false}function w(m){if(!m||typeof m!="object")return false;let p=m.kind;return p==="card_chats"||p==="chat_messages"}function _(m){if(!m||m.length===0)return;let p=[],k=new Set;for(let S of m)w(S)&&typeof S.cardId=="string"?k.add(String(S.cardId)):p.push(S);if(p.length>0){let S={kind:"notification-batch",notifications:p};for(let B of t.keys())A(B,S);}for(let S of k)C(S,true);}return {size:()=>t.size,has:m=>t.has(m),get:m=>t.get(m),buildFrame:i,flushTransport:a,register:b,disconnect:u,writeFrame:A,subscribeChat:y,unsubscribeChat:O,broadcastNotificationBatch:_,broadcastCardChats:C}}function ue(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function Xe(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function ut(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function et(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function nr(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let s=Number(o);if(Number.isFinite(s))return s}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Pn(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}function vr(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?Object.assign(new Error(e.error||`${t} failed`),{statusCode:400}):Object.assign(new Error(`${t} returned an unexpected response`),{statusCode:500})}async function Ar(e,t){return vr(await e,t)}function xr(e){let t=ue(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r[0]==="chat"&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool only supports card private keys under chat.*"),{statusCode:400});return t}function Ir(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function _n(e){let{boardId:t,getMcpFacade:r,getMcpCardStoreFacade:n}=e;function o(b){let A=ue(b,"board_id"),f=ue(b,"card_id");if(!A)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(!f)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});if(A!==t)throw Object.assign(new Error(`Unknown board_id: ${A}`),{statusCode:400});return {cardId:f}}function s(b,A){let{cardId:f}=o(b);return r().setChatProcessing({cardId:f,active:A}),{status:"success",data:{boardId:t,cardId:f,active:A}}}function i(b){let{cardId:A}=o(b),f=r().getChatProcessing({cardId:A});return {status:"success",data:{boardId:t,cardId:A,active:f.active}}}async function a(b){let{cardId:A}=o(b),f=xr(b);if(!Object.prototype.hasOwnProperty.call(b,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(f.split(".").includes("visible_controlplane_only")){let g=await Ar(n().get({params:{id:A}}),"cardStore.get"),v=Array.isArray(g.cards)&&g.cards.length>0&&typeof g.cards[0]=="object"&&!Array.isArray(g.cards[0])?g.cards[0]:null,C=v?Ir(v,"visible_controlplane_only").value:void 0;if(b.value!==C)throw Object.assign(new Error("MCP tool cannot change the reserved private flag visible_controlplane_only"),{statusCode:403});return {status:"success",data:{boardId:t,cardId:A,key:f}}}return vr(await n().patch({params:{id:A,path:`__private.${f}`},body:{value:b.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:A,key:f}}}async function u(b){let{cardId:A}=o(b),f=xr(b),g=await Ar(n().get({params:{id:A}}),"cardStore.get"),v=Array.isArray(g.cards)&&g.cards.length>0&&g.cards[0]&&typeof g.cards[0]=="object"&&!Array.isArray(g.cards[0])?g.cards[0]:null;if(!v)throw Object.assign(new Error(`Card "${A}" not found`),{statusCode:404});let C=Ir(v,f);return {status:"success",data:{boardId:t,cardId:A,key:f,exists:C.exists,value:C.value}}}return {requireCardArgs:o,setChatProcessing:s,getChatProcessing:i,setCardMeta:a,getCardMeta:u}}function En(e){let{boardId:t,boardContexts:r,readCardDefinitions:n,readChatRecords:o,getChatProcessing:s}=e;async function i(){let A=(await Promise.all(r.map(async R=>{try{let l=R.boardAdapter.kvStorageForRef(R.outputsStoreRef),y=await Promise.resolve(l.read("status"));if(y!=null)return y}catch{}return R.notification.status}))).filter(Boolean);if(A.length===0)return null;if(A.length===1)return A[0];let f=[],g=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],v={};for(let R of g)v[R]=0;for(let R of A){let l=R,y=Array.isArray(l.cards)?l.cards:[];f.push(...y);for(let O of g)v[O]+=Number(l?.summary?.[O]||0);}let C=A[0];return {...C,cards:f,summary:{...C.summary||{},card_count:f.length,...v}}}async function a(){let A={},f=async g=>{try{let v=await g.boardOps.getAllOutputsComputedValues({});if(v.status==="success"&&v.data&&typeof v.data=="object"){for(let[C,R]of Object.entries(v.data)){let l=g.notification.cards[C];A[C]={schema_version:"v1",card_id:C,card_data:l?.card_data??{},computed_values:R??{}};}return}}catch{}for(let[v,C]of Object.entries(g.notification.computedValues)){let R=g.notification.cards[v];A[v]={schema_version:"v1",card_id:v,card_data:R?.card_data??{},computed_values:C??{}};}};for(let g of r)await f(g);return A}async function u(){let A={};for(let f of r){try{let g=await f.boardOps.getAllOutputsDataObjects({});if(g.status==="success"&&g.data&&typeof g.data=="object"){Object.assign(A,g.data);continue}}catch{}Object.assign(A,f.notification.dataObjects||{});}return A}async function b(){let A=await n(),f=await a(),g=await u(),v={};for(let R of A){if(!R?.id)continue;let l=R.id,y=f[l]||{},O={...y.card_data&&typeof y.card_data=="object"?y.card_data:R.card_data&&typeof R.card_data=="object"?R.card_data:{}};v[l]={schema_version:y.schema_version||"v1",card_id:y.card_id||l,card_data:O,computed_values:y.computed_values&&typeof y.computed_values=="object"?y.computed_values:{}};}let C={};for(let R of A){if(!R?.id)continue;let l=R.id;try{let y=o(l),O=s(l);(y.length>0||O)&&(C[l]={messages:y.map(w=>({role:String(w.role||"system"),text:String(w.text||""),files:Array.isArray(w.files)?w.files:[]})),receiving:!1,processing:O});}catch{}}return {boardId:t,cardDefinitions:A,statusSnapshot:await i(),dataObjectsByToken:g,cardRuntimeById:v,cardChatsByCardId:C}}return {readStatusSnapshot:i,readCardRuntimeArtifacts:a,readDataObjectsByToken:u,buildPublishedRuntimePayload:b}}function $o(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 On(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:s,writeChatRecord:i}=e;async function a(A){let f=[];try{let g=await o(A);if(!g)return f;let v=n().read(g.card_data&&typeof g.card_data=="object"?g.card_data:null);for(let C of v)f.push(String(C.stored_name??""));}catch{}return f}async function u(A,f,g,v){let C=t(A),R=r(A),l=$o(f),y=await a(A),w=`${String(y.length+1).padStart(3,"0")}-${l}`.slice(-36);return R.files&&await R.files.putBytes(`${C}/${w}`,new Uint8Array(v),g||"application/octet-stream"),{name:l,stored_name:w,size:v.length,mime_type:g||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function b(A,f,g,v,C){if(!v.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let R=C?.inChat===true,l=await u(A,f,g,v),y=null;if(await s(A,O=>{let w=new Date().toISOString(),_=O.card_data&&typeof O.card_data=="object"?O.card_data:{};O.card_data=_;let m=n().normalizeIncoming([{name:l.name,stored_name:l.stored_name,size:l.size,mime_type:l.mime_type,uploaded_at:l.uploaded_at||w,chat:R}],w);return y=n().merge(_,m).findIndex(k=>k.stored_name===l.stored_name),O}),R&&C?.suppressChatRecordWrite!==true){let O=typeof y=="number"&&y>=0?` #${y}`:"";i(A,"system",`file uploaded: ${l.name} as ${l.stored_name}${O}`,[],C?.turnId??"");}return {ok:true,file:{...l,...typeof y=="number"&&y>=0?{file_idx:y}:{},chat:R},...typeof y=="number"&&y>=0?{file_idx:y}:{}}}return {uploadCardFile:b,readCardStoredFileNames:a}}function Bn(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:ue(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=Xe(t,"tail_turns"),n=Xe(t,"tail"),o=ue(t,"turn_id"),s=t.all_turns===true,i=ue(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:ue(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...s?{allTurns:true}:{},...i?{tailTurnsBeforeId:i}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:ue(t,"card_id"),fileIdx:Number(Xe(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:et(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:et(t,"candidate_card_content","candidate_card_content"),mockRequires:et(t,"mock_requires","mock_requires"),mockFetchedSources:et(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:et(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:nr(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:et(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:nr(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:ue(t,"card_id"),sourceIdx:nr(t,"source_idx","source_idx"),mockRequires:et(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:et(t,"candidate_card_content","candidate_card_content"),mockRequires:ut(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:ue(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=ue(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:ue(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:ue(t,"card_id"),candidateCardContent:ut(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:ue(t,"card_id")})}}function Fn(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:ue(t,"token"),ref:ue(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:ue(t,"token"),reason:ue(t,"reason")})}}function qn(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(a,u){let b=ue(a,"board_id");if(!b)throw Object.assign(new Error(`${u} requires board_id`),{statusCode:400});if(b!==t)throw Object.assign(new Error(`Unknown board_id: ${b}`),{statusCode:400})}function i(a,u){let{cardId:b}=o.requireCardArgs(a),A=ue(a,"turn_id");return s(a,u),n().manageAddChatAttachment({cardId:b,role:ue(a,"role")||"user",...A?{turn:A}:{},files:[{file_name:ue(a,"file_name"),content_type:ue(a,"content_type")||"application/octet-stream",...typeof a.text=="string"?{text:a.text}:{},...typeof a.base64=="string"?{base64:a.base64}:{},...Array.isArray(a.bytes)?{bytes:a.bytes}:{}}]})}return {"list-runtime-cards":a=>(s(a,"list-runtime-cards"),n().listRuntimeCards()),"getstate.is-chat-processing":a=>o.getChatProcessing(a),"setstate.chat-processing-started":a=>o.setChatProcessing(a,true),"setstate.chat-processing-done":a=>o.setChatProcessing(a,false),"getstate.card-private":a=>o.getCardMeta(a),"setstate.card-private":a=>o.setCardMeta(a),"manage.upload-card-file":a=>{let u=ue(a,"card_id"),b=ue(a,"file_name"),A=ue(a,"content_type")||"application/octet-stream",f=Pn(a);if(s(a,"manage.upload-card-file"),!u)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!f)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(u,b,A,f,{inChat:false})},"manage.add-chat-attachment":a=>i(a,"manage.add-chat-attachment"),"manage.add-chat-attachement":a=>i(a,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":a=>{let{cardId:u}=o.requireCardArgs(a),b=ue(a,"role")||"user",A=ue(a,"turn_id");return s(a,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:u,role:b,...typeof a.text=="string"?{text:a.text}:{},...A?{turn:A}:{},...Array.isArray(a.files)?{files:a.files}:{}})},"manage.patch-card":a=>{let{cardId:u}=o.requireCardArgs(a);return s(a,"manage.patch-card"),n().managePatchCard({cardId:u,patch:ut(a,"patch")})},"manage.upsert-card":a=>{let{cardId:u}=o.requireCardArgs(a);return s(a,"manage.upsert-card"),n().manageUpsertCard({cardId:u,candidateCardContent:ut(a,"candidate_card_content")})},"manage.remove-card":a=>{let{cardId:u}=o.requireCardArgs(a);return s(a,"manage.remove-card"),n().manageRemoveCard({cardId:u})},"manage.admin-read-card":async a=>{let{cardId:u}=o.requireCardArgs(a);return {status:"success",data:{cards:await n().adminReadCard({cardId:u})}}},"manage.admin-upsert-card":a=>{let u=ue(a,"board_id"),b=ue(a,"card_id");if(!u)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(u!==t)throw Object.assign(new Error(`Unknown board_id: ${u}`),{statusCode:400});return n().adminUpsertCard({cardId:b,candidateCardContent:ut(a,"candidate_card_content")})}}}function qe(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function jn(e,t){if(e?.status==="success"&&Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw e?.status==="success"?new Error(`${t} returned success without data`):e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function Y(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Ee(e){return Array.isArray(e)?e:[]}function Pr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=Y(e).fetched_sources,n=n.slice(16));for(let o of n.split(".")){if(r==null||typeof r!="object")return;r=r[o];}return r}function Tr(e,t){let r=Y(e.view),n=Ee(r.elements);return {layout:r.layout,features:r.features,elements:n.map((o,s)=>{let i=Y(o),a=Y(i.data),u=typeof i.visible=="string"?!!Pr(t,i.visible):true,b=typeof a.bind=="string"?a.bind:void 0,A=typeof a.maxRows=="number"?a.maxRows:void 0,f=b?Pr(t,b):void 0,g={id:typeof i.id=="string"&&i.id?i.id:`element-${s}`,kind:i.kind,label:i.label,visible:u};return f!==void 0&&(g.resolved=Array.isArray(f)&&typeof A=="number"?f.slice(0,A):f),g})}}function Ln(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Ee(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],s={};for(let i of o){let a=Y(i),u=typeof a.bindTo=="string"?a.bindTo:"",b=typeof a.ref=="string"?a.ref:"";if(!u||!b)continue;let A=Pr(t,b);A!==void 0&&(s[u]=A);}return s}function Uo(e){if(typeof e!="string"||!e.trim())return null;let t=/^(file uploaded|AI generated|AI geneterated):\s*.*?#(\d+)\s*$/i.exec(e.trim());if(!t)return null;let r=Number.parseInt(t[2],10);return !Number.isInteger(r)||r<0?null:r}function Vo(e){return {"card-content":e}}function or(e){let t={...e};return delete t.__private,t}function sr(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Ko(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function Ho(e,t){let r=Ko(e);if(!t||Object.keys(t).length===0)return r;function n(o,s,i){let a=String(s||"").split(".").filter(Boolean);if(!a.length)return;let u=o;for(let b=0;b<a.length-1;b+=1){let A=a[b];(!u[A]||typeof u[A]!="object")&&(u[A]={}),u=u[A];}u[a[a.length-1]]=i;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=Y(r.view),i=Ee(s.elements);for(let a of i){let u=Y(Y(a).data);if(typeof u.writeTo=="string"&&u.writeTo){o=u.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...Y(r.card_data),...t.fieldValues}),r}if(Array.isArray(t._stagedFiles)&&t._stagedFiles.length>0)return r;for(let[o,s]of Object.entries(t))o!=="_stagedFiles"&&(s!==null&&typeof s=="object"&&!Array.isArray(s)&&r[o]!==null&&typeof r[o]=="object"&&!Array.isArray(r[o])?r[o]={...r[o],...s}:r[o]=s);return r}function Dn(e){return Y(e.__private).visible_controlplane_only===true}async function yt(e,t){let r=await Ge(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function Mn(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:s,sourceFetchDone:i,sourceFetchFailed:a,uploadCardFile:u,buildFileDownloadUrl:b,readFetchedSourceJsonByRef:A}=e;function f(T,I){if(typeof T=="function")return T;throw new Error(`${I} is not configured for this MCP facade`)}async function g(){let T=await Ge(n.get({}),"cardStore.get");return Array.isArray(T.cards)?T.cards.map(I=>Y(I)):[]}function v(T){if(Array.isArray(T.bytes))return new Uint8Array(T.bytes.map(I=>Math.max(0,Math.min(255,Number(I)||0))));if(typeof T.text=="string")return new TextEncoder().encode(T.text);if(typeof T.base64=="string"){let I=String(T.base64).replace(/-/g,"+").replace(/_/g,"/"),U=I+"=".repeat((4-I.length%4)%4),J=atob(U);return Uint8Array.from(J,G=>G.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function C(){let T=Y(await Ge(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:T.version,commonSourceFields:Y(T.commonSourceDefFields),sourceKinds:Y(T.sourceKinds)}}async function R(){let T=Y(await Ge(t.status({}),"status")),I=Y(T.summary),U=Ee(T.cards);return {meta:Y(T.meta),summary:{card_count:typeof I.card_count=="number"?I.card_count:0,completed:typeof I.completed=="number"?I.completed:0,eligible:typeof I.eligible=="number"?I.eligible:0,pending:typeof I.pending=="number"?I.pending:0,blocked:typeof I.blocked=="number"?I.blocked:0,in_progress:typeof I.in_progress=="number"?I.in_progress:0,failed:typeof I.failed=="number"?I.failed:0,unresolved:typeof I.unresolved=="number"?I.unresolved:0},cards:U.map(J=>{let G=Y(J);return {"card-id":typeof G.name=="string"?G.name:null,status:G.status??null,error:G.error??null,requires:Ee(G.requires),requires_satisfied:Ee(G.requires_satisfied),requires_missing:Ee(G.requires_missing),provides_declared:Ee(G.provides_declared),provides_runtime:Ee(G.provides_runtime)}})}}async function l(T){let I=String(T.cardId||"").trim();if(!I)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let U=Y(await Ge(t.status({}),"status")),G=Ee(U.cards).map(Y).find(te=>te.name===I);if(!G)throw new Error(`card "${I}" not found in board status`);let re=Y(await yt(n,I));if(Dn(re))throw Object.assign(new Error(`card "${I}" not found`),{statusCode:404});let de=or(re),pe=Ee(G.requires_satisfied).filter(te=>typeof te=="string"&&!!te),ye=Ee(G.provides_runtime).filter(te=>typeof te=="string"&&!!te),he=Object.fromEntries(await Promise.all(pe.map(async te=>[te,await Ge(t.getOutputsDataObject({params:{key:te}}),`getOutputsDataObject(${te})`)]))),xe=Object.fromEntries(await Promise.all(ye.map(async te=>[te,await Ge(t.getOutputsDataObject({params:{key:te}}),`getOutputsDataObject(${te})`)]))),q=Y(await Ge(t.getOutputsComputedValues({params:{key:I}}),"getOutputsComputedValues")),c=await Ge(t.getOutputsFetchedSources({params:{key:I}}),"getOutputsFetchedSources"),E=Ee(re.source_defs).map(Y),L={};for(let te of E)typeof te.bindTo=="string"&&typeof te.outputFile=="string"&&(L[te.outputFile]=te.bindTo);let ee={};for(let[te,le]of Object.entries(c)){let Se=L[te]??te;if(!A||typeof le!="string"){ee[Se]=null;continue}try{ee[Se]=A({cardId:I,ref:le});}catch{ee[Se]=null;}}let ne={card_data:Y(re.card_data),requires:he,fetched_sources:ee,computed_values:q};return {cardId:I,card_status_in_board:G,card_definition_and_static_data:de,refs_for_fetched_source_files:c,runtime_data:{requires:he,provides:xe,computed_values:q,rendered_view:Tr(re,ne)}}}async function y(T){let I=String(T.cardId||"").trim();if(!I)throw new Error("inspectChatMessagesOnCards requires cardId");let U=typeof T.turnId=="string"?T.turnId:"",J=T.allTurns===true,G=typeof T.tailTurnsBeforeId=="string"?T.tailTurnsBeforeId:"",re=J?void 0:T.lastUserTurns??(U?void 0:1),de=T.tail,pe={...re===void 0?{}:{tailTurns:re},...U?{turnId:U}:{},...J?{allTurns:true}:{},...G?{tailTurnsBeforeId:G}:{}},ye=Object.keys(pe).length>0?{params:{cardId:I},body:pe}:{params:{cardId:I}},he=qe(o.readAll(ye),"chatStore.readAll"),xe=Y(await yt(n,I)),q=Ee(Y(xe.card_data).files).map((L,ee)=>({idx:ee,stored_name:Y(L).stored_name})).filter(L=>typeof L.stored_name=="string"&&L.stored_name.length>0),E=(Array.isArray(he.records)?he.records:[]).map(L=>{let ne=Y(L.payload),te={...L},le=typeof L?.role=="string"?L.role:typeof ne.role=="string"?String(ne.role):"",Se=typeof L?.text=="string"?L.text:typeof ne.text=="string"?String(ne.text):"";if(le==="system"){let be=Uo(Se);if(be!==null&&q.some(je=>je.idx===be)){let je=`Retrieve using inspect-file-contents --card-id ${I} --file-idx ${be}`;te.retrieval_hint=je,Object.keys(ne).length>0&&typeof L.role!="string"&&(te.payload={...ne,retrieval_hint:je});}}return te});return {cardId:I,messages:typeof de=="number"&&de>=0?E.slice(-de):E}}async function O(T){let I=String(T.cardId||"").trim(),U=Number(T.fileIdx);if(!I)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(U)||U<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let J=Y(await yt(n,I)),G=Ee(Y(J.card_data).files).map(Y);if(U>=G.length)throw new Error(`attachment index ${U} is out of range for card "${I}"`);let re=G[U],de=typeof re.stored_name=="string"?re.stored_name:null;return {cardId:I,fileIdx:U,downloadUrl:b({cardId:I,fileIdx:U,storedName:de}),...typeof re.name=="string"?{name:re.name}:{},...typeof re.stored_name=="string"?{stored_name:re.stored_name}:{},...typeof re.mime_type=="string"?{mime_type:re.mime_type}:{},...typeof re.size=="number"?{size:re.size}:{},...typeof re.uploaded_at=="string"?{uploaded_at:re.uploaded_at}:{}}}async function w(T){return await r.validateCardPreflight({body:Vo(T.candidateCardContent)})}function _(T){if(!T.mockRequires||typeof T.mockRequires!="object"||Array.isArray(T.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!T.mockFetchedSources||typeof T.mockFetchedSources!="object"||Array.isArray(T.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let I=r.evalCardCompute({body:{"card-content":T.candidateCardContent,"mock-requires":T.mockRequires,"mock-fetched-sources":T.mockFetchedSources}});if(I.status!=="success")return I;let U=Y(jn(I,"evalCardCompute")),J=Y(T.candidateCardContent),G={card_data:Y(J.card_data),requires:Y(T.mockRequires),fetched_sources:Y(T.mockFetchedSources),computed_values:Y(U.computed_values)};return {status:"success",data:{cardId:typeof U.cardId=="string"?U.cardId:typeof J.id=="string"?J.id:"(unknown)",ok:U.ok===true,computed_values:Y(U.computed_values),errors:Ee(U.errors).map(re=>{let de=Y(re);return {bindTo:typeof de.bindTo=="string"?de.bindTo:"",error:typeof de.error=="string"?de.error:""}}),provides_outputs:Ln(J,G),rendered_view:Tr(J,G)}}}async function m(T){return await r.probeSourcePreflight({params:{sourceIdx:T.sourceIdx},body:{"card-content":T.candidateCardContent,"mock-projections":T.mockProjections}})}async function p(T){return await r.runSourcePreflight({params:{sourceIdx:T.sourceIdx},body:{"card-content":T.candidateCardContent,"mock-projections":T.mockProjections}})}async function k(T){let I=String(T.cardId||"").trim();if(!I)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!T.mockRequires||typeof T.mockRequires!="object"||Array.isArray(T.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let U=Y(await yt(n,I)),J=Ee(U.source_defs).filter(re=>!!re&&typeof re=="object"&&!Array.isArray(re)),G={};if(T.sourceIdx>=0&&T.sourceIdx<J.length){let re=J[T.sourceIdx],de=$e.enrichSourcesSync([re],{card_data:Y(U.card_data),requires:T.mockRequires});Array.isArray(de)&&de.length>0&&(G=Y(de[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:T.sourceIdx},body:{"card-content":U,"mock-requires":T.mockRequires,"mock-projections":G}})}async function S(T){let I=Y(await Ge(r.simulateCardCycle({body:{"card-content":T.candidateCardContent,"mock-requires":T.mockRequires}}),"simulateCardCycle")),U=Y(T.candidateCardContent),J=Y(I.validation),G=Ee(I.source_probes),re=Ee(I.projection_errors),de=Y(I.fetched_sources),pe=Ee(I.compute_errors),ye=Y(I.computed_values),he={card_data:Y(U.card_data),requires:T.mockRequires,fetched_sources:de,computed_values:ye},xe=[];for(let q of Ee(J.issues))typeof q=="string"&&q&&xe.push(q);for(let q of G){let c=Y(q),E=typeof c.bindTo=="string"?c.bindTo:"source",L=typeof c.error=="string"?c.error:"";L&&xe.push(`${E}: ${L}`);}for(let q of re){let c=Y(q),E=typeof c.bindTo=="string"?c.bindTo:"source",L=typeof c.key=="string"?c.key:"projection",ee=typeof c.error=="string"?c.error:"projection failed";xe.push(`${E}.${L}: ${ee}`);}for(let q of pe){let c=Y(q),E=typeof c.bindTo=="string"?c.bindTo:"compute",L=typeof c.error=="string"?c.error:"compute failed";xe.push(`${E}: ${L}`);}return {status:"success",data:{cardId:typeof I.cardId=="string"?I.cardId:"(unknown)",ok:I.ok===true,issues:xe,provides_outputs:Ln(U,he),rendered_view:Tr(U,he)}}}async function B(T){let I=String(T.cardId||"").trim();if(!I)throw new Error("manageReadCard requires cardId");let U=await Ge(n.get({params:{id:I}}),"cardStore.get"),J=Array.isArray(U.cards)?U.cards.map(Y):[];if(J.some(Dn))throw Object.assign(new Error(`Card "${I}" not found`),{statusCode:404});return J.map(G=>or(G))}async function x(T){let I=await Promise.all(Ee(T.files).map(async U=>{let J=Y(U),G=String(J.file_name??J.fileName??J.name??"").trim(),re=String(J.content_type??J.contentType??"application/octet-stream");if(!G)throw new Error("file entry requires file_name");return await u({cardId:T.cardId,fileName:G,contentType:re,bytes:v(J),suppressChatRecordWrite:true})}));return I.forEach((U,J)=>{let G=Y(U.file),re=typeof U.file_idx=="number"&&Number.isInteger(U.file_idx)&&U.file_idx>=0?U.file_idx:J,de=T.role==="assistant"?`AI generated: ${String(G.name||"")} as ${String(G.stored_name||"")} #${re}`:`file uploaded: ${String(G.name||"")} as ${String(G.stored_name||"")} #${re}`;qe(o.append({params:{cardId:T.cardId},body:{role:"system",text:de,files:[],turn:T.turn}}),"chatStore.append(system attachment message)");}),I.map(U=>U.file)}async function h(T){let I=String(T.cardId||"").trim(),U=String(T.role||"user").trim()||"user",J=typeof T.turn=="string"?T.turn:"";if(!I)throw new Error("manageAddChatAttachment requires cardId");let G=await x({cardId:I,role:U,turn:J,files:T.files});return {status:"success",data:{cardId:I,turn:J,files:G}}}async function D(T){let I=String(T.cardId||"").trim(),U=String(T.role||"").trim(),J=typeof T.text=="string"?T.text:"",G=typeof T.turn=="string"?T.turn:"";if(!I)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!U)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(U==="assistant"&&G){let pe=qe(o.readAll({params:{cardId:I},body:{turnId:G}}),"chatStore.readAll(existing turn messages)"),ye=Array.isArray(pe.records)?pe.records.find(he=>he.role==="assistant"&&String(he.turn||"")===G):void 0;if(ye)return {status:"success",data:{cardId:I,id:String(ye.id),role:U,turn:G,files:Array.isArray(ye.files)?ye.files:[]}}}let re=await x({cardId:I,role:U,turn:G,files:T.files}),de=qe(o.append({params:{cardId:I},body:{role:U,text:J,files:re,turn:G}}),"chatStore.append");return {status:"success",data:{cardId:I,id:String(de.id),role:U,turn:G,files:re}}}async function j(T){let I=String(T.cardId||"").trim(),U=Y(T.patch);if(!I)throw new Error("managePatchCard requires cardId");let J=await B({cardId:I}),G=Y(J[0]),de={...Ho(G,U),...sr(G,"meta")?{meta:G.meta}:{},...sr(G,"__private")?{__private:G.__private}:{}},pe=await n.set({body:de});qe(pe,"cardStore.set");let ye;try{ye=await t.upsertCard({params:{cardId:I,restart:!0}}),qe(ye,"upsertCard");}catch(xe){try{await n.set({body:G});}catch{}throw xe}let he=null;try{he=await t.cardRefreshedNotify({params:{cardId:I}}),qe(he,"cardRefreshedNotify");}catch{he=null;}return {status:"success",data:{validation:null,card_saved:null,board_result:ye,refresh_notify:he}}}async function X(T){let I=String(T.cardId||"").trim(),U=Y(T.candidateCardContent),J=or(U);if(!I)throw new Error("manageUpsertCard requires cardId");if(typeof J.id!="string"||!J.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(J.id!==I)throw new Error(`candidateCardContent.id must match cardId (${I})`);let G=await w({candidateCardContent:J}),re=Y(G),de=Y(re.data);if(re.status!=="success"||de.isValid!==true)return {status:"fail",step:"validate",validation:G};let pe=null;try{pe=await yt(n,I);}catch{pe=null;}let ye=pe?Y(pe):null,he={...J,...ye&&sr(ye,"meta")?{meta:ye.meta}:{},...ye&&sr(ye,"__private")?{__private:ye.__private}:{}},xe=await n.set({body:he});qe(xe,"cardStore.set");let q;try{q=await t.upsertCard({params:{cardId:I,restart:!0}}),qe(q,"upsertCard");}catch(E){try{pe&&await n.set({body:pe});}catch{}throw E}let c=null;try{c=await t.cardRefreshedNotify({params:{cardId:I}}),qe(c,"cardRefreshedNotify");}catch{c=null;}return {status:"success",data:{validation:G,card_saved:null,board_result:q,refresh_notify:c}}}async function N(T){let I=String(T.cardId||"").trim();if(!I)throw new Error("manageRemoveCard requires cardId");let U=await t.removeCard({params:{id:I}});qe(U,"removeCard");let J=await n.del({params:{id:I}});return qe(J,"cardStore.del"),{status:"success",data:{board_result:U,store_result:J}}}async function $(T){let I=String(T.cardId||"").trim();if(!I)throw new Error("adminReadCard requires cardId");let U=await Ge(n.get({params:{id:I}}),"cardStore.get");return Array.isArray(U.cards)?U.cards.map(J=>Y(J)):[]}async function Z(T){let I=String(T.cardId||"").trim(),U=Y(T.candidateCardContent),J=or(U);if(!I)throw new Error("adminUpsertCard requires cardId");if(typeof J.id!="string"||!J.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(J.id!==I)throw new Error(`candidateCardContent.id must match cardId (${I})`);let G=await w({candidateCardContent:J}),re=Y(G),de=Y(re.data);if(re.status!=="success"||de.isValid!==true)return {status:"fail",step:"validate",validation:G};let pe=null;try{pe=await yt(n,I);}catch{pe=null;}let ye=pe?Y(Y(pe).__private):{},he={...J,__private:{...ye,visible_controlplane_only:true}},xe=await n.set({body:he});qe(xe,"cardStore.set");let q;try{q=await t.upsertCard({params:{cardId:I,restart:!0}}),qe(q,"upsertCard");}catch(E){try{pe&&await n.set({body:pe});}catch{}throw E}let c=null;try{c=await t.cardRefreshedNotify({params:{cardId:I}}),qe(c,"cardRefreshedNotify");}catch{c=null;}return {status:"success",data:{validation:G,card_saved:null,board_result:q,refresh_notify:c}}}function H(T){let I=String(T.cardId||"").trim();if(!I)throw new Error("getChatProcessing requires cardId");let U=jn(o.isProcessing({params:{cardId:I}}),"chatStore.isProcessing");return {cardId:I,active:!!U.active}}function M(T){let I=String(T.cardId||"").trim();if(!I)throw new Error("setChatProcessing requires cardId");if(typeof T.active!="boolean")throw new Error("setChatProcessing requires boolean active");return qe(o.setProcessing({params:{cardId:I},body:{active:T.active}}),"chatStore.setProcessing"),{cardId:I,active:T.active}}async function z(){let T=await f(s,"webhook.process-accumulated")();return T?.status==="fail"||T?.status==="error"?T:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(T??{},"data")?T.data??null:null}}}async function oe(T){let I=String(T.token||"").trim(),U=String(T.ref||"").trim();if(!I)throw new Error("webhookSourceFetchDone requires token");if(!U)throw new Error("webhookSourceFetchDone requires ref");let J=await f(i,"webhook.source-fetch-done")({token:I,ref:U});return J?.status==="fail"||J?.status==="error"?J:{status:"success",data:{token:I,ref:U,runtime_result:Object.prototype.hasOwnProperty.call(J??{},"data")?J.data??null:null}}}async function we(T){let I=String(T.token||"").trim(),U=String(T.reason||"").trim();if(!I)throw new Error("webhookSourceFetchFailed requires token");if(!U)throw new Error("webhookSourceFetchFailed requires reason");let J=await f(a,"webhook.source-fetch-failed")({token:I,reason:U});return J?.status==="fail"||J?.status==="error"?J:{status:"success",data:{token:I,reason:U,runtime_result:Object.prototype.hasOwnProperty.call(J??{},"data")?J.data??null:null}}}return {listRuntimeCards:g,discoverSourceKinds:C,inspectBoardRuntimeStatus:R,inspectCardDefinitionAndRuntime:l,inspectChatMessagesOnCards:y,inspectFileContents:O,preflightValidateCandidateCardDefinition:w,preflightMaterializeCandidateCard:_,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:k,preflightRunOneCycleWithCandidateCard:S,manageReadCard:B,manageAddChatAttachment:h,manageAddChatEntryAndAnyAttachments:D,managePatchCard:j,manageUpsertCard:X,manageRemoveCard:N,adminReadCard:$,adminUpsertCard:Z,getChatProcessing:H,setChatProcessing:M,webhookProcessAccumulated:z,webhookSourceFetchDone:oe,webhookSourceFetchFailed:we}}async function Ge(e,t){return qe(await e,t)}function Nn(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:s,readCardRuntimeArtifacts:i,readCardFromStore:a,readCardDefinitions:u,processAccumulatedLaneInternal:b,reportSourceFetched:A,reportSourceFetchFailure:f,uploadCardFile:g,chatStorePublic:v,serverUrl:C,apiBasePath:R}=e;function l(){return t[0]??null}function y(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let p=m?.params?.key;return p?{status:"success",data:(await s())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let p=m?.params?.key;return p?{status:"success",data:(await i())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let p=m?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let k=n(p)??l();return k?k.boardOps.getOutputsFetchedSources({params:{key:p}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let p=m?.params?.id;if(!p)return {status:"fail",error:"removeCard requires params.id"};let k=n(p)??l();return k?k.boardOps.removeCard({params:{id:p}}):{status:"fail",error:"Board context is unavailable"}},async cardRefreshedNotify(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"cardRefreshedNotify requires params.cardId"};let k=n(p)??l();return k?k.boardOps.cardRefreshedNotify({params:{cardId:p}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"upsertCard requires params.cardId"};let k=n(p)??l();if(!k)return {status:"fail",error:"Board context is unavailable"};let S=await k.boardOps.upsertCard({params:{cardId:p,restart:m.params.restart===true}});if(S.status!=="success")return S;if(ze(k.boardAdapter)){let B=await b(true);if(B.status!=="success")return B}return S}}}function O(){let m=()=>{let p=l();if(!p?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return p.nonCore};return {describeTaskExecutorCapabilities(p){return m().describeTaskExecutorCapabilities(p)},validateCardPreflight(p){return m().validateCardPreflight(p)},evalCardCompute(p){return m().evalCardCompute(p)},probeSourcePreflight(p){return m().probeSourcePreflight(p)},runSourcePreflight(p){return m().runSourcePreflight(p)},simulateCardCycle(p){return m().simulateCardCycle(p)}}}function w(){return {async get(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(p){let k=await a(p);return k?{status:"success",data:{cards:[k]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await u()}}},async set(m){let p=m.body;if(p==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let k=Array.isArray(p)?p:[p];for(let S of k){let B=S,x=typeof B.id=="string"?B.id:"";if(!x)return {status:"fail",error:"each card must have a string `id` field"};let h=r.get(x)??0,D=t[h]??l();if(!D)return {status:"fail",error:"Board context is unavailable"};let j=await D.cardStoreOps.set({body:B});if(j.status!=="success")return j;r.set(x,h);}return {status:"success",data:{count:k.length}}},async del(m){let p=[m.params?.id,...m.body?.ids??[]].filter(k=>typeof k=="string"&&!!k);if(p.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let k of p){let S=n(k)??l();if(!S)return {status:"fail",error:"Board context is unavailable"};let B=await S.cardStoreOps.del({params:{id:k}});if(B.status!=="success")return B;r.delete(k);}return {status:"success",data:{count:p.length}}},async patch(m){let p=typeof m.params?.id=="string"?m.params.id:void 0,k=typeof m.params?.path=="string"?m.params.path:void 0;if(!p||!k)return {status:"fail",error:"patch requires params.id and params.path"};let S=n(p)??l();return S?S.cardStoreOps.patch(m):{status:"fail",error:"Board context is unavailable"}},async appendFiles(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(!p)return {status:"fail",error:"appendFiles requires params.id"};let k=n(p)??l();return k?k.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function _(){return Mn({board:y(),nonCore:O(),cardStore:w(),chatStore:v,processAccumulated:()=>b(true),sourceFetchDone:({token:m,ref:p})=>A(m,p),sourceFetchFailed:({token:m,reason:p})=>f(m,p),uploadCardFile({cardId:m,fileName:p,contentType:k,bytes:S,suppressChatRecordWrite:B}){return g(m,p,k,S,{inChat:true,...B===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:p,storedName:k}){let S=`${C||""}${R}/cards/${encodeURIComponent(m)}/files/${p}`;return k?`${S}?sn=${encodeURIComponent(k)}`:S},readFetchedSourceJsonByRef({cardId:m,ref:p}){let k=n(m)??l();if(!k||ze(k.boardAdapter))return null;let x=k.boardAdapter.resolveBlob(Qe(p)).trim();return x?JSON.parse(x):null}})}return {mcpBoardFacade:y,mcpNonCoreFacade:O,mcpCardStoreFacade:w,createMcpFacade:_}}function $n(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:s,createMcpToolRegistry:i,resolveCardFileDownloadPayload:a,isLikelyTextMimeType:u,sliceTextByLines:b}=e;async function A(f,g,v){let C=f.method||"GET",R=v,l=R.pathname;try{if(C==="POST"&&l===`${t}/mcp`){await o();let y=await n(f),O=typeof y.tool=="string"?y.tool.trim():"",w=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!O)return r(g,400,{error:"tool is required"}),!0;if(O==="inspect.file-contents")return r(g,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let _=await mt(O,w,i(s()));if(_&&typeof _=="object"&&!Array.isArray(_)){let m=_;if(m.status==="fail")return r(g,400,{error:Ze(_,"Request failed")}),!0;if(m.status==="error")return r(g,500,{error:Ze(_,"Internal error")}),!0}r(g,200,_);}catch(_){let m=typeof _?.statusCode=="number"?Number(_.statusCode):500,p=_ instanceof Error?_.message:String(_);r(g,m,{error:p});}return !0}if(C==="POST"&&l===`${t}/mcp-raw`){await o();let y=await n(f),O=typeof y.tool=="string"?y.tool.trim():"",w=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!O)return r(g,400,{error:"tool is required"}),!0;if(O!=="inspect.file-contents")return r(g,400,{error:`Tool does not support raw response: ${O}`}),!0;let _=ue(w,"card_id","cardId"),m=Xe(w,"file_idx","fileIdx"),p=Xe(w,"head-lines","headLines"),k=Xe(w,"tail-lines","tailLines"),S=Xe(w,"head-bytes","headBytes"),B=Xe(w,"tail-bytes","tailBytes");if(!_)return r(g,400,{error:"inspect.file-contents requires card_id"}),!0;if(m===void 0||!Number.isInteger(m)||m<0)return r(g,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([p,k,S,B].filter(z=>z!==void 0).length>1)return r(g,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[z,oe]of [["head-lines",p],["tail-lines",k],["head-bytes",S],["tail-bytes",B]])if(oe!==void 0&&(!Number.isInteger(oe)||oe<0))return r(g,400,{error:`inspect.file-contents requires ${z} to be a non-negative integer`}),!0;let h=await s().inspectFileContents({cardId:_,fileIdx:m}),D=typeof h?.stored_name=="string"?h.stored_name:null,{fileRecord:j,bytes:X}=await a(_,m,D),N=String(j.name||j.stored_name||"download.bin"),$=String(j.mime_type||"application/octet-stream"),Z=(R.searchParams.get("resp")||"").trim().toLowerCase();if(Z&&Z!=="json-b64")return r(g,400,{error:`unsupported resp mode: ${Z}`}),!0;let H=Z==="json-b64",M;if(p!==void 0||k!==void 0){if(!u($))return r(g,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let z=new TextDecoder().decode(X),oe=p!==void 0?b(z,"head",p):b(z,"tail",k);M=typeof Buffer<"u"?Buffer.from(oe,"utf8"):new TextEncoder().encode(oe);}else if(S!==void 0||B!==void 0){let z=S??B;M=S!==void 0?X.slice(0,z):X.slice(Math.max(0,X.length-z));}else M=X;if(H){let z=typeof Buffer<"u"?Buffer.from(M).toString("base64"):btoa(String.fromCharCode(...M));return r(g,200,{bodyBase64:z,mimeType:$,filename:N,byteLength:M.length}),!0}return g.writeHead(200,{"Content-Type":$,"Content-Disposition":`attachment; filename="${N}"`,"Content-Length":M.length}),g.end(M),!0}return !1}catch(y){let O=y?.statusCode||500;return r(g,O,{error:String(y?.message||y)}),true}}return {handleAgentfaceApi:A}}function Un(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function i(a,u,b){let A=a.method||"GET",f=b.pathname;try{if(A==="POST"&&f===`${t}/mcp-webhooks`){await o();let g=await n(a),v=typeof g.tool=="string"?g.tool.trim():"",C=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!v)return r(u,400,{error:"tool is required"}),!0;try{let R=await mt(v,C,s());if(R&&typeof R=="object"&&!Array.isArray(R)){let l=R;if(l.status==="fail")return r(u,400,{error:Ze(R,"Request failed")}),!0;if(l.status==="error")return r(u,500,{error:Ze(R,"Internal error")}),!0}r(u,200,R);}catch(R){let l=typeof R?.statusCode=="number"?Number(R.statusCode):500,y=R instanceof Error?R.message:String(R);r(u,l,{error:y});}return !0}return !1}catch(g){let v=g?.statusCode||500;return r(u,v,{error:String(g?.message||g)}),true}}return {handleWebhooksApi:i}}function Vn(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:s,onChannelSubscribed:i,onChannelUnsubscribed:a}=e;function u(A,f,g,v,C){if(!t.has(f)){n(A,404,{error:`SSE client not connected: ${f}`});return}C?i?.(f,g,v):a?.(f,g,v),n(A,200,{ok:true,clientId:f,channelName:g,...v.cardId?{cardId:v.cardId}:{},subscribed:C});}async function b(A,f,g){let v=t.get(g),C=v?new Set(v.subscribedChatCardIds):new Set;f.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(f),t.register(g,f,C);let R=await o(),l=t.buildFrame(R);f.write(l);try{s?.(g,O=>{t.writeFrame(g,O);});}catch{}let y=setInterval(()=>{try{f.write(`: keepalive
|
|
4
|
+
`}function u(d){let f=d;try{f.flushHeaders?.();}catch{}try{f.flush?.();}catch{}try{f.socket?.setNoDelay?.(!0);}catch{}try{f.socket?.uncork?.();}catch{}}function p(d,f){let l=t.get(d);if(l&&!(f&&l.res!==f)){t.delete(d),I();try{e.onSseClientDisconnected?.(d);}catch{}try{l.res.end();}catch{}}}function T(d,f,l){let k=t.get(d);k&&p(d,k.res),t.set(d,{res:f,subscribedChatCardIds:l??new Set});}function _(d,f){let l=t.get(d);if(!l)return;let k=i(f);try{l.res.write(k),u(l.res);}catch{p(d,l.res);}}function y(){let d=new Set;for(let f of t.values())for(let l of f.subscribedChatCardIds)d.add(l);return Array.from(d)}async function C(d){let f=r.has(d)?r.get(d):null,{cursor:l}=await e.readChatAfter(d,f),k=await e.getChatProcessing(d),F=k!==(n.get(d)??false),$=l!==f;return $&&r.set(d,l),n.set(d,k),$||F}async function S(d,f){let l=await e.readChatRecords(d),k=Date.now();return {kind:"card_chats",cardId:d,sentAt:new Date(k).toISOString(),sentAtMs:k,messages:l.map(F=>({role:String(F.role||"system"),text:String(F.text||""),files:Array.isArray(F.files)?F.files:[]})),receiving:f,processing:await e.getChatProcessing(d)}}async function R(d,f=true){let l={kind:"notification-batch",notifications:[await S(d,f)]};for(let[k,F]of t.entries())F.subscribedChatCardIds.has(d)&&_(k,l);}function I(){y().length>0||(s&&(clearInterval(s),s=null),r.clear(),n.clear());}function x(){if(s)return;let d=async()=>{let f=y();if(f.length===0){I();return}let l=new Set(f);for(let k of Array.from(r.keys()))l.has(k)||r.delete(k);for(let k of Array.from(n.keys()))l.has(k)||n.delete(k);for(let k of f)await C(k)&&await R(k,true);};d(),s=setInterval(()=>{d();},1e3);}async function A(d,f){let l=t.get(d);if(!l)return false;l.subscribedChatCardIds.add(f);let{cursor:k}=await e.readChatAfter(f,null);return r.set(f,k),n.set(f,await e.getChatProcessing(f)),x(),_(d,{kind:"notification-batch",notifications:[await S(f,true)]}),true}function E(d,f){let l=t.get(d);return l?(l.subscribedChatCardIds.delete(f),y().includes(f)||(r.delete(f),n.delete(f)),I(),true):false}function c(d){if(!d||typeof d!="object")return false;let f=d.kind;return f==="card_chats"||f==="chat_messages"}function h(d){if(!d||d.length===0)return;let f=[],l=new Set;for(let k of d)c(k)&&typeof k.cardId=="string"?l.add(String(k.cardId)):f.push(k);if(f.length>0){let k={kind:"notification-batch",notifications:f};for(let F of t.keys())_(F,k);}for(let k of l)R(k,true);}return {size:()=>t.size,has:d=>t.has(d),get:d=>t.get(d),buildFrame:i,flushTransport:u,register:T,disconnect:p,writeFrame:_,subscribeChat:A,unsubscribeChat:E,broadcastNotificationBatch:h,broadcastCardChats:R}}function _r(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?Object.assign(new Error(e.error||`${t} failed`),{statusCode:400}):Object.assign(new Error(`${t} returned an unexpected response`),{statusCode:500})}async function Er(e,t){return _r(await e,t)}function Fr(e){let t=de(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r[0]==="chat"&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool only supports card private keys under chat.*"),{statusCode:400});return t}function Br(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function Dn(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:s,getMcpFacade:i,getMcpCardStoreFacade:u}=e;function p(c){let h=de(c,"board_id");if(!h)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(h!==t)throw Object.assign(new Error(`Unknown board_id: ${h}`),{statusCode:400})}function T(c){let h=de(c,"client_id");if(!h)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return h}function _(c){p(c);let h=T(c),d=de(c,"channel_name"),f=de(c,"card_id")||void 0;if(!d)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:h,channelName:d,...f?{cardId:f}:{}}}function y(c){p(c);let h=de(c,"card_id");if(!h)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:h}}async function C(c){await r();let{cardId:h}=y(c),d=T(c);if(!await n.subscribeChat(d,h))throw Object.assign(new Error(`SSE client not connected: ${d}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:h,clientId:d,subscribed:true}}}async function S(c){await r();let{cardId:h}=y(c),d=T(c);if(!n.unsubscribeChat(d,h))throw Object.assign(new Error(`SSE client not connected: ${d}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:h,clientId:d,subscribed:false}}}async function R(c,h){await r();let{clientId:d,channelName:f,cardId:l}=_(c);if(!n.has(d))throw Object.assign(new Error(`SSE client not connected: ${d}`),{statusCode:404});return h?o?.(d,f,l?{cardId:l}:{}):s?.(d,f,l?{cardId:l}:{}),{status:"success",data:{boardId:t,clientId:d,channelName:f,subscribed:h,...l?{cardId:l}:{}}}}async function I(c,h){let{cardId:d}=y(c);return await i().setChatProcessing({cardId:d,active:h}),{status:"success",data:{boardId:t,cardId:d,active:h}}}async function x(c){let{cardId:h}=y(c),d=await i().getChatProcessing({cardId:h});return {status:"success",data:{boardId:t,cardId:h,active:d.active}}}async function A(c){let{cardId:h}=y(c),d=Fr(c);if(!Object.prototype.hasOwnProperty.call(c,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(d.split(".").includes("visible_controlplane_only")){let f=await Er(u().get({params:{id:h}}),"cardStore.get"),l=Array.isArray(f.cards)&&f.cards.length>0&&typeof f.cards[0]=="object"&&!Array.isArray(f.cards[0])?f.cards[0]:null,k=l?Br(l,"visible_controlplane_only").value:void 0;if(c.value!==k)throw Object.assign(new Error("MCP tool cannot change the reserved private flag visible_controlplane_only"),{statusCode:403});return {status:"success",data:{boardId:t,cardId:h,key:d}}}return _r(await u().patch({params:{id:h,path:`__private.${d}`},body:{value:c.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:h,key:d}}}async function E(c){let{cardId:h}=y(c),d=Fr(c),f=await Er(u().get({params:{id:h}}),"cardStore.get"),l=Array.isArray(f.cards)&&f.cards.length>0&&f.cards[0]&&typeof f.cards[0]=="object"&&!Array.isArray(f.cards[0])?f.cards[0]:null;if(!l)throw Object.assign(new Error(`Card "${h}" not found`),{statusCode:404});let k=Br(l,d);return {status:"success",data:{boardId:t,cardId:h,key:d,exists:k.exists,value:k.value}}}return {requireCardArgs:y,subscribeChat:C,unsubscribeChat:S,watchChannel:R,setChatProcessing:I,getChatProcessing:x,setCardMeta:A,getCardMeta:E}}function Nn(e){let{boardId:t,boardContexts:r,readCardDefinitions:n,readChatRecords:o,getChatProcessing:s}=e;async function i(){let _=(await Promise.all(r.map(async I=>{try{let x=I.boardAdapter.kvStorageForRef(I.outputsStoreRef),A=await Promise.resolve(x.read("status"));if(A!=null)return A}catch{}return I.notification.status}))).filter(Boolean);if(_.length===0)return null;if(_.length===1)return _[0];let y=[],C=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],S={};for(let I of C)S[I]=0;for(let I of _){let x=I,A=Array.isArray(x.cards)?x.cards:[];y.push(...A);for(let E of C)S[E]+=Number(x?.summary?.[E]||0);}let R=_[0];return {...R,cards:y,summary:{...R.summary||{},card_count:y.length,...S}}}async function u(){let _={},y=async C=>{try{let S=await C.boardOps.getAllOutputsComputedValues({});if(S.status==="success"&&S.data&&typeof S.data=="object"){for(let[R,I]of Object.entries(S.data)){let x=C.notification.cards[R];_[R]={schema_version:"v1",card_id:R,card_data:x?.card_data??{},computed_values:I??{}};}return}}catch{}for(let[S,R]of Object.entries(C.notification.computedValues)){let I=C.notification.cards[S];_[S]={schema_version:"v1",card_id:S,card_data:I?.card_data??{},computed_values:R??{}};}};for(let C of r)await y(C);return _}async function p(){let _={};for(let y of r){try{let C=await y.boardOps.getAllOutputsDataObjects({});if(C.status==="success"&&C.data&&typeof C.data=="object"){Object.assign(_,C.data);continue}}catch{}Object.assign(_,y.notification.dataObjects||{});}return _}async function T(){let _=await n(),y=await u(),C=await p(),S={};for(let I of _){if(!I?.id)continue;let x=I.id,A=y[x]||{},E={...A.card_data&&typeof A.card_data=="object"?A.card_data:I.card_data&&typeof I.card_data=="object"?I.card_data:{}};S[x]={schema_version:A.schema_version||"v1",card_id:A.card_id||x,card_data:E,computed_values:A.computed_values&&typeof A.computed_values=="object"?A.computed_values:{}};}let R={};for(let I of _){if(!I?.id)continue;let x=I.id;try{let A=await o(x),E=await s(x);(A.length>0||E)&&(R[x]={messages:A.map(c=>({role:String(c.role||"system"),text:String(c.text||""),files:Array.isArray(c.files)?c.files:[]})),receiving:!1,processing:E});}catch{}}return {boardId:t,cardDefinitions:_,statusSnapshot:await i(),dataObjectsByToken:C,cardRuntimeById:S,cardChatsByCardId:R}}return {readStatusSnapshot:i,readCardRuntimeArtifacts:u,readDataObjectsByToken:p,buildPublishedRuntimePayload:T}}function zo(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 $n(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:s,writeChatRecord:i}=e;async function u(_){let y=[];try{let C=await o(_);if(!C)return y;let S=n().read(C.card_data&&typeof C.card_data=="object"?C.card_data:null);for(let R of S)y.push(String(R.stored_name??""));}catch{}return y}async function p(_,y,C,S){let R=t(_),I=r(_),x=zo(y),A=await u(_),c=`${String(A.length+1).padStart(3,"0")}-${x}`.slice(-36);if(!I.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${_}`),{statusCode:500});return await I.files.putBytes(`${R}/${c}`,new Uint8Array(S),C||"application/octet-stream"),{name:x,stored_name:c,size:S.length,mime_type:C||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function T(_,y,C,S,R){if(!S.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let I=R?.inChat===true,x=await p(_,y,C,S),A=null;if(await s(_,E=>{let c=new Date().toISOString(),h=E.card_data&&typeof E.card_data=="object"?E.card_data:{};E.card_data=h;let d=n().normalizeIncoming([{name:x.name,stored_name:x.stored_name,size:x.size,mime_type:x.mime_type,uploaded_at:x.uploaded_at||c,chat:I}],c);return A=n().merge(h,d).findIndex(l=>l.stored_name===x.stored_name),E}),I&&R?.suppressChatRecordWrite!==true){let E=typeof A=="number"&&A>=0?` #${A}`:"";await i(_,"system",`file uploaded: ${x.name} as ${x.stored_name}${E}`,[],R?.turnId??"");}return {ok:true,file:{...x,...typeof A=="number"&&A>=0?{file_idx:A}:{},chat:I},...typeof A=="number"&&A>=0?{file_idx:A}:{}}}return {uploadCardFile:T,readCardStoredFileNames:u}}function Un(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:de(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=it(t,"tail_turns"),n=it(t,"tail"),o=de(t,"turn_id"),s=t.all_turns===true,i=de(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:de(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...s?{allTurns:true}:{},...i?{tailTurnsBeforeId:i}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:de(t,"card_id"),fileIdx:Number(it(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ft(t,"mock_requires","mock_requires"),mockFetchedSources:ft(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:Lt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:Lt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:de(t,"card_id"),sourceIdx:Lt(t,"source_idx","source_idx"),mockRequires:ft(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ut(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:de(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=de(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:de(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:de(t,"card_id"),candidateCardContent:ut(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:de(t,"card_id")})}}function Vn(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:de(t,"token"),ref:de(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:de(t,"token"),reason:de(t,"reason")})}}function Kn(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(u,p){let T=de(u,"board_id");if(!T)throw Object.assign(new Error(`${p} requires board_id`),{statusCode:400});if(T!==t)throw Object.assign(new Error(`Unknown board_id: ${T}`),{statusCode:400})}function i(u,p){let{cardId:T}=o.requireCardArgs(u),_=de(u,"turn_id");return s(u,p),n().manageAddChatAttachment({cardId:T,role:de(u,"role")||"user",..._?{turn:_}:{},files:[{file_name:de(u,"file_name"),content_type:de(u,"content_type")||"application/octet-stream",...typeof u.text=="string"?{text:u.text}:{},...typeof u.base64=="string"?{base64:u.base64}:{},...Array.isArray(u.bytes)?{bytes:u.bytes}:{}}]})}return {"list-runtime-cards":u=>(s(u,"list-runtime-cards"),n().listRuntimeCards()),"sse.subscribe-chat":u=>o.subscribeChat(u),"sse.unsubscribe-chat":u=>o.unsubscribeChat(u),"sse.watch-channel":u=>o.watchChannel(u,true),"sse.unwatch-channel":u=>o.watchChannel(u,false),"getstate.is-chat-processing":u=>o.getChatProcessing(u),"setstate.chat-processing-started":u=>o.setChatProcessing(u,true),"setstate.chat-processing-done":u=>o.setChatProcessing(u,false),"getstate.card-private":u=>o.getCardMeta(u),"setstate.card-private":u=>o.setCardMeta(u),"manage.upload-card-file":u=>{let p=de(u,"card_id"),T=de(u,"file_name"),_=de(u,"content_type")||"application/octet-stream",y=Vr(u);if(s(u,"manage.upload-card-file"),!p)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!T)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!y)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(p,T,_,y,{inChat:false})},"manage.add-chat-attachment":u=>i(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>i(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:p}=o.requireCardArgs(u),T=de(u,"role")||"user",_=de(u,"turn_id");return s(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:p,role:T,...typeof u.text=="string"?{text:u.text}:{},..._?{turn:_}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:p}=o.requireCardArgs(u);return s(u,"manage.patch-card"),n().managePatchCard({cardId:p,patch:ut(u,"patch")})},"manage.upsert-card":u=>{let{cardId:p}=o.requireCardArgs(u);return s(u,"manage.upsert-card"),n().manageUpsertCard({cardId:p,candidateCardContent:ut(u,"candidate_card_content")})},"manage.remove-card":u=>{let{cardId:p}=o.requireCardArgs(u);return s(u,"manage.remove-card"),n().manageRemoveCard({cardId:p})},"manage.admin-read-card":async u=>{let{cardId:p}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:p})}}},"manage.admin-upsert-card":u=>{let p=de(u,"board_id"),T=de(u,"card_id");if(!p)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!T)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(p!==t)throw Object.assign(new Error(`Unknown board_id: ${p}`),{statusCode:400});return n().adminUpsertCard({cardId:T,candidateCardContent:ut(u,"candidate_card_content")})}}}function Ve(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function Hn(e,t){if(e?.status==="success"&&Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw e?.status==="success"?new Error(`${t} returned success without data`):e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function z(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function qe(e){return Array.isArray(e)?e:[]}function qr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=z(e).fetched_sources,n=n.slice(16));for(let o of n.split(".")){if(r==null||typeof r!="object")return;r=r[o];}return r}function Or(e,t){let r=z(e.view),n=qe(r.elements);return {layout:r.layout,features:r.features,elements:n.map((o,s)=>{let i=z(o),u=z(i.data),p=typeof i.visible=="string"?!!qr(t,i.visible):true,T=typeof u.bind=="string"?u.bind:void 0,_=typeof u.maxRows=="number"?u.maxRows:void 0,y=T?qr(t,T):void 0,C={id:typeof i.id=="string"&&i.id?i.id:`element-${s}`,kind:i.kind,label:i.label,visible:p};return y!==void 0&&(C.resolved=Array.isArray(y)&&typeof _=="number"?y.slice(0,_):y),C})}}function Jn(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=qe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],s={};for(let i of o){let u=z(i),p=typeof u.bindTo=="string"?u.bindTo:"",T=typeof u.ref=="string"?u.ref:"";if(!p||!T)continue;let _=qr(t,T);_!==void 0&&(s[p]=_);}return s}function Yo(e){if(typeof e!="string"||!e.trim())return null;let t=/^(file uploaded|AI generated|AI geneterated):\s*.*?#(\d+)\s*$/i.exec(e.trim());if(!t)return null;let r=Number.parseInt(t[2],10);return !Number.isInteger(r)||r<0?null:r}function Xo(e){return {"card-content":e}}function cr(e){let t={...e};return delete t.__private,t}function lr(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Zo(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function es(e,t){let r=Zo(e);if(!t||Object.keys(t).length===0)return r;function n(o,s,i){let u=String(s||"").split(".").filter(Boolean);if(!u.length)return;let p=o;for(let T=0;T<u.length-1;T+=1){let _=u[T];(!p[_]||typeof p[_]!="object")&&(p[_]={}),p=p[_];}p[u[u.length-1]]=i;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=z(r.view),i=qe(s.elements);for(let u of i){let p=z(z(u).data);if(typeof p.writeTo=="string"&&p.writeTo){o=p.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...z(r.card_data),...t.fieldValues}),r}if(Array.isArray(t._stagedFiles)&&t._stagedFiles.length>0)return r;for(let[o,s]of Object.entries(t))o!=="_stagedFiles"&&(s!==null&&typeof s=="object"&&!Array.isArray(s)&&r[o]!==null&&typeof r[o]=="object"&&!Array.isArray(r[o])?r[o]={...r[o],...s}:r[o]=s);return r}function Gn(e){return z(e.__private).visible_controlplane_only===true}async function bt(e,t){let r=await nt(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function Wn(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:s,sourceFetchDone:i,sourceFetchFailed:u,uploadCardFile:p,buildFileDownloadUrl:T,readFetchedSourceJsonByRef:_}=e;function y(w,b){if(typeof w=="function")return w;throw new Error(`${b} is not configured for this MCP facade`)}async function C(){let w=await nt(n.get({}),"cardStore.get");return Array.isArray(w.cards)?w.cards.map(b=>z(b)):[]}function S(w){if(Array.isArray(w.bytes))return new Uint8Array(w.bytes.map(b=>Math.max(0,Math.min(255,Number(b)||0))));if(typeof w.text=="string")return new TextEncoder().encode(w.text);if(typeof w.base64=="string"){let b=String(w.base64).replace(/-/g,"+").replace(/_/g,"/"),O=b+"=".repeat((4-b.length%4)%4),U=atob(O);return Uint8Array.from(U,V=>V.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function R(){let w=z(await nt(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:w.version,commonSourceFields:z(w.commonSourceDefFields),sourceKinds:z(w.sourceKinds)}}async function I(){let w=z(await nt(t.status({}),"status")),b=z(w.summary),O=qe(w.cards);return {meta:z(w.meta),summary:{card_count:typeof b.card_count=="number"?b.card_count:0,completed:typeof b.completed=="number"?b.completed:0,eligible:typeof b.eligible=="number"?b.eligible:0,pending:typeof b.pending=="number"?b.pending:0,blocked:typeof b.blocked=="number"?b.blocked:0,in_progress:typeof b.in_progress=="number"?b.in_progress:0,failed:typeof b.failed=="number"?b.failed:0,unresolved:typeof b.unresolved=="number"?b.unresolved:0},cards:O.map(U=>{let V=z(U);return {"card-id":typeof V.name=="string"?V.name:null,status:V.status??null,error:V.error??null,requires:qe(V.requires),requires_satisfied:qe(V.requires_satisfied),requires_missing:qe(V.requires_missing),provides_declared:qe(V.provides_declared),provides_runtime:qe(V.provides_runtime)}})}}async function x(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let O=z(await nt(t.status({}),"status")),V=qe(O.cards).map(z).find(ge=>ge.name===b);if(!V)throw new Error(`card "${b}" not found in board status`);let X=z(await bt(n,b));if(Gn(X))throw Object.assign(new Error(`card "${b}" not found`),{statusCode:404});let ae=cr(X),fe=qe(V.requires_satisfied).filter(ge=>typeof ge=="string"&&!!ge),we=qe(V.provides_runtime).filter(ge=>typeof ge=="string"&&!!ge),Te=Object.fromEntries(await Promise.all(fe.map(async ge=>[ge,await nt(t.getOutputsDataObject({params:{key:ge}}),`getOutputsDataObject(${ge})`)]))),Be=Object.fromEntries(await Promise.all(we.map(async ge=>[ge,await nt(t.getOutputsDataObject({params:{key:ge}}),`getOutputsDataObject(${ge})`)]))),Se=z(await nt(t.getOutputsComputedValues({params:{key:b}}),"getOutputsComputedValues")),ce=await nt(t.getOutputsFetchedSources({params:{key:b}}),"getOutputsFetchedSources"),Le=qe(X.source_defs).map(z),ve={};for(let ge of Le)typeof ge.bindTo=="string"&&typeof ge.outputFile=="string"&&(ve[ge.outputFile]=ge.bindTo);let Me={};for(let[ge,Ze]of Object.entries(ce)){let Ke=ve[ge]??ge;if(!_||typeof Ze!="string"){Me[Ke]=null;continue}try{Me[Ke]=_({cardId:b,ref:Ze});}catch{Me[Ke]=null;}}let Ne={card_data:z(X.card_data),requires:Te,fetched_sources:Me,computed_values:Se};return {cardId:b,card_status_in_board:V,card_definition_and_static_data:ae,refs_for_fetched_source_files:ce,runtime_data:{requires:Te,provides:Be,computed_values:Se,rendered_view:Or(X,Ne)}}}async function A(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("inspectChatMessagesOnCards requires cardId");let O=typeof w.turnId=="string"?w.turnId:"",U=w.allTurns===true,V=typeof w.tailTurnsBeforeId=="string"?w.tailTurnsBeforeId:"",X=U?void 0:w.lastUserTurns??(O?void 0:1),ae=w.tail,fe={...X===void 0?{}:{tailTurns:X},...O?{turnId:O}:{},...U?{allTurns:true}:{},...V?{tailTurnsBeforeId:V}:{}},we=Object.keys(fe).length>0?{params:{cardId:b},body:fe}:{params:{cardId:b}},Te=Ve(await o.readAll(we),"chatStore.readAll"),Be=z(await bt(n,b)),Se=qe(z(Be.card_data).files).map((ve,Me)=>({idx:Me,stored_name:z(ve).stored_name})).filter(ve=>typeof ve.stored_name=="string"&&ve.stored_name.length>0),Le=(Array.isArray(Te.records)?Te.records:[]).map(ve=>{let Ne=z(ve.payload),ge={...ve},Ze=typeof ve?.role=="string"?ve.role:typeof Ne.role=="string"?String(Ne.role):"",Ke=typeof ve?.text=="string"?ve.text:typeof Ne.text=="string"?String(Ne.text):"";if(Ze==="system"){let Ge=Yo(Ke);if(Ge!==null&&Se.some(m=>m.idx===Ge)){let m=`Retrieve using inspect-file-contents --card-id ${b} --file-idx ${Ge}`;ge.retrieval_hint=m,Object.keys(Ne).length>0&&typeof ve.role!="string"&&(ge.payload={...Ne,retrieval_hint:m});}}return ge});return {cardId:b,messages:typeof ae=="number"&&ae>=0?Le.slice(-ae):Le}}async function E(w){let b=String(w.cardId||"").trim(),O=Number(w.fileIdx);if(!b)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(O)||O<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let U=z(await bt(n,b)),V=qe(z(U.card_data).files).map(z);if(O>=V.length)throw new Error(`attachment index ${O} is out of range for card "${b}"`);let X=V[O],ae=typeof X.stored_name=="string"?X.stored_name:null;return {cardId:b,fileIdx:O,downloadUrl:T({cardId:b,fileIdx:O,storedName:ae}),...typeof X.name=="string"?{name:X.name}:{},...typeof X.stored_name=="string"?{stored_name:X.stored_name}:{},...typeof X.mime_type=="string"?{mime_type:X.mime_type}:{},...typeof X.size=="number"?{size:X.size}:{},...typeof X.uploaded_at=="string"?{uploaded_at:X.uploaded_at}:{}}}async function c(w){return await r.validateCardPreflight({body:Xo(w.candidateCardContent)})}function h(w){if(!w.mockRequires||typeof w.mockRequires!="object"||Array.isArray(w.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!w.mockFetchedSources||typeof w.mockFetchedSources!="object"||Array.isArray(w.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let b=r.evalCardCompute({body:{"card-content":w.candidateCardContent,"mock-requires":w.mockRequires,"mock-fetched-sources":w.mockFetchedSources}});if(b.status!=="success")return b;let O=z(Hn(b,"evalCardCompute")),U=z(w.candidateCardContent),V={card_data:z(U.card_data),requires:z(w.mockRequires),fetched_sources:z(w.mockFetchedSources),computed_values:z(O.computed_values)};return {status:"success",data:{cardId:typeof O.cardId=="string"?O.cardId:typeof U.id=="string"?U.id:"(unknown)",ok:O.ok===true,computed_values:z(O.computed_values),errors:qe(O.errors).map(X=>{let ae=z(X);return {bindTo:typeof ae.bindTo=="string"?ae.bindTo:"",error:typeof ae.error=="string"?ae.error:""}}),provides_outputs:Jn(U,V),rendered_view:Or(U,V)}}}async function d(w){return await r.probeSourcePreflight({params:{sourceIdx:w.sourceIdx},body:{"card-content":w.candidateCardContent,"mock-projections":w.mockProjections}})}async function f(w){return await r.runSourcePreflight({params:{sourceIdx:w.sourceIdx},body:{"card-content":w.candidateCardContent,"mock-projections":w.mockProjections}})}async function l(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!w.mockRequires||typeof w.mockRequires!="object"||Array.isArray(w.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let O=z(await bt(n,b)),U=qe(O.source_defs).filter(X=>!!X&&typeof X=="object"&&!Array.isArray(X)),V={};if(w.sourceIdx>=0&&w.sourceIdx<U.length){let X=U[w.sourceIdx],ae=ze.enrichSourcesSync([X],{card_data:z(O.card_data),requires:w.mockRequires});Array.isArray(ae)&&ae.length>0&&(V=z(ae[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:w.sourceIdx},body:{"card-content":O,"mock-requires":w.mockRequires,"mock-projections":V}})}async function k(w){let b=z(await nt(r.simulateCardCycle({body:{"card-content":w.candidateCardContent,"mock-requires":w.mockRequires}}),"simulateCardCycle")),O=z(w.candidateCardContent),U=z(b.validation),V=qe(b.source_probes),X=qe(b.projection_errors),ae=z(b.fetched_sources),fe=qe(b.compute_errors),we=z(b.computed_values),Te={card_data:z(O.card_data),requires:w.mockRequires,fetched_sources:ae,computed_values:we},Be=[];for(let Se of qe(U.issues))typeof Se=="string"&&Se&&Be.push(Se);for(let Se of V){let ce=z(Se),Le=typeof ce.bindTo=="string"?ce.bindTo:"source",ve=typeof ce.error=="string"?ce.error:"";ve&&Be.push(`${Le}: ${ve}`);}for(let Se of X){let ce=z(Se),Le=typeof ce.bindTo=="string"?ce.bindTo:"source",ve=typeof ce.key=="string"?ce.key:"projection",Me=typeof ce.error=="string"?ce.error:"projection failed";Be.push(`${Le}.${ve}: ${Me}`);}for(let Se of fe){let ce=z(Se),Le=typeof ce.bindTo=="string"?ce.bindTo:"compute",ve=typeof ce.error=="string"?ce.error:"compute failed";Be.push(`${Le}: ${ve}`);}return {status:"success",data:{cardId:typeof b.cardId=="string"?b.cardId:"(unknown)",ok:b.ok===true,issues:Be,provides_outputs:Jn(O,Te),rendered_view:Or(O,Te)}}}async function F(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("manageReadCard requires cardId");let O=await nt(n.get({params:{id:b}}),"cardStore.get"),U=Array.isArray(O.cards)?O.cards.map(z):[];if(U.some(Gn))throw Object.assign(new Error(`Card "${b}" not found`),{statusCode:404});return U.map(V=>cr(V))}async function $(w){let b=await Promise.all(qe(w.files).map(async O=>{let U=z(O),V=String(U.file_name??U.fileName??U.name??"").trim(),X=String(U.content_type??U.contentType??"application/octet-stream");if(!V)throw new Error("file entry requires file_name");return await p({cardId:w.cardId,fileName:V,contentType:X,bytes:S(U),suppressChatRecordWrite:true})}));for(let[O,U]of b.entries()){let V=z(U.file),X=typeof U.file_idx=="number"&&Number.isInteger(U.file_idx)&&U.file_idx>=0?U.file_idx:O,ae=w.role==="assistant"?`AI generated: ${String(V.name||"")} as ${String(V.stored_name||"")} #${X}`:`file uploaded: ${String(V.name||"")} as ${String(V.stored_name||"")} #${X}`;Ve(await o.append({params:{cardId:w.cardId},body:{role:"system",text:ae,files:[],turn:w.turn}}),"chatStore.append(system attachment message)");}return b.map(O=>O.file)}async function J(w){let b=String(w.cardId||"").trim(),O=String(w.role||"user").trim()||"user",U=typeof w.turn=="string"?w.turn:"";if(!b)throw new Error("manageAddChatAttachment requires cardId");let V=await $({cardId:b,role:O,turn:U,files:w.files});return {status:"success",data:{cardId:b,turn:U,files:V}}}async function G(w){let b=String(w.cardId||"").trim(),O=String(w.role||"").trim(),U=typeof w.text=="string"?w.text:"",V=typeof w.turn=="string"?w.turn:"";if(!b)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!O)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(O==="assistant"&&V){let fe=Ve(await o.readAll({params:{cardId:b},body:{turnId:V}}),"chatStore.readAll(existing turn messages)"),we=Array.isArray(fe.records)?fe.records.find(Te=>Te.role==="assistant"&&String(Te.turn||"")===V):void 0;if(we)return {status:"success",data:{cardId:b,id:String(we.id),role:O,turn:V,files:Array.isArray(we.files)?we.files:[]}}}let X=await $({cardId:b,role:O,turn:V,files:w.files}),ae=Ve(await o.append({params:{cardId:b},body:{role:O,text:U,files:X,turn:V}}),"chatStore.append");return {status:"success",data:{cardId:b,id:String(ae.id),role:O,turn:V,files:X}}}async function te(w){let b=String(w.cardId||"").trim(),O=z(w.patch);if(!b)throw new Error("managePatchCard requires cardId");let U=await F({cardId:b}),V=z(U[0]),ae={...es(V,O),...lr(V,"meta")?{meta:V.meta}:{},...lr(V,"__private")?{__private:V.__private}:{}},fe=await n.set({body:ae});Ve(fe,"cardStore.set");let we;try{we=await t.upsertCard({params:{cardId:b,restart:!0}}),Ve(we,"upsertCard");}catch(Be){try{await n.set({body:V});}catch{}throw Be}let Te=null;try{Te=await t.cardRefreshedNotify({params:{cardId:b}}),Ve(Te,"cardRefreshedNotify");}catch{Te=null;}return {status:"success",data:{validation:null,card_saved:null,board_result:we,refresh_notify:Te}}}async function ie(w){let b=String(w.cardId||"").trim(),O=z(w.candidateCardContent),U=cr(O);if(!b)throw new Error("manageUpsertCard requires cardId");if(typeof U.id!="string"||!U.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(U.id!==b)throw new Error(`candidateCardContent.id must match cardId (${b})`);let V=await c({candidateCardContent:U}),X=z(V),ae=z(X.data);if(X.status!=="success"||ae.isValid!==true)return {status:"fail",step:"validate",validation:V};let fe=null;try{fe=await bt(n,b);}catch{fe=null;}let we=fe?z(fe):null,Te={...U,...we&&lr(we,"meta")?{meta:we.meta}:{},...we&&lr(we,"__private")?{__private:we.__private}:{}},Be=await n.set({body:Te});Ve(Be,"cardStore.set");let Se;try{Se=await t.upsertCard({params:{cardId:b,restart:!0}}),Ve(Se,"upsertCard");}catch(Le){try{fe&&await n.set({body:fe});}catch{}throw Le}let ce=null;try{ce=await t.cardRefreshedNotify({params:{cardId:b}}),Ve(ce,"cardRefreshedNotify");}catch{ce=null;}return {status:"success",data:{validation:V,card_saved:null,board_result:Se,refresh_notify:ce}}}async function Y(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("manageRemoveCard requires cardId");let O=await t.removeCard({params:{id:b}});Ve(O,"removeCard");let U=await n.del({params:{id:b}});return Ve(U,"cardStore.del"),{status:"success",data:{board_result:O,store_result:U}}}async function ee(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("adminReadCard requires cardId");let O=await nt(n.get({params:{id:b}}),"cardStore.get");return Array.isArray(O.cards)?O.cards.map(U=>z(U)):[]}async function ne(w){let b=String(w.cardId||"").trim(),O=z(w.candidateCardContent),U=cr(O);if(!b)throw new Error("adminUpsertCard requires cardId");if(typeof U.id!="string"||!U.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(U.id!==b)throw new Error(`candidateCardContent.id must match cardId (${b})`);let V=await c({candidateCardContent:U}),X=z(V),ae=z(X.data);if(X.status!=="success"||ae.isValid!==true)return {status:"fail",step:"validate",validation:V};let fe=null;try{fe=await bt(n,b);}catch{fe=null;}let we=fe?z(z(fe).__private):{},Te={...U,__private:{...we,visible_controlplane_only:true}},Be=await n.set({body:Te});Ve(Be,"cardStore.set");let Se;try{Se=await t.upsertCard({params:{cardId:b,restart:!0}}),Ve(Se,"upsertCard");}catch(Le){try{fe&&await n.set({body:fe});}catch{}throw Le}let ce=null;try{ce=await t.cardRefreshedNotify({params:{cardId:b}}),Ve(ce,"cardRefreshedNotify");}catch{ce=null;}return {status:"success",data:{validation:V,card_saved:null,board_result:Se,refresh_notify:ce}}}async function v(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("getChatProcessing requires cardId");let O=Hn(await o.isProcessing({params:{cardId:b}}),"chatStore.isProcessing");return {cardId:b,active:!!O.active}}async function g(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("setChatProcessing requires cardId");if(typeof w.active!="boolean")throw new Error("setChatProcessing requires boolean active");return Ve(await o.setProcessing({params:{cardId:b},body:{active:w.active}}),"chatStore.setProcessing"),{cardId:b,active:w.active}}async function L(){let w=await y(s,"webhook.process-accumulated")();return w?.status==="fail"||w?.status==="error"?w:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(w??{},"data")?w.data??null:null}}}async function D(w){let b=String(w.token||"").trim(),O=String(w.ref||"").trim();if(!b)throw new Error("webhookSourceFetchDone requires token");if(!O)throw new Error("webhookSourceFetchDone requires ref");let U=await y(i,"webhook.source-fetch-done")({token:b,ref:O});return U?.status==="fail"||U?.status==="error"?U:{status:"success",data:{token:b,ref:O,runtime_result:Object.prototype.hasOwnProperty.call(U??{},"data")?U.data??null:null}}}async function H(w){let b=String(w.token||"").trim(),O=String(w.reason||"").trim();if(!b)throw new Error("webhookSourceFetchFailed requires token");if(!O)throw new Error("webhookSourceFetchFailed requires reason");let U=await y(u,"webhook.source-fetch-failed")({token:b,reason:O});return U?.status==="fail"||U?.status==="error"?U:{status:"success",data:{token:b,reason:O,runtime_result:Object.prototype.hasOwnProperty.call(U??{},"data")?U.data??null:null}}}return {listRuntimeCards:C,discoverSourceKinds:R,inspectBoardRuntimeStatus:I,inspectCardDefinitionAndRuntime:x,inspectChatMessagesOnCards:A,inspectFileContents:E,preflightValidateCandidateCardDefinition:c,preflightMaterializeCandidateCard:h,preflightProbeSingleSourceInCandidateCard:d,preflightRunSingleSourceInCandidateCard:f,preflightRunSingleSourceInLiveCard:l,preflightRunOneCycleWithCandidateCard:k,manageReadCard:F,manageAddChatAttachment:J,manageAddChatEntryAndAnyAttachments:G,managePatchCard:te,manageUpsertCard:ie,manageRemoveCard:Y,adminReadCard:ee,adminUpsertCard:ne,getChatProcessing:v,setChatProcessing:g,webhookProcessAccumulated:L,webhookSourceFetchDone:D,webhookSourceFetchFailed:H}}async function nt(e,t){return Ve(await e,t)}function Qn(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:s,readCardRuntimeArtifacts:i,readCardFromStore:u,readCardDefinitions:p,processAccumulatedLaneInternal:T,reportSourceFetched:_,reportSourceFetchFailure:y,uploadCardFile:C,chatStorePublic:S,serverUrl:R,apiBasePath:I}=e;function x(){return t[0]??null}function A(){return {async status(){let d=await o();return d==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:d}},async getOutputsDataObject(d){let f=d?.params?.key;return f?{status:"success",data:(await s())[f]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(d){let f=d?.params?.key;return f?{status:"success",data:(await i())[f]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(d){let f=d?.params?.key;if(!f)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let l=n(f)??x();return l?l.boardOps.getOutputsFetchedSources({params:{key:f}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(d){let f=d?.params?.id;if(!f)return {status:"fail",error:"removeCard requires params.id"};let l=n(f)??x();return l?l.boardOps.removeCard({params:{id:f}}):{status:"fail",error:"Board context is unavailable"}},async cardRefreshedNotify(d){let f=d?.params?.cardId;if(!f)return {status:"fail",error:"cardRefreshedNotify requires params.cardId"};let l=n(f)??x();return l?l.boardOps.cardRefreshedNotify({params:{cardId:f}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(d){let f=d?.params?.cardId;if(!f)return {status:"fail",error:"upsertCard requires params.cardId"};let l=n(f)??x();if(!l)return {status:"fail",error:"Board context is unavailable"};let k=await l.boardOps.upsertCard({params:{cardId:f,restart:d.params.restart===true}});if(k.status!=="success")return k;if(ot(l.boardAdapter)){let F=await T(true);if(F.status!=="success")return F}return k}}}function E(){let d=()=>{let f=x();if(!f?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return f.nonCore};return {describeTaskExecutorCapabilities(f){return d().describeTaskExecutorCapabilities(f)},validateCardPreflight(f){return d().validateCardPreflight(f)},evalCardCompute(f){return d().evalCardCompute(f)},probeSourcePreflight(f){return d().probeSourcePreflight(f)},runSourcePreflight(f){return d().runSourcePreflight(f)},simulateCardCycle(f){return d().simulateCardCycle(f)}}}function c(){return {async get(d){let f=typeof d.params?.id=="string"?d.params.id:void 0;if(f){let l=await u(f);return l?{status:"success",data:{cards:[l]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await p()}}},async set(d){let f=d.body;if(f==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let l=Array.isArray(f)?f:[f];for(let k of l){let F=k,$=typeof F.id=="string"?F.id:"";if(!$)return {status:"fail",error:"each card must have a string `id` field"};let J=r.get($)??0,G=t[J]??x();if(!G)return {status:"fail",error:"Board context is unavailable"};let te=await G.cardStoreOps.set({body:F});if(te.status!=="success")return te;r.set($,J);}return {status:"success",data:{count:l.length}}},async del(d){let f=[d.params?.id,...d.body?.ids??[]].filter(l=>typeof l=="string"&&!!l);if(f.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let l of f){let k=n(l)??x();if(!k)return {status:"fail",error:"Board context is unavailable"};let F=await k.cardStoreOps.del({params:{id:l}});if(F.status!=="success")return F;r.delete(l);}return {status:"success",data:{count:f.length}}},async patch(d){let f=typeof d.params?.id=="string"?d.params.id:void 0,l=typeof d.params?.path=="string"?d.params.path:void 0;if(!f||!l)return {status:"fail",error:"patch requires params.id and params.path"};let k=n(f)??x();return k?k.cardStoreOps.patch(d):{status:"fail",error:"Board context is unavailable"}},async appendFiles(d){let f=typeof d.params?.id=="string"?d.params.id:void 0;if(!f)return {status:"fail",error:"appendFiles requires params.id"};let l=n(f)??x();return l?l.cardStoreOps.appendFiles(d):{status:"fail",error:"Board context is unavailable"}}}}function h(){return Wn({board:A(),nonCore:E(),cardStore:c(),chatStore:S,processAccumulated:()=>T(true),sourceFetchDone:({token:d,ref:f})=>_(d,f),sourceFetchFailed:({token:d,reason:f})=>y(d,f),uploadCardFile({cardId:d,fileName:f,contentType:l,bytes:k,suppressChatRecordWrite:F}){return C(d,f,l,k,{inChat:true,...F===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:d,fileIdx:f,storedName:l}){let k=`${R||""}${I}/cards/${encodeURIComponent(d)}/files/${f}`;return l?`${k}?sn=${encodeURIComponent(l)}`:k},readFetchedSourceJsonByRef({cardId:d,ref:f}){let l=n(d)??x();if(!l||ot(l.boardAdapter))return null;let $=l.boardAdapter.resolveBlob(at(f)).trim();return $?JSON.parse($):null}})}return {mcpBoardFacade:A,mcpNonCoreFacade:E,mcpCardStoreFacade:c,createMcpFacade:h}}function zn(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:s,createMcpToolRegistry:i,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:p,sliceTextByLines:T}=e;async function _(y,C,S){let R=y.method||"GET",I=S,x=I.pathname;try{if(R==="POST"&&x===`${t}/mcp`){await o();let A=await n(y),E=typeof A.tool=="string"?A.tool.trim():"",c=A.args&&typeof A.args=="object"&&!Array.isArray(A.args)?A.args:{};if(!E)return r(C,400,{error:"tool is required"}),!0;if(E==="inspect.file-contents")return r(C,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let h=await pt(E,c,i(s()));if(h&&typeof h=="object"&&!Array.isArray(h)){let d=h;if(d.status==="fail")return r(C,400,{error:rt(h,"Request failed")}),!0;if(d.status==="error")return r(C,500,{error:rt(h,"Internal error")}),!0}r(C,200,h);}catch(h){let d=typeof h?.statusCode=="number"?Number(h.statusCode):500,f=h instanceof Error?h.message:String(h);r(C,d,{error:f});}return !0}if(R==="POST"&&x===`${t}/mcp-raw`){await o();let A=await n(y),E=typeof A.tool=="string"?A.tool.trim():"",c=A.args&&typeof A.args=="object"&&!Array.isArray(A.args)?A.args:{};if(!E)return r(C,400,{error:"tool is required"}),!0;if(E!=="inspect.file-contents")return r(C,400,{error:`Tool does not support raw response: ${E}`}),!0;let h=de(c,"card_id","cardId"),d=it(c,"file_idx","fileIdx"),f=it(c,"head-lines","headLines"),l=it(c,"tail-lines","tailLines"),k=it(c,"head-bytes","headBytes"),F=it(c,"tail-bytes","tailBytes");if(!h)return r(C,400,{error:"inspect.file-contents requires card_id"}),!0;if(d===void 0||!Number.isInteger(d)||d<0)return r(C,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([f,l,k,F].filter(L=>L!==void 0).length>1)return r(C,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[L,D]of [["head-lines",f],["tail-lines",l],["head-bytes",k],["tail-bytes",F]])if(D!==void 0&&(!Number.isInteger(D)||D<0))return r(C,400,{error:`inspect.file-contents requires ${L} to be a non-negative integer`}),!0;let J=await s().inspectFileContents({cardId:h,fileIdx:d}),G=typeof J?.stored_name=="string"?J.stored_name:null,{fileRecord:te,bytes:ie}=await u(h,d,G),Y=String(te.name||te.stored_name||"download.bin"),ee=String(te.mime_type||"application/octet-stream"),ne=(I.searchParams.get("resp")||"").trim().toLowerCase();if(ne&&ne!=="json-b64")return r(C,400,{error:`unsupported resp mode: ${ne}`}),!0;let v=ne==="json-b64",g;if(f!==void 0||l!==void 0){if(!p(ee))return r(C,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let L=new TextDecoder().decode(ie),D=f!==void 0?T(L,"head",f):T(L,"tail",l);g=typeof Buffer<"u"?Buffer.from(D,"utf8"):new TextEncoder().encode(D);}else if(k!==void 0||F!==void 0){let L=k??F;g=k!==void 0?ie.slice(0,L):ie.slice(Math.max(0,ie.length-L));}else g=ie;if(v){let L=typeof Buffer<"u"?Buffer.from(g).toString("base64"):btoa(String.fromCharCode(...g));return r(C,200,{bodyBase64:L,mimeType:ee,filename:Y,byteLength:g.length}),!0}return C.writeHead(200,{"Content-Type":ee,"Content-Disposition":`attachment; filename="${Y}"`,"Content-Length":g.length}),C.end(g),!0}return !1}catch(A){let E=A?.statusCode||500;return r(C,E,{error:String(A?.message||A)}),true}}return {handleAgentfaceApi:_}}function Yn(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function i(u,p,T){let _=u.method||"GET",y=T.pathname;try{if(_==="POST"&&y===`${t}/mcp-webhooks`){await o();let C=await n(u),S=typeof C.tool=="string"?C.tool.trim():"",R=C.args&&typeof C.args=="object"&&!Array.isArray(C.args)?C.args:{};if(!S)return r(p,400,{error:"tool is required"}),!0;try{let I=await pt(S,R,s());if(I&&typeof I=="object"&&!Array.isArray(I)){let x=I;if(x.status==="fail")return r(p,400,{error:rt(I,"Request failed")}),!0;if(x.status==="error")return r(p,500,{error:rt(I,"Internal error")}),!0}r(p,200,I);}catch(I){let x=typeof I?.statusCode=="number"?Number(I.statusCode):500,A=I instanceof Error?I.message:String(I);r(p,x,{error:A});}return !0}return !1}catch(C){let S=C?.statusCode||500;return r(p,S,{error:String(C?.message||C)}),true}}return {handleWebhooksApi:i}}function Xn(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:s,onChannelSubscribed:i,onChannelUnsubscribed:u}=e;function p(_,y,C,S,R){if(!t.has(y)){n(_,404,{error:`SSE client not connected: ${y}`});return}R?i?.(y,C,S):u?.(y,C,S),n(_,200,{ok:true,clientId:y,channelName:C,...S.cardId?{cardId:S.cardId}:{},subscribed:R});}async function T(_,y,C,S){let R=S?.oneShot===true,I=!R&&C?t.get(C):null,x=I?new Set(I.subscribedChatCardIds):new Set;y.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(y);let A=await o(),E=t.buildFrame(A);if(y.write(E),R){y.end();return}if(!C)throw new Error("clientId is required for streaming SSE");t.register(C,y,x);try{s?.(C,h=>{t.writeFrame(C,h);});}catch{}let c=setInterval(()=>{try{y.write(`: keepalive
|
|
5
5
|
|
|
6
|
-
`);}catch{}},15e3);A.on("close",()=>{clearInterval(y),t.disconnect(g,f);});}return {handleChannelSubscription:u,handleSse:b}}function Kn(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,boardContexts:i,publishPersistedStateSnapshot:a,upsertCardsFromSource:u,sseHub:b}=e,{handleSse:A,handleChannelSubscription:f}=Vn(e);async function g(v,C,R){let l=v.method||"GET",y=R,O=y.pathname;try{if(l==="GET"&&O===`${t}/sse`){await o();let k=String(y.searchParams.get("clientId")||"").trim();if(!k)return r(C,400,{error:"clientId query param is required for SSE"}),!0;await A(v,C,k);for(let S=0;S<i.length;S++)await a(i[S]),await u(i[S],S),await a(i[S]);return !0}let w=O.match(new RegExp(`^${We(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(l==="POST"&&w){await s();let k=decodeURIComponent(w[1]),S=await n(v),B=typeof S?.clientId=="string"?S.clientId.trim():"";return B?b.subscribeChat(B,k)?(r(C,200,{ok:!0,clientId:B,cardId:k,subscribed:!0}),!0):(r(C,404,{error:`SSE client not connected: ${B}`}),!0):(r(C,400,{error:"clientId is required"}),!0)}let _=O.match(new RegExp(`^${We(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(l==="POST"&&_){await s();let k=decodeURIComponent(_[1]),S=await n(v),B=typeof S?.clientId=="string"?S.clientId.trim():"";return B?b.unsubscribeChat(B,k)?(r(C,200,{ok:!0,clientId:B,cardId:k,subscribed:!1}),!0):(r(C,404,{error:`SSE client not connected: ${B}`}),!0):(r(C,400,{error:"clientId is required"}),!0)}let m=O.match(new RegExp(`^${We(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&m){await s();let k=decodeURIComponent(m[1]),S=m[2]==="subscribe",B=await n(v),x=typeof B?.clientId=="string"?B.clientId.trim():"";return x?(f(C,x,k,{},S),!0):(r(C,400,{error:"clientId is required"}),!0)}let p=O.match(new RegExp(`^${We(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&p){await s();let k=decodeURIComponent(p[1]),S=decodeURIComponent(p[2]),B=p[3]==="subscribe",x=await n(v),h=typeof x?.clientId=="string"?x.clientId.trim():"";return h?(f(C,h,S,{cardId:k},B),!0):(r(C,400,{error:"clientId is required"}),!0)}return !1}catch(w){let _=w?.statusCode||500;return r(C,_,{error:String(w?.message||w)}),true}}return {handleWatchersRoutes:g,handleSse:A,handleChannelSubscription:f}}var Jn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Hn="chat-handler-flow-queue";function Jo(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...Jn,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},i=e.invocationAdapter,a=e.chatFlowRunner||null,u=e.chatStorage??An(),b=xn(u),A=e.notificationTransport||null,f=e.serverUrl||null,g=e.executionExtra||{},v=e.onSseClientConnected,C=e.onSseClientDisconnected,R=e.onChannelSubscribed,l=e.onChannelUnsubscribed,y=Tn({chatStorage:u,readChatRecords:d=>te(d),onSseClientDisconnected:C});function O(d){function P(W){if(Array.isArray(W))return W;if(W&&typeof W=="object"){let ie=W;return Array.isArray(ie.files)?ie.files:[W]}return null}function F(W){return {async get(ie){return W.get(ie)},async set(ie){return W.set(ie)},async del(ie){return W.del(ie)},async patch(ie){return W.patch(ie)},async appendFiles(ie){return W.appendFiles(ie)}}}function V(W){function ie(Ae){return {status:"success",data:Ae}}function ke(Ae){return {status:"fail",error:Ae}}function ge(Ae){return {status:"error",error:Ae instanceof Error?Ae.message:String(Ae)}}return {async get(Ae){try{let Ce=Ae.params?.id;if(Ce){let Fe=await W.readCard(Ce);return Fe?ie({cards:[Fe]}):ke(`card "${Ce}" not found`)}return ie({cards:await W.readAllCards()})}catch(Ce){return ge(Ce)}},async set(Ae){try{let Ce=Ae.body;if(Ce==null)return ke("set requires a body (card object or array of cards)");let Fe=Array.isArray(Ce)?Ce:[Ce];for(let Le of Fe){if(typeof Le.id!="string")return ke("each card must have a string `id` field");await W.writeCard(Le.id,Le);}return ie({count:Fe.length})}catch(Ce){return ge(Ce)}},async del(Ae){try{let Ce=Ae.body?.ids??[],Fe=Ae.params?.id,Le=Fe?[...Ce,Fe]:Ce;if(Le.length===0)return ke("del requires body.ids (string[]) or params.id");for(let pt of Le)await W.removeCard(pt);return ie({count:Le.length})}catch(Ce){return ge(Ce)}},async patch(Ae){try{let Ce=Ae.params?.id,Fe=Ae.params?.path;if(!Ce)return ke("patch requires params.id");if(!Fe)return ke("patch requires params.path");let Le=Ae.body,pt=Le&&Object.prototype.hasOwnProperty.call(Le,"value")?Le.value:Ae.body;return await W.patchCard(Ce,Fe,pt),ie({count:1})}catch(Ce){return ge(Ce)}},async appendFiles(Ae){try{let Ce=Ae.params?.id;if(!Ce)return ke("appendFiles requires params.id");let Fe=await W.readCard(Ce);if(!Fe)return ke(`card "${Ce}" not found`);let Le=P(Ae.body);if(!Le||Le.length===0)return ke("appendFiles requires a file metadata object, array, or body.files array");let pt=Fe.card_data&&typeof Fe.card_data=="object"&&!Array.isArray(Fe.card_data)?Fe.card_data:{},_r=Array.isArray(pt.files)?pt.files:[],Wn=[..._r,...Le];return await W.patchCard(Ce,"card_data.files",Wn),ie({files_added:Le.map((Qn,zn)=>({idx:_r.length+zn,entry:Qn}))})}catch(Ce){return ge(Ce)}}}}let K=ze(d.boardAdapter)?Rn(d.baseRef,d.boardAdapter):fn(d.baseRef,d.boardAdapter),se=d.nonCoreAdapter??(!ze(d.boardAdapter)&&p(d.boardAdapter)?d.boardAdapter:null),fe=d.nonCore??(se?pn(d.baseRef,se):null),_e,Pe=ze(d.boardAdapter)?(()=>{let W=tr(er(Zt(d.boardAdapter.kvStorageForRef(d.cardStoreRef)),d.boardAdapter.hashFn),s.warn),ie=V(W);return _e={get(ke){return ie.get(ke)},set(ke){return ie.set(ke)}},ie})():(()=>{let W=d.boardAdapter.kvStorageForRef(d.cardStoreRef),ke=Qt(xt({readIndex:()=>W.read("_index"),writeIndex:ge=>W.write("_index",ge),readCard:ge=>W.read(ge),writeCard:(ge,Ae)=>(W.write(ge,Ae),ge),removeCard:ge=>{W.delete(ge);},cardExists:ge=>W.read(ge)!==null,defaultCardKey:ge=>ge},s.warn));return _e=ke,F(ke)})(),Be=d.artifactsAdapter||d.boardAdapter,Oe=d.filesArtifactsStore??null,Ne=Oe?{putBytes(W,ie,ke){Oe.putBytes(W,ie,ke);},getBytes(W){return Oe.getBytes(W)},listKeys(W){return Oe.list(W).map(ie=>ie.key)}}:null;if(!Ne&&!ze(Be)){let W=d.artifactsAdapter?Be.blobStorage(""):Be.blobStorage("files"),ie=bn(W);Ne={putBytes(ke,ge,Ae){ie.putBytes(ke,ge,Ae);},getBytes(ke){return ie.getBytes(ke)},listKeys(ke){return ie.list(ke).map(ge=>ge.key)}};}else if(!Ne&&ze(Be)){let W=d.artifactsAdapter?Be.blobStorage(""):Be.blobStorage("files");Ne={async putBytes(ie,ke){if(W.writeBytes){await W.writeBytes(ie,ke);return}let ge=JSON.stringify({__kind:"bytes-array",data:[...ke]});await W.write(ie,ge);},async getBytes(ie){if(W.readBytes){let ge=await W.readBytes(ie);if(ge!==null)return ge}let ke=await W.read(ie);if(ke===null)return null;try{let ge=JSON.parse(ke);if(ge&&ge.__kind==="bytes-array"&&Array.isArray(ge.data))return new Uint8Array(ge.data)}catch{}return new TextEncoder().encode(ke)},async listKeys(ie){return await W.listKeys(ie)}};}let He={async init(W){return K.init(W)},async status(W){return K.status(W)},async getConfig(W){return K.getConfig(W)},async getAllOutputsDataObjects(W){return K.getAllOutputsDataObjects(W)},async getAllOutputsComputedValues(W){return K.getAllOutputsComputedValues(W)},async getOutputsFetchedSources(W){return K.getOutputsFetchedSources(W)},async upsertCard(W){return K.upsertCard(W)},async removeCard(W){return K.removeCard(W)},async cardRefreshedNotify(W){return K.cardRefreshedNotify(W)},async sourceDataFetched(W){return K.sourceDataFetched(W)},async sourceDataFetchFailure(W){return K.sourceDataFetchFailure(W)}};return {label:d.label,board:K,nonCore:fe,publicCardStore:_e,boardOps:He,cardStoreOps:Pe,get filesArtifacts(){return Ne},boardAdapter:d.boardAdapter,cardStoreRef:d.cardStoreRef,outputsStoreRef:d.outputsStoreRef,artifactsStoreRef:d.artifactsStoreRef,chatStoreRef:d.chatStoreRef,scratchStoreRef:d.scratchStoreRef,archiveStoreRef:d.archiveStoreRef,notifyRef:d.notifyRef,taskExecutorRef:d.taskExecutorRef,chatHandlerRef:d.chatHandlerRef,chatHandlerFlow:d.chatHandlerFlow,inferenceAdapterRef:d.inferenceAdapterRef,notification:In(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let w=e.boards.map(O),_=new Map;function m(d){return _.get(d)??0}function p(d){let P=d;return typeof P.invokeExecutor=="function"&&typeof P.validateSchema=="function"}function k(d){let P=w[m(d)];return {files:P?P.filesArtifacts:null}}function S(){return vn()}function B(d){return String(d||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function x(d){if(!d||d.notificationTeardown||!A||!d.notifyRef)return;let P=await A.subscribe(d.notifyRef,F=>{br(d.notification,F);let V=F.kind==="notification-batch"?F.notifications:[F];y.broadcastNotificationBatch(V);});d.notificationTeardown=P;}async function h(d){if(!d||d.initialized)return;let P={cardStoreRef:d.cardStoreRef,outputsStoreRef:d.outputsStoreRef};d.artifactsStoreRef&&(P.artifactsStoreRef=d.artifactsStoreRef),d.chatStoreRef&&(P.chatStoreRef=d.chatStoreRef),d.scratchStoreRef&&(P.scratchStoreRef=d.scratchStoreRef),d.archiveStoreRef&&(P.archiveStoreRef=d.archiveStoreRef);let F={};d.taskExecutorRef&&(F["task-executor-ref"]=d.taskExecutorRef),d.chatHandlerFlow!==void 0&&(F["chat-handler-flow"]=d.chatHandlerFlow),d.inferenceAdapterRef&&(F["inference-adapter-ref"]=d.inferenceAdapterRef);let V=await d.boardOps.init({params:P,body:F});if(V.status!=="success")throw Object.assign(new Error(V.error||`init failed for ${d.label}`),{statusCode:500});if(await x(d),!d.chatHandlerFlow&&d.chatHandlerRef&&i.describe)try{let K=await i.describe(d.chatHandlerRef);K&&K.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${K.kind}", expected "chat-handler" for ${d.label}`):K&&s.info(`[init] chat-handler validated: ${K.name} (protocol ${K.protocolVersion}) for ${d.label}`);}catch(K){s.warn(`[init] chat-handler describe failed for ${d.label}: ${K?.message||String(K)}`);}d.initialized=true;}async function D(d){if(!d.boardAdapter.publishBoardChangeNotifications)return;let P=[],F=await d.boardOps.status({});F.status==="success"&&F.data!=null&&Sr(F.data)&&P.push({kind:"status",status:F.data});let V=await d.boardOps.getAllOutputsDataObjects({});if(V.status==="success"&&V.data!=null)for(let[se,fe]of Object.entries(V.data))se&&P.push({kind:"data_object",key:se,payload:fe});let K=await d.boardOps.getAllOutputsComputedValues({});if(K.status==="success"&&K.data!=null)for(let[se,fe]of Object.entries(K.data))se&&P.push({kind:"computed_values",cardId:se,values:fe});P.length>0&&d.boardAdapter.publishBoardChangeNotifications(P);}async function j(d,P){if(!d||d.cardsBootstrapped)return;let F=await d.cardStoreOps.get({}),V=F.status==="success"&&Array.isArray(F.data?.cards)?F.data.cards:[];for(let K of V)typeof K.id=="string"&&(_.set(K.id,P),await d.boardOps.upsertCard({params:{cardId:K.id}}));d.cardsBootstrapped=true;}async function X(){for(let d of w)await h(d);}async function N(){await X();for(let d=0;d<w.length;d++)await D(w[d]),await j(w[d],d),await D(w[d]);}async function $(d=false){d||await X();for(let P of w){let F=await P.board.processAccumulatedEvents({});if(F.status!=="success")return F}return {status:"success"}}async function Z(){return await X(),$(true)}function H(d){return w[m(d)]??null}async function M(d){let P=H(d);if(!P)return null;let F=await P.cardStoreOps.get({params:{id:d}});if(F.status!=="success")return null;let V=Array.isArray(F.data?.cards)?F.data.cards:[];return V.length>0?V[0]:null}async function z(){let d=async F=>{if(!F)return [];let V=await F.cardStoreOps.get({});return V.status!=="success"||!Array.isArray(V.data?.cards)?[]:V.data.cards},P=[];for(let F of w)P.push(...await d(F));return P}function oe(){return w[0]??null}let we=Nn({boardContexts:w,cardOwnerIndex:_,cardContextForCard:d=>H(d),readStatusSnapshot:()=>pe(),readDataObjectsByToken:()=>he(),readCardRuntimeArtifacts:()=>ye(),readCardFromStore:d=>M(d),readCardDefinitions:()=>z(),processAccumulatedLaneInternal:d=>$(d),reportSourceFetched:(d,P)=>Ct(d,{ref:P}),reportSourceFetchFailure:(d,P)=>ar(d,{reason:P}),uploadCardFile:(d,P,F,V,K)=>Se(d,P,F,V,K),chatStorePublic:b,serverUrl:f,apiBasePath:t}),T=we.mcpCardStoreFacade,I=we.createMcpFacade,U=_n({boardId:o,getMcpFacade:()=>I(),getMcpCardStoreFacade:()=>T()});function J(d){return Bn(d)}function G(){return Fn(I())}function re(){return qn({boardId:o,uploadCardFile:Se,getMcpFacade:()=>I(),controlplane:U})}let de=En({boardId:o,boardContexts:w,readCardDefinitions:()=>z(),readChatRecords:d=>te(d),getChatProcessing:d=>I().getChatProcessing({cardId:d}).active}),pe=de.readStatusSnapshot,ye=de.readCardRuntimeArtifacts,he=de.readDataObjectsByToken,xe=de.buildPublishedRuntimePayload;async function q(d,P,F){let V=F?.syncBoard!==false,K=F?.restartOnlyIfChanged===true,se=H(d);if(!se)throw Object.assign(new Error(`Card not found: ${d}`),{statusCode:404});let fe=await M(d);if(!fe)throw Object.assign(new Error(`Card not found: ${d}`),{statusCode:404});let _e=K?JSON.stringify(fe):null,Pe=P(fe)||fe;if(K&&JSON.stringify(Pe)===_e)return;let Be=await se.cardStoreOps.set({body:Pe});if(Be.status!=="success")throw Object.assign(new Error(Be.error||`Failed to persist card: ${d}`),{statusCode:500});if(V){let Oe=await se.boardOps.upsertCard({params:{cardId:d,restart:true}});if(Oe.status!=="success")throw Object.assign(new Error(Oe.error||`Failed to upsert card: ${d}`),{statusCode:500})}}async function c(d,P){await q(d,P,{syncBoard:true});}async function E(d,P){await q(d,P,{syncBoard:false});}async function L(d){let P=H(d);if(!P)throw Object.assign(new Error(`Card not found: ${d}`),{statusCode:404});if(!await M(d))throw Object.assign(new Error(`Card not found: ${d}`),{statusCode:404});let V=await P.boardOps.upsertCard({params:{cardId:d,restart:true}});if(V.status!=="success")throw Object.assign(new Error(V.error||`Failed to retrigger card: ${d}`),{statusCode:500})}function ee(d){u.clear(d);try{I().setChatProcessing({cardId:d,active:!1});}catch{}}function ne(d,P,F,V,K=""){let se=typeof F=="string"?F.trim():"";return u.append(d,P||"system",se,V,K)}function te(d){return u.readAll(d)}let Se=On({safeCardId:d=>B(d),artifactsStores:d=>k(d),cardFileMetadataStore:()=>S(),readCardFromStore:d=>M(d),updateCardLocalOnly:(d,P)=>E(d,P),writeChatRecord:(d,P,F,V,K)=>ne(d,P,F,V,K)}).uploadCardFile;async function be(d){let P=H(d);if(!P)return null;let F=await P.boardOps.getConfig({params:{key:"chat-handler-flow"}}),V=F.status==="success"?F.data?.value:null,K=P.chatHandlerRef;return V==null&&(!K||typeof K!="object")?null:{ctx:P,handlerFlow:V,handlerRef:K}}async function Ve(d,P,F=false,V=""){let K=await be(d);if(!K)return;let{ctx:se,handlerFlow:fe,handlerRef:_e}=K;if(!F)try{I().setChatProcessing({cardId:d,active:!0});}catch{}let Pe={boardId:o,cardId:String(d),lastChatEntryId:P,...V?{turnId:V}:{},...g,...f?{serverUrl:f}:{}},Be=fe!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:Hn}}:_e;try{ze(se.boardAdapter)?await se.boardAdapter.chatAgentStore().enqueueRequest({boardId:o,ref:Be,args:fe!=null?{...Pe,__chatHandlerFlow:fe}:Pe}):se.boardAdapter.chatAgentStore().enqueueRequest({boardId:o,ref:Be,args:fe!=null?{...Pe,__chatHandlerFlow:fe}:Pe}),await Promise.resolve(se.boardAdapter.requestProcessAccumulated?.());}catch(Oe){try{I().setChatProcessing({cardId:d,active:!1});}catch{}s.warn(`[chat-handler] queue failed for card "${d}": ${Oe instanceof Error?Oe.message:String(Oe)}`);}}async function je(d,P,F){if(P.howToRun==="built-in"&&Br(P)===Hn){let V=a,K=F.__chatHandlerFlow,se={...F};return delete se.__chatHandlerFlow,V?V.run(K,se,{boardId:o,cardId:String(se.cardId||""),label:d.label,logger:s,serverUrl:f,executionExtra:g}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return i.invoke(P,F)}async function tt(d,P=false){P||await X();let F=typeof d.args?.cardId=="string"?d.args.cardId:"",V=F?H(F):oe();if(!V)throw new Error(F?`Board context is unavailable for chat-agent request: ${F}`:"Board context is unavailable for chat-agent request");let K=await je(V,d.ref,d.args);if(!K.dispatched){if(F)try{u.setProcessing(F,!1);}catch{}throw new Error(K.error||`chat-agent dispatch failed for card "${F||"unknown"}"`)}}async function rt(d,P,F){let V=P==="chat-send"?E:c,K;await V(d,se=>{let fe=new Date().toISOString(),_e=se.card_data&&typeof se.card_data=="object"?se.card_data:{};if(se.card_data=_e,P==="chat-send"){let Pe=F&&typeof F.text=="string"?F.text.trim():"",Be=F&&typeof F["turn-id"]=="string"?F["turn-id"]:F&&typeof F.turnId=="string"?F.turnId:F&&typeof F.turn=="string"?F.turn:"",Oe=[];if(Array.isArray(F?.files)){for(let Ne of F.files)if(Ne){if(typeof Ne=="string"){Oe.push({name:Ne});continue}if(typeof Ne=="object"){let He=Ne;typeof He.name=="string"&&Oe.push({name:He.name,size:He.size,mime_type:He.mime_type,uploaded_at:He.uploaded_at,stored_name:He.stored_name,chat:He.chat===true});}}}if(Pe||Oe.length>0){let Ne=b.runBatch({cardId:d,commands:[{command:"append",role:"user",text:Pe,files:Oe,turn:Be},{command:"set-processing",active:true}]});if(Ne.status!=="success")throw new Error(Ne.error);let He=Ne.data.results[0]?.data?.id;if(typeof He!="string"||!He)throw new Error(`chat-send did not return an append id for card ${d}`);K={cardId:d,lastEntryId:He,processingAlreadySet:true,turnId:Be};try{y.broadcastCardChats(d);}catch{}}return se}if(P==="file-upload"){let Pe=S().normalizeIncoming(F?.files,fe);return Pe.length>0&&S().merge(_e,Pe),se}if(P==="action"){let Pe=F&&typeof F.buttonId=="string"?F.buttonId:"";if(!Pe)return se;_e.lastAction={buttonId:Pe,at:fe},_e.lastActionText=`${Pe} @ ${fe}`;}return se}),K&&Ve(K.cardId,K.lastEntryId,K.processingAlreadySet,K.turnId??"");}function Ke(d,P,F){let V=JSON.stringify(F),K=typeof Buffer<"u"?Buffer.byteLength(V):new TextEncoder().encode(V).length;d.writeHead(P,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":K}),d.end(V);}async function nt(d,P,F){let V=await M(d);if(!V)throw Object.assign(new Error("Card not found"),{statusCode:404});let K=S().resolve(V.card_data,P,F);if(!K.ok&&K.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!K.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let se=K.file,fe=B(d),_e=k(d),Pe=String(se.stored_name||""),Be=`${fe}/${Pe}`,Oe=_e.files?await _e.files.getBytes(Be):null;if(!Oe)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:se,bytes:Oe}}async function ht(d,P,F,V){let{fileRecord:K,bytes:se}=await nt(P,F,V),fe=String(K.name||K.stored_name||"download.bin"),_e=String(K.mime_type||"application/octet-stream");d.writeHead(200,{"Content-Type":_e,"Content-Disposition":`attachment; filename="${fe}"`,"Content-Length":se.length}),d.end(se);}function kt(d){let P=String(d||"").toLowerCase();return P.startsWith("text/")||P.includes("json")||P.includes("xml")||P.includes("javascript")||P.includes("typescript")||P.includes("yaml")||P.includes("csv")}function Tt(d,P,F){let V=d.split(/\r?\n/);return (P==="head"?V.slice(0,F):V.slice(-F)).join(`
|
|
7
|
-
`)}async function
|
|
6
|
+
`);}catch{}},15e3);_.on("close",()=>{clearInterval(c),t.disconnect(C,y);});}return {handleChannelSubscription:p,handleSse:T}}function Zn(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,boardContexts:i,publishPersistedStateSnapshot:u,upsertCardsFromSource:p,sseHub:T}=e,{handleSse:_,handleChannelSubscription:y}=Xn(e);async function C(S,R,I){let x=S.method||"GET",A=I,E=A.pathname;try{if(x==="GET"&&E===`${t}/sse`){let l=A.searchParams.has("one-shot");await o();let k=String(A.searchParams.get("clientId")||"").trim();if(!l&&!k)return r(R,400,{error:"clientId query param is required for SSE"}),!0;if(await _(S,R,k||void 0,{oneShot:l}),l)return !0;for(let F=0;F<i.length;F++)await u(i[F]),await p(i[F],F),await u(i[F]);return !0}let c=E.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(x==="POST"&&c){await s();let l=decodeURIComponent(c[1]),k=await n(S),F=typeof k?.clientId=="string"?k.clientId.trim():"";return F?await T.subscribeChat(F,l)?(r(R,200,{ok:!0,clientId:F,cardId:l,subscribed:!0}),!0):(r(R,404,{error:`SSE client not connected: ${F}`}),!0):(r(R,400,{error:"clientId is required"}),!0)}let h=E.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(x==="POST"&&h){await s();let l=decodeURIComponent(h[1]),k=await n(S),F=typeof k?.clientId=="string"?k.clientId.trim():"";return F?T.unsubscribeChat(F,l)?(r(R,200,{ok:!0,clientId:F,cardId:l,subscribed:!1}),!0):(r(R,404,{error:`SSE client not connected: ${F}`}),!0):(r(R,400,{error:"clientId is required"}),!0)}let d=E.match(new RegExp(`^${st(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(x==="POST"&&d){await s();let l=decodeURIComponent(d[1]),k=d[2]==="subscribe",F=await n(S),$=typeof F?.clientId=="string"?F.clientId.trim():"";return $?(y(R,$,l,{},k),!0):(r(R,400,{error:"clientId is required"}),!0)}let f=E.match(new RegExp(`^${st(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(x==="POST"&&f){await s();let l=decodeURIComponent(f[1]),k=decodeURIComponent(f[2]),F=f[3]==="subscribe",$=await n(S),J=typeof $?.clientId=="string"?$.clientId.trim():"";return J?(y(R,J,k,{cardId:l},F),!0):(r(R,400,{error:"clientId is required"}),!0)}return !1}catch(c){let h=c?.statusCode||500;return r(R,h,{error:String(c?.message||c)}),true}}return {handleWatchersRoutes:C,handleSse:_,handleChannelSubscription:y}}var to={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},eo="chat-handler-flow-queue",jr="__probe__echo__probe__";function ts(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...to,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},i=e.invocationAdapter,u=e.chatFlowRunner||null,p=e.notificationTransport||null,T=e.serverUrl||null,_=e.executionExtra||{},y=e.onSseClientConnected,C=e.onSseClientDisconnected,S=e.onChannelSubscribed,R=e.onChannelUnsubscribed,I=Mn({readChatRecords:a=>m(a),getChatProcessing:a=>b(a),readChatAfter:async(a,P)=>{let q=await w(a,P);return {records:q.records,cursor:q.cursor}},onSseClientDisconnected:C});function x(a){function P(Q){if(Array.isArray(Q))return Q;if(Q&&typeof Q=="object"){let ue=Q;return Array.isArray(ue.files)?ue.files:[Q]}return null}function q(Q){return {async get(ue){return Q.get(ue)},async set(ue){return Q.set(ue)},async del(ue){return Q.del(ue)},async patch(ue){return Q.patch(ue)},async appendFiles(ue){return Q.appendFiles(ue)}}}function W(Q){function ue(Ie){return {status:"success",data:Ie}}function Ce(Ie){return {status:"fail",error:Ie}}function ye(Ie){return {status:"error",error:Ie instanceof Error?Ie.message:String(Ie)}}return {async get(Ie){try{let xe=Ie.params?.id;if(xe){let Ue=await Q.readCard(xe);return Ue?ue({cards:[Ue]}):Ce(`card "${xe}" not found`)}return ue({cards:await Q.readAllCards()})}catch(xe){return ye(xe)}},async set(Ie){try{let xe=Ie.body;if(xe==null)return Ce("set requires a body (card object or array of cards)");let Ue=Array.isArray(xe)?xe:[xe];for(let Je of Ue){if(typeof Je.id!="string")return Ce("each card must have a string `id` field");await Q.writeCard(Je.id,Je);}return ue({count:Ue.length})}catch(xe){return ye(xe)}},async del(Ie){try{let xe=Ie.body?.ids??[],Ue=Ie.params?.id,Je=Ue?[...xe,Ue]:xe;if(Je.length===0)return Ce("del requires body.ids (string[]) or params.id");for(let wt of Je)await Q.removeCard(wt);return ue({count:Je.length})}catch(xe){return ye(xe)}},async patch(Ie){try{let xe=Ie.params?.id,Ue=Ie.params?.path;if(!xe)return Ce("patch requires params.id");if(!Ue)return Ce("patch requires params.path");let Je=Ie.body,wt=Je&&Object.prototype.hasOwnProperty.call(Je,"value")?Je.value:Ie.body;return await Q.patchCard(xe,Ue,wt),ue({count:1})}catch(xe){return ye(xe)}},async appendFiles(Ie){try{let xe=Ie.params?.id;if(!xe)return Ce("appendFiles requires params.id");let Ue=await Q.readCard(xe);if(!Ue)return Ce(`card "${xe}" not found`);let Je=P(Ie.body);if(!Je||Je.length===0)return Ce("appendFiles requires a file metadata object, array, or body.files array");let wt=Ue.card_data&&typeof Ue.card_data=="object"&&!Array.isArray(Ue.card_data)?Ue.card_data:{},Dr=Array.isArray(wt.files)?wt.files:[],no=[...Dr,...Je];return await Q.patchCard(xe,"card_data.files",no),ue({files_added:Je.map((oo,so)=>({idx:Dr.length+so,entry:oo}))})}catch(xe){return ye(xe)}}}}let B=ot(a.boardAdapter)?En(a.baseRef,a.boardAdapter,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow}):Sn(a.baseRef,a.boardAdapter,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow}),N=a.nonCoreAdapter??(!ot(a.boardAdapter)&&f(a.boardAdapter)?a.boardAdapter:null),Z=a.nonCore??(N?bn(a.baseRef,N,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,taskExecutorRef:a.taskExecutorRef}):null),me=a.boardAdapter.chatStorageForRef(a.chatStoreRef),le,Pe=ot(a.boardAdapter)?(()=>{let Q=ur(ir(ar(a.boardAdapter.kvStorageForRef(a.cardStoreRef)),a.boardAdapter.hashFn),s.warn),ue=W(Q);return le={get(Ce){return ue.get(Ce)},set(Ce){return ue.set(Ce)}},ue})():(()=>{let Q=a.boardAdapter.kvStorageForRef(a.cardStoreRef),Ce=rr(Et({readIndex:()=>Q.read("_index"),writeIndex:ye=>Q.write("_index",ye),readCard:ye=>Q.read(ye),writeCard:(ye,Ie)=>(Q.write(ye,Ie),ye),removeCard:ye=>{Q.delete(ye);},cardExists:ye=>Q.read(ye)!==null,defaultCardKey:ye=>ye},s.warn));return le=Ce,q(Ce)})(),je;if(ot(a.boardAdapter)){let Q=a.boardAdapter.blobStorageForRef(a.artifactsStoreRef);je={async putBytes(ue,Ce){if(Q.writeBytes){await Q.writeBytes(ue,Ce);return}let ye=JSON.stringify({__kind:"bytes-array",data:[...Ce]});await Q.write(ue,ye);},async getBytes(ue){if(Q.readBytes){let ye=await Q.readBytes(ue);if(ye!==null)return ye}let Ce=await Q.read(ue);if(Ce===null)return null;try{let ye=JSON.parse(Ce);if(ye&&ye.__kind==="bytes-array"&&Array.isArray(ye.data))return new Uint8Array(ye.data)}catch{}return new TextEncoder().encode(Ce)},async listKeys(ue){return await Q.listKeys(ue)}};}else {let Q=a.boardAdapter.blobStorageForRef(a.artifactsStoreRef),ue=On(Q);je={putBytes(Ce,ye,Ie){ue.putBytes(Ce,ye,Ie);},getBytes(Ce){return ue.getBytes(Ce)},listKeys(Ce){return ue.list(Ce).map(ye=>ye.key)}};}let De={async init(Q){return B.init(Q)},async status(Q){return B.status(Q)},async getConfig(Q){return B.getConfig(Q)},async getAllOutputsDataObjects(Q){return B.getAllOutputsDataObjects(Q)},async getAllOutputsComputedValues(Q){return B.getAllOutputsComputedValues(Q)},async getOutputsFetchedSources(Q){return B.getOutputsFetchedSources(Q)},async upsertCard(Q){return B.upsertCard(Q)},async removeCard(Q){return B.removeCard(Q)},async cardRefreshedNotify(Q){return B.cardRefreshedNotify(Q)},async sourceDataFetched(Q){return B.sourceDataFetched(Q)},async sourceDataFetchFailure(Q){return B.sourceDataFetchFailure(Q)}};return {label:a.label,board:B,nonCore:Z,publicCardStore:le,boardOps:De,cardStoreOps:Pe,get filesArtifacts(){return je},get chatStorage(){return me},boardAdapter:a.boardAdapter,boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,artifactsStoreRef:a.artifactsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:Ln(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let A=e.boards.map(x),E=new Map;function c(a){return E.get(a)??0}function h(a){return a.queueStoreRef}function d(a,P){if(ot(a.boardAdapter)){let W=a.boardAdapter.queueStorageForRef(h(a),P);return Ar(W)}let q=a.boardAdapter.queueStorageForRef(h(a),P);return Ir(q)}function f(a){let P=a;return typeof P.invokeExecutor=="function"&&typeof P.validateSchema=="function"}function l(a){let P=A[c(a)];return {files:P?P.filesArtifacts:null}}function k(){return qn()}function F(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function $(a){if(!a||a.notificationTeardown||!p||!a.notifyRef)return;let P=await p.subscribe(a.notifyRef,q=>{Pr(a.notification,q);let W=q.kind==="notification-batch"?q.notifications:[q];I.broadcastNotificationBatch(W);});a.notificationTeardown=P;}async function J(a){if(!a||a.initialized)return;let P={boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,artifactsStoreRef:a.artifactsStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef},q={};a.taskExecutorRef&&(q["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(q["chat-handler-flow"]=a.chatHandlerFlow);let W=await a.boardOps.init({params:P,body:q});if(W.status!=="success")throw Object.assign(new Error(W.error||`init failed for ${a.label}`),{statusCode:500});if(await $(a),!a.chatHandlerFlow&&a.chatHandlerRef&&i.describe)try{let B=await i.describe(a.chatHandlerRef);B&&B.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${B.kind}", expected "chat-handler" for ${a.label}`):B&&s.info(`[init] chat-handler validated: ${B.name} (protocol ${B.protocolVersion}) for ${a.label}`);}catch(B){s.warn(`[init] chat-handler describe failed for ${a.label}: ${B?.message||String(B)}`);}a.initialized=true;}async function G(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let P=[],q=await a.boardOps.status({});q.status==="success"&&q.data!=null&&Tr(q.data)&&P.push({kind:"status",status:q.data});let W=await a.boardOps.getAllOutputsDataObjects({});if(W.status==="success"&&W.data!=null)for(let[N,Z]of Object.entries(W.data))N&&P.push({kind:"data_object",key:N,payload:Z});let B=await a.boardOps.getAllOutputsComputedValues({});if(B.status==="success"&&B.data!=null)for(let[N,Z]of Object.entries(B.data))N&&P.push({kind:"computed_values",cardId:N,values:Z});P.length>0&&a.boardAdapter.publishBoardChangeNotifications(P);}async function te(a,P){if(!a||a.cardsBootstrapped)return;let q=await a.cardStoreOps.get({}),W=q.status==="success"&&Array.isArray(q.data?.cards)?q.data.cards:[];for(let B of W)typeof B.id=="string"&&(E.set(B.id,P),await a.boardOps.upsertCard({params:{cardId:B.id}}));a.cardsBootstrapped=true;}async function ie(){for(let a of A)await J(a);}async function Y(){await ie();for(let a=0;a<A.length;a++)await G(A[a]),await te(A[a],a),await G(A[a]);}async function ee(a=false){a||await ie();for(let P of A){let q=await P.board.processAccumulatedEvents({});if(q.status!=="success")return q}return {status:"success"}}function ne(a){return A[c(a)]??null}async function v(a){let P=ne(a);if(!P)return null;let q=await P.cardStoreOps.get({params:{id:a}});if(q.status!=="success")return null;let W=Array.isArray(q.data?.cards)?q.data.cards:[];return W.length>0?W[0]:null}async function g(){let a=async q=>{if(!q)return [];let W=await q.cardStoreOps.get({});return W.status!=="success"||!Array.isArray(W.data?.cards)?[]:W.data.cards},P=[];for(let q of A)P.push(...await a(q));return P}function L(){return A[0]??null}function D(a){return ne(a)??L()}function H(a){let P=D(a);if(!P)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${a}`),{statusCode:404});return P.chatStorage}async function w(a,P){return await H(a).readAfter(a,P)}async function b(a){return await H(a).isProcessing(a)}async function O(a,P){await H(a).setProcessing(a,P),await I.broadcastCardChats(a,true);}let U=jn({append(a,P,q,W,B){return Promise.resolve(H(a).append(a,P,q,W,B)).then(async N=>(await I.broadcastCardChats(a,true),N))},readAll(a){return H(a).readAll(a)},readAfter(a,P){return H(a).readAfter(a,P)},clear(a){return H(a).clear(a)},setProcessing(a,P){return Promise.resolve(H(a).setProcessing(a,P)).then(async()=>{await I.broadcastCardChats(a,true);})},isProcessing(a){return H(a).isProcessing(a)},getConfig(a){return H(a).getConfig(a)},setConfig(a,P){return H(a).setConfig(a,P)}}),V=Qn({boardContexts:A,cardOwnerIndex:E,cardContextForCard:a=>ne(a),readStatusSnapshot:()=>ce(),readDataObjectsByToken:()=>ve(),readCardRuntimeArtifacts:()=>Le(),readCardFromStore:a=>v(a),readCardDefinitions:()=>g(),processAccumulatedLaneInternal:a=>ee(a),reportSourceFetched:(a,P)=>kt(a,{ref:P}),reportSourceFetchFailure:(a,P)=>Ct(a,{reason:P}),uploadCardFile:(a,P,q,W,B)=>K(a,P,q,W,B),chatStorePublic:U,serverUrl:T,apiBasePath:t}),X=V.mcpCardStoreFacade,ae=V.createMcpFacade,fe=Dn({boardId:o,bootstrapBoard:()=>Y(),sseHub:I,onChannelSubscribed:S,onChannelUnsubscribed:R,getMcpFacade:()=>ae(),getMcpCardStoreFacade:()=>X()});function we(a){return Un(a)}function Te(){return Vn(ae())}function Be(){return Kn({boardId:o,uploadCardFile:K,getMcpFacade:()=>ae(),controlplane:fe})}let Se=Nn({boardId:o,boardContexts:A,readCardDefinitions:()=>g(),readChatRecords:a=>m(a),getChatProcessing:a=>b(a)}),ce=Se.readStatusSnapshot,Le=Se.readCardRuntimeArtifacts,ve=Se.readDataObjectsByToken,Me=Se.buildPublishedRuntimePayload;async function Ne(a,P,q){let W=q?.syncBoard!==false,B=q?.restartOnlyIfChanged===true,N=ne(a);if(!N)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let Z=await v(a);if(!Z)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let me=B?JSON.stringify(Z):null,le=P(Z)||Z;if(B&&JSON.stringify(le)===me)return;let Pe=await N.cardStoreOps.set({body:le});if(Pe.status!=="success")throw Object.assign(new Error(Pe.error||`Failed to persist card: ${a}`),{statusCode:500});if(W){let je=await N.boardOps.upsertCard({params:{cardId:a,restart:true}});if(je.status!=="success")throw Object.assign(new Error(je.error||`Failed to upsert card: ${a}`),{statusCode:500})}}async function ge(a,P){await Ne(a,P,{syncBoard:true});}async function Ze(a,P){await Ne(a,P,{syncBoard:false});}async function Ke(a){let P=ne(a);if(!P)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});if(!await v(a))throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let W=await P.boardOps.upsertCard({params:{cardId:a,restart:true}});if(W.status!=="success")throw Object.assign(new Error(W.error||`Failed to retrigger card: ${a}`),{statusCode:500})}async function Ge(a){await H(a).clear(a);try{await O(a,!1);}catch{}}async function M(a,P,q,W,B=""){let N=typeof q=="string"?q.trim():"",Z=await H(a).append(a,P||"system",N,W,B);return await I.broadcastCardChats(a,true),Z}async function m(a){return await H(a).readAll(a)}let K=$n({safeCardId:a=>F(a),artifactsStores:a=>l(a),cardFileMetadataStore:()=>k(),readCardFromStore:a=>v(a),updateCardLocalOnly:(a,P)=>Ze(a,P),writeChatRecord:(a,P,q,W,B)=>M(a,P,q,W,B)}).uploadCardFile;async function oe(a){let P=ne(a);if(!P)return null;let q=await P.boardOps.getConfig({params:{key:"chat-handler-flow"}}),B=(q.status==="success"?q.data?.value:null)??P.chatHandlerFlow??null,N=P.chatHandlerRef;return B==null&&(!N||typeof N!="object")?null:{ctx:P,handlerFlow:B,handlerRef:N}}function re(a){let P=typeof a=="string"?a.trim():"";return P.length>=jr.length*2&&P.startsWith(jr)&&P.endsWith(jr)}async function Ae(a,P,q=false,W="",B=false){try{let N=await oe(a);if(!N){try{await O(a,!1);}catch{}return}let{ctx:Z,handlerFlow:me,handlerRef:le}=N;if(!q)try{await O(a,!0);}catch{}let Pe={boardId:o,cardId:String(a),lastChatEntryId:P,...W?{turnId:W}:{},isProbe:!!B,..._,...T?{serverUrl:T}:{}},je=me!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:eo}}:le;ot(Z.boardAdapter)?await d(Z,"chat-agent").enqueueRequest({boardId:o,ref:je,args:me!=null?{...Pe,__chatHandlerFlow:me}:Pe}):d(Z,"chat-agent").enqueueRequest({boardId:o,ref:je,args:me!=null?{...Pe,__chatHandlerFlow:me}:Pe}),await Promise.resolve(Z.boardAdapter.requestProcessAccumulated?.());}catch(N){try{await O(a,!1);}catch{}s.warn(`[chat-handler] queue failed for card "${a}": ${N instanceof Error?N.message:String(N)}`);}}async function be(a,P,q){if(P.howToRun==="built-in"&&Ur(P)===eo){let W=u,B=q.__chatHandlerFlow,N={...q};return delete N.__chatHandlerFlow,W?W.run(B,N,{boardId:o,cardId:String(N.cardId||""),label:a.label,logger:s,serverUrl:T,executionExtra:_}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return i.invoke(P,q)}async function Fe(a,P=false){P||await ie();let q=typeof a.args?.cardId=="string"?a.args.cardId:"",W=q?ne(q):L();if(!W)throw new Error(q?`Board context is unavailable for chat-agent request: ${q}`:"Board context is unavailable for chat-agent request");let B=await be(W,a.ref,a.args);if(!B.dispatched){if(q)try{await O(q,!1);}catch{}throw new Error(B.error||`chat-agent dispatch failed for card "${q||"unknown"}"`)}}async function Oe(a,P,q){if(P==="chat-send"){let B=q&&typeof q["turn-id"]=="string"?q["turn-id"]:q&&typeof q.turnId=="string"?q.turnId:q&&typeof q.turn=="string"?q.turn:"",N=Be(),Z=re(q?.text),me=await pt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:a,role:"user",text:q?.text,turn_id:B,files:[]},N);if(me?.status!=="success")throw new Error(rt(me,`chat-send append failed for card ${a}`));let le=me?.data?.id;if(typeof le!="string"||!le)throw new Error(`chat-send did not return an append id for card ${a}`);let Pe=await pt("setstate.chat-processing-started",{board_id:o,card_id:a},N);if(Pe?.status!=="success")throw new Error(rt(Pe,`chat-send processing update failed for card ${a}`));Ae(a,le,true,B,Z);return}await ge(a,B=>{let N=new Date().toISOString(),Z=B.card_data&&typeof B.card_data=="object"?B.card_data:{};if(B.card_data=Z,P==="file-upload"){let me=k().normalizeIncoming(q?.files,N);return me.length>0&&k().merge(Z,me),B}if(P==="action"){let me=q&&typeof q.buttonId=="string"?q.buttonId:"";if(!me)return B;Z.lastAction={buttonId:me,at:N},Z.lastActionText=`${me} @ ${N}`;}return B});}function $e(a,P,q){let W=JSON.stringify(q),B=typeof Buffer<"u"?Buffer.byteLength(W):new TextEncoder().encode(W).length;a.writeHead(P,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":B}),a.end(W);}async function We(a,P,q){let W=await v(a);if(!W)throw Object.assign(new Error("Card not found"),{statusCode:404});let B=k().resolve(W.card_data,P,q);if(!B.ok&&B.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!B.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let N=B.file,Z=F(a),me=l(a),le=String(N.stored_name||""),Pe=`${Z}/${le}`,je=me.files?await me.files.getBytes(Pe):null;if(!je)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:N,bytes:je}}async function He(a,P,q,W){let{fileRecord:B,bytes:N}=await We(P,q,W),Z=String(B.name||B.stored_name||"download.bin"),me=String(B.mime_type||"application/octet-stream");a.writeHead(200,{"Content-Type":me,"Content-Disposition":`attachment; filename="${Z}"`,"Content-Length":N.length}),a.end(N);}function lt(a){let P=String(a||"").toLowerCase();return P.startsWith("text/")||P.includes("json")||P.includes("xml")||P.includes("javascript")||P.includes("typescript")||P.includes("yaml")||P.includes("csv")}function et(a,P,q){let W=a.split(/\r?\n/);return (P==="head"?W.slice(0,q):W.slice(-q)).join(`
|
|
7
|
+
`)}async function tt(a){let P=[];for await(let W of a)P.push(W);let q=typeof Buffer<"u"?Buffer.concat(P).toString("utf-8").trim():new TextDecoder().decode(pr(P)).trim();return q?JSON.parse(q):{}}async function kt(a,P){let q=typeof P.ref=="string"?P.ref.trim():"";if(!q)return {status:"fail",error:"board-worker success callback requires body.ref"};let W=A[0];return W?W.boardOps.sourceDataFetched({params:{token:a,ref:q}}):{status:"fail",error:"no board context"}}async function Ct(a,P){let q=typeof P.reason=="string"&&P.reason.trim()?P.reason:"unknown",W=A[0];return W?W.boardOps.sourceDataFetchFailure({params:{token:a,reason:q}}):{status:"fail",error:"no board context"}}let Ot=Zn({sseHub:I,corsHeaders:r,json:$e,buildPublishedRuntimePayload:()=>Me(),onSseClientConnected:y,onChannelSubscribed:S,onChannelUnsubscribed:R,apiBasePath:t,readJsonBody:a=>tt(a),initBoardAndSetup:()=>ie(),bootstrapBoard:()=>Y(),boardContexts:A,publishPersistedStateSnapshot:a=>G(a),upsertCardsFromSource:(a,P)=>te(a,P)}).handleWatchersRoutes,vt=zn({apiBasePath:t,json:$e,readJsonBody:a=>tt(a),bootstrapBoard:()=>Y(),createMcpFacade:()=>ae(),createMcpToolRegistry:a=>we(a),resolveCardFileDownloadPayload:(a,P,q)=>We(a,P,q),isLikelyTextMimeType:a=>lt(a),sliceTextByLines:(a,P,q)=>et(a,P,q)}).handleAgentfaceApi,Mr=Yn({apiBasePath:t,json:$e,readJsonBody:a=>tt(a),initBoardAndSetup:()=>ie(),createMcpWebhookToolRegistry:()=>Te()}).handleWebhooksApi,qt=mr({apiBasePath:t,json:$e,readJsonBody:a=>tt(a),initBoardAndSetup:()=>ie(),bootstrapBoard:()=>Y(),buildPublishedRuntimePayload:()=>Me(),createMcpControlplaneToolRegistry:()=>Be(),retriggerCard:a=>Ke(a),applyCardAction:(a,P,q)=>Oe(a,P,q),resolveChatHandlerTarget:a=>oe(a),sendCardFileDownloadResponse:(a,P,q,W)=>He(a,P,q,W)}).handleRuntimeApi;async function fr(a,P,q){return !!(await vt(a,P,q)||await Mr(a,P,q)||await Ot(a,P,q)||await qt(a,P,q))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:fr,buildPublishedRuntimePayload:Me,__drainProcessAccumulatedLane:ee,handleChatAgentRequest:Fe,clearChatRecords:Ge,reportSourceFetched(a,P){return kt(a,{ref:P})},reportSourceFetchFailure(a,P){return Ct(a,{reason:P})},get cardStore(){return A[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function rs(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...to,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,s=new Map,i="boards-config.json";function u(){let x=n.getText(i);if(!x)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(x)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function p(x){n.putText(i,JSON.stringify(x,null,2));}function T(x){let A=String(x||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return A.length>0&&A.length<=64?A:null}function _(x){if(s.has(x))return s.get(x);let E=u().boards.find(h=>h.id===x)||{},c=o(x,E);return s.set(x,c),c}function y(x,A,E){let c=JSON.stringify(E),h=typeof Buffer<"u"?Buffer.byteLength(c):new TextEncoder().encode(c).length;x.writeHead(A,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":h}),x.end(c);}async function C(x,A,E){let c=x.method||"GET",h=E.pathname;if(c==="GET"&&h===t)return y(A,200,{ok:true,boards:u().boards}),true;if(c==="POST"&&h===t){let d=[];for await(let G of x)d.push(G);let f=typeof Buffer<"u"?Buffer.concat(d).toString("utf-8").trim():new TextDecoder().decode(pr(d)).trim(),l={};try{l=f?JSON.parse(f):{};}catch{l={};}let k=T(l.id);if(!k)return y(A,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let F=u();if(F.boards.some(G=>G.id===k))return y(A,409,{error:`Board "${k}" is already registered`}),true;let $=typeof l.label=="string"&&l.label.trim()?l.label.trim():k,J={id:k,label:$};for(let[G,te]of Object.entries(l))G==="id"||G==="label"||te!=null&&(J[G]=te);return F.boards.push(J),p(F),y(A,200,{ok:true,board:J}),true}return false}async function S(x,A,E){let h=E.pathname.match(new RegExp(`^${st(t)}/([^/]+)(/|$)`));if(!h)return false;let d=T(decodeURIComponent(h[1]));return d?u().boards.some(k=>k.id===d)?!!await _(d).handleRuntimeApi(x,A,E):(y(A,404,{error:`Board "${d}" not registered. POST ${t} with {id} to register it first.`}),true):(y(A,400,{error:"Invalid board id"}),true)}async function R(x,A,E){return !!(await C(x,A,E)||await S(x,A,E))}function I(x){if(!u().boards.some(E=>E.id===x))throw Object.assign(new Error(`Board "${x}" not registered`),{statusCode:404});return {service:_(x)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:R,requireBoardService:I}}exports.createMultiBoardServerRuntime=rs;exports.createRoutesRuntimeApi=mr;exports.createSingleBoardServerRuntime=ts;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
|
|
8
8
|
//# sourceMappingURL=server-runtime-controlface.js.map
|