yaml-flow 8.8.7 → 8.9.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/firestore-storage.js +2 -2
- package/browser/adapters/localstorage-storage.js +3 -3
- package/browser/asset-integrity.json +7 -7
- package/browser/server-runtime-controlface.js +5 -5
- package/examples/board/test/server-http-test-browser.ts +2394 -0
- package/examples/board/test/server-http-test.js +44 -35
- package/lib/{artifacts-store-lib-C6qBpMfU.d.cts → artifacts-store-lib-CqkJEgbx.d.cts} +1 -1
- package/lib/{artifacts-store-lib-D4qf7Q-7.d.ts → artifacts-store-lib-D6Bo4yFN.d.ts} +1 -1
- package/lib/artifacts-store-public.d.cts +5 -3
- package/lib/artifacts-store-public.d.ts +5 -3
- package/lib/board-callback-transport-Bekq8Gp-.d.ts +71 -0
- package/lib/board-callback-transport-kP0K6UMq.d.cts +71 -0
- package/lib/board-live-cards-lib-DVh3t9NT.d.cts +222 -0
- package/lib/board-live-cards-lib-iU8xOwNp.d.ts +222 -0
- package/lib/board-live-cards-mcp.cjs +1 -1
- package/lib/board-live-cards-mcp.d.cts +4 -8
- package/lib/board-live-cards-mcp.d.ts +4 -8
- package/lib/board-live-cards-mcp.js +1 -1
- package/lib/board-live-cards-node.cjs +7 -7
- package/lib/board-live-cards-node.d.cts +15 -11
- package/lib/board-live-cards-node.d.ts +15 -11
- package/lib/board-live-cards-node.js +7 -7
- package/lib/{board-live-cards-public-async-CYjr4mgX.d.cts → board-live-cards-public-async-Cl0M3j5P.d.cts} +6 -4
- package/lib/{board-live-cards-public-async-DlyC3PgC.d.ts → board-live-cards-public-async-U98IXUBx.d.ts} +6 -4
- package/lib/board-live-cards-public.cjs +1 -1
- package/lib/board-live-cards-public.d.cts +325 -3
- package/lib/board-live-cards-public.d.ts +325 -3
- 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 +8 -6
- package/lib/board-live-cards-server-runtime.d.ts +8 -6
- package/lib/board-live-cards-server-runtime.js +1 -1
- package/lib/{board-platform-adapter-async-JP9V-U5E.d.ts → board-platform-adapter-async-ByBRFn1G.d.ts} +4 -3
- package/lib/{board-platform-adapter-async-BZIftm36.d.cts → board-platform-adapter-async-DjBwE0m9.d.cts} +4 -3
- package/lib/board-state-reducer.cjs +2 -0
- package/lib/board-state-reducer.d.cts +53 -0
- package/lib/board-state-reducer.d.ts +53 -0
- package/lib/board-state-reducer.js +2 -0
- package/lib/card-store-public.cjs +1 -1
- package/lib/card-store-public.d.cts +11 -4
- package/lib/card-store-public.d.ts +11 -4
- package/lib/card-store-public.js +1 -1
- package/lib/chat-store-public.cjs +1 -1
- package/lib/chat-store-public.d.cts +15 -4
- package/lib/chat-store-public.d.ts +15 -4
- package/lib/chat-store-public.js +1 -1
- package/lib/chunk-2RIHC5TZ.cjs +2 -0
- package/lib/chunk-37FDOKDK.js +3 -0
- package/lib/chunk-3S7LV2HZ.cjs +2 -0
- package/lib/chunk-3T5TMAWG.cjs +3 -0
- package/lib/chunk-5XLFPPTY.cjs +2 -0
- package/lib/{chunk-R44X3RQB.cjs → chunk-6EJRZHFP.cjs} +2 -2
- package/lib/{chunk-NNSBBO5R.js → chunk-6MD6FVE3.js} +2 -2
- package/lib/chunk-7QNEV5S3.js +2 -0
- package/lib/{chunk-6OPXQPSC.js → chunk-7UJQMFVS.js} +2 -2
- package/lib/chunk-BJGK5FNL.js +2 -0
- package/lib/{chunk-ETW3BXHD.cjs → chunk-BQJVCCFU.cjs} +2 -2
- package/lib/chunk-DQPBAB5Z.cjs +2 -0
- package/lib/chunk-JB4Q2W7I.js +7 -0
- package/lib/chunk-JYVYAAXT.js +3 -0
- package/lib/chunk-LFVMX23W.cjs +7 -0
- package/lib/chunk-NIBLKYXN.js +2 -0
- package/lib/chunk-OF4FPYNI.cjs +2 -0
- package/lib/chunk-P3R6TXII.js +3 -0
- package/lib/{chunk-7BTZCOT5.js → chunk-QLB6PKOT.js} +2 -2
- package/lib/chunk-R4YASXSJ.js +2 -0
- package/lib/chunk-RZRIXQ6A.cjs +3 -0
- package/lib/chunk-SDJ3747Q.cjs +2 -0
- package/lib/chunk-SJANU3PL.cjs +3 -0
- package/lib/chunk-UGB7PC4P.js +2 -0
- package/lib/chunk-VBYNMTWC.js +2 -0
- package/lib/{chunk-37HDEW26.cjs → chunk-WRMOGPRG.cjs} +2 -2
- package/lib/cloud-storage.cjs +1 -1
- package/lib/cloud-storage.d.cts +44 -8
- package/lib/cloud-storage.d.ts +44 -8
- package/lib/cloud-storage.js +1 -1
- package/lib/firebase-storage/index.d.cts +2 -2
- package/lib/firebase-storage/index.d.ts +2 -2
- package/lib/firestore-storage/index.cjs +2 -2
- package/lib/firestore-storage/index.d.cts +6 -5
- package/lib/firestore-storage/index.d.ts +6 -5
- package/lib/firestore-storage/index.js +2 -2
- package/lib/index.cjs +2 -2
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/localstorage-storage/index.cjs +1 -1
- package/lib/localstorage-storage/index.d.cts +6 -5
- package/lib/localstorage-storage/index.d.ts +6 -5
- package/lib/localstorage-storage/index.js +1 -1
- package/lib/notification-consumer/index.cjs +2 -0
- package/lib/notification-consumer/index.d.cts +17 -0
- package/lib/notification-consumer/index.d.ts +17 -0
- package/lib/notification-consumer/index.js +2 -0
- package/lib/queue-storage-public.cjs +2 -0
- package/lib/queue-storage-public.d.cts +13 -0
- package/lib/queue-storage-public.d.ts +13 -0
- package/lib/queue-storage-public.js +2 -0
- package/lib/server-jobs-queue-runner/index.cjs +1 -1
- package/lib/server-jobs-queue-runner/index.d.cts +9 -7
- package/lib/server-jobs-queue-runner/index.d.ts +9 -7
- 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 +9 -7
- package/lib/server-runtime/index.d.ts +9 -7
- package/lib/server-runtime/index.js +1 -1
- package/lib/server-runtime-agentface/index.d.cts +8 -6
- package/lib/server-runtime-agentface/index.d.ts +8 -6
- package/lib/server-runtime-controlface/index.cjs +1 -1
- package/lib/server-runtime-controlface/index.d.cts +8 -6
- package/lib/server-runtime-controlface/index.d.ts +8 -6
- 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 +16 -37
- package/lib/server-runtime-core/index.d.ts +16 -37
- 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 +11 -8
- package/lib/server-runtime-watchers/index.d.ts +11 -8
- package/lib/server-runtime-watchers/index.js +1 -1
- package/lib/server-runtime-webhooks/index.d.cts +8 -6
- package/lib/server-runtime-webhooks/index.d.ts +8 -6
- package/lib/{sse-hub-DM8bw-dO.d.ts → sse-hub-BRBvymHR.d.cts} +18 -15
- package/lib/{sse-hub-BDjWI7JR.d.cts → sse-hub-D_94fV87.d.ts} +18 -15
- package/lib/step-machine-public/index.d.cts +1 -1
- package/lib/step-machine-public/index.d.ts +1 -1
- package/lib/{storage-async-interface-CyO-zwVQ.d.cts → storage-async-interface-CLOXiqwC.d.cts} +2 -2
- package/lib/{storage-async-interface-CG0bMqvE.d.ts → storage-async-interface-Cb-SULrI.d.ts} +2 -2
- package/lib/{storage-interface-D-iEiTJA.d.cts → storage-interface-DogVPooM.d.cts} +1 -1
- package/lib/{storage-interface-D-iEiTJA.d.ts → storage-interface-DogVPooM.d.ts} +1 -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-BsfXZyI3.d.ts → types-BsqzUZNl.d.ts} +6 -4
- package/lib/{types-CPnYv7RC.d.cts → types-DxhB6Toz.d.cts} +6 -4
- package/package.json +16 -1
- package/lib/board-live-cards-public-BT5HrgqZ.d.cts +0 -529
- package/lib/board-live-cards-public-DSRamFm8.d.ts +0 -529
- package/lib/chunk-35N7ONTH.js +0 -2
- package/lib/chunk-36QUKFL7.cjs +0 -3
- package/lib/chunk-3MMTBEAO.js +0 -2
- package/lib/chunk-7QQFDYBM.js +0 -3
- package/lib/chunk-7QZ267XP.cjs +0 -2
- package/lib/chunk-ABAVFLDP.js +0 -7
- package/lib/chunk-EPCJYP4N.js +0 -3
- package/lib/chunk-H22NK6KH.cjs +0 -7
- package/lib/chunk-KBELAKIY.js +0 -2
- package/lib/chunk-OJ2CAQ4C.cjs +0 -2
- package/lib/chunk-Q3OTUDIE.js +0 -2
- package/lib/chunk-QG6ERLZQ.cjs +0 -3
- package/lib/chunk-UB54HZA4.cjs +0 -2
- package/lib/chunk-YMEIPKLW.cjs +0 -2
- package/lib/chunk-ZENTBLLA.cjs +0 -3
- package/lib/chunk-ZWVT24YW.js +0 -3
|
@@ -1,8 +1,8 @@
|
|
|
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 Lt="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 `${Lt}${uo(JSON.stringify(e))}`}function at(e){if(!e.startsWith(Lt))throw new Error(`Invalid ref format (expected ${Lt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(co(e.slice(Lt.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 mr(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 ue(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 Mt(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 gr(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,buildPublishedRuntimePayload:i,createMcpControlplaneToolRegistry:u,retriggerCard:p,applyCardAction:T,resolveChatHandlerTarget:E,sendCardFileDownloadResponse:y}=e;async function C(S,R,I){let x=S.method||"GET",A=I,F=A.pathname;try{if(x==="POST"&&F===`${t}/mcp-actions`){await s();let f=Date.now(),l=new Date(f).toISOString(),k=await n(S),_=typeof k.tool=="string"?k.tool.trim():"",$=k.args&&typeof k.args=="object"&&!Array.isArray(k.args)?k.args:{};if(!_)return r(R,400,{error:"tool is required"}),!0;let J=ue($,"card_id");if(!J)return r(R,400,{error:"MCP action requires card_id"}),!0;if(_==="retrigger-card"||_==="retrigger"){await p(J);let ie=Date.now();return r(R,200,{status:"success",data:{ok:!0,cardId:J,actionType:_,requestReceivedAt:l,requestReceivedAtMs:f,responseSentAt:new Date(ie).toISOString(),responseSentAtMs:ie,responseStatus:200}}),!0}let W=ut($,"payload");if(_==="chat-send"&&!await E(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(_==="chat-send"){let ie=typeof W["turn-id"]=="string"?W["turn-id"]:typeof W.turnId=="string"?W.turnId:typeof W.turn=="string"?W.turn:"";if(!ie||!String(ie).trim()){let X=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(X).toISOString(),responseSentAtMs:X,responseStatus:400}),!0}}await T(J,_,W);let te=Date.now();return r(R,200,{status:"success",data:{ok:!0,cardId:J,actionType:_,requestReceivedAt:l,requestReceivedAtMs:f,responseSentAt:new Date(te).toISOString(),responseSentAtMs:te,responseStatus:200}}),!0}if(x==="POST"&&F===`${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 _=await pt(l,k,u());if(_&&typeof _=="object"&&!Array.isArray(_)){let $=_;if($.status==="fail")return r(R,400,{error:rt(_,"Request failed")}),!0;if($.status==="error")return r(R,500,{error:rt(_,"Internal error")}),!0}r(R,200,_);}catch(_){let $=typeof _?.statusCode=="number"?Number(_.statusCode):500,J=_ instanceof Error?_.message:String(_);r(R,$,{error:J});}return !0}let c=F.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=F.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(),_=await n(S),$=_?.actionType;if($==="chat-send"&&!await E(f)){let W=Date.now();return r(R,409,{error:`chat handler is not configured for card: ${f}`,requestReceivedAt:k,requestReceivedAtMs:l,responseSentAt:new Date(W).toISOString(),responseSentAtMs:W,responseStatus:409}),!0}if($==="chat-send"){let W=_?.payload??{},te=typeof W["turn-id"]=="string"?W["turn-id"]:typeof W.turnId=="string"?W.turnId:typeof W.turn=="string"?W.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,$,_?.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=F.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 Dt(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 yr(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]??Nt(),o={};if(r){let i=r.tasks[t],u=gt(i);for(let p of u)for(let[T,E]of Object.entries(r.tasks))if(Ye(E).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]??Nt(),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 E={...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]:E},availableOutputs:y,lastUpdated:new Date().toISOString()}}function Yr(e,t,r,n){let o=e.tasks[r]??Nt(),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]??Nt(),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 Nt(){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=[],E=[],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||yr(I))continue;let F=Jr(R);if(F!==void 0&&I&&I.executionCount>=F||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,W]of Object.entries(n))if(Ye(W).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,W]of Object.entries(n))if(Ye(W).includes($)){let te=r.tasks[J];if(te&&te.executionCount>I.lastEpoch)return true}return false})||(k=true);break}case "time-based":{let _=R.refreshInterval??0;if(_<=0){k=true;break}let $=I.completedAt;if(!$){k=true;break}(Date.now()-Date.parse($))/1e3<_&&(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($=>yr(r.tasks[$]))?f.push({token:l,failedProducer:k[0]}):d.push(l);}h.length>0?E.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:E,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 hr(e){let t=Rr(e);return Co(t)}function Rr(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Rr).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Rr(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 $t(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,E=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)F(l);for(let l of d)if(l.type==="task-progress"){let{taskName:k,update:_}=l;if(!u.config.tasks[k])continue;let J=u.state.tasks[k];if(!J||J.status!=="running")continue;let W=rn(k),te=A(k,W,_).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,_]of Object.entries(u.config.tasks))for(let $ of _.provides??[])f.set($,k);let l={};for(let k of d){let _=f.get(k);_?l[k]=u.state.tasks[_]?.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 _ of l){let $=E.get(_);if(!$)throw new Error(`Handler '${_}' 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 '${_}' returned task-initiate-failure (task '${c}')`)}}function F(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:hr(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:hr(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?hr(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){E.set(c,h);},unregisterHandler(c){E.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 Ut(){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=Ut();vo("./jsonata-sync.cjs");var Ao=Ut(),Vt=Ao("./jsonata-sync.cjs"),sn=Vt;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 Vt(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 Vt(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 Vt(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 Kt(e){return JSON.stringify(e)}function Ht(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function Jt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function kr(e,t){return Jt(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 Cr(e,t){return {readValues(n){let o=e(n);return kr(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 E=o.read(T);Jt(E)?p=(p??Promise.resolve()).then(async()=>{u[T]=await E;}):u[T]=E;}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);Jt(T)&&(u=(u??Promise.resolve()).then(()=>T).then(()=>{}));}for(let[p,T]of Object.entries(o)){let E=i.write(p,T);Jt(E)&&(u=(u??Promise.resolve()).then(()=>E).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function Gt(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 kr(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 kr(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 Wt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function dt(e,t){return Wt(e)?e.then(t):t(e)}function wr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);Wt(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=wr(e,s=>{let i=r(s);if(i)return dt(t(s),u=>{n[i]=u;})});return Wt(o)?o.then(()=>n):n}function Qt(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 Sr(e,t){let r=(n,o)=>{try{let s=o(n);return Wt(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(wr(i,u=>r(u,o)),()=>e.delete(n))})}}}function br(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 zt(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 wr(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 E=0;E<u.length-1;E++){let y=u[E],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 E=n(T,s,i),y=e.writeCard(p.key,E);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 Yt(e,t){return Qt(e,t)}function pn(e){return cn(e)}var Xt="v1",ct="board/graph",mn="board/lastJournalProcessedId";function gn(e){return `cards/${e}/runtime`}function yn(e){return Gt(e,Xt)}function Zt(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Ht(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Kt(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 zt(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 vr(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??[],F=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 F)for(let J of p.get($)??[])J!==R&&l.add(J);let k=I.failedAt,_=I.error?{message:I.error,code:"TASK_FAILED",at:k,source:"task-runtime"}:void 0;return {name:R,status:I.status,error:_,requires:A,requires_satisfied:h,requires_missing:d,provides_declared:F,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 E=T.map(R=>({name:R.name,fanOut:R.unblocks.length})).sort((R,I)=>I.fanOut-R.fanOut||R.name.localeCompare(I.name)),y=E.length>0?E[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,F=(I.provides??[]).some(c=>(p.get(c)??[]).some(h=>h!==R));x&&!F&&(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 E=T.id,y=T.card_data??{},C=T.source_defs??[],S=C.filter(v=>v.optionalForCompletionGating!==true),R=r.cardRuntimeStore.readRuntime(E),I=false,x=()=>{I&&(r.cardRuntimeStore.writeRuntime(E,R),I=false);},A=v=>Tt(R._sources[v]),F=(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&&F(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(E,g,H)),w?F(g,vr(L,D)):F(g,_t(L,D));}}x();}}let d={};for(let v of C)if(v.outputFile){let g=r.fetchedSourcesStore.readSourceData(E,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:E,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))(E,l.computed_values??{});let k={...T},_=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(_)?_.map(v=>({...v,boardDir:typeof v.boardDir=="string"&&v.boardDir?v.boardDir:$})):_;let J=Lo(),W=u.update?void 0:J,te=S.filter(v=>{let g=v.outputFile;if(typeof g!="string"||!g)return true;let L=A(g);W&&(L={...L,queueRequestedToken:W},F(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;F(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 X=T.provides??[],ee={};for(let{bindTo:v,ref:g}of X)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 er(e){return {[ct]:e.graph,[mn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function tr(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 rr(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 nr(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:{},E=Array.isArray(T.files)?T.files:[],y=[...E,...p],C=p.map((R,I)=>({idx:E.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 or(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={}){Dt(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 E(){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(E()),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(E());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=()=>Zt(t.kvStorageForRef(E())),I=()=>yn(S),x=()=>pn(t.journalAdapterForRef(E())),A=()=>Et(C(),o),F=()=>{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 tr(M.values)}function f(M,m){let j=I().commitSnapshot(e.value,{schemaVersion:Xt,expectedVersion:m,commitId:t.genId(),committedAt:Xe(),deleteKeys:[],shallowMerge:er(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 Y=B.payload,le=(Y?.enrichedCard??{}).id??Y?.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=Yt(Ae,B=>t.resolveBlob(B)),Fe={...j.runtimeByCardId},qe=new Map,$e={readRuntime(B){return qe.get(B)??Fe[B]??{_sources:{}}},writeRuntime(B,N){qe.set(B,N),Fe[B]=N;}},We=[],He=new Map,lt={readSourceData(B,N){let Y=`${B}/${N}`;return He.has(Y)?He.get(Y):be.readSourceData(B,N)},ingestSourceDataStaged(B,N,Y,he){be.ingestSourceDataStaged(B,N,Y,he);},commitSourceData(B,N,Y){let he=`${B}/.staged/${Y}/${N}`,le=Ae.read(he);if(le==null){let De=Ae.keyRef?.(he);De&&(le=t.resolveBlob(De));}if(le==null)return false;let Te=`${B}/${N}`,Oe=le.trim();try{He.set(Te,JSON.parse(Oe));}catch{He.set(Te,Oe);}return We.push({cardId:B,outputFile:N,deliveryToken:Y}),true},hasSource(B,N){let Y=`${B}/${N}`;return He.has(Y)?true:be.hasSource(B,N)},listSources(B){let N=be.listSources(B),Y=new Set;for(let le of He.keys())le.startsWith(`${B}/`)&&Y.add(le.slice(`${B}/`.length));let he=new Set([...N,...Y]);return Array.from(he)}},et={cardStore:A(),cardRuntimeStore:$e,fetchedSourcesStore:lt,outputStore:F(),executionRequestStore:m},tt=[],kt=[],Ct=[],Ot=new Map,qt=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=$t(K,{handlers:{"card-handler":Rn(e,re,et,Lr,vt,(B,N)=>{kt.push({cardId:B,values:N});},B=>{Ct.push(B);})},onNodeRemoved:B=>{Ot.delete(B),qe.delete(B),delete Fe[B],qt.add(B);}});for(tt=oe;tt.length>0;){let B=tt;tt=[];for(let N of B)if(N.type==="task-restart"){let Y=et.cardStore.readCard(N.taskName);Y&&Ot.set(N.taskName,Y);}At.pushAll(B),await At.waitForHandlers();}let jt=At.getState();await At.dispose({wait:true});let pr=I().readSnapshot(e.value).version;f({lastDrainedJournalId:re,graph:yt(jt),runtimeByCardId:Fe},pr);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:Y}of We)be.commitSourceData(B,N,Y);let a;try{a=Rt(s,jt),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,Y]of Object.entries(B))N&&P.push({kind:"data_object",key:N,payload:Y});for(let[B,N]of Ot)P.push({kind:"card_refreshed",cardId:B,card:N});for(let B of qt)P.push({kind:"card_removed",cardId:B});a!==void 0&&P.push({kind:"status",status:a}),y(P);let O=c()??{howToRun:"built-in",whatToRun:ke({kind:"built-in",value:"source-cli-task-executor"})},G=t.supportsDirectSourceOutput?.(O)===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,Y=N.enrichedCard?.id??"unknown",he=N.enrichedCard?.source_defs??[];if(O.howToRun==="queue-storage"&&G){try{let le=t.queueStorageForRef(_(),"task-executor"),Te=typeof O.extra?.boardId=="string"?O.extra.boardId:void 0,Oe=[];for(let De of he){if(!De.outputFile){o(`[dispatch] source "${De.bindTo}" has no outputFile \u2014 skipping`);continue}let Q=t.genId(),de=`${Y}/.staged/${Q}/${De.outputFile}`,Ce=Ae.keyRef?.(de);if(!Ce)continue;let ge={ref:ke(Ce),deliveryToken:Q,outputFile:De.outputFile,cardId:Y},Ie=kn({cbk:N.callbackToken,rg:e.value,br:ke(e),cid:Y,b:De.bindTo,d:De.outputFile,cs:void 0,rqt:N.rqt,dt:ge.deliveryToken});Oe.push({...Te?{boardId:Te}:{},ref:O,args:{source_def:De,base_ref:ke(e),callback:n.createCallback(Ie),output:ge}});}Oe.length>0&&le.enqueueMany(Oe);}catch(le){vt(Y,le instanceof Error?le.message:String(le));}return}for(let le of he){if(!le.outputFile){o(`[dispatch] source "${le.bindTo}" has no outputFile \u2014 skipping`);continue}let Te;if(G){let De=t.genId(),Q=`${Y}/.staged/${De}/${le.outputFile}`,de=Ae.keyRef?.(Q);de&&(Te={ref:ke(de),deliveryToken:De,outputFile:le.outputFile,cardId:Y});}let Oe=kn({cbk:N.callbackToken,rg:e.value,br:ke(e),cid:Y,b:le.bindTo,d:le.outputFile,cs:void 0,rqt:N.rqt,...Te?{dt:Te.deliveryToken}:{}});t.dispatchExecution(O,{source_def:le,base_ref:ke(e),callback:n.createCallback(Oe),...Te?{output:Te}:{}}).catch(De=>vt(Y,De instanceof Error?De.message:String(De)));}});}function _(){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(_(),"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(_(),"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 W(){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{F().writeStatusSnapshot(Rt(s,ht(d().graph)));}catch{}return pe()}catch(m){return Re(m)}}function X(M){try{let m=F().readStatusSnapshot();if(!m){m=Rt(s,ht(d().graph));try{F().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=nr(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(),W()}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=rr(Ae),Fe=t.hashFn(be),qe=t.kvStorage("card-upsert"),$e=qe.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()}),qe.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=or(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 q(M){try{let m=M.params?.token;if(!m)return se("taskProgress requires params.token");let K=(M.body??{}).update??{},oe=or(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:qe,dt:$e}=K,We=Yt(H(),tt=>t.resolveBlob(tt)),He=$e||t.genId();$e||We.ingestSourceDataStaged(re,be,at(j),He);let lt=or(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:qe},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,qe=or(oe);return qe?(l({type:"task-progress",taskName:qe.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 Z(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 Pe(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=F().readDataObject(m);return pe(j)}catch(m){return Re(m)}}function ve(M){try{return pe(F().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=F().readComputedValues(m);return pe(j)}catch(m){return Re(m)}}function Ne(M){try{return pe(F().readAllComputedValues())}catch(m){return Re(m)}}function me(){return Yt(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=me().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=me(),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:X,getBoardRuntimeStoreRef:ae,getCardStoreRef:Z,getOutputsStoreRef:fe,getScratchStoreRef:we,getChatStoreRef:Pe,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:q,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 Zt(t.kvStorageForRef(r.boardRuntimeStoreRef))}return Zt(t.kvStorage("config"))};function s(){let F=o().readCardStoreRef();if(!F)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(F);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(F,c){let h=t.validateSchema(c),d=[],f=u();if(f&&Array.isArray(c.source_defs))for(let k of c.source_defs){let _=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(W){let te=W;if($=typeof te?.stdout=="string"?te.stdout:"",!$.trim()){d.push(`source "${_}": executor validate-source-def failed \u2014 ${W instanceof Error?W.message:String(W)}`);continue}}let J=JSON.parse($.trim());if(!J.ok&&Array.isArray(J.errors))for(let W of J.errors)d.push(`source "${_}": ${W}`);}catch($){d.push(`source "${_}": executor validate-source-def failed \u2014 ${$ instanceof Error?$.message:String($)}`);}}let l=[...h.errors,...d];return pe({cardId:F,isValid:l.length===0,issues:l})}function T(F,c){let h=F.params?.sourceIdx,d=F.params?.outRef;if(h===void 0)return se(`${c} requires params.sourceIdx`);if(!F.body||typeof F.body!="object"||Array.isArray(F.body))return se(`${c} requires card JSON object in body`);let f=F.body,l=f["card-content"]??f,k=f["mock-projections"]??{},_=l.source_defs??[];if(h<0||h>=_.length)return se(`sourceIdx ${h} out of range (card has ${_.length} source(s))`);let $=_[h],J=typeof $.bindTo=="string"?$.bindTo:"source";return {src:$,bindTo:J,outRef:d,mockProjections:k}}async function E(F){try{if(!F.body||typeof F.body!="object"||Array.isArray(F.body))return se("validateCardPreflight requires card JSON object in body");let c=F.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(F){try{let c=T(F,"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(F){try{let c=T(F,"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(F){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(F){try{let c=F.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["card-content"];if(!_)return se(`update op for "${k}" is missing "card-content"`);d.writeCard(k,_);}else return se(`Unknown op type: "${l??"(none)"}"`)}return pe()}catch(c){return Re(c)}}function I(F){try{let c=F.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(F){try{if(!F.body||typeof F.body!="object"||Array.isArray(F.body))return se("evalCardCompute requires a JSON object in body");let c=F.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 _={id:d,card_data:h.card_data??{},requires:l,source_defs:h.source_defs,compute:k},$=ze.runSync(_,{sourcesData:f}),J=$.node.computed_values??{},W=$.errors??[];return pe({cardId:d,ok:W.length===0,computed_values:J,errors:W})}catch(c){return Re(c)}}async function A(F){try{if(!F.body||typeof F.body!="object"||Array.isArray(F.body))return se("simulateCardCycle requires a JSON object in body");let c=F.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),_=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??{},W=[],te=[];if($.length>0){W=ze.enrichSourcesSync($,{card_data:J,requires:l});for(let H of W){let w=H.projections,b=H._projections;if(w&&b){for(let q of Object.keys(w))if(b[q]===void 0){let U=typeof H.bindTo=="string"?H.bindTo:"(unknown)";te.push({bindTo:U,key:q,error:`Projection "${q}" resolved to undefined`});}}}}let ie=[],X={...f},ee=c["task-executor-ref"],ne=(ee?.howToRun&&ee?.whatToRun?ee:void 0)??u();for(let H=0;H<W.length;H++){let w=W[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 q={...w},U=await t.invokeExecutor(ne,"run-source-preflight",{timeout:w.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(q)}),V=JSON.parse(U.trim());V.ok&&!Object.prototype.hasOwnProperty.call(f,b)&&Object.prototype.hasOwnProperty.call(V,"resultValue")&&(X[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:X});g=w.node.computed_values??{},L=w.errors??[];}let D=_.isValid&&te.length===0&&L.length===0&&ie.every(H=>H.reachable!==!1);return pe({cardId:d,ok:D,validation:_,source_probes:ie,projection_errors:te,fetched_sources:X,computed_values:g,compute_errors:L})}catch(c){return Re(c)}}return {validateCardPreflight:E,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 Ar(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function xr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Ar(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(Ar)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Ar(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 Ht(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Kt(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 sr(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 ar(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]:ar(s,o,r)}}function In(e){return {read:r=>e.read(r),get(r,n){return sr(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 sr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return sr(e.read(r),o=>e.write(r,xn(o??{},n)))},patch(r,n,o){return sr(e.read(r),s=>{let i=n.split(".").filter(Boolean);return e.write(r,ar(s??{},i,o))})}}}function ir(e){return In(e)}function ur(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 dr(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),E=ar(p,T,s),y=await e.writeCard(u.key,E);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 ye(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 cr(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 br(e,gn,()=>({_sources:{}}))}function Vo(e,t){return Qt(e,t)}function Ko(e){return zt(e)}function Ho(e,t){return Sr(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,E=p.card_data??{},y=p.source_defs??[],C=y.filter(X=>X.optionalForCompletionGating!==true),S=await r.cardRuntimeStore.readRuntime(T),R=false,I=async()=>{R&&(await r.cardRuntimeStore.writeRuntime(T,S),R=false);},x=X=>Tt(S._sources[X]),A=(X,ee)=>{S._sources[X]=Tt(ee),R=true;},F=i.taskState?.executionCount??0;if(S._lastExecutionCount!==F&&(S._sources={},S._lastExecutionCount=F,R=true),i.update){let X=i.update.outputFile;if(X){let ee=x(X);if(i.update.failure){let ne=i.update.rqt??ee.lastRequestedToken??ee.queueRequestedToken;ne&&A(X,_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,X,v):false;A(X,g?vr(ee,ne):_t(ee,ne));}}await I();}}let c={};for(let X of y){if(!X.outputFile)continue;let ee=await r.fetchedSourcesStore.readSourceData(T,X.outputFile);ee!==null&&(c[X.bindTo]=ee);}let h={};for(let[X,ee]of Object.entries(i.state??{}))if(ee!==null&&typeof ee=="object"&&!Array.isArray(ee)){let ne=ee[X];h[X]=ne!==void 0?ne:ee;}else h[X]=ee;let d={id:T,card_data:{...E},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(X=>({...X,boardDir:typeof X.boardDir=="string"&&X.boardDir?X.boardDir:e.value})):f},k=Qe(),_=i.update?void 0:k,$=C.filter(X=>{let ee=X.outputFile;if(typeof ee!="string"||!ee)return true;let ne=x(ee);_&&(ne={...ne,queueRequestedToken:_},A(ee,ne));let v=ne.queueRequestedToken??ne.lastRequestedToken??k;return Pt(ne,v)==="dispatch"});if(await I(),$.length>0){let X=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,X=true;}return X&&await I(),X&&(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(X=>{let ee=X.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 W=p.provides??[],te={};for(let{bindTo:X,ref:ee}of W)te[X]=ze.resolve(d,ee);return (s??(()=>{}))(te),y.filter(X=>{if(X.optionalForCompletionGating!==true)return false;let ee=x(X.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={}){Dt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),s=ke(e),i=null,u=r.boardRuntimeStoreRef,p=r.scratchStoreRef,T=r.taskExecutorRef,E=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=()=>Gt(Cr(()=>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 dr(ur(ir(g),t.hashFn),o)};async function F(){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 tr(v.values)}async function h(v,g){let L=await I().commitSnapshot(R,{schemaVersion:"v1",expectedVersion:g,deleteKeys:[],shallowMerge:er(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 _(){return t.blobStorageForRef(await k())}async function $(){return Vo(await _(),v=>t.resolveBlob(v))}async function J(v){let g=(await _()).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 W(){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 _(),D=await $(),H=await A(),w=await x(),b=new Map,q=new Map,U=[],V=[],Z=[],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;}},Pe={async readSourceData(m,j){let K=`${m}/${j}`;return q.has(K)?q.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{q.set(Ae,JSON.parse(be));}catch{q.set(Ae,be);}return U.push({cardId:m,outputFile:j,deliveryToken:K}),true},async hasSource(m,j){let K=`${m}/${j}`;return q.has(K)||await D.hasSource(m,j)},async listSources(m){let j=await D.listSources(m),K=[...q.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=$t(Se,{handlers:{"card-handler":Jo(e,ve,{cardStore:H,cardRuntimeStore:we,fetchedSourcesStore:Pe,executionRequestStore:v},(m,j)=>{Me.push({type:"task-completed",taskName:m,data:j,timestamp:Qe()});},(m,j)=>{V.push({cardId:m,values:j});},m=>{Z.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 me=Ne.getState();await Ne.dispose({wait:true}),await h({lastDrainedJournalId:ve,graph:yt(me),runtimeByCardId:ce},(await I().readSnapshot(R)).version);for(let{cardId:m,values:j}of V)await w.writeComputedValues(m,j);for(let m of Z)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,me);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 Z)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 qe of oe){if(!qe.outputFile)continue;let $e=t.genId(),We=`${K}/.staged/${$e}/${qe.outputFile}`,He=await Promise.resolve(L.keyRef?.(We));if(!He)continue;let lt={ref:ke(He),deliveryToken:$e,outputFile:qe.outputFile,cardId:K},et=Tn({cbk:j.callbackToken,rg:e.value,br:ke(e),cid:K,b:qe.bindTo,d:qe.outputFile,cs:void 0,rqt:j.rqt,dt:lt.deliveryToken});Fe.push({...be?{boardId:be}:{},ref:Ge,args:{source_def:qe,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 qe=t.genId(),$e=`${K}/.staged/${qe}/${re.outputFile}`,We=await Promise.resolve(L.keyRef?.($e));We&&(Ae={ref:ke(We),deliveryToken:qe,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 X();},g=await vn(t.lock,W,v);return _e({ran:g!==!1})}catch(v){return Ee(v)}}async function ie(){return i||(i=te().finally(()=>{i=null;}),i)}async function X(){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(){X();}return {async init(v){try{let g=v.params?.cardStoreRef;if(!g)return ye("init requires params.cardStoreRef");if(u=v.params?.boardRuntimeStoreRef,!u)return ye("init requires params.boardRuntimeStoreRef");let L=v.params?.outputsStoreRef;if(!L)return ye("init requires params.outputsStoreRef");let D=v.params?.queueStoreRef;if(!D)return ye("init requires params.queueStoreRef");let H=v.params?.fetchedSourcesStoreRef;if(!H)return ye("init requires params.fetchedSourcesStoreRef");if(p=v.params?.scratchStoreRef,!p)return ye("init requires params.scratchStoreRef");let w=v.params?.chatStoreRef;if(!w)return ye("init requires params.chatStoreRef");let b=v.params?.artifactsStoreRef;if(!b)return ye("init requires params.artifactsStoreRef");await F()||await h({lastDrainedJournalId:"",graph:yt(St(Ft)),runtimeByCardId:{}},null);let q=S();return await q.writeBoardRuntimeStoreRef(u),await q.writeCardStoreRef(g),await q.writeOutputsStoreRef(L),await q.writeQueueStoreRef(D),await q.writeFetchedSourcesStoreRef(H),await q.writeChatStoreRef(w),await q.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}):ye(`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}):ye(`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 ye("getConfig requires params.key");let L=S(),D;switch(g){case "task-executor":D=T??null;break;case "chat-handler-flow":D=E??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 ye(`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)):ye("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)):ye("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 ye("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 _()).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 q of b)H[w][q]=await J(`${w}/${q}`);}}return _e(H)}catch(g){return Ee(g)}},async addCardFiles(v){try{let g=v.params?.cardId;if(!g)return ye("addCardFiles requires params.cardId");let L=await A(),D=await L.readCard(g);if(!D)return ye(`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 ye("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:{},q=Array.isArray(b.files)?b.files:[],U=[...q,...w],V=w.map((ae,fe)=>({idx:q.length+fe,entry:ae}));await L.writeCard(g,{...D,card_data:{...b,files:U}});let Z=await this.cardRefreshedNotify({params:{cardId:g}});return Z.status!=="success"?Z:_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 ye("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})):ye(`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 ye("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()):ye("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 ye("upsertCard requires --card-id <id> or --all");let H=await A(),w=L?(await H.readAllCards()).map(q=>q.id):[g];for(let q of w)if(!await H.readCard(q))return ye(`Card "${q}" not found in board at ${e.value}`);let b=t.kvStorage("card-upsert");for(let q of w){let U=await H.readCard(q);if(!U)continue;let V=rr(U),Z=t.hashFn(V),ae=await b.read(q),fe=ae?.taskConfigHash!==Z;if(!(!fe&&!D)){if(fe){let we=ae?.blobRef??await H.readCardKey(q)??q;await l({type:"task-upsert",taskName:q,taskConfig:V,timestamp:Qe()}),await b.write(q,{blobRef:we,taskConfigHash:Z,updatedAt:Qe()});}D&&await l({type:"task-restart",taskName:q,timestamp:Qe()});}}return ne(),_e()}catch(g){return Ee(g)}},async taskFailed(v){try{let g=v.params?.token;if(!g)return ye("taskFailed requires params.token");let L=v.params?.error??"unknown error",D=cr(g);return D?(await l({type:"task-failed",taskName:D.taskName,error:L,timestamp:Qe()}),ne(),_e()):ye("Invalid callback token")}catch(g){return Ee(g)}},async taskProgress(v){try{let g=v.params?.token;if(!g)return ye("taskProgress requires params.token");let L=(v.body??{}).update??{},D=cr(g);return D?(await l({type:"task-progress",taskName:D.taskName,update:L,timestamp:Qe()}),ne(),_e()):ye("Invalid callback token")}catch(g){return Ee(g)}},async sourceDataFetched(v){try{let g=v.params?.token,L=v.params?.ref;if(!g)return ye("sourceDataFetched requires params.token");if(!L)return ye("sourceDataFetched requires params.ref");let D=Pn(g);if(!D)return ye("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=cr(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()):ye("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 ye("sourceDataFetchFailure requires params.token");let D=Pn(g);if(!D)return ye("Invalid source token");let H=cr(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()):ye("Invalid callback token embedded in source token")}catch(g){return Ee(g)}}}}function Ir(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Go(e){return {...Ir(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function Wo(e){return {...Ir(e),reason:e.reason}}function Tr(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(Ir)},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 E.append({params:{cardId:S},body:{role:y.role,text:y.text,files:y.files,turn:y.turn}});if(y.command==="read-all")return await E.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 E.readAfter({params:{cardId:S},body:{cursor:y.cursor??null}});if(y.command==="clear")return await E.clear({params:{cardId:S}});if(y.command==="set-processing")return await E.setProcessing({params:{cardId:S},body:{active:y.active}});if(y.command==="is-processing")return await E.isProcessing({params:{cardId:S}});if(y.command==="get-config")return await E.getConfig({params:{cardId:S}});if(y.command==="set-config"){let{command:R,cardId:I,...x}=y;return await E.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 E={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 F=await e.append(C,R,I,x,A);return s({id:F})}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,F=A===void 0?I||R?void 0:1:t(A);if(A!==void 0&&F===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=F;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 W=String(J.turn||"");f.has(W)||(f.set(W,[]),l.push(W)),f.get(W).push(J);}let k=l.findIndex(J=>J===x),_=Math.max(0,k-d);return h=(k===-1?[]:l.slice(_,k)).flatMap(J=>f.get(J)??[]),s({records:h})}return s(typeof F=="number"?{records:o(h,F)}:{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 E}function Ln(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Pr(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 _r(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)_r(e,n);return}r.kind==="status"&&Pr(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: ${
|
|
1
|
+
var ServerRuntimeControlface=(function(exports){'use strict';var ko=Object.defineProperty;var Co=(e,t,r)=>t in e?ko(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Qr=(e,t,r)=>Co(e,t+"",r);var Dt="b64:";function bo(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 So(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 `${Dt}${bo(JSON.stringify(e))}`}function at(e){if(!e.startsWith(Dt))throw new Error(`Invalid ref format (expected ${Dt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(So(e.slice(Dt.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 Wr(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function tt(e){return typeof e.journalStorage=="function"}function zr(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?at(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function ot(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wr(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 st(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function it(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 $t(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 Yr(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 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,c=s.status;if(c==="success")return Object.prototype.hasOwnProperty.call(s,"data")?o:{status:"success",data:{}};if(c==="fail"||c==="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 c=s.issues;if(Array.isArray(c)){let m=c.find(p=>typeof p=="string"&&p.trim());if(typeof m=="string")return `Validation failed: ${m}`}let u=s.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function vr(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,buildPublishedRuntimePayload:c,createMcpControlplaneToolRegistry:u,retriggerCard:m,applyCardAction:p,resolveChatHandlerTarget:R,sendCardFileDownloadResponse:S}=e;async function A(B,x,_){let I=B.method||"GET",y=_,d=y.pathname;try{if(I==="POST"&&d===`${t}/mcp-actions`){await s();let f=Date.now(),k=new Date(f).toISOString(),v=await n(B),O=typeof v.tool=="string"?v.tool.trim():"",M=v.args&&typeof v.args=="object"&&!Array.isArray(v.args)?v.args:{};if(!O)return r(x,400,{error:"tool is required"}),!0;let $=de(M,"card_id");if(!$)return r(x,400,{error:"MCP action requires card_id"}),!0;if(O==="retrigger-card"||O==="retrigger"){await m($);let ae=Date.now();return r(x,200,{status:"success",data:{ok:!0,cardId:$,actionType:O,requestReceivedAt:k,requestReceivedAtMs:f,responseSentAt:new Date(ae).toISOString(),responseSentAtMs:ae,responseStatus:200}}),!0}let J=it(M,"payload");if(O==="chat-send"&&!await R($)){let ae=Date.now();return r(x,409,{error:`chat handler is not configured for card: ${$}`,requestReceivedAt:k,requestReceivedAtMs:f,responseSentAt:new Date(ae).toISOString(),responseSentAtMs:ae,responseStatus:409}),!0}if(O==="chat-send"){let ae=typeof J["turn-id"]=="string"?J["turn-id"]:typeof J.turnId=="string"?J.turnId:typeof J.turn=="string"?J.turn:"";if(!ae||!String(ae).trim()){let ee=Date.now();return r(x,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${$}`,requestReceivedAt:k,requestReceivedAtMs:f,responseSentAt:new Date(ee).toISOString(),responseSentAtMs:ee,responseStatus:400}),!0}}await p($,O,J);let Z=Date.now();return r(x,200,{status:"success",data:{ok:!0,cardId:$,actionType:O,requestReceivedAt:k,requestReceivedAtMs:f,responseSentAt:new Date(Z).toISOString(),responseSentAtMs:Z,responseStatus:200}}),!0}if(I==="POST"&&d===`${t}/mcp-controlplane`){await s();let f=await n(B),k=typeof f.tool=="string"?f.tool.trim():"",v=f.args&&typeof f.args=="object"&&!Array.isArray(f.args)?f.args:{};if(!k)return r(x,400,{error:"tool is required"}),!0;try{let O=await mt(k,v,u());if(O&&typeof O=="object"&&!Array.isArray(O)){let M=O;if(M.status==="fail")return r(x,400,{error:rt(O,"Request failed")}),!0;if(M.status==="error")return r(x,500,{error:rt(O,"Internal error")}),!0}r(x,200,O);}catch(O){let M=typeof O?.statusCode=="number"?Number(O.statusCode):500,$=O instanceof Error?O.message:String(O);r(x,M,{error:$});}return !0}let i=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/retrigger$`));if(I==="POST"&&i){await s();let f=decodeURIComponent(i[1]);return await m(f),r(x,200,{ok:!0}),!0}let l=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/actions$`));if(I==="POST"&&l){await s();let f=decodeURIComponent(l[1]),k=Date.now(),v=new Date(k).toISOString(),O=await n(B),M=O?.actionType;if(M==="chat-send"&&!await R(f)){let J=Date.now();return r(x,409,{error:`chat handler is not configured for card: ${f}`,requestReceivedAt:v,requestReceivedAtMs:k,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:409}),!0}if(M==="chat-send"){let J=O?.payload??{},Z=typeof J["turn-id"]=="string"?J["turn-id"]:typeof J.turnId=="string"?J.turnId:typeof J.turn=="string"?J.turn:"";if(!Z||!String(Z).trim()){let ae=Date.now();return r(x,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${f}`,requestReceivedAt:v,requestReceivedAtMs:k,responseSentAt:new Date(ae).toISOString(),responseSentAtMs:ae,responseStatus:400}),!0}}await p(f,M,O?.payload);let $=Date.now();return r(x,200,{ok:!0,requestReceivedAt:v,requestReceivedAtMs:k,responseSentAt:new Date($).toISOString(),responseSentAtMs:$,responseStatus:200}),!0}let g=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/files/(\\d+)$`));if(I==="GET"&&g){let f=decodeURIComponent(g[1]),k=parseInt(g[2],10),v=y.searchParams.get("sn");return await S(x,f,k,v),!0}return !1}catch(i){let l=i?.statusCode||500;return r(x,l,{error:String(i?.message||i)}),true}}return {handleRuntimeApi:A}}function Ut(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`)}function wo(e){switch(e){case "computed_values":case "data_object":case "status":return "board-output";case "card_refreshed":case "card_removed":return "card-store";case "card_chats":case "chat_messages":return "chat-store";case "chat_processing":case "card_watchparty":return "hosted-runtime";case "message_enqueued":return "queue-storage"}}function vo(e){return e.category?e:{...e,category:wo(e.kind)}}function qe(e){return e.map(t=>vo(t))}function Ne(e){return {...e,category:e.category??"batch",notifications:qe(e.notifications)}}var gt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ye(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function yt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Xr(e){return e.tasks??{}}function Ar(e){return e?e.status===gt.FAILED||e.status===gt.INACTIVATED:false}function Zr(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function en(e){return e.maxExecutions}function tn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===gt.COMPLETED){let s=e.tasks[n];s&&Ye(s).forEach(u=>r.add(u));}return Array.from(r)}function rn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Ye(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function nn(e,t,r){let n=e.tasks[t]??Vt(),o={};if(r){let c=r.tasks[t],u=yt(c);for(let m of u)for(let[p,R]of Object.entries(r.tasks))if(Ye(R).includes(m)){let S=e.tasks[p];S?.lastDataHash&&(o[m]=S.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 on(e,t,r,n,o,s){let c=e.tasks[r]??Vt(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let m;n&&u.on&&u.on[n]?m=u.on[n]:m=Ye(u);let p=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let A=u.requires??[];for(let B of A)for(let[x,_]of Object.entries(t.tasks))if(Ye(_).includes(B)){let I=e.tasks[x];I?.lastDataHash&&(p[B]=I.lastDataHash);break}}let R={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:p,error:void 0},S=[...new Set([...e.availableOutputs,...m])];return {...e,tasks:{...e.tasks,[r]:R},availableOutputs:S,lastUpdated:new Date().toISOString()}}function an(e,t,r,n){let o=e.tasks[r]??Vt(),s=t.tasks[r];if(s?.retry){let m=o.retryCount+1;if(m<=s.retry.max_attempts){let p={...o,status:"not-started",retryCount:m,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:p},lastUpdated:new Date().toISOString()}}}let c={...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&&c.executionCount>=s.circuit_breaker.max_executions){let m=s.circuit_breaker.on_break;u=[...new Set([...u,...m])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:u,lastUpdated:new Date().toISOString()}}function sn(e,t,r,n){let o=e.tasks[t]??Vt(),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 un(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 Vt(){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]=dn();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 Ao(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:nn(n,t.taskName,r)};case "task-completed":return {config:r,state:on(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:an(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:sn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:un(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:Bo(n,t.action)};case "task-upsert":return xo(e,t.taskName,t.taskConfig);case "task-removal":return Io(e,t.taskName);case "node-requires-add":return To(e,t.nodeName,t.tokens);case "node-requires-remove":return Po(e,t.nodeName,t.tokens);case "node-provides-add":return _o(e,t.nodeName,t.tokens);case "node-provides-remove":return Eo(e,t.nodeName,t.tokens);default:return e}}function cn(e,t){return t.reduce((r,n)=>Ao(r,n),e)}function xo(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]:dn()},lastUpdated:new Date().toISOString()}}}function Io(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 To(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=yt(n),s=r.filter(c=>!o.includes(c));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function Po(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=yt(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function _o(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=r.filter(c=>!o.includes(c));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function Eo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function ht(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Rt(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 dn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Bo(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 Pt(e){let{config:t,state:r}=e,n=Xr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=Oo(n),c=tn(t,r.tasks),u=new Set([...c,...r.availableOutputs]),m=[],p=[],R=[],S=[];for(let[B,x]of Object.entries(n)){let _=r.tasks[B],I=Zr(x,t.settings),y=I!=="once";if(_?.status===gt.RUNNING||Ar(_))continue;let d=en(x);if(d!==void 0&&_&&_.executionCount>=d||x.circuit_breaker&&_&&_.executionCount>=x.circuit_breaker.max_executions||!y&&_?.status===gt.COMPLETED)continue;if(y&&_?.status===gt.COMPLETED){let k=yt(x),v=false;switch(I){case "data-changed":{k.length>0&&k.some(M=>{for(let[$,J]of Object.entries(n))if(Ye(J).includes(M)){let Z=r.tasks[$];if(!Z)continue;let ae=_.lastConsumedHashes?.[M];return Z.lastDataHash==null?Z.executionCount>_.lastEpoch:Z.lastDataHash!==ae}return false})||(v=true);break}case "epoch-changed":{k.length>0&&k.some(M=>{for(let[$,J]of Object.entries(n))if(Ye(J).includes(M)){let Z=r.tasks[$];if(Z&&Z.executionCount>_.lastEpoch)return true}return false})||(v=true);break}case "time-based":{let O=x.refreshInterval??0;if(O<=0){v=true;break}let M=_.completedAt;if(!M){v=true;break}(Date.now()-Date.parse(M))/1e3<O&&(v=true);break}case "manual":v=true;break}if(v)continue}let i=yt(x);if(i.length===0){m.push(B);continue}let l=[],g=[],f=[];for(let k of i){if(u.has(k))continue;let v=s[k]||[];v.length===0?l.push(k):v.every(M=>Ar(r.tasks[M]))?f.push({token:k,failedProducer:v[0]}):g.push(k);}l.length>0?R.push({taskName:B,missingTokens:l}):f.length>0?S.push({taskName:B,failedTokens:f.map(k=>k.token),failedProducers:[...new Set(f.map(k=>k.failedProducer))]}):g.length>0?p.push({taskName:B,waitingOn:g}):m.push(B);}let A={};if(m.length>1){let B=rn(m,n);for(let[x,_]of Object.entries(B))_.length>1&&(A[x]=_);}return {eligible:m,pending:p,unresolved:R,blocked:S,conflicts:A}}function Oo(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 _t=class{constructor(){Qr(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function xr(e){let t=Ir(e);return Fo(t)}function Ir(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Ir).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Ir(t[n])).join(",")+"}"}function Fo(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 qo(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 No(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 ln(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return qo(t)}function jo(e){try{let t=JSON.parse(No(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Kt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:s}=t,c=new _t,u="state"in e&&"config"in e?e:St(e),m=false,p=new Set,R=new Map(Object.entries(n)),S=new _t,A=false,B=false;function x(){if(!m){if(A){B=true;return}A=true;try{do B=!1,_();while(B)}finally{A=false;}}}function _(){let i=S.drain(),l=c.drain(),g=[...i,...l];if(g.length>0&&(u=cn(u,g),o)){for(let k of g)if(k.type==="task-removal")try{o(k.taskName);}catch(v){console.warn("[reactive] onNodeRemoved failed:",v instanceof Error?v.message:String(v));}}let f=Pt(u);g.length>0&&s?.(g,u,f);for(let k of f.eligible)d(k);for(let k of g)if(k.type==="task-progress"){let{taskName:v,update:O}=k;if(!u.config.tasks[v])continue;let $=u.state.tasks[v];if(!$||$.status!=="running")continue;let J=ln(v),Z=y(v,J,O).catch(ae=>{m||(S.append({type:"task-failed",taskName:v,error:ae.message??String(ae),timestamp:new Date().toISOString()}),x());}).finally(()=>{p.delete(Z);});p.add(Z);}}function I(i){let g=u.config.tasks[i].requires??[],f=new Map;for(let[v,O]of Object.entries(u.config.tasks))for(let M of O.provides??[])f.set(M,v);let k={};for(let v of g){let O=f.get(v);O?k[v]=u.state.tasks[O]?.data:k[v]=void 0;}return k}async function y(i,l,g){let f=u.config.tasks[i],k=f.taskHandlers??[],v=I(i);for(let O of k){let M=R.get(O);if(!M)throw new Error(`Handler '${O}' not found in registry (task '${i}')`);let $={nodeId:i,state:v,taskState:u.state.tasks[i],config:f,callbackToken:l,update:g};if(await M($)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${i}')`)}}function d(i){let g=u.config.tasks[i]?.taskHandlers;if(!g||g.length===0)return;S.append({type:"task-started",taskName:i,timestamp:new Date().toISOString()}),x();let f=ln(i),k=y(i,f).catch(v=>{m||(S.append({type:"task-failed",taskName:i,error:v.message??String(v),timestamp:new Date().toISOString()}),x());}).finally(()=>{p.delete(k);});p.add(k);}return {push(i){m||(i.type==="task-completed"&&i.data&&!i.dataHash&&(i={...i,dataHash:xr(i.data)}),c.append(i),x());},pushAll(i){if(!m){for(let l of i)l.type==="task-completed"&&l.data&&!l.dataHash?c.append({...l,dataHash:xr(l.data)}):c.append(l);x();}},resolveCallback(i,l,g){if(m)return;let f=jo(i);if(!f)return;let{taskName:k}=f;if(u.config.tasks[k]){if(g&&g.length>0)c.append({type:"task-failed",taskName:k,error:g.join("; "),timestamp:new Date().toISOString()});else {let v=l&&Object.keys(l).length>0?xr(l):void 0;c.append({type:"task-completed",taskName:k,data:l,dataHash:v,timestamp:new Date().toISOString()});}x();}},addNode(i,l){m||(c.append({type:"task-upsert",taskName:i,taskConfig:l,timestamp:new Date().toISOString()}),x());},removeNode(i){m||(c.append({type:"task-removal",taskName:i,timestamp:new Date().toISOString()}),x());},addRequires(i,l){m||(c.append({type:"node-requires-add",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},removeRequires(i,l){m||(c.append({type:"node-requires-remove",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},addProvides(i,l){m||(c.append({type:"node-provides-add",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},removeProvides(i,l){m||(c.append({type:"node-provides-remove",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},registerHandler(i,l){R.set(i,l);},unregisterHandler(i){R.delete(i);},retrigger(i){m||u.config.tasks[i]&&(c.append({type:"task-restart",taskName:i,timestamp:new Date().toISOString()}),x());},retriggerAll(i){if(!m){for(let l of i)u.config.tasks[l]&&c.append({type:"task-restart",taskName:l,timestamp:new Date().toISOString()});x();}},snapshot(){return ht(u)},getState(){return u},getSchedule(){return Pt(u)},async waitForHandlers(){p.size>0&&await Promise.allSettled([...p]);},async dispose(i){i?.wait&&p.size>0&&await Promise.allSettled([...p]),m=true;}}}function Ht(){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 Lo=Ht();Lo("./jsonata-sync.cjs");var Mo=Ht(),Jt=Mo("./jsonata-sync.cjs"),pn=Jt;function fn(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 gn(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 Do(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 Jt(o.expr).evaluate(n);gn(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function $o(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 c=pn(s.expr).evaluate(n);gn(e.computed_values,s.bindTo,c),n.computed_values=e.computed_values;}catch(c){let u=c instanceof Error?c.message:String(c);o.push({bindTo:s.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Uo(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Jt(e).evaluate(n)}function Vo(e,t){return t.startsWith("fetched_sources.")?fn(e._sourcesData??{},t.slice(16)):fn(e,t)}var mn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Ko=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Ho(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))Ko.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,c)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${c}]: must be an object`);else {let u=s;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${c}]: missing required "bindTo" property`):(n.has(u.bindTo)&&t.push(`source_defs[${c}]: bindTo "${u.bindTo}" is not unique across source_defs`),n.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${c}]: missing required "outputFile" property`):(o.has(u.outputFile)&&t.push(`source_defs[${c}]: outputFile "${u.outputFile}" is not unique across source_defs`),o.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${c}]: 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`):mn.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...mn].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 Jo(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,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=await Jt(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Go(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,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=pn(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Ge={run:Do,runSync:$o,eval:Uo,resolve:Vo,validate:Ho,enrichSources:Jo,enrichSourcesSync:Go};function Gt(e){return JSON.stringify(e)}function Qt(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 Wt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Tr(e,t){return Wt(e)?e.then(t):t(e)}function hn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Pr(e,t){return {readValues(n){let o=e(n);return Tr(o.listKeys(),s=>{let c=[...s].sort();if(c.length===0)return {version:null,values:{}};let u={},m=null;for(let p of c){let R=o.read(p);Wt(R)?m=(m??Promise.resolve()).then(async()=>{u[p]=await R;}):u[p]=R;}return m?m.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,s){let c=e(n),u=null;for(let m of s){let p=c.delete(m);Wt(p)&&(u=(u??Promise.resolve()).then(()=>p).then(()=>{}));}for(let[m,p]of Object.entries(o)){let R=c.write(m,p);Wt(R)&&(u=(u??Promise.resolve()).then(()=>R).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function zt(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 Tr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let s=hn(o.values,n);return Tr(e.writeValues(r,s,n.deleteKeys),c=>({ok:true,newVersion:c}))})}}}function yn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function Rn(e){return {readEntriesAfterCursor(t){let r=yn(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 yn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function kn(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 Yt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ut(e,t){return Yt(e)?e.then(t):t(e)}function _r(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);Yt(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function Qo(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function Wo(e,t){let r=e.match(t);return r?r[1]:null}function Cn(e,t,r){let n={},o=_r(e,s=>{let c=r(s);if(c)return ut(t(s),u=>{n[c]=u;})});return Yt(o)?o.then(()=>n):n}function Xt(e,t){return {readSourceData(r,n){return ut(e.read(`${r}/${n}`),Qo)},ingestSourceDataStaged(r,n,o,s){return ut(t(o),c=>e.write(`${r}/.staged/${s}/${n}`,c))},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,c=`${r}/${n}`;return e.renameKey(s,c)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return ut(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function Er(e,t){let r=(n,o)=>{try{let s=o(n);return Yt(s)?s.catch(c=>t(n,c instanceof Error?c.message:String(c))):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 ut(e.read(n),s=>e.write(n,[...s??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ut(e.read(n),s=>{let c=s;if(!(!c||c.length===0))return ut(_r(c,u=>r(u,o)),()=>e.delete(n))})}}}function Br(e,t,r){return {readRuntime(n){return ut(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function Zt(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return ut(e.listKeys("cards/"),t=>Cn(t,r=>e.read(r),r=>Wo(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return _r(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 ut(e.listKeys("data-objects/"),t=>Cn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function Ft(e,t){function r(){return e.readIndex()??{}}function n(o,s,c){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let m={...o},p=m;for(let R=0;R<u.length-1;R++){let S=u[R],A=p[S],B=A&&typeof A=="object"&&!Array.isArray(A)?{...A}:{};p[S]=B,p=B;}return p[u[u.length-1]]=c,m}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,c]of Object.entries(r())){if(!e.cardExists(c.key))continue;let u=e.readCard(c.key);u?o.push(u):t?.(`[card-store] could not read card "${s}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,c]of Object.entries(r()))o[s]=c.checksum;return o},changedSince(o){let s=r(),c=[];for(let[u,m]of Object.entries(s))o[u]!==m.checksum&&c.push(u);for(let u of Object.keys(o))s[u]||c.push(u);return c},validateUpsert(o,s){let c=r(),u=c[o],m=Object.entries(c).find(([,p])=>p.key===s);return u&&u.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:m&&m[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${m[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,c){let u=r(),m=c??u[o]?.key??e.defaultCardKey(o),p=e.writeCard(m,s);u[o]={key:m,checksum:p,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,s,c){let u=r(),m=u[o];if(!m||!e.cardExists(m.key))throw new Error(`card "${o}" not found`);let p=e.readCard(m.key);if(!p||typeof p!="object"||Array.isArray(p))throw new Error(`card "${o}" is not patchable`);let R=n(p,s,c),S=e.writeCard(m.key,R);u[o]={key:m.key,checksum:S,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let s=r(),c=s[o];c&&(e.removeCard(c.key),delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function er(e,t){return Xt(e,t)}function bn(e){return Rn(e)}var tr="v1",ct="board/graph",Sn="board/lastJournalProcessedId";function wn(e){return `cards/${e}/runtime`}function vn(e){return zt(e,tr)}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 Qt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Gt(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 An(e){return Zt(e)}function Et(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function zo(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Bt(e,t){return e?.lastRequestedToken?zo(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Or(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Ot(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function kt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=Pt(t),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let x of s.pending)u.set(x.taskName,x.waitingOn);for(let x of s.unresolved)u.set(x.taskName,x.missingTokens);for(let x of s.blocked)u.set(x.taskName,x.failedTokens);let m=new Map;for(let[x,_]of Object.entries(n))for(let I of _.requires??[]){let y=m.get(I)??[];y.push(x),m.set(I,y);}let p=o.sort().map(x=>{let _=r[x],I=n[x]??{requires:[],provides:[]};_.status==="completed"?c.completed+=1:_.status==="failed"?c.failed+=1:_.status==="in-progress"&&(c.in_progress+=1);let y=I.requires??[],d=I.provides??[],i=Object.keys(_.data??{}).sort(),l=y.filter(M=>t.state.availableOutputs.includes(M)),g=y.filter(M=>!t.state.availableOutputs.includes(M)),f=u.get(x)??g,k=new Set;for(let M of d)for(let $ of m.get(M)??[])$!==x&&k.add($);let v=_.failedAt,O=_.error?{message:_.error,code:"TASK_FAILED",at:v,source:"task-runtime"}:void 0;return {name:x,status:_.status,error:O,requires:y,requires_satisfied:l,requires_missing:g,provides_declared:d,provides_runtime:i,blocked_by:f,unblocks:Array.from(k).sort(),runtime:{attempt_count:_.executionCount??0,restart_count:_.retryCount??0,in_progress_since:_.status==="in-progress"?_.startedAt??null:null,last_transition_at:_.lastUpdated??null,last_completed_at:_.completedAt??null,last_restarted_at:_.startedAt??null,status_age_ms:_.lastUpdated?0:null}}});c.pending=s.pending.length,c.blocked=s.blocked.length,c.unresolved=s.unresolved.length;let R=p.map(x=>({name:x.name,fanOut:x.unblocks.length})).sort((x,_)=>_.fanOut-x.fanOut||x.name.localeCompare(_.name)),S=R.length>0?R[0]:{name:null,fanOut:0},A=new Set;for(let x of Object.values(n))for(let _ of x.requires??[])A.add(_);let B=0;for(let[x,_]of Object.entries(n)){let I=(_.requires??[]).length===0,d=(_.provides??[]).some(i=>(m.get(i)??[]).some(l=>l!==x));I&&!d&&(B+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:c.completed,eligible:s.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:B,topology:{edge_count:Array.from(A).length,max_fan_out_card:S.name,max_fan_out:S.fanOut}},cards:p}}function Yo(){return new Date().toISOString()}function xn(e,t,r,n,o,s,c){return async u=>{let m=[],p=r.cardStore.readCard(u.nodeId);if(!p)return "task-initiate-failure";let R=p.id,S=p.card_data??{},A=p.source_defs??[],B=A.filter(G=>G.optionalForCompletionGating!==true),x=r.cardRuntimeStore.readRuntime(R),_=false,I=()=>{_&&(r.cardRuntimeStore.writeRuntime(R,x),_=false);},y=G=>Et(x._sources[G]),d=(G,P)=>{x._sources[G]=Et(P),_=true;},i=u.taskState?.executionCount??0;if(x._lastExecutionCount!==i&&(x._sources={},x._lastExecutionCount=i,_=true),u.update){let G=u.update,P=G.outputFile;if(P){let C=y(P);if(G.failure){let K=G.rqt??C.lastRequestedToken??C.queueRequestedToken;K&&d(P,Ot(C,K));}else {let K=G.rqt;if(!C.lastCompletedToken||K>C.lastCompletedToken){let N=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,w=false;N&&(w=r.fetchedSourcesStore.commitSourceData(R,P,N)),w?d(P,Or(C,K)):d(P,Ot(C,K));}}I();}}let g={};for(let G of A)if(G.outputFile){let P=r.fetchedSourcesStore.readSourceData(R,G.outputFile);P!==null&&(g[G.bindTo]=P);}let f={};for(let[G,P]of Object.entries(u.state??{}))if(P!==null&&typeof P=="object"&&!Array.isArray(P)){let C=P[G];f[G]=C!==void 0?C:P;}else f[G]=P;let k={id:R,card_data:{...S},requires:f,source_defs:A,compute:p.compute};k._sourcesData=g,p.compute&&Ge.runSync(k,{sourcesData:g}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(R,k.computed_values??{});let v={...p},O=Ge.enrichSourcesSync(Array.isArray(p.source_defs)?p.source_defs:void 0,{card_data:p.card_data,requires:f}),M=e.value;v.source_defs=Array.isArray(O)?O.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:M})):O;let $=Yo(),J=u.update?void 0:$,Z=B.filter(G=>{let P=G.outputFile;if(typeof P!="string"||!P)return true;let C=y(P);J&&(C={...C,queueRequestedToken:J},d(P,C));let K=C.queueRequestedToken??C.lastRequestedToken??$,N=Bt(C,K);return N==="in-flight"?false:N==="dispatch"});if(I(),Z.length>0){let G=false,P=$;for(let C of Z){let K=C.outputFile;if(typeof K!="string"||!K)continue;let N=y(K),w=N.queueRequestedToken??$;d(K,{...N,lastRequestedToken:w}),P=w,G=true;}return G&&I(),G&&(m.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:v,callbackToken:u.callbackToken,rqt:P}}),r.executionRequestStore.appendEntries(t,m)),"task-initiated"}if(B.some(G=>{let P=G.outputFile;if(typeof P!="string"||!P)return false;let C=y(P),K=C.queueRequestedToken??C.lastRequestedToken??$;return Bt(C,K)==="in-flight"}))return "task-initiated";let ee=p.provides??[],X={};for(let{bindTo:G,ref:P}of ee)X[G]=Ge.resolve(k,P);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(X),A.filter(G=>{if(G.optionalForCompletionGating!==true)return false;let P=y(G.outputFile);return !P.lastRequestedToken||!P.lastCompletedToken?true:P.lastCompletedToken<=P.lastRequestedToken}).length>0&&m.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:v,callbackToken:u.callbackToken,rqt:$}}),n(u.nodeId,X),m.length>0&&r.executionRequestStore.appendEntries(t,m),"task-initiated"}}var qt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function nr(e){return {[ct]:e.graph,[Sn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function or(e){let t=e[ct],r=e[Sn],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 ar(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 sr(e,t={}){function r(p){return {status:"success",data:p}}function n(p){return {status:"fail",error:p}}function o(p){return {status:"error",error:p instanceof Error?p.message:String(p)}}async function s(p){let R=t.emitNotification;if(!R||p.length===0)return;let S=qe(p);if(S.length===1){await R(S[0]);return}await R(Ne({kind:"notification-batch",notifications:S}));}function c(p){let R=p.params?.id;if(R){let S=e.readCard(R);if(!S)throw new Error(`card "${R}" not found`);return [S]}return e.readAllCards()}function u(p){return Ne({kind:"notification-batch",notifications:qe(p.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function m(p){if(Array.isArray(p))return p;if(p&&typeof p=="object"){let R=p;return Array.isArray(R.files)?R.files:[p]}return null}return {get(p){try{return r({cards:c(p)})}catch(R){return o(R)}},buildNotificationBatch(p){try{return r(u(c(p)))}catch(R){return o(R)}},set(p){try{let R=p.body;if(R==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(R)?R:[R];for(let A of S){if(typeof A.id!="string")return n("each card must have a string `id` field");e.writeCard(A.id,A);}return s(S.map(A=>({kind:"card_refreshed",cardId:A.id,card:A}))),r({count:S.length})}catch(R){return o(R)}},del(p){try{let R=p.body?.ids??[],S=p.params?.id,A=S?[...R,S]:R;if(A.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of A)e.removeCard(B);return s(A.map(B=>({kind:"card_removed",cardId:B}))),r({count:A.length})}catch(R){return o(R)}},patch(p){try{let R=p.params?.id,S=p.params?.path;if(!R)return n("patch requires params.id");if(!S)return n("patch requires params.path");let A=p.body,B=A&&Object.prototype.hasOwnProperty.call(A,"value")?A.value:p.body;e.patchCard(R,S,B);let x=e.readCard(R);return x?(s([{kind:"card_refreshed",cardId:R,card:x}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},appendFiles(p){try{let R=p.params?.id;if(!R)return n("appendFiles requires params.id");let S=e.readCard(R);if(!S)return n(`card "${R}" not found`);let A=m(p.body);if(!A||A.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},x=Array.isArray(B.files)?B.files:[],_=[...x,...A],I=A.map((d,i)=>({idx:x.length+i,entry:d})),y=this.patch({params:{id:R,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:I})}catch(R){return o(R)}}}}function ge(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ie(e){return {status:"fail",error:e}}function Re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Xo(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 Pn(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 ir(e){try{let t=JSON.parse(Pn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function In(e){return Xo(JSON.stringify(e))}function Tn(e){try{let t=JSON.parse(Pn(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 Zo(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(c){try{e(s,c instanceof Error?c.message:String(c));}catch{}}t.delete(r);}}}}function _n(e,t,r={}){Ut(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),s=ke(e),c=r.boardRuntimeStoreRef,u=r.scratchStoreRef,m=r.taskExecutorRef,p=r.chatHandlerFlow,R=r.emitNotification??(L=>{if(!t.publishBoardChangeNotifications)return;let h=L.kind==="notification-batch"?L.notifications:[L];return t.publishBoardChangeNotifications(h)});function S(){if(!c)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return c}function A(L){if(L.length!==0)try{let h=qe(L),q=Ne({kind:"notification-batch",notifications:h}),V=R(q);V&&typeof V.catch=="function"&&V.catch(oe=>o(`[board-live-cards-public] emitNotification failed: ${oe instanceof Error?oe.message:String(oe)}`));}catch(h){o(`[board-live-cards-public] emitNotification failed: ${h instanceof Error?h.message:String(h)}`);}}function B(){let L=_().readCardStoreRef();if(!L)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let h=t.kvStorageForRef(L);return {readIndex(){return h.read("_index")},writeIndex(q){h.write("_index",q);},readCard(q){return h.read(q)},writeCard(q,V){return h.write(q,V),t.hashFn(V)},removeCard(q){h.delete(q);},cardExists(q){return h.read(q)!==null},defaultCardKey(q){return q}}}let x={readValues(L){let h=t.kvStorageForRef(S()),q=h.listKeys().sort();if(q.length===0)return {version:null,values:{}};let V={};for(let oe of q)V[oe]=h.read(oe);return {version:t.hashFn(V),values:V}},writeValues(L,h,q){let V=t.kvStorageForRef(S());for(let oe of q)V.delete(oe);for(let[oe,ne]of Object.entries(h))V.write(oe,ne);return t.hashFn(h)}},_=()=>rr(t.kvStorageForRef(S())),I=()=>vn(x),y=()=>bn(t.journalAdapterForRef(S())),d=()=>Ft(B(),o),i=()=>{let L=_().readOutputsStoreRef();if(!L)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return An(t.kvStorageForRef(L))};function l(){return m??_().readTaskExecutorRef()}function g(){return !!I().readSnapshot(e.value).values[ct]}function f(){let L=I().readSnapshot(e.value);if(!L.values[ct])throw new Error(`Board not initialized at ${e.value}`);return or(L.values)}function k(L,h){let q=I().commitSnapshot(e.value,{schemaVersion:tr,expectedVersion:h,commitId:t.genId(),committedAt:Xe(),deleteKeys:[],shallowMerge:nr(L)});if(!q.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${h??"null"} current=${q.currentVersion??"null"}`)}function v(L){y().appendEvent(L);}async function O(){let h=Zo((W,a)=>{let b=W.payload,U=(b?.enrichedCard??{}).id??b?.cardId??"unknown";v({type:"task-failed",taskName:U,error:a,timestamp:Xe()});}),q=f(),V=Rt(q.graph),{events:oe,newCursor:ne}=y().readEntriesAfterCursor(q.lastDrainedJournalId),he=N(),fe=er(he,W=>t.resolveBlob(W)),Ce={...q.runtimeByCardId},_e=new Map,He={readRuntime(W){return _e.get(W)??Ce[W]??{_sources:{}}},writeRuntime(W,a){_e.set(W,a),Ce[W]=a;}},Je=[],De=new Map,We={readSourceData(W,a){let b=`${W}/${a}`;return De.has(b)?De.get(b):fe.readSourceData(W,a)},ingestSourceDataStaged(W,a,b,E){fe.ingestSourceDataStaged(W,a,b,E);},commitSourceData(W,a,b){let E=`${W}/.staged/${b}/${a}`,U=he.read(E);if(U==null){let z=he.keyRef?.(E);z&&(U=t.resolveBlob(z));}if(U==null)return false;let H=`${W}/${a}`,re=U.trim();try{De.set(H,JSON.parse(re));}catch{De.set(H,re);}return Je.push({cardId:W,outputFile:a,deliveryToken:b}),true},hasSource(W,a){let b=`${W}/${a}`;return De.has(b)?true:fe.hasSource(W,a)},listSources(W){let a=fe.listSources(W),b=new Set;for(let U of De.keys())U.startsWith(`${W}/`)&&b.add(U.slice(`${W}/`.length));let E=new Set([...a,...b]);return Array.from(E)}},ze={cardStore:d(),cardRuntimeStore:He,fetchedSourcesStore:We,outputStore:i(),executionRequestStore:h},dt=[],At=[],xt=[],lt=new Map,It=new Set,jt=(W,a)=>{dt.push({type:"task-completed",taskName:W,data:a,timestamp:Xe()});},Lt=(W,a)=>{v({type:"task-failed",taskName:W,error:a,timestamp:Xe()});},bt=Kt(V,{handlers:{"card-handler":xn(e,ne,ze,jt,Lt,(W,a)=>{At.push({cardId:W,values:a});},W=>{xt.push(W);})},onNodeRemoved:W=>{lt.delete(W),_e.delete(W),delete Ce[W],It.add(W);}});for(dt=oe;dt.length>0;){let W=dt;dt=[];for(let a of W)if(a.type==="task-restart"){let b=ze.cardStore.readCard(a.taskName);b&<.set(a.taskName,b);}bt.pushAll(W),await bt.waitForHandlers();}let hr=bt.getState();await bt.dispose({wait:true});let Rr=I().readSnapshot(e.value).version;k({lastDrainedJournalId:ne,graph:ht(hr),runtimeByCardId:Ce},Rr);for(let{cardId:W,values:a}of At)ze.outputStore.writeComputedValues(W,a);for(let W of xt)ze.outputStore.writeDataObjects(W);for(let{cardId:W,outputFile:a,deliveryToken:b}of Je)fe.commitSourceData(W,a,b);let Tt;try{Tt=kt(s,hr),ze.outputStore.writeStatusSnapshot(Tt);}catch(W){o(`[board-live-cards-public] status publish failed: ${W instanceof Error?W.message:String(W)}`);}let pt=[];for(let{cardId:W,values:a}of At)pt.push({kind:"computed_values",cardId:W,values:a});for(let W of xt)for(let[a,b]of Object.entries(W))a&&pt.push({kind:"data_object",key:a,payload:b});for(let[W,a]of lt)pt.push({kind:"card_refreshed",cardId:W,card:a});for(let W of It)pt.push({kind:"card_removed",cardId:W});Tt!==void 0&&pt.push({kind:"status",status:Tt}),A(pt);let Ct=l()??{howToRun:"built-in",whatToRun:ke({kind:"built-in",value:"source-cli-task-executor"})},Mt=t.supportsDirectSourceOutput?.(Ct)===true;h.dispatchEntriesForJournalId(ne,W=>{if(W.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${W.taskKind}" \u2014 skipping`);return}let a=W.payload,b=a.enrichedCard?.id??"unknown",E=a.enrichedCard?.source_defs??[];if(Ct.howToRun==="queue-storage"&&Mt){try{let U=t.queueStorageForRef(M(),"task-executor"),H=typeof Ct.extra?.boardId=="string"?Ct.extra.boardId:void 0,re=[];for(let z of E){if(!z.outputFile){o(`[dispatch] source "${z.bindTo}" has no outputFile \u2014 skipping`);continue}let ue=t.genId(),Me=`${b}/.staged/${ue}/${z.outputFile}`,xe=he.keyRef?.(Me);if(!xe)continue;let $e={ref:ke(xe),deliveryToken:ue,outputFile:z.outputFile,cardId:b},kr=In({cbk:a.callbackToken,rg:e.value,br:ke(e),cid:b,b:z.bindTo,d:z.outputFile,cs:void 0,rqt:a.rqt,dt:$e.deliveryToken});re.push({...H?{boardId:H}:{},ref:Ct,args:{source_def:z,base_ref:ke(e),callback:n.createCallback(kr),output:$e}});}re.length>0&&U.enqueueMany(re);}catch(U){Lt(b,U instanceof Error?U.message:String(U));}return}for(let U of E){if(!U.outputFile){o(`[dispatch] source "${U.bindTo}" has no outputFile \u2014 skipping`);continue}let H;if(Mt){let z=t.genId(),ue=`${b}/.staged/${z}/${U.outputFile}`,Me=he.keyRef?.(ue);Me&&(H={ref:ke(Me),deliveryToken:z,outputFile:U.outputFile,cardId:b});}let re=In({cbk:a.callbackToken,rg:e.value,br:ke(e),cid:b,b:U.bindTo,d:U.outputFile,cs:void 0,rqt:a.rqt,...H?{dt:H.deliveryToken}:{}});t.dispatchExecution(Ct,{source_def:U,base_ref:ke(e),callback:n.createCallback(re),...H?{output:H}:{}}).catch(z=>Lt(b,z instanceof Error?z.message:String(z)));}});}function M(){let L=_().readQueueStoreRef();if(!L)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);return L}function $(){let L=t.queueStorageForRef(M(),"process-accumulated");L.enqueueIfAbsent?L.enqueueIfAbsent({boardRef:ke(e)},`process-accumulated:${ke(e)}`):L.enqueue({boardRef:ke(e)}),t.requestProcessAccumulated?.();}function J(){let L=t.queueStorageForRef(M(),"process-accumulated");for(;;){let h=L.lease({max:64,visibilityMs:1e3});if(h.length<=0)return;for(let q of h)L.ack(q.id,q.leaseToken);if(h.length<64)return}}async function Z(){try{let L=()=>{let q=f(),{events:V}=y().readEntriesAfterCursor(q.lastDrainedJournalId);V.length<=0||$();},h=await Wr(t.lock,O,L);return ge({ran:h!==!1})}catch(L){return Re(L)}}function ae(){$();}function ee(L){try{let h=L.params?.cardStoreRef;if(!h)return ie("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(c=L.params?.boardRuntimeStoreRef,!c)return ie("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!g()){let Ce=St(qt);k({lastDrainedJournalId:"",graph:ht(Ce),runtimeByCardId:{}},null);}let q=L.params?.outputsStoreRef;if(!q)return ie("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let V=L.params?.queueStoreRef;if(!V)return ie("init requires params.queueStoreRef \u2014 pass the queue store ref here");let oe=L.params?.fetchedSourcesStoreRef;if(!oe)return ie("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");if(u=L.params?.scratchStoreRef,!u)return ie("init requires params.scratchStoreRef \u2014 pass the scratch store ref here");let ne=L.params?.chatStoreRef;if(!ne)return ie("init requires params.chatStoreRef \u2014 pass the chat store ref here");let he=L.params?.artifactsStoreRef;if(!he)return ie("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let fe=_();fe.writeBoardRuntimeStoreRef(c),fe.writeCardStoreRef(h),fe.writeOutputsStoreRef(q),fe.writeQueueStoreRef(V),fe.writeFetchedSourcesStoreRef(oe),fe.writeChatStoreRef(ne),fe.writeArtifactsStoreRef(he);try{i().writeStatusSnapshot(kt(s,Rt(f().graph)));}catch{}return ge()}catch(h){return Re(h)}}function X(L){try{let h=i().readStatusSnapshot();if(!h){h=kt(s,Rt(f().graph));try{i().writeStatusSnapshot(h);}catch{}}return ge(h)}catch(h){return Re(h)}}function se(L){try{let h=L.params?.id;if(!h)return ie("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(h);}catch{}return v({type:"task-removal",taskName:h,timestamp:Xe()}),ae(),ge()}catch(h){return Re(h)}}function G(L){try{let h=L.params?.cardId;if(!h)return ie("addCardFiles requires params.cardId");let q=sr(d(),{emitNotification:R}).appendFiles({params:{id:h},body:L.body});return q.status!=="success"?q:ge({cardId:h,files_added:q.data.files_added,notified:!0})}catch(h){return Re(h)}}function P(L){try{let h=L.params?.id;return h?(v({type:"task-restart",taskName:h,timestamp:Xe()}),ae(),ge()):ie("retrigger requires params.id")}catch(h){return Re(h)}}async function C(L){return J(),Z()}function K(){let L=_().readFetchedSourcesStoreRef();if(!L)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return L}function N(){return t.blobStorageForRef(K())}function w(L){try{let h=L.params?.cardId,q=L.params?.all,V=!!L.params?.restart;if(!h&&!q)return ie("upsertCard requires --card-id <id> or --all");let oe=q?d().readAllCards().map(ne=>ne.id):[h];for(let ne of oe)if(!d().readCard(ne))return ie(`Card "${ne}" not found in board at ${e.value}`);for(let ne of oe){let he=d().readCard(ne),fe=ar(he),Ce=t.hashFn(fe),_e=t.kvStorage("card-upsert"),He=_e.read(ne),Je=He?.taskConfigHash!==Ce;if(!(!Je&&!V)){if(Je){let De=He?.blobRef??d().readCardKey(ne)??ne;v({type:"task-upsert",taskName:ne,taskConfig:fe,timestamp:Xe()}),_e.write(ne,{blobRef:De,taskConfigHash:Ce,updatedAt:Xe()});}V&&v({type:"task-restart",taskName:ne,timestamp:Xe()});}}return ae(),ge()}catch(h){return Re(h)}}function T(L){try{let h=L.params?.token;if(!h)return ie("taskFailed requires params.token");let q=L.params?.error??"unknown error",V=ir(h);return V?(v({type:"task-failed",taskName:V.taskName,error:q,timestamp:Xe()}),ae(),ge()):ie("Invalid callback token")}catch(h){return Re(h)}}function j(L){try{let h=L.params?.token;if(!h)return ie("taskProgress requires params.token");let V=(L.body??{}).update??{},oe=ir(h);return oe?(v({type:"task-progress",taskName:oe.taskName,update:V,timestamp:Xe()}),ae(),ge()):ie("Invalid callback token")}catch(h){return Re(h)}}function F(L){try{let h=L.params?.token,q=L.params?.ref;if(!h)return ie("sourceDataFetched requires params.token");if(!q)return ie("sourceDataFetched requires params.ref");let V=Tn(h);if(!V)return ie("Invalid source token");let{cbk:oe,cid:ne,b:he,d:fe,cs:Ce,rqt:_e,dt:He}=V,Je=er(N(),dt=>t.resolveBlob(dt)),De=He||t.genId();He||Je.ingestSourceDataStaged(ne,fe,at(q),De);let We=ir(oe);if(!We)return ie("Invalid callback token embedded in source token");let ze=Xe();return v({type:"task-progress",taskName:We.taskName,update:{bindTo:he,outputFile:fe,fetchedAt:ze,deliveryToken:De,sourceChecksum:Ce,rqt:_e},timestamp:ze}),ae(),ge()}catch(h){return Re(h)}}function D(L){try{let h=L.params?.token,q=L.params?.reason??"unknown";if(!h)return ie("sourceDataFetchFailure requires params.token");let V=Tn(h);if(!V)return ie("Invalid source token");let{cbk:oe,b:ne,d:he,cs:fe,rqt:Ce}=V,_e=ir(oe);return _e?(v({type:"task-progress",taskName:_e.taskName,update:{bindTo:ne,outputFile:he,failure:!0,reason:q,sourceChecksum:fe,rqt:Ce},timestamp:Xe()}),ae(),ge()):ie("Invalid callback token embedded in source token")}catch(h){return Re(h)}}function te(L){try{let h=_().readCardStoreRef();return h?ge({storeRef:h}):ie(`Board at ${e.value} has no card store configured`)}catch(h){return Re(h)}}function ce(L){try{return ge({storeRef:c??null})}catch(h){return Re(h)}}function le(L){try{let h=_().readOutputsStoreRef();return h?ge({storeRef:h}):ie(`Board at ${e.value} has no outputs store configured`)}catch(h){return Re(h)}}function ye(L){try{return ge({storeRef:u??null})}catch(h){return Re(h)}}function Pe(L){try{let h=_().readChatStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function Be(L){try{let h=_().readArtifactsStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function Se(L){try{let h=_().readFetchedSourcesStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function we(L){try{let h=L.params?.key;if(!h)return ie("getConfig requires params.key");let q=_(),V;switch(h){case "task-executor":V=m??null;break;case "chat-handler-flow":V=p??null;break;case "board-runtime-store-ref":V=q.readBoardRuntimeStoreRef();break;case "card-store-ref":V=q.readCardStoreRef();break;case "outputs-store-ref":V=q.readOutputsStoreRef();break;case "scratch-store-ref":V=u??null;break;case "chat-store-ref":V=q.readChatStoreRef();break;case "artifacts-store-ref":V=q.readArtifactsStoreRef();break;case "fetched-sources-store-ref":V=q.readFetchedSourcesStoreRef();break;default:return ie(`getConfig: unknown key "${h}"`)}return ge({value:V})}catch(h){return Re(h)}}function je(L){try{let h=L.params?.key;if(!h)return ie("getOutputsDataObject requires params.key");let q=i().readDataObject(h);return ge(q)}catch(h){return Re(h)}}function ve(L){try{return ge(i().readAllDataObjects())}catch(h){return Re(h)}}function Fe(L){try{let h=L.params?.key;if(!h)return ie("getOutputsComputedValues requires params.key");let q=i().readComputedValues(h);return ge(q)}catch(h){return Re(h)}}function Le(L){try{return ge(i().readAllComputedValues())}catch(h){return Re(h)}}function pe(){return er(N(),L=>t.resolveBlob(L))}function Ze(L){let h=N().keyRef?.(L);if(!h)throw new Error("configured fetched-sources store does not support keyRef");return ke(h)}function Ke(L){try{let h=L.params?.key;if(!h)return ie("getOutputsFetchedSources requires params.key");let q=pe().listSources(h),V={};for(let oe of q)V[oe]=Ze(`${h}/${oe}`);return ge(V)}catch(h){return Re(h)}}function Ue(L){try{let h=pe(),q=new Set;for(let oe of N().listKeys()){let ne=oe.indexOf("/");ne>0&&!oe.includes("/.staged/")&&q.add(oe.slice(0,ne));}let V={};for(let oe of q){let ne=h.listSources(oe);if(ne.length>0){V[oe]={};for(let he of ne)V[oe][he]=Ze(`${oe}/${he}`);}}return ge(V)}catch(h){return Re(h)}}function et(L){try{let h=d().readAllCards(),q=X({});if(q.status!=="success")return q;let V=ve({});if(V.status!=="success")return V;let oe=Le({});if(oe.status!=="success")return oe;let ne=oe.data,he={};for(let fe of h){let Ce=typeof fe?.id=="string"?fe.id:null;if(!Ce)continue;let _e=fe.card_data&&typeof fe.card_data=="object"&&!Array.isArray(fe.card_data)?fe.card_data:{};he[Ce]={schema_version:"v1",card_id:Ce,card_data:{..._e},computed_values:ne[Ce]&&typeof ne[Ce]=="object"?ne[Ce]:{}};}return ge({cardDefinitions:h,statusSnapshot:q.data,dataObjectsByToken:V.data,cardRuntimeById:he})}catch(h){return Re(h)}}return {init:ee,status:X,getBoardRuntimeStoreRef:ce,getCardStoreRef:te,getOutputsStoreRef:le,getScratchStoreRef:ye,getChatStoreRef:Pe,getArtifactsStoreRef:Be,getFetchedSourcesStoreRef:Se,getConfig:we,getOutputsDataObject:je,getAllOutputsDataObjects:ve,getOutputsComputedValues:Fe,getAllOutputsComputedValues:Le,getOutputsFetchedSources:Ke,getAllOutputsFetchedSources:Ue,buildSseOneShotPayload:et,removeCard:se,addCardFiles:G,retrigger:P,processAccumulatedEvents:C,upsertCard:w,taskFailed:T,taskProgress:j,sourceDataFetched:F,sourceDataFetchFailure:D}}function En(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 rr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return rr(t.kvStorage("config"))};function s(){let d=o().readCardStoreRef();if(!d)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let i=t.kvStorageForRef(d);return {readIndex(){return i.read("_index")},writeIndex(l){i.write("_index",l);},readCard(l){return i.read(l)},writeCard(l,g){return i.write(l,g),t.hashFn(g)},removeCard(l){i.delete(l);},cardExists(l){return i.read(l)!==null},defaultCardKey(l){return l}}}let c=()=>Ft(s(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function m(d,i){let l=t.validateSchema(i),g=[],f=u();if(f&&Array.isArray(i.source_defs))for(let v of i.source_defs){let O=typeof v.bindTo=="string"?v.bindTo:"(unknown)";try{let M;try{M=await t.invokeExecutor(f,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(v)});}catch(J){let Z=J;if(M=typeof Z?.stdout=="string"?Z.stdout:"",!M.trim()){g.push(`source "${O}": executor validate-source-def failed \u2014 ${J instanceof Error?J.message:String(J)}`);continue}}let $=JSON.parse(M.trim());if(!$.ok&&Array.isArray($.errors))for(let J of $.errors)g.push(`source "${O}": ${J}`);}catch(M){g.push(`source "${O}": executor validate-source-def failed \u2014 ${M instanceof Error?M.message:String(M)}`);}}let k=[...l.errors,...g];return ge({cardId:d,isValid:k.length===0,issues:k})}function p(d,i){let l=d.params?.sourceIdx,g=d.params?.outRef;if(l===void 0)return ie(`${i} requires params.sourceIdx`);if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return ie(`${i} requires card JSON object in body`);let f=d.body,k=f["card-content"]??f,v=f["mock-projections"]??{},O=k.source_defs??[];if(l<0||l>=O.length)return ie(`sourceIdx ${l} out of range (card has ${O.length} source(s))`);let M=O[l],$=typeof M.bindTo=="string"?M.bindTo:"source";return {src:M,bindTo:$,outRef:g,mockProjections:v}}async function R(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return ie("validateCardPreflight requires card JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)";return await m(g,l)}catch(i){return Re(i)}}async function S(d){try{let i=p(d,"probeSourcePreflight");if("status"in i)return i;let l=u();if(!l)return ie("No task-executor registered for this board");try{let g={...i.src,_projections:i.mockProjections},f=await t.invokeExecutor(l,"probe-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(g)}),k=JSON.parse(f.trim());return k.ok?ge({bindTo:i.bindTo,reachable:k.reachable,latencyMs:k.latencyMs,note:k.note}):ie(k.error??"Preflight probe failed")}catch{return ie("Executor does not support probe-source-preflight")}}catch(i){return Re(i)}}async function A(d){try{let i=p(d,"runSourcePreflight");if("status"in i)return i;let l=u();if(!l)return ie("No task-executor registered for this board");try{let g={...i.src,_projections:i.mockProjections},f=await t.invokeExecutor(l,"run-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(g)}),k=JSON.parse(f.trim());if(!k.ok)return ge({bindTo:i.bindTo,ok:!1,result:null,issues:[k.error??"Preflight run failed"]});if(i.outRef){let v=at(i.outRef);t.absoluteBlob.write(v.value,JSON.stringify(k.resultValue,null,2));}return ge({bindTo:typeof k.bindTo=="string"?k.bindTo:i.bindTo,ok:!0,result:k.resultValue??null,issues:[]})}catch(g){let f=g instanceof Error?g.message:String(g);return ge({bindTo:i.bindTo,ok:!1,result:null,issues:[f]})}}catch(i){return Re(i)}}async function B(d){try{let i=u();if(!i)return ie("No task-executor registered for this board");let l=await t.invokeExecutor(i,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return ge(JSON.parse(l.trim()))}catch(i){return Re(i)}}function x(d){try{let i=d.body;if(!i||!Array.isArray(i.ops))return ie("updatesInCardStore requires body.ops array");let l=i.ops,g=c();for(let f of l){let k=f.op,v=f.id;if(!v)return ie('op is missing "id"');if(k==="update"){let O=f["card-content"];if(!O)return ie(`update op for "${v}" is missing "card-content"`);g.writeCard(v,O);}else return ie(`Unknown op type: "${k??"(none)"}"`)}return ge()}catch(i){return Re(i)}}function _(d){try{let i=d.body;if(!i||!Array.isArray(i.ids))return ie("readFromCardStore requires body.ids array");let l=i.ids,g=c(),f=l.map(k=>({id:k,"card-content":g.readCard(k)}));return ge({cards:f})}catch(i){return Re(i)}}function I(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return ie("evalCardCompute requires a JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)",f=i["mock-fetched-sources"]??{},k=i["mock-requires"]??{},v=l.compute;if(!v||!Array.isArray(v)||v.length===0)return ge({cardId:g,ok:!0,computed_values:{},errors:[]});let O={id:g,card_data:l.card_data??{},requires:k,source_defs:l.source_defs,compute:v},M=Ge.runSync(O,{sourcesData:f}),$=M.node.computed_values??{},J=M.errors??[];return ge({cardId:g,ok:J.length===0,computed_values:$,errors:J})}catch(i){return Re(i)}}async function y(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return ie("simulateCardCycle requires a JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)",f=i["mock-fetched-sources"]??{},k=i["mock-requires"]??{},v=await m(g,l),O=v.status==="success"?{isValid:v.data.isValid,issues:v.data.issues}:{isValid:!1,issues:[v.status==="fail"?v.error:"internal error"]},M=l.source_defs??[],$=l.card_data??{},J=[],Z=[];if(M.length>0){J=Ge.enrichSourcesSync(M,{card_data:$,requires:k});for(let N of J){let w=N.projections,T=N._projections;if(w&&T){for(let j of Object.keys(w))if(T[j]===void 0){let F=typeof N.bindTo=="string"?N.bindTo:"(unknown)";Z.push({bindTo:F,key:j,error:`Projection "${j}" resolved to undefined`});}}}}let ae=[],ee={...f},X=i["task-executor-ref"],se=(X?.howToRun&&X?.whatToRun?X:void 0)??u();for(let N=0;N<J.length;N++){let w=J[N],T=typeof w.bindTo=="string"?w.bindTo:`source_${N}`;if(!se){ae.push({bindTo:T,skipped:!0,error:"No task executor configured"});continue}try{let j={...w},F=await t.invokeExecutor(se,"run-source-preflight",{timeout:w.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(j)}),D=JSON.parse(F.trim());D.ok&&!Object.prototype.hasOwnProperty.call(f,T)&&Object.prototype.hasOwnProperty.call(D,"resultValue")&&(ee[T]=D.resultValue),ae.push({bindTo:T,reachable:D.reachable,latencyMs:D.latencyMs,error:D.ok?void 0:D.error});}catch{ae.push({bindTo:T,skipped:!0,error:"Executor does not support run-source-preflight"});}}let G=l.compute,P={},C=[];if(G&&Array.isArray(G)&&G.length>0){let N={id:g,card_data:$,requires:k,source_defs:l.source_defs,compute:G},w=Ge.runSync(N,{sourcesData:ee});P=w.node.computed_values??{},C=w.errors??[];}let K=O.isValid&&Z.length===0&&C.length===0&&ae.every(N=>N.reachable!==!1);return ge({cardId:g,ok:K,validation:O,source_probes:ae,projection_errors:Z,fetched_sources:ee,computed_values:P,compute_errors:C})}catch(i){return Re(i)}}return {validateCardPreflight:R,probeSourcePreflight:S,runSourcePreflight:A,evalCardCompute:I,simulateCardCycle:y,describeTaskExecutorCapabilities:B,updatesInCardStore:x,readFromCardStore:_}}function ur(e,t={}){function r(p){return {status:"success",data:p}}function n(p){return {status:"fail",error:p}}function o(p){return {status:"error",error:p instanceof Error?p.message:String(p)}}async function s(p){let R=t.emitNotification;if(!R||p.length===0)return;let S=qe(p);if(S.length===1){await R(S[0]);return}await R(Ne({kind:"notification-batch",notifications:S}));}async function c(p){let R=p.params?.id;if(R){let S=await e.readCard(R);if(!S)throw new Error(`card "${R}" not found`);return [S]}return await e.readAllCards()}function u(p){return Ne({kind:"notification-batch",notifications:qe(p.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function m(p){if(Array.isArray(p))return p;if(p&&typeof p=="object"){let R=p;return Array.isArray(R.files)?R.files:[p]}return null}return {async get(p){try{return r({cards:await c(p)})}catch(R){return o(R)}},async buildNotificationBatch(p){try{return r(u(await c(p)))}catch(R){return o(R)}},async set(p){try{let R=p.body;if(R==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(R)?R:[R];for(let A of S){if(typeof A.id!="string")return n("each card must have a string `id` field");await e.writeCard(A.id,A);}return await s(S.map(A=>({kind:"card_refreshed",cardId:A.id,card:A}))),r({count:S.length})}catch(R){return o(R)}},async del(p){try{let R=p.body?.ids??[],S=p.params?.id,A=S?[...R,S]:R;if(A.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of A)await e.removeCard(B);return await s(A.map(B=>({kind:"card_removed",cardId:B}))),r({count:A.length})}catch(R){return o(R)}},async patch(p){try{let R=p.params?.id,S=p.params?.path;if(!R)return n("patch requires params.id");if(!S)return n("patch requires params.path");let A=p.body,B=A&&Object.prototype.hasOwnProperty.call(A,"value")?A.value:p.body;await e.patchCard(R,S,B);let x=await e.readCard(R);return x?(await s([{kind:"card_refreshed",cardId:R,card:x}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},async appendFiles(p){try{let R=p.params?.id;if(!R)return n("appendFiles requires params.id");let S=await e.readCard(R);if(!S)return n(`card "${R}" not found`);let A=m(p.body);if(!A||A.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},x=Array.isArray(B.files)?B.files:[],_=[...x,...A],I=A.map((d,i)=>({idx:x.length+i,entry:d})),y=await this.patch({params:{id:R,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:I})}catch(R){return o(R)}}}}async function Bn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Fr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function qr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Fr(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(Fr)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Fr(t),reason:t.reason}))}}}function On(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 Qt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Gt(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 ea(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function cr(e,t){return ea(e)?e.then(t):t(e)}function Fn(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]=Fn(r[n],o):r[n]=o;return r}function dr(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]:dr(s,o,r)}}function qn(e){return {read:r=>e.read(r),get(r,n){return cr(e.read(r),o=>{if(o===null)return null;let s=o;for(let c of n.split(".").filter(Boolean)){if(s===null||typeof s!="object"||Array.isArray(s))return null;s=s[c]??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 cr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return cr(e.read(r),o=>e.write(r,Fn(o??{},n)))},patch(r,n,o){return cr(e.read(r),s=>{let c=n.split(".").filter(Boolean);return e.write(r,dr(s??{},c,o))})}}}function lr(e){return qn(e)}function fr(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 mr(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 c=await e.readCard(s.key);c?n.push(c):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[c,u]of Object.entries(o))n[c]!==u.checksum&&s.push(c);for(let c of Object.keys(n))o[c]||s.push(c);return s},async validateUpsert(n,o){let s=await r(),c=s[n],u=Object.entries(s).find(([,m])=>m.key===o);return c&&c.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${c.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 c=await r(),u=s??c[n]?.key??e.defaultCardKey(n),m=await e.writeCard(u,o);c[n]={key:u,checksum:m,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async patchCard(n,o,s){let c=await r(),u=c[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let m=await e.readCard(u.key);if(!m||typeof m!="object"||Array.isArray(m))throw new Error(`card "${n}" is not patchable`);let p=String(o||"").split(".").filter(Boolean),R=dr(m,p,s),S=await e.writeCard(u.key,R);c[n]={key:u.key,checksum:S,updatedAt:new Date().toISOString()},await e.writeIndex(c);},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 be(e){return {status:"fail",error:e}}function Te(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Ve(){return new Date().toISOString()}function ta(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 pr(e){try{let t=JSON.parse(Ln(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Nn(e){return ta(JSON.stringify(e))}function jn(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 ra(e){return Br(e,wn,()=>({_sources:{}}))}function na(e,t){return Xt(e,t)}function oa(e){return Zt(e)}function aa(e,t){return Er(e,t)}function sa(e,t,r,n,o,s){return async c=>{let u=[],m=await r.cardStore.readCard(c.nodeId);if(!m)return "task-initiate-failure";let p=m.id,R=m.card_data??{},S=m.source_defs??[],A=S.filter(ee=>ee.optionalForCompletionGating!==true),B=await r.cardRuntimeStore.readRuntime(p),x=false,_=async()=>{x&&(await r.cardRuntimeStore.writeRuntime(p,B),x=false);},I=ee=>Et(B._sources[ee]),y=(ee,X)=>{B._sources[ee]=Et(X),x=true;},d=c.taskState?.executionCount??0;if(B._lastExecutionCount!==d&&(B._sources={},B._lastExecutionCount=d,x=true),c.update){let ee=c.update.outputFile;if(ee){let X=I(ee);if(c.update.failure){let se=c.update.rqt??X.lastRequestedToken??X.queueRequestedToken;se&&y(ee,Ot(X,se));}else {let se=c.update.rqt;if(!X.lastCompletedToken||se>X.lastCompletedToken){let G=typeof c.update.deliveryToken=="string"?c.update.deliveryToken:void 0,P=G?await r.fetchedSourcesStore.commitSourceData(p,ee,G):false;y(ee,P?Or(X,se):Ot(X,se));}}await _();}}let i={};for(let ee of S){if(!ee.outputFile)continue;let X=await r.fetchedSourcesStore.readSourceData(p,ee.outputFile);X!==null&&(i[ee.bindTo]=X);}let l={};for(let[ee,X]of Object.entries(c.state??{}))if(X!==null&&typeof X=="object"&&!Array.isArray(X)){let se=X[ee];l[ee]=se!==void 0?se:X;}else l[ee]=X;let g={id:p,card_data:{...R},requires:l,source_defs:S,compute:m.compute};g._sourcesData=i,m.compute&&Ge.runSync(g,{sourcesData:i}),(o??(()=>{}))(p,g.computed_values??{});let f=Ge.enrichSourcesSync(Array.isArray(m.source_defs)?m.source_defs:void 0,{card_data:m.card_data,requires:l}),k={...m,source_defs:Array.isArray(f)?f.map(ee=>({...ee,boardDir:typeof ee.boardDir=="string"&&ee.boardDir?ee.boardDir:e.value})):f},v=Ve(),O=c.update?void 0:v,M=A.filter(ee=>{let X=ee.outputFile;if(typeof X!="string"||!X)return true;let se=I(X);O&&(se={...se,queueRequestedToken:O},y(X,se));let G=se.queueRequestedToken??se.lastRequestedToken??v;return Bt(se,G)==="dispatch"});if(await _(),M.length>0){let ee=false,X=v;for(let se of M){let G=se.outputFile;if(typeof G!="string"||!G)continue;let P=I(G),C=P.queueRequestedToken??v;y(G,{...P,lastRequestedToken:C}),X=C,ee=true;}return ee&&await _(),ee&&(u.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:k,callbackToken:c.callbackToken,rqt:X}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(A.some(ee=>{let X=ee.outputFile;if(typeof X!="string"||!X)return false;let se=I(X),G=se.queueRequestedToken??se.lastRequestedToken??v;return Bt(se,G)==="in-flight"}))return "task-initiated";let J=m.provides??[],Z={};for(let{bindTo:ee,ref:X}of J)Z[ee]=Ge.resolve(g,X);return (s??(()=>{}))(Z),S.filter(ee=>{if(ee.optionalForCompletionGating!==true)return false;let X=I(ee.outputFile);return !X.lastRequestedToken||!X.lastCompletedToken?true:X.lastCompletedToken<=X.lastRequestedToken}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:k,callbackToken:c.callbackToken,rqt:v}}),n(c.nodeId,Z),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Mn(e,t,r={}){Ut(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),s=ke(e),c=r.emitNotification??(P=>{if(!t.publishBoardChangeNotifications)return;let C=P.kind==="notification-batch"?P.notifications:[P];return t.publishBoardChangeNotifications(C)}),u=null,m=r.boardRuntimeStoreRef,p=r.scratchStoreRef,R=r.taskExecutorRef,S=r.chatHandlerFlow;function A(){if(!m)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return m}function B(P){if(P.length!==0)try{let C=qe(P),K=Ne({kind:"notification-batch",notifications:C});return Promise.resolve(c(K)).catch(N=>{o(`[async-board-live-cards-public] emitNotification failed: ${N instanceof Error?N.message:String(N)}`);})}catch(C){o(`[async-board-live-cards-public] emitNotification failed: ${C instanceof Error?C.message:String(C)}`);return}}let x=()=>On(t.kvStorageForRef(A())),_=e.value,I=()=>zt(Pr(()=>t.kvStorageForRef(A()),t.hashFn),"v1"),y=async()=>{let P=await x().readOutputsStoreRef();if(!P)throw new Error(`Board at ${e.value} has no outputs store configured.`);return oa(t.kvStorageForRef(P))},d=async()=>{let P=await x().readCardStoreRef();if(!P)throw new Error(`Board at ${e.value} has no card store configured.`);let C=t.kvStorageForRef(P);return mr(fr(lr(C),t.hashFn),o)};async function i(){return !!(await I().readSnapshot(_)).values[ct]}async function l(){let P=await I().readSnapshot(_);if(!P.values[ct])throw new Error(`Board not initialized at ${e.value}`);return or(P.values)}async function g(P,C){let K=await I().commitSnapshot(_,{schemaVersion:"v1",expectedVersion:C,deleteKeys:[],shallowMerge:nr(P)});if(!K.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${C??"null"} current=${K.currentVersion??"null"}`)}let f=()=>kn(t.journalStorageForRef(A()));async function k(){return R??await x().readTaskExecutorRef()}async function v(P){await f().appendEvent(P);}async function O(){let P=await x().readFetchedSourcesStoreRef();if(!P)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return P}async function M(){return t.blobStorageForRef(await O())}async function $(){return na(await M(),P=>t.resolveBlob(P))}async function J(P){let C=(await M()).keyRef?.(P);if(!C)throw new Error("configured fetched-sources store does not support keyRef");let K=await Promise.resolve(C);return ke(K)}async function Z(){let P=aa(t.kvStorageForRef(A()),async(h,q)=>{let V=h.payload,ne=(V.enrichedCard??{}).id??V.cardId??"unknown";await v({type:"task-failed",taskName:ne,error:q,timestamp:Ve()});}),C=ra(t.kvStorageForRef(A())),K=await M(),N=await $(),w=await d(),T=await y(),j=new Map,F=new Map,D=[],te=[],ce=[],le=new Map,ye=new Set,Pe={async readRuntime(h){return j.get(h)??await C.readRuntime(h)},async writeRuntime(h,q){j.set(h,q),je[h]=q;}},Be={async readSourceData(h,q){let V=`${h}/${q}`;return F.has(V)?F.get(V):await N.readSourceData(h,q)},ingestSourceDataStaged(h,q,V,oe){return N.ingestSourceDataStaged(h,q,V,oe)},async commitSourceData(h,q,V){let oe=`${h}/.staged/${V}/${q}`,ne=await K.read(oe);if(ne==null){let Ce=await Promise.resolve(K.keyRef?.(oe));Ce&&(ne=await t.resolveBlob(Ce));}if(ne==null)return false;let he=`${h}/${q}`,fe=ne.trim();try{F.set(he,JSON.parse(fe));}catch{F.set(he,fe);}return D.push({cardId:h,outputFile:q,deliveryToken:V}),true},async hasSource(h,q){let V=`${h}/${q}`;return F.has(V)||await N.hasSource(h,q)},async listSources(h){let q=await N.listSources(h),V=[...F.keys()].filter(oe=>oe.startsWith(`${h}/`)).map(oe=>oe.slice(`${h}/`.length));return [...new Set([...q,...V])]}},Se=await l(),we=Rt(Se.graph),je={...Se.runtimeByCardId},{events:ve,newCursor:Fe}=await f().readEntriesAfterCursor(Se.lastDrainedJournalId),Le=ve,pe=Kt(we,{handlers:{"card-handler":sa(e,Fe,{cardStore:w,cardRuntimeStore:Pe,fetchedSourcesStore:Be,executionRequestStore:P},(h,q)=>{Le.push({type:"task-completed",taskName:h,data:q,timestamp:Ve()});},(h,q)=>{te.push({cardId:h,values:q});},h=>{ce.push(h);})},onNodeRemoved:h=>{le.delete(h),j.delete(h),delete je[h],ye.add(h);}});for(;Le.length>0;){let h=Le;Le=[];for(let q of h)if(q.type==="task-restart"){let V=await w.readCard(q.taskName);V&&le.set(q.taskName,V);}pe.pushAll(h),await pe.waitForHandlers();}let Ze=pe.getState();await pe.dispose({wait:true}),await g({lastDrainedJournalId:Fe,graph:ht(Ze),runtimeByCardId:je},(await I().readSnapshot(_)).version);for(let{cardId:h,values:q}of te)await T.writeComputedValues(h,q);for(let h of ce)await T.writeDataObjects(h);for(let[h,q]of j)await C.writeRuntime(h,q);for(let h of D)await N.commitSourceData(h.cardId,h.outputFile,h.deliveryToken);let Ke=kt(s,Ze);await T.writeStatusSnapshot(Ke);let Ue=[];for(let{cardId:h,values:q}of te)Ue.push({kind:"computed_values",cardId:h,values:q});for(let h of ce)for(let[q,V]of Object.entries(h))Ue.push({kind:"data_object",key:q,payload:V});for(let[h,q]of le)Ue.push({kind:"card_refreshed",cardId:h,card:q});for(let h of ye)Ue.push({kind:"card_removed",cardId:h});Ue.push({kind:"status",status:Ke}),await B(Ue);let et=await k();if(!et)return;let L=t.supportsDirectSourceOutput?.(et)===true;await P.dispatchEntriesForJournalId(Fe,async h=>{if(h.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${h.taskKind}" \u2014 skipping`);return}let q=h.payload,V=q.enrichedCard?.id??"unknown",oe=q.enrichedCard?.source_defs??[];if(et.howToRun==="queue-storage"&&L){try{let ne=await x().readQueueStoreRef();if(!ne)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let he=t.queueStorageForRef(ne,"task-executor"),fe=typeof et.extra?.boardId=="string"?et.extra.boardId:void 0,Ce=[];for(let _e of oe){if(!_e.outputFile)continue;let He=t.genId(),Je=`${V}/.staged/${He}/${_e.outputFile}`,De=await Promise.resolve(K.keyRef?.(Je));if(!De)continue;let We={ref:ke(De),deliveryToken:He,outputFile:_e.outputFile,cardId:V},ze=Nn({cbk:q.callbackToken,rg:e.value,br:ke(e),cid:V,b:_e.bindTo,d:_e.outputFile,cs:void 0,rqt:q.rqt,dt:We.deliveryToken});Ce.push({...fe?{boardId:fe}:{},ref:et,args:{source_def:_e,base_ref:ke(e),callback:n.createCallback(ze),output:We}});}Ce.length>0&&await he.enqueueMany(Ce);}catch(ne){await v({type:"task-failed",taskName:V,error:ne instanceof Error?ne.message:String(ne),timestamp:Ve()});}return}for(let ne of oe){if(!ne.outputFile)continue;let he;if(L){let _e=t.genId(),He=`${V}/.staged/${_e}/${ne.outputFile}`,Je=await Promise.resolve(K.keyRef?.(He));Je&&(he={ref:ke(Je),deliveryToken:_e,outputFile:ne.outputFile,cardId:V});}let fe=Nn({cbk:q.callbackToken,rg:e.value,br:ke(e),cid:V,b:ne.bindTo,d:ne.outputFile,cs:void 0,rqt:q.rqt,...he?{dt:he.deliveryToken}:{}}),Ce=await t.dispatchExecution(et,{source_def:ne,base_ref:ke(e),callback:n.createCallback(fe),...he?{output:he}:{}});Ce.dispatched||await v({type:"task-failed",taskName:V,error:Ce.error??"dispatch failed",timestamp:Ve()});}});}async function ae(){try{let P=async()=>{let K=await l(),{events:N}=await f().readEntriesAfterCursor(K.lastDrainedJournalId);N.length>0&&await X();},C=await Bn(t.lock,Z,P);return Ie({ran:C!==!1})}catch(P){return Te(P)}}async function ee(){return u||(u=ae().finally(()=>{u=null;}),u)}async function X(){let P=await x().readQueueStoreRef();if(!P)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let C=t.queueStorageForRef(P,"process-accumulated");C.enqueueIfAbsent?await C.enqueueIfAbsent({boardRef:ke(e)},`process-accumulated:${ke(e)}`):await C.enqueue({boardRef:ke(e)}),await t.requestProcessAccumulated?.();}async function se(){let P=await x().readQueueStoreRef();if(!P)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let C=t.queueStorageForRef(P,"process-accumulated");for(;;){let K=await C.lease({max:64,visibilityMs:1e3});if(K.length<=0)return;for(let N of K)await C.ack(N.id,N.leaseToken);if(K.length<64)return}}function G(){X();}return {async init(P){try{let C=P.params?.cardStoreRef;if(!C)return be("init requires params.cardStoreRef");if(m=P.params?.boardRuntimeStoreRef,!m)return be("init requires params.boardRuntimeStoreRef");let K=P.params?.outputsStoreRef;if(!K)return be("init requires params.outputsStoreRef");let N=P.params?.queueStoreRef;if(!N)return be("init requires params.queueStoreRef");let w=P.params?.fetchedSourcesStoreRef;if(!w)return be("init requires params.fetchedSourcesStoreRef");if(p=P.params?.scratchStoreRef,!p)return be("init requires params.scratchStoreRef");let T=P.params?.chatStoreRef;if(!T)return be("init requires params.chatStoreRef");let j=P.params?.artifactsStoreRef;if(!j)return be("init requires params.artifactsStoreRef");await i()||await g({lastDrainedJournalId:"",graph:ht(St(qt)),runtimeByCardId:{}},null);let F=x();return await F.writeBoardRuntimeStoreRef(m),await F.writeCardStoreRef(C),await F.writeOutputsStoreRef(K),await F.writeQueueStoreRef(N),await F.writeFetchedSourcesStoreRef(w),await F.writeChatStoreRef(T),await F.writeArtifactsStoreRef(j),await(await y()).writeStatusSnapshot(kt(s,Rt((await l()).graph))),Ie()}catch(C){return Te(C)}},async status(P){try{let C=await y(),K=await C.readStatusSnapshot();return K||(K=kt(s,Rt((await l()).graph)),await C.writeStatusSnapshot(K)),Ie(K)}catch(C){return Te(C)}},async getCardStoreRef(P){try{let C=await x().readCardStoreRef();return C?Ie({storeRef:C}):be(`Board at ${e.value} has no card store configured`)}catch(C){return Te(C)}},async getBoardRuntimeStoreRef(P){try{return Ie({storeRef:m??null})}catch(C){return Te(C)}},async getOutputsStoreRef(P){try{let C=await x().readOutputsStoreRef();return C?Ie({storeRef:C}):be(`Board at ${e.value} has no outputs store configured`)}catch(C){return Te(C)}},async getScratchStoreRef(P){try{return Ie({storeRef:p??null})}catch(C){return Te(C)}},async getChatStoreRef(P){try{return Ie({storeRef:await x().readChatStoreRef()})}catch(C){return Te(C)}},async getArtifactsStoreRef(P){try{return Ie({storeRef:await x().readArtifactsStoreRef()})}catch(C){return Te(C)}},async getFetchedSourcesStoreRef(P){try{return Ie({storeRef:await x().readFetchedSourcesStoreRef()})}catch(C){return Te(C)}},async getConfig(P){try{let C=P.params?.key;if(!C)return be("getConfig requires params.key");let K=x(),N;switch(C){case "task-executor":N=R??null;break;case "chat-handler-flow":N=S??null;break;case "board-runtime-store-ref":N=await K.readBoardRuntimeStoreRef();break;case "card-store-ref":N=await K.readCardStoreRef();break;case "outputs-store-ref":N=await K.readOutputsStoreRef();break;case "scratch-store-ref":N=p??null;break;case "chat-store-ref":N=await K.readChatStoreRef();break;case "artifacts-store-ref":N=await K.readArtifactsStoreRef();break;case "fetched-sources-store-ref":N=await K.readFetchedSourcesStoreRef();break;default:return be(`getConfig: unknown key "${C}"`)}return Ie({value:N})}catch(C){return Te(C)}},async getOutputsDataObject(P){try{let C=P.params?.key;return C?Ie(await(await y()).readDataObject(C)):be("getOutputsDataObject requires params.key")}catch(C){return Te(C)}},async getAllOutputsDataObjects(P){try{return Ie(await(await y()).readAllDataObjects())}catch(C){return Te(C)}},async getOutputsComputedValues(P){try{let C=P.params?.key;return C?Ie(await(await y()).readComputedValues(C)):be("getOutputsComputedValues requires params.key")}catch(C){return Te(C)}},async getAllOutputsComputedValues(P){try{return Ie(await(await y()).readAllComputedValues())}catch(C){return Te(C)}},async getOutputsFetchedSources(P){try{let C=P.params?.key;if(!C)return be("getOutputsFetchedSources requires params.key");let K=await(await $()).listSources(C),N={};for(let w of K)N[w]=await J(`${C}/${w}`);return Ie(N)}catch(C){return Te(C)}},async getAllOutputsFetchedSources(P){try{let C=await $(),K=await(await M()).listKeys(),N=new Set;for(let T of K){let j=T.indexOf("/");j>0&&!T.includes("/.staged/")&&N.add(T.slice(0,j));}let w={};for(let T of N){let j=await C.listSources(T);if(j.length!==0){w[T]={};for(let F of j)w[T][F]=await J(`${T}/${F}`);}}return Ie(w)}catch(C){return Te(C)}},async buildSseOneShotPayload(P){try{let C=await(await d()).readAllCards(),K=await this.status({});if(K.status!=="success")return K;let N=await this.getAllOutputsDataObjects({});if(N.status!=="success")return N;let w=await this.getAllOutputsComputedValues({});if(w.status!=="success")return w;let T=w.data,j={};for(let F of C){let D=typeof F?.id=="string"?F.id:null;if(!D)continue;let te=F.card_data&&typeof F.card_data=="object"&&!Array.isArray(F.card_data)?F.card_data:{};j[D]={schema_version:"v1",card_id:D,card_data:{...te},computed_values:T[D]&&typeof T[D]=="object"?T[D]:{}};}return Ie({cardDefinitions:C,statusSnapshot:K.data,dataObjectsByToken:N.data,cardRuntimeById:j})}catch(C){return Te(C)}},async addCardFiles(P){try{let C=P.params?.cardId;if(!C)return be("addCardFiles requires params.cardId");let N=await ur(await d(),{emitNotification:c}).appendFiles({params:{id:C},body:P.body});return N.status!=="success"?N:Ie({cardId:C,files_added:N.data.files_added,notified:!0})}catch(C){return Te(C)}},async removeCard(P){try{let C=P.params?.id;if(!C)return be("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(C);}catch{}return await v({type:"task-removal",taskName:C,timestamp:Ve()}),G(),Ie()}catch(C){return Te(C)}},async retrigger(P){try{let C=P.params?.id;return C?(await v({type:"task-restart",taskName:C,timestamp:Ve()}),G(),Ie()):be("retrigger requires params.id")}catch(C){return Te(C)}},async processAccumulatedEvents(P){return await se(),ee()},async upsertCard(P){try{let C=P.params?.cardId,K=P.params?.all,N=!!P.params?.restart;if(!C&&!K)return be("upsertCard requires --card-id <id> or --all");let w=await d(),T=K?(await w.readAllCards()).map(F=>F.id):[C];for(let F of T)if(!await w.readCard(F))return be(`Card "${F}" not found in board at ${e.value}`);let j=t.kvStorage("card-upsert");for(let F of T){let D=await w.readCard(F);if(!D)continue;let te=ar(D),ce=t.hashFn(te),le=await j.read(F),ye=le?.taskConfigHash!==ce;if(!(!ye&&!N)){if(ye){let Pe=le?.blobRef??await w.readCardKey(F)??F;await v({type:"task-upsert",taskName:F,taskConfig:te,timestamp:Ve()}),await j.write(F,{blobRef:Pe,taskConfigHash:ce,updatedAt:Ve()});}N&&await v({type:"task-restart",taskName:F,timestamp:Ve()});}}return G(),Ie()}catch(C){return Te(C)}},async taskFailed(P){try{let C=P.params?.token;if(!C)return be("taskFailed requires params.token");let K=P.params?.error??"unknown error",N=pr(C);return N?(await v({type:"task-failed",taskName:N.taskName,error:K,timestamp:Ve()}),G(),Ie()):be("Invalid callback token")}catch(C){return Te(C)}},async taskProgress(P){try{let C=P.params?.token;if(!C)return be("taskProgress requires params.token");let K=(P.body??{}).update??{},N=pr(C);return N?(await v({type:"task-progress",taskName:N.taskName,update:K,timestamp:Ve()}),G(),Ie()):be("Invalid callback token")}catch(C){return Te(C)}},async sourceDataFetched(P){try{let C=P.params?.token,K=P.params?.ref;if(!C)return be("sourceDataFetched requires params.token");if(!K)return be("sourceDataFetched requires params.ref");let N=jn(C);if(!N)return be("Invalid source token");let w=await $(),T=N.dt||t.genId();N.dt||await w.ingestSourceDataStaged(N.cid,N.d,at(K),T);let j=pr(N.cbk);return j?(await v({type:"task-progress",taskName:j.taskName,update:{bindTo:N.b,outputFile:N.d,fetchedAt:Ve(),deliveryToken:T,sourceChecksum:N.cs,rqt:N.rqt},timestamp:Ve()}),G(),Ie()):be("Invalid callback token embedded in source token")}catch(C){return Te(C)}},async sourceDataFetchFailure(P){try{let C=P.params?.token,K=P.params?.reason??"unknown";if(!C)return be("sourceDataFetchFailure requires params.token");let N=jn(C);if(!N)return be("Invalid source token");let w=pr(N.cbk);return w?(await v({type:"task-progress",taskName:w.taskName,update:{bindTo:N.b,outputFile:N.d,failure:!0,reason:K,sourceChecksum:N.cs,rqt:N.rqt},timestamp:Ve()}),G(),Ie()):be("Invalid callback token embedded in source token")}catch(C){return Te(C)}}}}async function ia(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Dn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=qe(n);if(s.length===1){await o(s[0]);return}await o(Ne({kind:"notification-batch",notifications:s}));}return {async enqueue(n){let o=await e.enqueue(n);return await r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},async enqueueMany(n){let o=await e.enqueueMany(n);return await r(o.map(s=>({kind:"message_enqueued",lane:t.lane,message:s}))),o},enqueueIfAbsent:e.enqueueIfAbsent?async(n,o)=>{let s=await e.enqueueIfAbsent(n,o);return s&&await r([{kind:"message_enqueued",lane:t.lane,message:s}]),s}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,s){return e.nack(n,o,s)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},async stage(n,o){return e.stage(n,o)},async commitStaged(n){let o=await e.commitStaged(n);if(o){let s=await ia(e,n);s&&await r([{kind:"message_enqueued",lane:t.lane,message:s}]);}return o},async discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Nr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ua(e){return {...Nr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function ca(e){return {...Nr(e),reason:e.reason}}function jr(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(ua)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(Nr)},peekDeadLetter(){return e.peekDeadLetter().map(ca)}}}function da(e,t){return e.peekActive().find(r=>r.id===t)}function $n(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=qe(n);if(s.length===1){await o(s[0]);return}await o(Ne({kind:"notification-batch",notifications:s}));}return {enqueue(n){let o=e.enqueue(n);return r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},enqueueMany(n){let o=e.enqueueMany(n);return r(o.map(s=>({kind:"message_enqueued",lane:t.lane,message:s}))),o},enqueueIfAbsent:e.enqueueIfAbsent?(n,o)=>{let s=e.enqueueIfAbsent(n,o);return s&&r([{kind:"message_enqueued",lane:t.lane,message:s}]),s}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,s){return e.nack(n,o,s)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},stage(n,o){return e.stage(n,o)},commitStaged(n){let o=e.commitStaged(n);if(o){let s=da(e,n);s&&r([{kind:"message_enqueued",lane:t.lane,message:s}]);}return o},discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Un(){return new Date().toISOString()}function Vn(e){return new TextEncoder().encode(e).byteLength}function la(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Kn(e){function t(r){let n=e.stat?la(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:Vn(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??Un(),s.size=s.size??Vn(n),s},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let c=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,c);}let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Un(),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 Hn(){function e(o,s){if(!Array.isArray(o))return [];let c=[];for(let u of o){if(!u||typeof u!="object")continue;let m=u;typeof m.stored_name=="string"&&c.push({name:typeof m.name=="string"?m.name:m.stored_name,stored_name:m.stored_name,size:typeof m.size=="number"&&Number.isFinite(m.size)?m.size:null,mime_type:typeof m.mime_type=="string"?m.mime_type:null,uploaded_at:typeof m.uploaded_at=="string"?m.uploaded_at:s||null,chat:m.chat===true});}return c}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let c=t(o);if(s.length===0)return o.files=c,c;let u=new Set(c.map(m=>m.stored_name));for(let m of s)u.has(m.stored_name)||(c.push(m),u.add(m.stored_name));return o.files=c,c}function n(o,s,c){let u=t(o);if(!Number.isInteger(s)||s<0||s>=u.length)return {ok:false,reason:"index_out_of_range"};let m=u[s];return !m||!m.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==m.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:m}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function Jn(e,t={}){let r=t.emitNotification;function n(y){let d=typeof y=="number"?y:Number(y);return Number.isInteger(d)&&d>0?d:null}function o(y,d){let i=d;for(let l=y.length-1;l>=0;l-=1)if(y[l]?.role==="user"&&(i-=1,i===0))return y.slice(l);return y}function s(y){return y.some(d=>typeof d?.turn=="string"&&d.turn!=="")}function c(y,d){if(d<=0)return [];if(!s(y))return o(y,d);let i=new Map,l=[];for(let f of y){let k=typeof f?.turn=="string"?f.turn:"";i.has(k)||(i.set(k,[]),l.push(k)),i.get(k).push(f);}return l.slice(Math.max(0,l.length-d)).flatMap(f=>i.get(f)??[])}function u(y){return {status:"success",data:y}}function m(y){return {status:"fail",error:y}}function p(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}function R(y){return {role:String(y.role||"system"),text:String(y.text||""),files:Array.isArray(y.files)?y.files:[],...typeof y.turn=="string"&&y.turn?{turn:y.turn}:{}}}async function S(y){if(!r||y.length===0)return;let d=qe(y);if(d.length===1){await r(d[0]);return}await r(Ne({kind:"notification-batch",notifications:d}));}async function A(y){let d=await e.readAll(y);return c(d,1).map(R)}async function B(y){let d=Date.now();return {kind:"card_chats",cardId:y,sentAt:new Date(d).toISOString(),sentAtMs:d,messages:await A(y),receiving:true,processing:await e.isProcessing(y)}}async function x(y,d="command envelope"){let i=typeof y.cardId=="string"?y.cardId:void 0;if(!y.command)return m(`chat-store: ${d} missing "command"`);if(!i)return m(`chat-store: ${d} missing "cardId"`);if(y.command==="append")return await I.append({params:{cardId:i},body:{role:y.role,text:y.text,files:y.files,turn:y.turn}});if(y.command==="read-all")return await I.readAll({params:{cardId:i},body:{lastUserTurns:y.lastUserTurns,tailTurns:y.tailTurns,turnId:y.turnId,allTurns:y.allTurns,tailTurnsBeforeId:y.tailTurnsBeforeId}});if(y.command==="read-after")return await I.readAfter({params:{cardId:i},body:{cursor:y.cursor??null}});if(y.command==="clear")return await I.clear({params:{cardId:i}});if(y.command==="set-processing")return await I.setProcessing({params:{cardId:i},body:{active:y.active}});if(y.command==="is-processing")return await I.isProcessing({params:{cardId:i}});if(y.command==="get-config")return await I.getConfig({params:{cardId:i}});if(y.command==="set-config"){let{command:l,cardId:g,...f}=y;return await I.setConfig({params:{cardId:i},body:f})}return m(`chat-store: unknown command "${String(y.command)}"`)}async function _(y){if(!Array.isArray(y.commands)||y.commands.length===0)return m('chat-store: command envelope must include a non-empty "commands" array');let d=[];for(let i=0;i<y.commands.length;i+=1){let l=y.commands[i];if(!l||typeof l!="object"||Array.isArray(l))return m(`chat-store: command envelope entry ${i} must be an object`);let g={cardId:y.cardId,...l},f=await x(g,`command envelope entry ${i}`);if(f.status!=="success")return f;d.push({index:i,command:String(g.command),data:f.data});}return u({results:d})}let I={async append(y){try{let d=y.params?.cardId;if(!d)return m("append requires params.cardId");let i=y.body??{},l=typeof i.role=="string"?i.role:"",g=typeof i.text=="string"?i.text:"",f=Array.isArray(i.files)?i.files:[],k=typeof i.turn=="string"?i.turn:"";if(!l)return m("append requires body.role");let v=await e.append(d,l,g,f,k);return await S([{kind:"chat_messages",cardId:d,messages:await A(d)}]),u({id:v})}catch(d){return p(d)}},async readAll(y){try{let d=y.params?.cardId;if(!d)return m("readAll requires params.cardId");let i=y.body??{},l=typeof i.turnId=="string"?i.turnId:"",g=i.allTurns===!0,f=typeof i.tailTurnsBeforeId=="string"?i.tailTurnsBeforeId:"",k=i.tailTurns===void 0?i.lastUserTurns:i.tailTurns,v=k===void 0?g||l?void 0:1:n(k);if(k!==void 0&&v===null)return m("readAll requires body.tailTurns (positive integer)");let O=await e.readAll(d),M=O.filter($=>!l||String($.turn||"")===l);if(f){let $=v;if(typeof $!="number"||!Number.isInteger($)||$<=0)return m("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let J=new Map,Z=[];for(let se of O){let G=String(se.turn||"");J.has(G)||(J.set(G,[]),Z.push(G)),J.get(G).push(se);}let ae=Z.findIndex(se=>se===f),ee=Math.max(0,ae-$);return M=(ae===-1?[]:Z.slice(ee,ae)).flatMap(se=>J.get(se)??[]),u({records:M})}return u(typeof v=="number"?{records:c(M,v)}:{records:M})}catch(d){return p(d)}},async buildSseOneShotBatch(y){try{let d=y.params?.cardId;if(!d)return m("buildSseOneShotBatch requires params.cardId");let i=y.body??{},l=typeof i.receiving=="boolean"?i.receiving:!0,g=await B(d);return u(Ne({kind:"notification-batch",notifications:[{...g,receiving:l}]}))}catch(d){return p(d)}},async readAfter(y){try{let d=y.params?.cardId;if(!d)return m("readAfter requires params.cardId");let l=(y.body??{}).cursor??null;return u(await e.readAfter(d,l))}catch(d){return p(d)}},async clear(y){try{let d=y.params?.cardId;return d?(await e.clear(d),u({ok:!0})):m("clear requires params.cardId")}catch(d){return p(d)}},async setProcessing(y){try{let d=y.params?.cardId;if(!d)return m("setProcessing requires params.cardId");let i=y.body??{};return typeof i.active!="boolean"?m("setProcessing requires body.active (boolean)"):(await e.setProcessing(d,i.active),await S([{kind:"chat_processing",cardId:d,active:i.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(d){return p(d)}},async isProcessing(y){try{let d=y.params?.cardId;return d?u({active:await e.isProcessing(d)}):m("isProcessing requires params.cardId")}catch(d){return p(d)}},async getConfig(y){try{let d=y.params?.cardId;return d?u({config:await e.getConfig(d)}):m("getConfig requires params.cardId")}catch(d){return p(d)}},async setConfig(y){try{let d=y.params?.cardId;if(!d)return m("setConfig requires params.cardId");let i=y.body??{};return await e.setConfig(d,i),u({ok:!0})}catch(d){return p(d)}},run:x,runBatch:_};return I}function wt(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function Gn(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(wt):[]:wt(e)?[e]:[]}function Qn(e,t,r){let n=0;return {accepted:e.filter(s=>{if(!wt(s))return n++,false;let c=s;return typeof c.sentAtMs=="number"&&t-c.sentAtMs>r?(n++,false):true}),rejected:n}}function zn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Lr(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 fa(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function Wn(e,t){if(t.kind==="status"){Lr(t.status)&&(e.status=t.status);return}if(t.kind==="computed_values"){e.computedValues[t.cardId]=t.values;return}if(t.kind==="data_object"){e.dataObjects[t.key]=t.payload;return}if(t.kind==="card_refreshed"){e.cards[t.cardId]=t.card;return}t.kind==="card_removed"&&(delete e.cards[t.cardId],delete e.computedValues[t.cardId]);}function Yn(e,t){if(fa(t)){for(let r of t.notifications)wt(r)&&Wn(e,r);return}wt(t)&&Wn(e,t);}function Mr(e){let t=new Map,r=0;function n(d){let i=JSON.stringify(d);return r++,`id: ${r}
|
|
2
|
+
data: ${i}
|
|
3
3
|
|
|
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 E(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),_=k!==(n.get(d)??false),$=l!==f;return $&&r.set(d,l),n.set(d,k),$||_}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(_=>({role:String(_.role||"system"),text:String(_.text||""),files:Array.isArray(_.files)?_.files:[],...typeof _.turn=="string"&&_.turn?{turn:_.turn}:{}})),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,_]of t.entries())_.subscribedChatCardIds.has(d)&&E(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(),E(d,{kind:"notification-batch",notifications:[await S(f,true)]}),true}function F(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 _ of t.keys())E(_,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:E,subscribeChat:A,unsubscribeChat:F,broadcastNotificationBatch:h,broadcastCardChats:R}}function Er(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 Fr(e,t){return Er(await e,t)}function Br(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 Or(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=ue(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=ue(c,"client_id");if(!h)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return h}function E(c){p(c);let h=T(c),d=ue(c,"channel_name"),f=ue(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=ue(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}=E(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=Br(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 Fr(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?Or(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 Er(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 F(c){let{cardId:h}=y(c),d=Br(c),f=await Fr(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=Or(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:F}}function Nn(e){let{boardId:t,boardContexts:r,readCardDefinitions:n,readChatRecords:o,getChatProcessing:s}=e;async function i(){let E=(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(E.length===0)return null;if(E.length===1)return E[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 E){let x=I,A=Array.isArray(x.cards)?x.cards:[];y.push(...A);for(let F of C)S[F]+=Number(x?.summary?.[F]||0);}let R=E[0];return {...R,cards:y,summary:{...R.summary||{},card_count:y.length,...S}}}async function u(){let E={},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];E[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];E[S]={schema_version:"v1",card_id:S,card_data:I?.card_data??{},computed_values:R??{}};}};for(let C of r)await y(C);return E}async function p(){let E={};for(let y of r){try{let C=await y.boardOps.getAllOutputsDataObjects({});if(C.status==="success"&&C.data&&typeof C.data=="object"){Object.assign(E,C.data);continue}}catch{}Object.assign(E,y.notification.dataObjects||{});}return E}async function T(){let E=await n(),y=await u(),C=await p(),S={};for(let I of E){if(!I?.id)continue;let x=I.id,A=y[x]||{},F={...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:F,computed_values:A.computed_values&&typeof A.computed_values=="object"?A.computed_values:{}};}let R={};for(let I of E){if(!I?.id)continue;let x=I.id;try{let A=await o(x),F=await s(x);(A.length>0||F)&&(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:F});}catch{}}return {boardId:t,cardDefinitions:E,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(E){let y=[];try{let C=await o(E);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(E,y,C,S){let R=t(E),I=r(E),x=zo(y),A=await u(E),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: ${E}`),{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(E,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(E,y,C,S),A=null;if(await s(E,F=>{let c=new Date().toISOString(),h=F.card_data&&typeof F.card_data=="object"?F.card_data:{};F.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),F}),I&&R?.suppressChatRecordWrite!==true){let F=typeof A=="number"&&A>=0?` #${A}`:"";await i(E,"system",`file uploaded: ${x.name} as ${x.stored_name}${F}`,[],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:ue(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=it(t,"tail_turns"),n=it(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(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:Mt(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:Mt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:ue(t,"card_id"),sourceIdx:Mt(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: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}:{}})},"stage-ai-failure-message":t=>{let r=ue(t,"turn_id"),n=ue(t,"failure");if(!r)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty turn_id"),{statusCode:400});if(!n)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty failure"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:ue(t,"card_id"),role:"system",text:n,turn:r})},"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 Vn(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 Kn(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(u,p){let T=ue(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),E=ue(u,"turn_id");return s(u,p),n().manageAddChatAttachment({cardId:T,role:ue(u,"role")||"user",...E?{turn:E}:{},files:[{file_name:ue(u,"file_name"),content_type:ue(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=ue(u,"card_id"),T=ue(u,"file_name"),E=ue(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,E,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=ue(u,"role")||"user",E=ue(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}:{},...E?{turn:E}:{},...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=ue(u,"board_id"),T=ue(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 je(e){return Array.isArray(e)?e:[]}function jr(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 qr(e,t){let r=z(e.view),n=je(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"?!!jr(t,i.visible):true,T=typeof u.bind=="string"?u.bind:void 0,E=typeof u.maxRows=="number"?u.maxRows:void 0,y=T?jr(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 E=="number"?y.slice(0,E):y),C})}}function Jn(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=je(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 E=jr(t,T);E!==void 0&&(s[p]=E);}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 lr(e){let t={...e};return delete t.__private,t}function fr(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 E=u[T];(!p[E]||typeof p[E]!="object")&&(p[E]={}),p=p[E];}p[u[u.length-1]]=i;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=z(r.view),i=je(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}=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,"/"),q=b+"=".repeat((4-b.length%4)%4),U=atob(q);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),q=je(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:q.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:je(V.requires),requires_satisfied:je(V.requires_satisfied),requires_missing:je(V.requires_missing),provides_declared:je(V.provides_declared),provides_runtime:je(V.provides_runtime)}})}}async function x(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let q=z(await nt(t.status({}),"status")),V=je(q.cards).map(z).find(me=>me.name===b);if(!V)throw new Error(`card "${b}" not found in board status`);let Z=z(await bt(n,b));if(Gn(Z))throw Object.assign(new Error(`card "${b}" not found`),{statusCode:404});let ae=lr(Z),fe=je(V.requires_satisfied).filter(me=>typeof me=="string"&&!!me),we=je(V.provides_runtime).filter(me=>typeof me=="string"&&!!me),Pe=Object.fromEntries(await Promise.all(fe.map(async me=>[me,await nt(t.getOutputsDataObject({params:{key:me}}),`getOutputsDataObject(${me})`)]))),Be=Object.fromEntries(await Promise.all(we.map(async me=>[me,await nt(t.getOutputsDataObject({params:{key:me}}),`getOutputsDataObject(${me})`)]))),Se=z(await nt(t.getOutputsComputedValues({params:{key:b}}),"getOutputsComputedValues")),ce=await nt(t.getOutputsFetchedSources({params:{key:b}}),"getOutputsFetchedSources"),Le=je(Z.source_defs).map(z),ve={};for(let me of Le)typeof me.bindTo=="string"&&typeof me.outputFile=="string"&&(ve[me.outputFile]=me.bindTo);let Me={};for(let[me,Ze]of Object.entries(ce)){let Ke=ve[me]??me;if(!E||typeof Ze!="string"){Me[Ke]=null;continue}try{Me[Ke]=E({cardId:b,ref:Ze});}catch{Me[Ke]=null;}}let Ne={card_data:z(Z.card_data),requires:Pe,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:Pe,provides:Be,computed_values:Se,rendered_view:qr(Z,Ne)}}}async function A(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("inspectChatMessagesOnCards requires cardId");let q=typeof w.turnId=="string"?w.turnId:"",U=w.allTurns===true,V=typeof w.tailTurnsBeforeId=="string"?w.tailTurnsBeforeId:"",Z=U?void 0:w.lastUserTurns??(q?void 0:1),ae=w.tail,fe={...Z===void 0?{}:{tailTurns:Z},...q?{turnId:q}:{},...U?{allTurns:true}:{},...V?{tailTurnsBeforeId:V}:{}},we=Object.keys(fe).length>0?{params:{cardId:b},body:fe}:{params:{cardId:b}},Pe=Ve(await o.readAll(we),"chatStore.readAll"),Be=z(await bt(n,b)),Se=je(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(Pe.records)?Pe.records:[]).map(ve=>{let Ne=z(ve.payload),me={...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}`;me.retrieval_hint=m,Object.keys(Ne).length>0&&typeof ve.role!="string"&&(me.payload={...Ne,retrieval_hint:m});}}return me});return {cardId:b,messages:typeof ae=="number"&&ae>=0?Le.slice(-ae):Le}}async function F(w){let b=String(w.cardId||"").trim(),q=Number(w.fileIdx);if(!b)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(q)||q<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let U=z(await bt(n,b)),V=je(z(U.card_data).files).map(z);if(q>=V.length)throw new Error(`attachment index ${q} is out of range for card "${b}"`);let Z=V[q],ae=typeof Z.stored_name=="string"?Z.stored_name:null;return {cardId:b,fileIdx:q,downloadUrl:T({cardId:b,fileIdx:q,storedName:ae}),...typeof Z.name=="string"?{name:Z.name}:{},...typeof Z.stored_name=="string"?{stored_name:Z.stored_name}:{},...typeof Z.mime_type=="string"?{mime_type:Z.mime_type}:{},...typeof Z.size=="number"?{size:Z.size}:{},...typeof Z.uploaded_at=="string"?{uploaded_at:Z.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 q=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(q.computed_values)};return {status:"success",data:{cardId:typeof q.cardId=="string"?q.cardId:typeof U.id=="string"?U.id:"(unknown)",ok:q.ok===true,computed_values:z(q.computed_values),errors:je(q.errors).map(Z=>{let ae=z(Z);return {bindTo:typeof ae.bindTo=="string"?ae.bindTo:"",error:typeof ae.error=="string"?ae.error:""}}),provides_outputs:Jn(U,V),rendered_view:qr(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 q=z(await bt(n,b)),U=je(q.source_defs).filter(Z=>!!Z&&typeof Z=="object"&&!Array.isArray(Z)),V={};if(w.sourceIdx>=0&&w.sourceIdx<U.length){let Z=U[w.sourceIdx],ae=ze.enrichSourcesSync([Z],{card_data:z(q.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":q,"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")),q=z(w.candidateCardContent),U=z(b.validation),V=je(b.source_probes),Z=je(b.projection_errors),ae=z(b.fetched_sources),fe=je(b.compute_errors),we=z(b.computed_values),Pe={card_data:z(q.card_data),requires:w.mockRequires,fetched_sources:ae,computed_values:we},Be=[];for(let Se of je(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 Z){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(q,Pe),rendered_view:qr(q,Pe)}}}async function _(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("manageReadCard requires cardId");let q=await nt(n.get({params:{id:b}}),"cardStore.get"),U=Array.isArray(q.cards)?q.cards.map(z):[];if(U.some(Gn))throw Object.assign(new Error(`Card "${b}" not found`),{statusCode:404});return U.map(V=>lr(V))}async function $(w){let b=await Promise.all(je(w.files).map(async q=>{let U=z(q),V=String(U.file_name??U.fileName??U.name??"").trim(),Z=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:Z,bytes:S(U),suppressChatRecordWrite:true})}));for(let[q,U]of b.entries()){let V=z(U.file),Z=typeof U.file_idx=="number"&&Number.isInteger(U.file_idx)&&U.file_idx>=0?U.file_idx:q,ae=w.role==="assistant"?`AI generated: ${String(V.name||"")} as ${String(V.stored_name||"")} #${Z}`:`file uploaded: ${String(V.name||"")} as ${String(V.stored_name||"")} #${Z}`;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(q=>q.file)}async function J(w){let b=String(w.cardId||"").trim(),q=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:q,turn:U,files:w.files});return {status:"success",data:{cardId:b,turn:U,files:V}}}async function W(w){let b=String(w.cardId||"").trim(),q=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(!q)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(q==="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(Pe=>Pe.role==="assistant"&&String(Pe.turn||"")===V):void 0;if(we)return {status:"success",data:{cardId:b,id:String(we.id),role:q,turn:V,files:Array.isArray(we.files)?we.files:[]}}}let Z=await $({cardId:b,role:q,turn:V,files:w.files}),ae=Ve(await o.append({params:{cardId:b},body:{role:q,text:U,files:Z,turn:V}}),"chatStore.append");return {status:"success",data:{cardId:b,id:String(ae.id),role:q,turn:V,files:Z}}}async function te(w){let b=String(w.cardId||"").trim(),q=z(w.patch);if(!b)throw new Error("managePatchCard requires cardId");let U=await _({cardId:b}),V=z(U[0]),ae={...es(V,q),...fr(V,"meta")?{meta:V.meta}:{},...fr(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 Pe=null;try{Pe=await t.cardRefreshedNotify({params:{cardId:b}}),Ve(Pe,"cardRefreshedNotify");}catch{Pe=null;}return {status:"success",data:{validation:null,card_saved:null,board_result:we,refresh_notify:Pe}}}async function ie(w){let b=String(w.cardId||"").trim(),q=z(w.candidateCardContent),U=lr(q);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}),Z=z(V),ae=z(Z.data);if(Z.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,Pe={...U,...we&&fr(we,"meta")?{meta:we.meta}:{},...we&&fr(we,"__private")?{__private:we.__private}:{}},Be=await n.set({body:Pe});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 X(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("manageRemoveCard requires cardId");let q=await t.removeCard({params:{id:b}});Ve(q,"removeCard");let U=await n.del({params:{id:b}});return Ve(U,"cardStore.del"),{status:"success",data:{board_result:q,store_result:U}}}async function ee(w){let b=String(w.cardId||"").trim();if(!b)throw new Error("adminReadCard requires cardId");let q=await nt(n.get({params:{id:b}}),"cardStore.get");return Array.isArray(q.cards)?q.cards.map(U=>z(U)):[]}async function ne(w){let b=String(w.cardId||"").trim(),q=z(w.candidateCardContent),U=lr(q);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}),Z=z(V),ae=z(Z.data);if(Z.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):{},Pe={...U,__private:{...we,visible_controlplane_only:true}},Be=await n.set({body:Pe});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 q=Hn(await o.isProcessing({params:{cardId:b}}),"chatStore.isProcessing");return {cardId:b,active:!!q.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(),q=String(w.ref||"").trim();if(!b)throw new Error("webhookSourceFetchDone requires token");if(!q)throw new Error("webhookSourceFetchDone requires ref");let U=await y(i,"webhook.source-fetch-done")({token:b,ref:q});return U?.status==="fail"||U?.status==="error"?U:{status:"success",data:{token:b,ref:q,runtime_result:Object.prototype.hasOwnProperty.call(U??{},"data")?U.data??null:null}}}async function H(w){let b=String(w.token||"").trim(),q=String(w.reason||"").trim();if(!b)throw new Error("webhookSourceFetchFailed requires token");if(!q)throw new Error("webhookSourceFetchFailed requires reason");let U=await y(u,"webhook.source-fetch-failed")({token:b,reason:q});return U?.status==="fail"||U?.status==="error"?U:{status:"success",data:{token:b,reason:q,runtime_result:Object.prototype.hasOwnProperty.call(U??{},"data")?U.data??null:null}}}return {listRuntimeCards:C,discoverSourceKinds:R,inspectBoardRuntimeStatus:I,inspectCardDefinitionAndRuntime:x,inspectChatMessagesOnCards:A,inspectFileContents:F,preflightValidateCandidateCardDefinition:c,preflightMaterializeCandidateCard:h,preflightProbeSingleSourceInCandidateCard:d,preflightRunSingleSourceInCandidateCard:f,preflightRunSingleSourceInLiveCard:l,preflightRunOneCycleWithCandidateCard:k,manageReadCard:_,manageAddChatAttachment:J,manageAddChatEntryAndAnyAttachments:W,managePatchCard:te,manageUpsertCard:ie,manageRemoveCard:X,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:E,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 _=await T(true);if(_.status!=="success")return _}return k}}}function F(){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 _=k,$=typeof _.id=="string"?_.id:"";if(!$)return {status:"fail",error:"each card must have a string `id` field"};let J=r.get($)??0,W=t[J]??x();if(!W)return {status:"fail",error:"Board context is unavailable"};let te=await W.cardStoreOps.set({body:_});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 _=await k.cardStoreOps.del({params:{id:l}});if(_.status!=="success")return _;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:F(),cardStore:c(),chatStore:S,processAccumulated:()=>T(true),sourceFetchDone:({token:d,ref:f})=>E(d,f),sourceFetchFailed:({token:d,reason:f})=>y(d,f),uploadCardFile({cardId:d,fileName:f,contentType:l,bytes:k,suppressChatRecordWrite:_}){return C(d,f,l,k,{inChat:true,..._===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:F,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 E(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),F=typeof A.tool=="string"?A.tool.trim():"",c=A.args&&typeof A.args=="object"&&!Array.isArray(A.args)?A.args:{};if(!F)return r(C,400,{error:"tool is required"}),!0;if(F==="inspect.file-contents")return r(C,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let h=await pt(F,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),F=typeof A.tool=="string"?A.tool.trim():"",c=A.args&&typeof A.args=="object"&&!Array.isArray(A.args)?A.args:{};if(!F)return r(C,400,{error:"tool is required"}),!0;if(F!=="inspect.file-contents")return r(C,400,{error:`Tool does not support raw response: ${F}`}),!0;let h=ue(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"),_=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,_].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",_]])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}),W=typeof J?.stored_name=="string"?J.stored_name:null,{fileRecord:te,bytes:ie}=await u(h,d,W),X=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||_!==void 0){let L=k??_;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:X,byteLength:g.length}),!0}return C.writeHead(200,{"Content-Type":ee,"Content-Disposition":`attachment; filename="${X}"`,"Content-Length":g.length}),C.end(g),!0}return !1}catch(A){let F=A?.statusCode||500;return r(C,F,{error:String(A?.message||A)}),true}}return {handleAgentfaceApi:E}}function Yn(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function i(u,p,T){let E=u.method||"GET",y=T.pathname;try{if(E==="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(E,y,C,S,R){if(!t.has(y)){n(E,404,{error:`SSE client not connected: ${y}`});return}R?i?.(y,C,S):u?.(y,C,S),n(E,200,{ok:true,clientId:y,channelName:C,...S.cardId?{cardId:S.cardId}:{},subscribed:R});}async function T(E,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(),F=t.buildFrame(A);if(y.write(F),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
|
|
4
|
+
`}function o(d){let i=d;try{i.flushHeaders?.();}catch{}try{i.flush?.();}catch{}try{i.socket?.setNoDelay?.(!0);}catch{}try{i.socket?.uncork?.();}catch{}}function s(d,i){let l=t.get(d);if(l&&!(i&&l.res!==i)){t.delete(d);try{e.onSseClientDisconnected?.(d);}catch{}try{l.res.end();}catch{}}}function c(d,i,l){let g=t.get(d);g&&s(d,g.res),t.set(d,{res:i,subscribedChatCardIds:l?.subscribedChatCardIds??new Set,subscribedChannelNames:l?.subscribedChannelNames??new Set,subscribedCardChannels:l?.subscribedCardChannels??new Map});}function u(d,i){let l=t.get(d);if(!l)return;let g=n(i);try{l.res.write(g),o(l.res);}catch{s(d,l.res);}}function m(d){return Ne({kind:"notification-batch",notifications:d})}async function p(d,i){let l=await e.buildChatOneShotBatch(d,i);return l.status==="success"?l.data:m([])}async function R(d,i){let l=t.get(d);return l?(l.subscribedChatCardIds.add(i),u(d,await p(i,true)),true):false}function S(d,i){let l=t.get(d);return l?(l.subscribedChatCardIds.delete(i),true):false}function A(d,i,l){let g=t.get(d);if(!g)return false;if(l){let f=g.subscribedCardChannels.get(l)??new Set;return f.add(i),g.subscribedCardChannels.set(l,f),true}return g.subscribedChannelNames.add(i),true}function B(d,i,l){let g=t.get(d);if(!g)return false;if(l){let f=g.subscribedCardChannels.get(l);return f&&(f.delete(i),f.size===0&&g.subscribedCardChannels.delete(l)),true}return g.subscribedChannelNames.delete(i),true}function x(d){return d.kind==="card_chats"||d.kind==="chat_messages"||d.kind==="chat_processing"}function _(d){return d.kind==="card_watchparty"}function I(d,i,l){return d.subscribedChannelNames.has(i)?true:!!d.subscribedCardChannels.get(l)?.has(i)}function y(d){if(!d||d.length===0)return;let i=[],l=new Map,g=new Map;for(let f of d)if(_(f)){let k=`${f.cardId}\0${f.channel}`,v=g.get(k)??[];v.push(f),g.set(k,v);}else if(x(f)){let k=l.get(f.cardId)??[];k.push(f),l.set(f.cardId,k);}else i.push(f);if(i.length>0){let f=m(i);for(let k of t.keys())u(k,f);}for(let[f,k]of l.entries()){let v=m(k);for(let[O,M]of t.entries())M.subscribedChatCardIds.has(f)&&u(O,v);}for(let[f,k]of g.entries()){let v=f.indexOf("\0"),O=v>=0?f.slice(0,v):"",M=v>=0?f.slice(v+1):f,$=m(k);for(let[J,Z]of t.entries())!O||!M||I(Z,M,O)&&u(J,$);}}return {size:()=>t.size,has:d=>t.has(d),get:d=>t.get(d),buildFrame:n,flushTransport:o,register:c,disconnect:s,writeFrame:u,subscribeChat:R,unsubscribeChat:S,subscribeChannel:A,unsubscribeChannel:B,broadcastNotificationBatch:y}}function Dr(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 $r(e,t){return Dr(await e,t)}function Ur(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 Vr(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 Xn(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:s,getMcpFacade:c,getMcpCardStoreFacade:u}=e;function m(i){let l=de(i,"board_id");if(!l)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(l!==t)throw Object.assign(new Error(`Unknown board_id: ${l}`),{statusCode:400})}function p(i){let l=de(i,"client_id");if(!l)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return l}function R(i){m(i);let l=p(i),g=de(i,"channel_name"),f=de(i,"card_id")||void 0;if(!g)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:l,channelName:g,...f?{cardId:f}:{}}}function S(i){m(i);let l=de(i,"card_id");if(!l)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:l}}async function A(i){await r();let{cardId:l}=S(i),g=p(i);if(!await n.subscribeChat(g,l))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:g,subscribed:true}}}async function B(i){await r();let{cardId:l}=S(i),g=p(i);if(!n.unsubscribeChat(g,l))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:g,subscribed:false}}}async function x(i,l){await r();let{clientId:g,channelName:f,cardId:k}=R(i);if(!n.has(g))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return l?(n.subscribeChannel(g,f,k),o?.(g,f,k?{cardId:k}:{})):(n.unsubscribeChannel(g,f,k),s?.(g,f,k?{cardId:k}:{})),{status:"success",data:{boardId:t,clientId:g,channelName:f,subscribed:l,...k?{cardId:k}:{}}}}async function _(i,l){let{cardId:g}=S(i);return await c().setChatProcessing({cardId:g,active:l}),{status:"success",data:{boardId:t,cardId:g,active:l}}}async function I(i){let{cardId:l}=S(i),g=await c().getChatProcessing({cardId:l});return {status:"success",data:{boardId:t,cardId:l,active:g.active}}}async function y(i){let{cardId:l}=S(i),g=Ur(i);if(!Object.prototype.hasOwnProperty.call(i,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(g.split(".").includes("visible_controlplane_only")){let f=await $r(u().get({params:{id:l}}),"cardStore.get"),k=Array.isArray(f.cards)&&f.cards.length>0&&typeof f.cards[0]=="object"&&!Array.isArray(f.cards[0])?f.cards[0]:null,v=k?Vr(k,"visible_controlplane_only").value:void 0;if(i.value!==v)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:l,key:g}}}return Dr(await u().patch({params:{id:l,path:`__private.${g}`},body:{value:i.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:l,key:g}}}async function d(i){let{cardId:l}=S(i),g=Ur(i),f=await $r(u().get({params:{id:l}}),"cardStore.get"),k=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(!k)throw Object.assign(new Error(`Card "${l}" not found`),{statusCode:404});let v=Vr(k,g);return {status:"success",data:{boardId:t,cardId:l,key:g,exists:v.exists,value:v.value}}}return {requireCardArgs:S,subscribeChat:A,unsubscribeChat:B,watchChannel:x,setChatProcessing:_,getChatProcessing:I,setCardMeta:y,getCardMeta:d}}function Zn(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e;function s(S){if(S.length===0)return null;if(S.length===1)return S[0];let A=[],B=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],x={};for(let I of B)x[I]=0;for(let I of S){let y=I,d=Array.isArray(y.cards)?y.cards:[];A.push(...d);for(let i of B)x[i]+=Number(y?.summary?.[i]||0);}let _=S[0];return {..._,cards:A,summary:{..._.summary||{},card_count:A.length,...x}}}async function c(){let S=[];for(let A of r)try{let B=await A.boardOps.buildSseOneShotPayload({});B.status==="success"&&B.data&&S.push(B.data);}catch{}return S}async function u(){let A=(await c()).map(B=>B.statusSnapshot).filter(Boolean);if(A.length===0){let B=r.map(x=>x.notification.status).filter(Boolean);return s(B)}return s(A)}async function m(){let S={},A=await c();for(let B of A)Object.assign(S,B.cardRuntimeById||{});if(Object.keys(S).length>0)return S;for(let B of r)for(let[x,_]of Object.entries(B.notification.computedValues)){let I=B.notification.cards[x];S[x]={schema_version:"v1",card_id:x,card_data:I?.card_data??{},computed_values:_??{}};}return S}async function p(){let S={},A=await c();for(let B of A)Object.assign(S,B.dataObjectsByToken||{});if(Object.keys(S).length===0)for(let B of r)Object.assign(S,B.notification.dataObjects||{});return S}async function R(){let S=await c(),A=S.flatMap(I=>Array.isArray(I.cardDefinitions)?I.cardDefinitions:[]),B={},x={};for(let I of S)Object.assign(B,I.dataObjectsByToken||{}),Object.assign(x,I.cardRuntimeById||{});let _={};for(let I of A){if(!I?.id)continue;let y=I.id;try{let d=await n(y),i=await o(y);(d.length>0||i)&&(_[y]={messages:d.map(l=>({role:String(l.role||"system"),text:String(l.text||""),files:Array.isArray(l.files)?l.files:[]})),receiving:!1,processing:i});}catch{}}return {boardId:t,cardDefinitions:A,statusSnapshot:await u(),dataObjectsByToken:B,cardRuntimeById:x,cardChatsByCardId:_}}return {readStatusSnapshot:u,readCardRuntimeArtifacts:m,readDataObjectsByToken:p,buildPublishedRuntimePayload:R}}function ma(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 eo(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:s,writeChatRecord:c}=e;async function u(R){let S=[];try{let A=await o(R);if(!A)return S;let B=n().read(A.card_data&&typeof A.card_data=="object"?A.card_data:null);for(let x of B)S.push(String(x.stored_name??""));}catch{}return S}async function m(R,S,A,B){let x=t(R),_=r(R),I=ma(S),y=await u(R),i=`${String(y.length+1).padStart(3,"0")}-${I}`.slice(-36);if(!_.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${R}`),{statusCode:500});return await _.files.putBytes(`${x}/${i}`,new Uint8Array(B),A||"application/octet-stream"),{name:I,stored_name:i,size:B.length,mime_type:A||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function p(R,S,A,B,x){if(!B.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let _=x?.inChat===true,I=await m(R,S,A,B),y=null;if(await s(R,d=>{let i=new Date().toISOString(),l=d.card_data&&typeof d.card_data=="object"?d.card_data:{};d.card_data=l;let g=n().normalizeIncoming([{name:I.name,stored_name:I.stored_name,size:I.size,mime_type:I.mime_type,uploaded_at:I.uploaded_at||i,chat:_}],i);return y=n().merge(l,g).findIndex(k=>k.stored_name===I.stored_name),d}),_&&x?.suppressChatRecordWrite!==true){let d=typeof y=="number"&&y>=0?` #${y}`:"";await c(R,"system",`file uploaded: ${I.name} as ${I.stored_name}${d}`,[],x?.turnId??"");}return {ok:true,file:{...I,...typeof y=="number"&&y>=0?{file_idx:y}:{},chat:_},...typeof y=="number"&&y>=0?{file_idx:y}:{}}}return {uploadCardFile:p,readCardStoredFileNames:u}}function to(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=st(t,"tail_turns"),n=st(t,"tail"),o=de(t,"turn_id"),s=t.all_turns===true,c=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}:{},...c?{tailTurnsBeforeId:c}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:de(t,"card_id"),fileIdx:Number(st(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:it(t,"mock_projections"),sourceIdx:$t(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:it(t,"mock_projections"),sourceIdx:$t(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:de(t,"card_id"),sourceIdx:$t(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:it(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}:{}})},"stage-ai-failure-message":t=>{let r=de(t,"turn_id"),n=de(t,"failure");if(!r)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty turn_id"),{statusCode:400});if(!n)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty failure"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:de(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:de(t,"card_id"),candidateCardContent:it(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:de(t,"card_id")})}}function ro(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 no(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(u,m){let p=de(u,"board_id");if(!p)throw Object.assign(new Error(`${m} requires board_id`),{statusCode:400});if(p!==t)throw Object.assign(new Error(`Unknown board_id: ${p}`),{statusCode:400})}function c(u,m){let{cardId:p}=o.requireCardArgs(u),R=de(u,"turn_id");return s(u,m),n().manageAddChatAttachment({cardId:p,role:de(u,"role")||"user",...R?{turn:R}:{},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 m=de(u,"card_id"),p=de(u,"file_name"),R=de(u,"content_type")||"application/octet-stream",S=Yr(u);if(s(u,"manage.upload-card-file"),!m)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!p)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!S)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(m,p,R,S,{inChat:false})},"manage.add-chat-attachment":u=>c(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>c(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:m}=o.requireCardArgs(u),p=de(u,"role")||"user",R=de(u,"turn_id");return s(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:m,role:p,...typeof u.text=="string"?{text:u.text}:{},...R?{turn:R}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.patch-card"),n().managePatchCard({cardId:m,patch:it(u,"patch")})},"manage.upsert-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.upsert-card"),n().manageUpsertCard({cardId:m,candidateCardContent:it(u,"candidate_card_content")})},"manage.remove-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.remove-card"),n().manageRemoveCard({cardId:m})},"manage.admin-read-card":async u=>{let{cardId:m}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:m})}}},"manage.admin-upsert-card":u=>{let m=de(u,"board_id"),p=de(u,"card_id");if(!m)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!p)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(m!==t)throw Object.assign(new Error(`Unknown board_id: ${m}`),{statusCode:400});return n().adminUpsertCard({cardId:p,candidateCardContent:it(u,"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 oo(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 Q(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Oe(e){return Array.isArray(e)?e:[]}function Hr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=Q(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 Kr(e,t){let r=Q(e.view),n=Oe(r.elements);return {layout:r.layout,features:r.features,elements:n.map((o,s)=>{let c=Q(o),u=Q(c.data),m=typeof c.visible=="string"?!!Hr(t,c.visible):true,p=typeof u.bind=="string"?u.bind:void 0,R=typeof u.maxRows=="number"?u.maxRows:void 0,S=p?Hr(t,p):void 0,A={id:typeof c.id=="string"&&c.id?c.id:`element-${s}`,kind:c.kind,label:c.label,visible:m};return S!==void 0&&(A.resolved=Array.isArray(S)&&typeof R=="number"?S.slice(0,R):S),A})}}function ao(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Oe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],s={};for(let c of o){let u=Q(c),m=typeof u.bindTo=="string"?u.bindTo:"",p=typeof u.ref=="string"?u.ref:"";if(!m||!p)continue;let R=Hr(t,p);R!==void 0&&(s[m]=R);}return s}function pa(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 ga(e){return {"card-content":e}}function gr(e){let t={...e};return delete t.__private,t}function yr(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function ya(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function ha(e,t){let r=ya(e);if(!t||Object.keys(t).length===0)return r;function n(o,s,c){let u=String(s||"").split(".").filter(Boolean);if(!u.length)return;let m=o;for(let p=0;p<u.length-1;p+=1){let R=u[p];(!m[R]||typeof m[R]!="object")&&(m[R]={}),m=m[R];}m[u[u.length-1]]=c;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=Q(r.view),c=Oe(s.elements);for(let u of c){let m=Q(Q(u).data);if(typeof m.writeTo=="string"&&m.writeTo){o=m.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...Q(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 so(e){return Q(e.__private).visible_controlplane_only===true}async function vt(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 io(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:s,sourceFetchDone:c,sourceFetchFailed:u,uploadCardFile:m,buildFileDownloadUrl:p,readFetchedSourceJsonByRef:R}=e;function S(w,T){if(typeof w=="function")return w;throw new Error(`${T} is not configured for this MCP facade`)}async function A(){let w=await nt(n.get({}),"cardStore.get");return Array.isArray(w.cards)?w.cards.map(T=>Q(T)):[]}function B(w){if(Array.isArray(w.bytes))return new Uint8Array(w.bytes.map(T=>Math.max(0,Math.min(255,Number(T)||0))));if(typeof w.text=="string")return new TextEncoder().encode(w.text);if(typeof w.base64=="string"){let T=String(w.base64).replace(/-/g,"+").replace(/_/g,"/"),j=T+"=".repeat((4-T.length%4)%4),F=atob(j);return Uint8Array.from(F,D=>D.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function x(){let w=Q(await nt(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:w.version,commonSourceFields:Q(w.commonSourceDefFields),sourceKinds:Q(w.sourceKinds)}}async function _(){let w=Q(await nt(t.status({}),"status")),T=Q(w.summary),j=Oe(w.cards);return {meta:Q(w.meta),summary:{card_count:typeof T.card_count=="number"?T.card_count:0,completed:typeof T.completed=="number"?T.completed:0,eligible:typeof T.eligible=="number"?T.eligible:0,pending:typeof T.pending=="number"?T.pending:0,blocked:typeof T.blocked=="number"?T.blocked:0,in_progress:typeof T.in_progress=="number"?T.in_progress:0,failed:typeof T.failed=="number"?T.failed:0,unresolved:typeof T.unresolved=="number"?T.unresolved:0},cards:j.map(F=>{let D=Q(F);return {"card-id":typeof D.name=="string"?D.name:null,status:D.status??null,error:D.error??null,requires:Oe(D.requires),requires_satisfied:Oe(D.requires_satisfied),requires_missing:Oe(D.requires_missing),provides_declared:Oe(D.provides_declared),provides_runtime:Oe(D.provides_runtime)}})}}async function I(w){let T=String(w.cardId||"").trim();if(!T)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let j=Q(await nt(t.status({}),"status")),D=Oe(j.cards).map(Q).find(pe=>pe.name===T);if(!D)throw new Error(`card "${T}" not found in board status`);let te=Q(await vt(n,T));if(so(te))throw Object.assign(new Error(`card "${T}" not found`),{statusCode:404});let ce=gr(te),le=Oe(D.requires_satisfied).filter(pe=>typeof pe=="string"&&!!pe),ye=Oe(D.provides_runtime).filter(pe=>typeof pe=="string"&&!!pe),Pe=Object.fromEntries(await Promise.all(le.map(async pe=>[pe,await nt(t.getOutputsDataObject({params:{key:pe}}),`getOutputsDataObject(${pe})`)]))),Be=Object.fromEntries(await Promise.all(ye.map(async pe=>[pe,await nt(t.getOutputsDataObject({params:{key:pe}}),`getOutputsDataObject(${pe})`)]))),Se=Q(await nt(t.getOutputsComputedValues({params:{key:T}}),"getOutputsComputedValues")),we=await nt(t.getOutputsFetchedSources({params:{key:T}}),"getOutputsFetchedSources"),je=Oe(te.source_defs).map(Q),ve={};for(let pe of je)typeof pe.bindTo=="string"&&typeof pe.outputFile=="string"&&(ve[pe.outputFile]=pe.bindTo);let Fe={};for(let[pe,Ze]of Object.entries(we)){let Ke=ve[pe]??pe;if(!R||typeof Ze!="string"){Fe[Ke]=null;continue}try{Fe[Ke]=R({cardId:T,ref:Ze});}catch{Fe[Ke]=null;}}let Le={card_data:Q(te.card_data),requires:Pe,fetched_sources:Fe,computed_values:Se};return {cardId:T,card_status_in_board:D,card_definition_and_static_data:ce,refs_for_fetched_source_files:we,runtime_data:{requires:Pe,provides:Be,computed_values:Se,rendered_view:Kr(te,Le)}}}async function y(w){let T=String(w.cardId||"").trim();if(!T)throw new Error("inspectChatMessagesOnCards requires cardId");let j=typeof w.turnId=="string"?w.turnId:"",F=w.allTurns===true,D=typeof w.tailTurnsBeforeId=="string"?w.tailTurnsBeforeId:"",te=F?void 0:w.lastUserTurns??(j?void 0:1),ce=w.tail,le={...te===void 0?{}:{tailTurns:te},...j?{turnId:j}:{},...F?{allTurns:true}:{},...D?{tailTurnsBeforeId:D}:{}},ye=Object.keys(le).length>0?{params:{cardId:T},body:le}:{params:{cardId:T}},Pe=Qe(await o.readAll(ye),"chatStore.readAll"),Be=Q(await vt(n,T)),Se=Oe(Q(Be.card_data).files).map((ve,Fe)=>({idx:Fe,stored_name:Q(ve).stored_name})).filter(ve=>typeof ve.stored_name=="string"&&ve.stored_name.length>0),je=(Array.isArray(Pe.records)?Pe.records:[]).map(ve=>{let Le=Q(ve.payload),pe={...ve},Ze=typeof ve?.role=="string"?ve.role:typeof Le.role=="string"?String(Le.role):"",Ke=typeof ve?.text=="string"?ve.text:typeof Le.text=="string"?String(Le.text):"";if(Ze==="system"){let Ue=pa(Ke);if(Ue!==null&&Se.some(L=>L.idx===Ue)){let L=`Retrieve using inspect-file-contents --card-id ${T} --file-idx ${Ue}`;pe.retrieval_hint=L,Object.keys(Le).length>0&&typeof ve.role!="string"&&(pe.payload={...Le,retrieval_hint:L});}}return pe});return {cardId:T,messages:typeof ce=="number"&&ce>=0?je.slice(-ce):je}}async function d(w){let T=String(w.cardId||"").trim(),j=Number(w.fileIdx);if(!T)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(j)||j<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let F=Q(await vt(n,T)),D=Oe(Q(F.card_data).files).map(Q);if(j>=D.length)throw new Error(`attachment index ${j} is out of range for card "${T}"`);let te=D[j],ce=typeof te.stored_name=="string"?te.stored_name:null;return {cardId:T,fileIdx:j,downloadUrl:p({cardId:T,fileIdx:j,storedName:ce}),...typeof te.name=="string"?{name:te.name}:{},...typeof te.stored_name=="string"?{stored_name:te.stored_name}:{},...typeof te.mime_type=="string"?{mime_type:te.mime_type}:{},...typeof te.size=="number"?{size:te.size}:{},...typeof te.uploaded_at=="string"?{uploaded_at:te.uploaded_at}:{}}}async function i(w){return await r.validateCardPreflight({body:ga(w.candidateCardContent)})}function l(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 T=r.evalCardCompute({body:{"card-content":w.candidateCardContent,"mock-requires":w.mockRequires,"mock-fetched-sources":w.mockFetchedSources}});if(T.status!=="success")return T;let j=Q(oo(T,"evalCardCompute")),F=Q(w.candidateCardContent),D={card_data:Q(F.card_data),requires:Q(w.mockRequires),fetched_sources:Q(w.mockFetchedSources),computed_values:Q(j.computed_values)};return {status:"success",data:{cardId:typeof j.cardId=="string"?j.cardId:typeof F.id=="string"?F.id:"(unknown)",ok:j.ok===true,computed_values:Q(j.computed_values),errors:Oe(j.errors).map(te=>{let ce=Q(te);return {bindTo:typeof ce.bindTo=="string"?ce.bindTo:"",error:typeof ce.error=="string"?ce.error:""}}),provides_outputs:ao(F,D),rendered_view:Kr(F,D)}}}async function g(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 k(w){let T=String(w.cardId||"").trim();if(!T)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!w.mockRequires||typeof w.mockRequires!="object"||Array.isArray(w.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let j=Q(await vt(n,T)),F=Oe(j.source_defs).filter(te=>!!te&&typeof te=="object"&&!Array.isArray(te)),D={};if(w.sourceIdx>=0&&w.sourceIdx<F.length){let te=F[w.sourceIdx],ce=Ge.enrichSourcesSync([te],{card_data:Q(j.card_data),requires:w.mockRequires});Array.isArray(ce)&&ce.length>0&&(D=Q(ce[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:w.sourceIdx},body:{"card-content":j,"mock-requires":w.mockRequires,"mock-projections":D}})}async function v(w){let T=Q(await nt(r.simulateCardCycle({body:{"card-content":w.candidateCardContent,"mock-requires":w.mockRequires}}),"simulateCardCycle")),j=Q(w.candidateCardContent),F=Q(T.validation),D=Oe(T.source_probes),te=Oe(T.projection_errors),ce=Q(T.fetched_sources),le=Oe(T.compute_errors),ye=Q(T.computed_values),Pe={card_data:Q(j.card_data),requires:w.mockRequires,fetched_sources:ce,computed_values:ye},Be=[];for(let Se of Oe(F.issues))typeof Se=="string"&&Se&&Be.push(Se);for(let Se of D){let we=Q(Se),je=typeof we.bindTo=="string"?we.bindTo:"source",ve=typeof we.error=="string"?we.error:"";ve&&Be.push(`${je}: ${ve}`);}for(let Se of te){let we=Q(Se),je=typeof we.bindTo=="string"?we.bindTo:"source",ve=typeof we.key=="string"?we.key:"projection",Fe=typeof we.error=="string"?we.error:"projection failed";Be.push(`${je}.${ve}: ${Fe}`);}for(let Se of le){let we=Q(Se),je=typeof we.bindTo=="string"?we.bindTo:"compute",ve=typeof we.error=="string"?we.error:"compute failed";Be.push(`${je}: ${ve}`);}return {status:"success",data:{cardId:typeof T.cardId=="string"?T.cardId:"(unknown)",ok:T.ok===true,issues:Be,provides_outputs:ao(j,Pe),rendered_view:Kr(j,Pe)}}}async function O(w){let T=String(w.cardId||"").trim();if(!T)throw new Error("manageReadCard requires cardId");let j=await nt(n.get({params:{id:T}}),"cardStore.get"),F=Array.isArray(j.cards)?j.cards.map(Q):[];if(F.some(so))throw Object.assign(new Error(`Card "${T}" not found`),{statusCode:404});return F.map(D=>gr(D))}async function M(w){let T=await Promise.all(Oe(w.files).map(async j=>{let F=Q(j),D=String(F.file_name??F.fileName??F.name??"").trim(),te=String(F.content_type??F.contentType??"application/octet-stream");if(!D)throw new Error("file entry requires file_name");return await m({cardId:w.cardId,fileName:D,contentType:te,bytes:B(F),suppressChatRecordWrite:true})}));for(let[j,F]of T.entries()){let D=Q(F.file),te=typeof F.file_idx=="number"&&Number.isInteger(F.file_idx)&&F.file_idx>=0?F.file_idx:j,ce=w.role==="assistant"?`AI generated: ${String(D.name||"")} as ${String(D.stored_name||"")} #${te}`:`file uploaded: ${String(D.name||"")} as ${String(D.stored_name||"")} #${te}`;Qe(await o.append({params:{cardId:w.cardId},body:{role:"system",text:ce,files:[],turn:w.turn}}),"chatStore.append(system attachment message)");}return T.map(j=>j.file)}async function $(w){let T=String(w.cardId||"").trim(),j=String(w.role||"user").trim()||"user",F=typeof w.turn=="string"?w.turn:"";if(!T)throw new Error("manageAddChatAttachment requires cardId");let D=await M({cardId:T,role:j,turn:F,files:w.files});return {status:"success",data:{cardId:T,turn:F,files:D}}}async function J(w){let T=String(w.cardId||"").trim(),j=String(w.role||"").trim(),F=typeof w.text=="string"?w.text:"",D=typeof w.turn=="string"?w.turn:"";if(!T)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!j)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(j==="assistant"&&D){let le=Qe(await o.readAll({params:{cardId:T},body:{turnId:D}}),"chatStore.readAll(existing turn messages)"),ye=Array.isArray(le.records)?le.records.find(Pe=>Pe.role==="assistant"&&String(Pe.turn||"")===D):void 0;if(ye)return {status:"success",data:{cardId:T,id:String(ye.id),role:j,turn:D,files:Array.isArray(ye.files)?ye.files:[]}}}let te=await M({cardId:T,role:j,turn:D,files:w.files}),ce=Qe(await o.append({params:{cardId:T},body:{role:j,text:F,files:te,turn:D}}),"chatStore.append");return {status:"success",data:{cardId:T,id:String(ce.id),role:j,turn:D,files:te}}}async function Z(w){let T=String(w.cardId||"").trim(),j=Q(w.patch);if(!T)throw new Error("managePatchCard requires cardId");let F=await O({cardId:T}),D=Q(F[0]),ce={...ha(D,j),...yr(D,"meta")?{meta:D.meta}:{},...yr(D,"__private")?{__private:D.__private}:{}},le=await n.set({body:ce});Qe(le,"cardStore.set");let ye;try{ye=await t.upsertCard({params:{cardId:T,restart:!0}}),Qe(ye,"upsertCard");}catch(Pe){try{await n.set({body:D});}catch{}throw Pe}return {status:"success",data:{validation:null,card_saved:null,board_result:ye}}}async function ae(w){let T=String(w.cardId||"").trim(),j=Q(w.candidateCardContent),F=gr(j);if(!T)throw new Error("manageUpsertCard requires cardId");if(typeof F.id!="string"||!F.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(F.id!==T)throw new Error(`candidateCardContent.id must match cardId (${T})`);let D=await i({candidateCardContent:F}),te=Q(D),ce=Q(te.data);if(te.status!=="success"||ce.isValid!==true)return {status:"fail",step:"validate",validation:D};let le=null;try{le=await vt(n,T);}catch{le=null;}let ye=le?Q(le):null,Pe={...F,...ye&&yr(ye,"meta")?{meta:ye.meta}:{},...ye&&yr(ye,"__private")?{__private:ye.__private}:{}},Be=await n.set({body:Pe});Qe(Be,"cardStore.set");let Se;try{Se=await t.upsertCard({params:{cardId:T,restart:!0}}),Qe(Se,"upsertCard");}catch(we){try{le&&await n.set({body:le});}catch{}throw we}return {status:"success",data:{validation:D,card_saved:null,board_result:Se}}}async function ee(w){let T=String(w.cardId||"").trim();if(!T)throw new Error("manageRemoveCard requires cardId");let j=await t.removeCard({params:{id:T}});Qe(j,"removeCard");let F=await n.del({params:{id:T}});return Qe(F,"cardStore.del"),{status:"success",data:{board_result:j,store_result:F}}}async function X(w){let T=String(w.cardId||"").trim();if(!T)throw new Error("adminReadCard requires cardId");let j=await nt(n.get({params:{id:T}}),"cardStore.get");return Array.isArray(j.cards)?j.cards.map(F=>Q(F)):[]}async function se(w){let T=String(w.cardId||"").trim(),j=Q(w.candidateCardContent),F=gr(j);if(!T)throw new Error("adminUpsertCard requires cardId");if(typeof F.id!="string"||!F.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(F.id!==T)throw new Error(`candidateCardContent.id must match cardId (${T})`);let D=await i({candidateCardContent:F}),te=Q(D),ce=Q(te.data);if(te.status!=="success"||ce.isValid!==true)return {status:"fail",step:"validate",validation:D};let le=null;try{le=await vt(n,T);}catch{le=null;}let ye=le?Q(Q(le).__private):{},Pe={...F,__private:{...ye,visible_controlplane_only:true}},Be=await n.set({body:Pe});Qe(Be,"cardStore.set");let Se;try{Se=await t.upsertCard({params:{cardId:T,restart:!0}}),Qe(Se,"upsertCard");}catch(we){try{le&&await n.set({body:le});}catch{}throw we}return {status:"success",data:{validation:D,card_saved:null,board_result:Se}}}async function G(w){let T=String(w.cardId||"").trim();if(!T)throw new Error("getChatProcessing requires cardId");let j=oo(await o.isProcessing({params:{cardId:T}}),"chatStore.isProcessing");return {cardId:T,active:!!j.active}}async function P(w){let T=String(w.cardId||"").trim();if(!T)throw new Error("setChatProcessing requires cardId");if(typeof w.active!="boolean")throw new Error("setChatProcessing requires boolean active");return Qe(await o.setProcessing({params:{cardId:T},body:{active:w.active}}),"chatStore.setProcessing"),{cardId:T,active:w.active}}async function C(){let w=await S(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 K(w){let T=String(w.token||"").trim(),j=String(w.ref||"").trim();if(!T)throw new Error("webhookSourceFetchDone requires token");if(!j)throw new Error("webhookSourceFetchDone requires ref");let F=await S(c,"webhook.source-fetch-done")({token:T,ref:j});return F?.status==="fail"||F?.status==="error"?F:{status:"success",data:{token:T,ref:j,runtime_result:Object.prototype.hasOwnProperty.call(F??{},"data")?F.data??null:null}}}async function N(w){let T=String(w.token||"").trim(),j=String(w.reason||"").trim();if(!T)throw new Error("webhookSourceFetchFailed requires token");if(!j)throw new Error("webhookSourceFetchFailed requires reason");let F=await S(u,"webhook.source-fetch-failed")({token:T,reason:j});return F?.status==="fail"||F?.status==="error"?F:{status:"success",data:{token:T,reason:j,runtime_result:Object.prototype.hasOwnProperty.call(F??{},"data")?F.data??null:null}}}return {listRuntimeCards:A,discoverSourceKinds:x,inspectBoardRuntimeStatus:_,inspectCardDefinitionAndRuntime:I,inspectChatMessagesOnCards:y,inspectFileContents:d,preflightValidateCandidateCardDefinition:i,preflightMaterializeCandidateCard:l,preflightProbeSingleSourceInCandidateCard:g,preflightRunSingleSourceInCandidateCard:f,preflightRunSingleSourceInLiveCard:k,preflightRunOneCycleWithCandidateCard:v,manageReadCard:O,manageAddChatAttachment:$,manageAddChatEntryAndAnyAttachments:J,managePatchCard:Z,manageUpsertCard:ae,manageRemoveCard:ee,adminReadCard:X,adminUpsertCard:se,getChatProcessing:G,setChatProcessing:P,webhookProcessAccumulated:C,webhookSourceFetchDone:K,webhookSourceFetchFailed:N}}async function nt(e,t){return Qe(await e,t)}function uo(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:s,readCardRuntimeArtifacts:c,readCardFromStore:u,readCardDefinitions:m,processAccumulatedLaneInternal:p,reportSourceFetched:R,reportSourceFetchFailure:S,uploadCardFile:A,chatStorePublic:B,serverUrl:x,apiBasePath:_}=e;function I(){return t[0]??null}function y(){return {async status(){let g=await o();return g==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:g}},async getOutputsDataObject(g){let f=g?.params?.key;return f?{status:"success",data:(await s())[f]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(g){let f=g?.params?.key;return f?{status:"success",data:(await c())[f]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(g){let f=g?.params?.key;if(!f)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let k=n(f)??I();return k?k.boardOps.getOutputsFetchedSources({params:{key:f}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(g){let f=g?.params?.id;if(!f)return {status:"fail",error:"removeCard requires params.id"};let k=n(f)??I();return k?k.boardOps.removeCard({params:{id:f}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(g){let f=g?.params?.cardId;if(!f)return {status:"fail",error:"upsertCard requires params.cardId"};let k=n(f)??I();if(!k)return {status:"fail",error:"Board context is unavailable"};let v=await k.boardOps.upsertCard({params:{cardId:f,restart:g.params.restart===true}});if(v.status!=="success")return v;if(tt(k.boardAdapter)){let O=await p(true);if(O.status!=="success")return O}return v}}}function d(){let g=()=>{let f=I();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 g().describeTaskExecutorCapabilities(f)},validateCardPreflight(f){return g().validateCardPreflight(f)},evalCardCompute(f){return g().evalCardCompute(f)},probeSourcePreflight(f){return g().probeSourcePreflight(f)},runSourcePreflight(f){return g().runSourcePreflight(f)},simulateCardCycle(f){return g().simulateCardCycle(f)}}}function i(){return {async get(g){let f=typeof g.params?.id=="string"?g.params.id:void 0;if(f){let k=await u(f);return k?{status:"success",data:{cards:[k]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await m()}}},async set(g){let f=g.body;if(f==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let k=Array.isArray(f)?f:[f];for(let v of k){let O=v,M=typeof O.id=="string"?O.id:"";if(!M)return {status:"fail",error:"each card must have a string `id` field"};let $=r.get(M)??0,J=t[$]??I();if(!J)return {status:"fail",error:"Board context is unavailable"};let Z=await J.cardStoreOps.set({body:O});if(Z.status!=="success")return Z;r.set(M,$);}return {status:"success",data:{count:k.length}}},async del(g){let f=[g.params?.id,...g.body?.ids??[]].filter(k=>typeof k=="string"&&!!k);if(f.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let k of f){let v=n(k)??I();if(!v)return {status:"fail",error:"Board context is unavailable"};let O=await v.cardStoreOps.del({params:{id:k}});if(O.status!=="success")return O;r.delete(k);}return {status:"success",data:{count:f.length}}},async patch(g){let f=typeof g.params?.id=="string"?g.params.id:void 0,k=typeof g.params?.path=="string"?g.params.path:void 0;if(!f||!k)return {status:"fail",error:"patch requires params.id and params.path"};let v=n(f)??I();return v?v.cardStoreOps.patch(g):{status:"fail",error:"Board context is unavailable"}},async appendFiles(g){let f=typeof g.params?.id=="string"?g.params.id:void 0;if(!f)return {status:"fail",error:"appendFiles requires params.id"};let k=n(f)??I();return k?k.cardStoreOps.appendFiles(g):{status:"fail",error:"Board context is unavailable"}}}}function l(){return io({board:y(),nonCore:d(),cardStore:i(),chatStore:B,processAccumulated:()=>p(true),sourceFetchDone:({token:g,ref:f})=>R(g,f),sourceFetchFailed:({token:g,reason:f})=>S(g,f),uploadCardFile({cardId:g,fileName:f,contentType:k,bytes:v,suppressChatRecordWrite:O}){return A(g,f,k,v,{inChat:true,...O===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:g,fileIdx:f,storedName:k}){let v=`${x||""}${_}/cards/${encodeURIComponent(g)}/files/${f}`;return k?`${v}?sn=${encodeURIComponent(k)}`:v},readFetchedSourceJsonByRef({cardId:g,ref:f}){let k=n(g)??I();if(!k||tt(k.boardAdapter))return null;let M=k.boardAdapter.resolveBlob(at(f)).trim();return M?JSON.parse(M):null}})}return {mcpBoardFacade:y,mcpNonCoreFacade:d,mcpCardStoreFacade:i,createMcpFacade:l}}function co(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:s,createMcpToolRegistry:c,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:m,sliceTextByLines:p}=e;async function R(S,A,B){let x=S.method||"GET",_=B,I=_.pathname;try{if(x==="POST"&&I===`${t}/mcp`){await o();let y=await n(S),d=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!d)return r(A,400,{error:"tool is required"}),!0;if(d==="inspect.file-contents")return r(A,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let l=await mt(d,i,c(s()));if(l&&typeof l=="object"&&!Array.isArray(l)){let g=l;if(g.status==="fail")return r(A,400,{error:rt(l,"Request failed")}),!0;if(g.status==="error")return r(A,500,{error:rt(l,"Internal error")}),!0}r(A,200,l);}catch(l){let g=typeof l?.statusCode=="number"?Number(l.statusCode):500,f=l instanceof Error?l.message:String(l);r(A,g,{error:f});}return !0}if(x==="POST"&&I===`${t}/mcp-raw`){await o();let y=await n(S),d=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!d)return r(A,400,{error:"tool is required"}),!0;if(d!=="inspect.file-contents")return r(A,400,{error:`Tool does not support raw response: ${d}`}),!0;let l=de(i,"card_id","cardId"),g=st(i,"file_idx","fileIdx"),f=st(i,"head-lines","headLines"),k=st(i,"tail-lines","tailLines"),v=st(i,"head-bytes","headBytes"),O=st(i,"tail-bytes","tailBytes");if(!l)return r(A,400,{error:"inspect.file-contents requires card_id"}),!0;if(g===void 0||!Number.isInteger(g)||g<0)return r(A,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([f,k,v,O].filter(C=>C!==void 0).length>1)return r(A,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[C,K]of [["head-lines",f],["tail-lines",k],["head-bytes",v],["tail-bytes",O]])if(K!==void 0&&(!Number.isInteger(K)||K<0))return r(A,400,{error:`inspect.file-contents requires ${C} to be a non-negative integer`}),!0;let $=await s().inspectFileContents({cardId:l,fileIdx:g}),J=typeof $?.stored_name=="string"?$.stored_name:null,{fileRecord:Z,bytes:ae}=await u(l,g,J),ee=String(Z.name||Z.stored_name||"download.bin"),X=String(Z.mime_type||"application/octet-stream"),se=(_.searchParams.get("resp")||"").trim().toLowerCase();if(se&&se!=="json-b64")return r(A,400,{error:`unsupported resp mode: ${se}`}),!0;let G=se==="json-b64",P;if(f!==void 0||k!==void 0){if(!m(X))return r(A,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let C=new TextDecoder().decode(ae),K=f!==void 0?p(C,"head",f):p(C,"tail",k);P=typeof Buffer<"u"?Buffer.from(K,"utf8"):new TextEncoder().encode(K);}else if(v!==void 0||O!==void 0){let C=v??O;P=v!==void 0?ae.slice(0,C):ae.slice(Math.max(0,ae.length-C));}else P=ae;if(G){let C=typeof Buffer<"u"?Buffer.from(P).toString("base64"):btoa(String.fromCharCode(...P));return r(A,200,{bodyBase64:C,mimeType:X,filename:ee,byteLength:P.length}),!0}return A.writeHead(200,{"Content-Type":X,"Content-Disposition":`attachment; filename="${ee}"`,"Content-Length":P.length}),A.end(P),!0}return !1}catch(y){let d=y?.statusCode||500;return r(A,d,{error:String(y?.message||y)}),true}}return {handleAgentfaceApi:R}}function lo(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function c(u,m,p){let R=u.method||"GET",S=p.pathname;try{if(R==="POST"&&S===`${t}/mcp-webhooks`){await o();let A=await n(u),B=typeof A.tool=="string"?A.tool.trim():"",x=A.args&&typeof A.args=="object"&&!Array.isArray(A.args)?A.args:{};if(!B)return r(m,400,{error:"tool is required"}),!0;try{let _=await mt(B,x,s());if(_&&typeof _=="object"&&!Array.isArray(_)){let I=_;if(I.status==="fail")return r(m,400,{error:rt(_,"Request failed")}),!0;if(I.status==="error")return r(m,500,{error:rt(_,"Internal error")}),!0}r(m,200,_);}catch(_){let I=typeof _?.statusCode=="number"?Number(_.statusCode):500,y=_ instanceof Error?_.message:String(_);r(m,I,{error:y});}return !0}return !1}catch(A){let B=A?.statusCode||500;return r(m,B,{error:String(A?.message||A)}),true}}return {handleWebhooksApi:c}}function Jr(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:s,onChannelSubscribed:c,onChannelUnsubscribed:u}=e;function m(R,S,A,B,x){if(!t.has(S)){n(R,404,{error:`SSE client not connected: ${S}`});return}x?(t.subscribeChannel(S,A,B.cardId),c?.(S,A,B)):(t.unsubscribeChannel(S,A,B.cardId),u?.(S,A,B)),n(R,200,{ok:true,clientId:S,channelName:A,...B.cardId?{cardId:B.cardId}:{},subscribed:x});}async function p(R,S,A,B){let x=B?.oneShot===true,_=B?.bootstrapPayload!==false,I=!x&&A?t.get(A):null,y=I?new Set(I.subscribedChatCardIds):new Set,d=I?new Set(I.subscribedChannelNames):new Set,i=I?new Map(Array.from(I.subscribedCardChannels.entries(),([g,f])=>[g,new Set(f)])):new Map;if(S.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(S),_){let g=await o(),f=t.buildFrame(g);S.write(f);}if(x){S.end();return}if(!A)throw new Error("clientId is required for streaming SSE");t.register(A,S,{subscribedChatCardIds:y,subscribedChannelNames:d,subscribedCardChannels:i});try{s?.(A,g=>{t.writeFrame(A,g);});}catch{}let l=setInterval(()=>{try{S.write(`: keepalive
|
|
5
5
|
|
|
6
|
-
`);}catch{}},15e3);E.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:E,handleChannelSubscription:y}=Xn(e);async function C(S,R,I){let x=S.method||"GET",A=I,F=A.pathname;try{if(x==="GET"&&F===`${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 E(S,R,k||void 0,{oneShot:l}),l)return !0;for(let _=0;_<i.length;_++)await u(i[_]),await p(i[_],_),await u(i[_]);return !0}let c=F.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(x==="POST"&&c){await s();let l=decodeURIComponent(c[1]),k=await n(S),_=typeof k?.clientId=="string"?k.clientId.trim():"";return _?await T.subscribeChat(_,l)?(r(R,200,{ok:!0,clientId:_,cardId:l,subscribed:!0}),!0):(r(R,404,{error:`SSE client not connected: ${_}`}),!0):(r(R,400,{error:"clientId is required"}),!0)}let h=F.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(x==="POST"&&h){await s();let l=decodeURIComponent(h[1]),k=await n(S),_=typeof k?.clientId=="string"?k.clientId.trim():"";return _?T.unsubscribeChat(_,l)?(r(R,200,{ok:!0,clientId:_,cardId:l,subscribed:!1}),!0):(r(R,404,{error:`SSE client not connected: ${_}`}),!0):(r(R,400,{error:"clientId is required"}),!0)}let d=F.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",_=await n(S),$=typeof _?.clientId=="string"?_.clientId.trim():"";return $?(y(R,$,l,{},k),!0):(r(R,400,{error:"clientId is required"}),!0)}let f=F.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[3]==="subscribe",$=await n(S),J=typeof $?.clientId=="string"?$.clientId.trim():"";return J?(y(R,J,k,{cardId:l},_),!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:E,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",Bt="__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=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 O=await w(a,P);return {records:O.records,cursor:O.cursor}},onSseClientDisconnected:C});function x(a){function P(Q){if(Array.isArray(Q))return Q;if(Q&&typeof Q=="object"){let de=Q;return Array.isArray(de.files)?de.files:[Q]}return null}function O(Q){return {async get(de){return Q.get(de)},async set(de){return Q.set(de)},async del(de){return Q.del(de)},async patch(de){return Q.patch(de)},async appendFiles(de){return Q.appendFiles(de)}}}function G(Q){function de(Ie){return {status:"success",data:Ie}}function Ce(Ie){return {status:"fail",error:Ie}}function ge(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?de({cards:[Ue]}):Ce(`card "${xe}" not found`)}return de({cards:await Q.readAllCards()})}catch(xe){return ge(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 de({count:Ue.length})}catch(xe){return ge(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 de({count:Je.length})}catch(xe){return ge(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),de({count:1})}catch(xe){return ge(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),de({files_added:Je.map((oo,so)=>({idx:Dr.length+so,entry:oo}))})}catch(xe){return ge(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),Y=a.nonCore??(N?bn(a.baseRef,N,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,taskExecutorRef:a.taskExecutorRef}):null),he=a.boardAdapter.chatStorageForRef(a.chatStoreRef),le,Te=ot(a.boardAdapter)?(()=>{let Q=dr(ur(ir(a.boardAdapter.kvStorageForRef(a.cardStoreRef)),a.boardAdapter.hashFn),s.warn),de=G(Q);return le={get(Ce){return de.get(Ce)},set(Ce){return de.set(Ce)}},de})():(()=>{let Q=a.boardAdapter.kvStorageForRef(a.cardStoreRef),Ce=nr(Et({readIndex:()=>Q.read("_index"),writeIndex:ge=>Q.write("_index",ge),readCard:ge=>Q.read(ge),writeCard:(ge,Ie)=>(Q.write(ge,Ie),ge),removeCard:ge=>{Q.delete(ge);},cardExists:ge=>Q.read(ge)!==null,defaultCardKey:ge=>ge},s.warn));return le=Ce,O(Ce)})(),Oe;if(ot(a.boardAdapter)){let Q=a.boardAdapter.blobStorageForRef(a.artifactsStoreRef);Oe={async putBytes(de,Ce){if(Q.writeBytes){await Q.writeBytes(de,Ce);return}let ge=JSON.stringify({__kind:"bytes-array",data:[...Ce]});await Q.write(de,ge);},async getBytes(de){if(Q.readBytes){let ge=await Q.readBytes(de);if(ge!==null)return ge}let Ce=await Q.read(de);if(Ce===null)return null;try{let ge=JSON.parse(Ce);if(ge&&ge.__kind==="bytes-array"&&Array.isArray(ge.data))return new Uint8Array(ge.data)}catch{}return new TextEncoder().encode(Ce)},async listKeys(de){return await Q.listKeys(de)}};}else {let Q=a.boardAdapter.blobStorageForRef(a.artifactsStoreRef),de=On(Q);Oe={putBytes(Ce,ge,Ie){de.putBytes(Ce,ge,Ie);},getBytes(Ce){return de.getBytes(Ce)},listKeys(Ce){return de.list(Ce).map(ge=>ge.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:Y,publicCardStore:le,boardOps:De,cardStoreOps:Te,get filesArtifacts(){return Oe},get chatStorage(){return he},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),F=new Map;function c(a){return F.get(a)??0}function h(a){return a.queueStoreRef}function d(a,P){if(ot(a.boardAdapter)){let G=a.boardAdapter.queueStorageForRef(h(a),P);return xr(G)}let O=a.boardAdapter.queueStorageForRef(h(a),P);return Tr(O)}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 _(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,O=>{_r(a.notification,O);let G=O.kind==="notification-batch"?O.notifications:[O];I.broadcastNotificationBatch(G);});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},O={};a.taskExecutorRef&&(O["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(O["chat-handler-flow"]=a.chatHandlerFlow);let G=await a.boardOps.init({params:P,body:O});if(G.status!=="success")throw Object.assign(new Error(G.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 W(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let P=[],O=await a.boardOps.status({});O.status==="success"&&O.data!=null&&Pr(O.data)&&P.push({kind:"status",status:O.data});let G=await a.boardOps.getAllOutputsDataObjects({});if(G.status==="success"&&G.data!=null)for(let[N,Y]of Object.entries(G.data))N&&P.push({kind:"data_object",key:N,payload:Y});let B=await a.boardOps.getAllOutputsComputedValues({});if(B.status==="success"&&B.data!=null)for(let[N,Y]of Object.entries(B.data))N&&P.push({kind:"computed_values",cardId:N,values:Y});P.length>0&&a.boardAdapter.publishBoardChangeNotifications(P);}async function te(a,P){if(!a||a.cardsBootstrapped)return;let O=await a.cardStoreOps.get({}),G=O.status==="success"&&Array.isArray(O.data?.cards)?O.data.cards:[];for(let B of G)typeof B.id=="string"&&(F.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 X(){await ie();for(let a=0;a<A.length;a++)await W(A[a]),await te(A[a],a),await W(A[a]);}async function ee(a=false){a||await ie();for(let P of A){let O=await P.board.processAccumulatedEvents({});if(O.status!=="success")return O}return {status:"success"}}function ne(a){return A[c(a)]??null}async function v(a){let P=ne(a);if(!P)return null;let O=await P.cardStoreOps.get({params:{id:a}});if(O.status!=="success")return null;let G=Array.isArray(O.data?.cards)?O.data.cards:[];return G.length>0?G[0]:null}async function g(){let a=async O=>{if(!O)return [];let G=await O.cardStoreOps.get({});return G.status!=="success"||!Array.isArray(G.data?.cards)?[]:G.data.cards},P=[];for(let O of A)P.push(...await a(O));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 q(a,P){await H(a).setProcessing(a,P),await I.broadcastCardChats(a,true);}let U=jn({append(a,P,O,G,B){return Promise.resolve(H(a).append(a,P,O,G,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:F,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,O,G,B)=>K(a,P,O,G,B),chatStorePublic:U,serverUrl:T,apiBasePath:t}),Z=V.mcpCardStoreFacade,ae=V.createMcpFacade,fe=Dn({boardId:o,bootstrapBoard:()=>X(),sseHub:I,onChannelSubscribed:S,onChannelUnsubscribed:R,getMcpFacade:()=>ae(),getMcpCardStoreFacade:()=>Z()});function we(a){return Un(a)}function Pe(){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,O){let G=O?.syncBoard!==false,B=O?.restartOnlyIfChanged===true,N=ne(a);if(!N)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let Y=await v(a);if(!Y)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let he=B?JSON.stringify(Y):null,le=P(Y)||Y;if(B&&JSON.stringify(le)===he)return;let Te=await N.cardStoreOps.set({body:le});if(Te.status!=="success")throw Object.assign(new Error(Te.error||`Failed to persist card: ${a}`),{statusCode:500});if(G){let Oe=await N.boardOps.upsertCard({params:{cardId:a,restart:true}});if(Oe.status!=="success")throw Object.assign(new Error(Oe.error||`Failed to upsert card: ${a}`),{statusCode:500})}}async function me(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 G=await P.boardOps.upsertCard({params:{cardId:a,restart:true}});if(G.status!=="success")throw Object.assign(new Error(G.error||`Failed to retrigger card: ${a}`),{statusCode:500})}async function Ge(a){await H(a).clear(a);try{await q(a,!1);}catch{}}async function M(a,P,O,G,B=""){let N=typeof O=="string"?O.trim():"",Y=await H(a).append(a,P||"system",N,G,B);return await I.broadcastCardChats(a,true),Y}async function m(a){return await H(a).readAll(a)}let K=$n({safeCardId:a=>_(a),artifactsStores:a=>l(a),cardFileMetadataStore:()=>k(),readCardFromStore:a=>v(a),updateCardLocalOnly:(a,P)=>Ze(a,P),writeChatRecord:(a,P,O,G,B)=>M(a,P,O,G,B)}).uploadCardFile;async function oe(a){let P=ne(a);if(!P)return null;let O=await P.boardOps.getConfig({params:{key:"chat-handler-flow"}}),B=(O.status==="success"?O.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():"";if(P.length<Bt.length*2||!P.startsWith(Bt)||!P.endsWith(Bt))return null;let O=P.slice(Bt.length,P.length-Bt.length).trim(),G=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(O);return G?{assistant:G[1].trim().toLowerCase(),text:G[2].trim()}:{assistant:"echo",text:O}}async function Ae(a,P,O=false,G="",B=""){try{let N=await oe(a);if(!N){try{await q(a,!1);}catch{}return}let{ctx:Y,handlerFlow:he,handlerRef:le}=N;if(!O)try{await q(a,!0);}catch{}let Te={boardId:o,cardId:String(a),lastChatEntryId:P,...G?{turnId:G}:{},...typeof B=="string"&&B.trim()?{probe:B.trim()}:{},...E,...T?{serverUrl:T}:{}},Oe=he!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:eo}}:le;ot(Y.boardAdapter)?await d(Y,"chat-agent").enqueueRequest({boardId:o,ref:Oe,args:he!=null?{...Te,__chatHandlerFlow:he}:Te}):d(Y,"chat-agent").enqueueRequest({boardId:o,ref:Oe,args:he!=null?{...Te,__chatHandlerFlow:he}:Te}),await Promise.resolve(Y.boardAdapter.requestProcessAccumulated?.());}catch(N){try{await q(a,!1);}catch{}s.warn(`[chat-handler] queue failed for card "${a}": ${N instanceof Error?N.message:String(N)}`);}}async function be(a,P,O){if(P.howToRun==="built-in"&&Ur(P)===eo){let G=u,B=O.__chatHandlerFlow,N={...O};return delete N.__chatHandlerFlow,G?G.run(B,N,{boardId:o,cardId:String(N.cardId||""),label:a.label,logger:s,serverUrl:T,executionExtra:E}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return i.invoke(P,O)}async function Fe(a,P=false){P||await ie();let O=typeof a.args?.cardId=="string"?a.args.cardId:"",G=O?ne(O):L();if(!G)throw new Error(O?`Board context is unavailable for chat-agent request: ${O}`:"Board context is unavailable for chat-agent request");let B=await be(G,a.ref,a.args);if(!B.dispatched){if(O)try{await q(O,!1);}catch{}throw new Error(B.error||`chat-agent dispatch failed for card "${O||"unknown"}"`)}}async function qe(a,P,O){if(P==="chat-send"){let B=O&&typeof O["turn-id"]=="string"?O["turn-id"]:O&&typeof O.turnId=="string"?O.turnId:O&&typeof O.turn=="string"?O.turn:"";if(O&&"files"in O&&O.files!==void 0&&O.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let N=Be(),Y=re(O?.text),he=Y?Y.text:O?.text,le=await pt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:a,role:"user",text:he,turn_id:B,files:[]},N);if(le?.status!=="success")throw new Error(rt(le,`chat-send append failed for card ${a}`));let Te=le?.data?.id;if(typeof Te!="string"||!Te)throw new Error(`chat-send did not return an append id for card ${a}`);let Oe=await pt("setstate.chat-processing-started",{board_id:o,card_id:a},N);if(Oe?.status!=="success")throw new Error(rt(Oe,`chat-send processing update failed for card ${a}`));Ae(a,Te,true,B,Y?.assistant||"");return}await me(a,B=>{let N=new Date().toISOString(),Y=B.card_data&&typeof B.card_data=="object"?B.card_data:{};if(B.card_data=Y,P==="file-upload"){let he=k().normalizeIncoming(O?.files,N);return he.length>0&&k().merge(Y,he),B}if(P==="action"){let he=O&&typeof O.buttonId=="string"?O.buttonId:"";if(!he)return B;Y.lastAction={buttonId:he,at:N},Y.lastActionText=`${he} @ ${N}`;}return B});}function $e(a,P,O){let G=JSON.stringify(O),B=typeof Buffer<"u"?Buffer.byteLength(G):new TextEncoder().encode(G).length;a.writeHead(P,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":B}),a.end(G);}async function We(a,P,O){let G=await v(a);if(!G)throw Object.assign(new Error("Card not found"),{statusCode:404});let B=k().resolve(G.card_data,P,O);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,Y=_(a),he=l(a),le=String(N.stored_name||""),Te=`${Y}/${le}`,Oe=he.files?await he.files.getBytes(Te):null;if(!Oe)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:N,bytes:Oe}}async function He(a,P,O,G){let{fileRecord:B,bytes:N}=await We(P,O,G),Y=String(B.name||B.stored_name||"download.bin"),he=String(B.mime_type||"application/octet-stream");a.writeHead(200,{"Content-Type":he,"Content-Disposition":`attachment; filename="${Y}"`,"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,O){let G=a.split(/\r?\n/);return (P==="head"?G.slice(0,O):G.slice(-O)).join(`
|
|
7
|
-
`)}async function
|
|
6
|
+
`);}catch{}},15e3);R.on("close",()=>{clearInterval(l),t.disconnect(A,S);});}return {handleChannelSubscription:m,handleSse:p}}function fo(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,boardContexts:c,publishPersistedStateSnapshot:u,upsertCardsFromSource:m,sseHub:p,queueSseHub:R}=e,{handleSse:S,handleChannelSubscription:A}=Jr(e),{handleSse:B}=Jr({...e,sseHub:R,buildPublishedRuntimePayload:async()=>null});async function x(_,I,y){let d=_.method||"GET",i=y,l=i.pathname;try{if(d==="GET"&&l===`${t}/sse`){let O=i.searchParams.has("one-shot");await o();let M=String(i.searchParams.get("clientId")||"").trim();if(!O&&!M)return r(I,400,{error:"clientId query param is required for SSE"}),!0;if(await S(_,I,M||void 0,{oneShot:O}),O)return !0;for(let $=0;$<c.length;$++)await u(c[$]),await m(c[$],$),await u(c[$]);return !0}if(d==="GET"&&l===`${t}/sse-q`){let O=String(i.searchParams.get("clientId")||"").trim();return O?(await B(_,I,O,{bootstrapPayload:!1}),!0):(r(I,400,{error:"clientId query param is required for SSE"}),!0)}let g=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(d==="POST"&&g){await s();let O=decodeURIComponent(g[1]),M=await n(_),$=typeof M?.clientId=="string"?M.clientId.trim():"";return $?await p.subscribeChat($,O)?(r(I,200,{ok:!0,clientId:$,cardId:O,subscribed:!0}),!0):(r(I,404,{error:`SSE client not connected: ${$}`}),!0):(r(I,400,{error:"clientId is required"}),!0)}let f=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(d==="POST"&&f){await s();let O=decodeURIComponent(f[1]),M=await n(_),$=typeof M?.clientId=="string"?M.clientId.trim():"";return $?p.unsubscribeChat($,O)?(r(I,200,{ok:!0,clientId:$,cardId:O,subscribed:!1}),!0):(r(I,404,{error:`SSE client not connected: ${$}`}),!0):(r(I,400,{error:"clientId is required"}),!0)}let k=l.match(new RegExp(`^${ot(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(d==="POST"&&k){await s();let O=decodeURIComponent(k[1]),M=k[2]==="subscribe",$=await n(_),J=typeof $?.clientId=="string"?$.clientId.trim():"";return J?(A(I,J,O,{},M),!0):(r(I,400,{error:"clientId is required"}),!0)}let v=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(d==="POST"&&v){await s();let O=decodeURIComponent(v[1]),M=decodeURIComponent(v[2]),$=v[3]==="subscribe",J=await n(_),Z=typeof J?.clientId=="string"?J.clientId.trim():"";return Z?(A(I,Z,M,{cardId:O},$),!0):(r(I,400,{error:"clientId is required"}),!0)}return !1}catch(g){let f=g?.statusCode||500;return r(I,f,{error:String(g?.message||g)}),true}}return {handleWatchersRoutes:x,handleSse:S,handleChannelSubscription:A}}var Ra=3e4;function ka(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function mo(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,s=`${t}/notify-q`;async function c(u,m,p){if(p.pathname!==s)return false;if((u.method??"").toUpperCase()!=="POST")return o(m,405,{status:"error",error:"Method not allowed"}),true;if(!ka(u))return o(m,403,{status:"error",error:"Forbidden"}),true;let R;try{R=await n(u);}catch{return o(m,400,{status:"error",error:"Invalid JSON body"}),true}if(!R||typeof R!="object"||!Array.isArray(R.notifications))return o(m,400,{status:"error",error:"body.notifications must be an array"}),true;let S=R.notifications,{accepted:A,rejected:B}=Qn(S,Date.now(),Ra);return A.length>0&&r(A),o(m,200,{status:"success",data:{accepted:A.length,rejected:B}}),true}return {handleNotifyRoute:c}}var go={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},po="chat-handler-flow-queue",Nt="__probe__echo__probe__";function Ca(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...go,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},c=e.invocationAdapter,u=e.chatFlowRunner||null,m=e.notificationTransport||null,p=e.serverUrl||null,R=e.executionExtra||{},S=e.onSseClientConnected,A=e.onSseClientDisconnected,B=e.onChannelSubscribed,x=e.onChannelUnsubscribed,_=Mr({buildChatOneShotBatch:async(a,b)=>await le.buildSseOneShotBatch({params:{cardId:a},body:{receiving:b}}),onSseClientDisconnected:A}),I=Mr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function y(a){function b(Y){return {...Y,queueStorageForRef(me,Ee){return $n(Y.queueStorageForRef(me,Ee),{lane:Ee,emitNotification:z})}}}function E(Y){return {...Y,queueStorageForRef(me,Ee){return Dn(Y.queueStorageForRef(me,Ee),{lane:Ee,emitNotification:z})}}}function U(Y){return {async get(me){return Y.get(me)},async set(me){return Y.set(me)},async del(me){return Y.del(me)},async patch(me){return Y.patch(me)},async appendFiles(me){return Y.appendFiles(me)}}}function H(Y){return {async get(me){return await Y.get(me)},async set(me){return await Y.set(me)},async del(me){return await Y.del(me)},async patch(me){return await Y.patch(me)},async appendFiles(me){return await Y.appendFiles(me)}}}let re=null;function z(Y){if(Y.kind==="notification-batch"){ae(Y.notifications,re??void 0);return}ae([Y],re??void 0);}let ue=tt(a.boardAdapter)?E(a.boardAdapter):b(a.boardAdapter),Me=a.nonCoreAdapter??(!tt(ue)&&k(ue)?ue:null),xe=tt(ue)?Mn(a.baseRef,ue,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:z}):_n(a.baseRef,ue,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:z}),$e=a.nonCore??(Me?En(a.baseRef,Me,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,taskExecutorRef:a.taskExecutorRef}):null),kr=ue.chatStorageForRef(a.chatStoreRef),Cr,ho=tt(ue)?(()=>{let Y=mr(fr(lr(ue.kvStorageForRef(a.cardStoreRef)),ue.hashFn),s.warn),me=ur(Y,{emitNotification:z}),Ee=H(me);return Cr={get(Ae){return Ee.get(Ae)},set(Ae){return Ee.set(Ae)}},Ee})():(()=>{let Y=ue.kvStorageForRef(a.cardStoreRef),Ee=sr(Ft({readIndex:()=>Y.read("_index"),writeIndex:Ae=>Y.write("_index",Ae),readCard:Ae=>Y.read(Ae),writeCard:(Ae,Sr)=>(Y.write(Ae,Sr),Ae),removeCard:Ae=>{Y.delete(Ae);},cardExists:Ae=>Y.read(Ae)!==null,defaultCardKey:Ae=>Ae},s.warn),{emitNotification:z});return Cr=Ee,U(Ee)})(),br;if(tt(ue)){let Y=ue.blobStorageForRef(a.artifactsStoreRef);br={async putBytes(me,Ee){if(Y.writeBytes){await Y.writeBytes(me,Ee);return}let Ae=JSON.stringify({__kind:"bytes-array",data:[...Ee]});await Y.write(me,Ae);},async getBytes(me){if(Y.readBytes){let Ae=await Y.readBytes(me);if(Ae!==null)return Ae}let Ee=await Y.read(me);if(Ee===null)return null;try{let Ae=JSON.parse(Ee);if(Ae&&Ae.__kind==="bytes-array"&&Array.isArray(Ae.data))return new Uint8Array(Ae.data)}catch{}return new TextEncoder().encode(Ee)},async listKeys(me){return await Y.listKeys(me)}};}else {let Y=ue.blobStorageForRef(a.artifactsStoreRef),me=Kn(Y);br={putBytes(Ee,Ae,Sr){me.putBytes(Ee,Ae,Sr);},getBytes(Ee){return me.getBytes(Ee)},listKeys(Ee){return me.list(Ee).map(Ae=>Ae.key)}};}let Ro={async init(Y){return xe.init(Y)},async status(Y){return xe.status(Y)},async getConfig(Y){return xe.getConfig(Y)},async getAllOutputsDataObjects(Y){return xe.getAllOutputsDataObjects(Y)},async getAllOutputsComputedValues(Y){return xe.getAllOutputsComputedValues(Y)},async getOutputsFetchedSources(Y){return xe.getOutputsFetchedSources(Y)},async buildSseOneShotPayload(Y){return xe.buildSseOneShotPayload(Y)},async upsertCard(Y){return xe.upsertCard(Y)},async removeCard(Y){return xe.removeCard(Y)},async sourceDataFetched(Y){return xe.sourceDataFetched(Y)},async sourceDataFetchFailure(Y){return xe.sourceDataFetchFailure(Y)}};return re={label:a.label,board:xe,nonCore:$e,publicCardStore:Cr,boardOps:Ro,cardStoreOps:ho,get filesArtifacts(){return br},get chatStorage(){return kr},boardAdapter:ue,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:zn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},re}let d=e.boards.map(y),i=new Map;function l(a){return i.get(a)??0}function g(a){return a.queueStoreRef}function f(a,b){if(tt(a.boardAdapter)){let U=a.boardAdapter.queueStorageForRef(g(a),b);return qr(U)}let E=a.boardAdapter.queueStorageForRef(g(a),b);return jr(E)}function k(a){let b=a;return typeof b.invokeExecutor=="function"&&typeof b.validateSchema=="function"}function v(a){let b=d[l(a)];return {files:b?b.filesArtifacts:null}}function O(){return Hn()}function M(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function $(a){return "cardId"in a&&typeof a.cardId=="string"?N(a.cardId)??void 0:d[0]??void 0}function J(a){for(let b of a){let E=$(b);if(E)return E}return d[0]??void 0}function Z(a,b={}){if(!a||a.length===0)return;let E=qe(a),U={kind:"notification-batch",notifications:E},H=b.ctx??J(E);if(b.appendState!==false&&H&&Yn(H.notification,U),b.broadcastSse!==false){let re=E.filter(ue=>ue.kind==="message_enqueued"),z=E.filter(ue=>ue.kind!=="message_enqueued");z.length>0&&_.broadcastNotificationBatch(z),re.length>0&&I.broadcastNotificationBatch(re);}if(!(b.mirrorExternal===false||!H?.boardAdapter.publishBoardChangeNotifications))try{let re=E.filter(z=>z.category==="board-output"||z.category==="card-store");re.length>0&&H.boardAdapter.publishBoardChangeNotifications(re);}catch{}}function ae(a,b){Z(a,{ctx:b,appendState:true,broadcastSse:true,mirrorExternal:true});}async function ee(a){if(!a||a.notificationTeardown||!m||!a.notifyRef)return;let b=await m.subscribe(a.notifyRef,E=>{let U=Gn(E);Z(U,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});});a.notificationTeardown=b;}async function X(a){if(!a||a.initialized)return;let b={boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,artifactsStoreRef:a.artifactsStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef},E={};a.taskExecutorRef&&(E["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=a.chatHandlerFlow);let U=await a.boardOps.init({params:b,body:E});if(U.status!=="success")throw Object.assign(new Error(U.error||`init failed for ${a.label}`),{statusCode:500});if(await ee(a),!a.chatHandlerFlow&&a.chatHandlerRef&&c.describe)try{let H=await c.describe(a.chatHandlerRef);H&&H.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${H.kind}", expected "chat-handler" for ${a.label}`):H&&s.info(`[init] chat-handler validated: ${H.name} (protocol ${H.protocolVersion}) for ${a.label}`);}catch(H){s.warn(`[init] chat-handler describe failed for ${a.label}: ${H?.message||String(H)}`);}a.initialized=true;}async function se(a){let b=[],E=await a.boardOps.status({});E.status==="success"&&E.data!=null&&Lr(E.data)&&b.push({kind:"status",status:E.data});let U=await a.boardOps.getAllOutputsDataObjects({});if(U.status==="success"&&U.data!=null)for(let[re,z]of Object.entries(U.data))re&&b.push({kind:"data_object",key:re,payload:z});let H=await a.boardOps.getAllOutputsComputedValues({});if(H.status==="success"&&H.data!=null)for(let[re,z]of Object.entries(H.data))re&&z&&typeof z=="object"&&!Array.isArray(z)&&b.push({kind:"computed_values",cardId:re,values:z});b.length>0&&Z(b,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});}async function G(a,b){if(!a||a.cardsBootstrapped)return;let E=await a.cardStoreOps.get({}),U=E.status==="success"&&Array.isArray(E.data?.cards)?E.data.cards:[];for(let H of U)typeof H.id=="string"&&(i.set(H.id,b),await a.boardOps.upsertCard({params:{cardId:H.id}}));a.cardsBootstrapped=true;}async function P(){for(let a of d)await X(a);}async function C(){await P();for(let a=0;a<d.length;a++)await se(d[a]),await G(d[a],a),await se(d[a]);}async function K(a=false){a||await P();for(let b of d){let E=await b.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}function N(a){return d[l(a)]??null}async function w(a){let b=N(a);if(!b)return null;let E=await b.cardStoreOps.get({params:{id:a}});if(E.status!=="success")return null;let U=Array.isArray(E.data?.cards)?E.data.cards:[];return U.length>0?U[0]:null}async function T(){let a=async E=>{if(!E)return [];let U=await E.cardStoreOps.get({});return U.status!=="success"||!Array.isArray(U.data?.cards)?[]:U.data.cards},b=[];for(let E of d)b.push(...await a(E));return b}function j(){return d[0]??null}function F(a){return N(a)??j()}function D(a){let b=F(a);if(!b)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${a}`),{statusCode:404});return b.chatStorage}async function te(a){return await D(a).isProcessing(a)}async function ce(a,b){let E=await le.setProcessing({params:{cardId:a},body:{active:b}});if(E.status!=="success")throw Object.assign(new Error(E.error||`Failed to set chat processing for card: ${a}`),{statusCode:500})}let le=Jn({append(a,b,E,U,H){return D(a).append(a,b,E,U,H)},readAll(a){return D(a).readAll(a)},readAfter(a,b){return D(a).readAfter(a,b)},clear(a){return D(a).clear(a)},setProcessing(a,b){return D(a).setProcessing(a,b)},isProcessing(a){return D(a).isProcessing(a)},getConfig(a){return D(a).getConfig(a)},setConfig(a,b){return D(a).setConfig(a,b)}},{emitNotification(a){if(a.kind==="notification-batch"){ae(a.notifications);return}ae([a]);}}),ye=uo({boardContexts:d,cardOwnerIndex:i,cardContextForCard:a=>N(a),readStatusSnapshot:()=>Le(),readDataObjectsByToken:()=>Ze(),readCardRuntimeArtifacts:()=>pe(),readCardFromStore:a=>w(a),readCardDefinitions:()=>T(),processAccumulatedLaneInternal:a=>K(a),reportSourceFetched:(a,b)=>It(a,{ref:b}),reportSourceFetchFailure:(a,b)=>jt(a,{reason:b}),uploadCardFile:(a,b,E,U,H)=>he(a,b,E,U,H),chatStorePublic:le,serverUrl:p,apiBasePath:t}),Pe=ye.mcpCardStoreFacade,Be=ye.createMcpFacade,Se=Xn({boardId:o,bootstrapBoard:()=>C(),sseHub:_,onChannelSubscribed:B,onChannelUnsubscribed:x,getMcpFacade:()=>Be(),getMcpCardStoreFacade:()=>Pe()});function we(a){return to(a)}function je(){return ro(Be())}function ve(){return no({boardId:o,uploadCardFile:he,getMcpFacade:()=>Be(),controlplane:Se})}let Fe=Zn({boardId:o,boardContexts:d,readChatRecords:a=>oe(a),getChatProcessing:a=>te(a)}),Le=Fe.readStatusSnapshot,pe=Fe.readCardRuntimeArtifacts,Ze=Fe.readDataObjectsByToken,Ke=Fe.buildPublishedRuntimePayload;async function Ue(a,b,E){let U=E?.syncBoard!==false,H=E?.restartOnlyIfChanged===true,re=N(a);if(!re)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let z=await w(a);if(!z)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let ue=H?JSON.stringify(z):null,Me=b(z)||z;if(H&&JSON.stringify(Me)===ue)return;let xe=await re.cardStoreOps.set({body:Me});if(xe.status!=="success")throw Object.assign(new Error(xe.error||`Failed to persist card: ${a}`),{statusCode:500});if(U){let $e=await re.boardOps.upsertCard({params:{cardId:a,restart:true}});if($e.status!=="success")throw Object.assign(new Error($e.error||`Failed to upsert card: ${a}`),{statusCode:500})}}async function et(a,b){await Ue(a,b,{syncBoard:true});}async function L(a,b){await Ue(a,b,{syncBoard:false});}async function h(a){let b=N(a);if(!b)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});if(!await w(a))throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let U=await b.boardOps.upsertCard({params:{cardId:a,restart:true}});if(U.status!=="success")throw Object.assign(new Error(U.error||`Failed to retrigger card: ${a}`),{statusCode:500})}async function q(a){let b=await le.clear({params:{cardId:a}});if(b.status!=="success")throw Object.assign(new Error(b.error||`Failed to clear chat records for card: ${a}`),{statusCode:500});try{await ce(a,!1);}catch{}}async function V(a,b,E,U,H=""){let re=typeof E=="string"?E.trim():"",z=await le.append({params:{cardId:a},body:{role:b||"system",text:re,files:U,turn:H}});if(z.status!=="success")throw Object.assign(new Error(z.error||`Failed to append chat record for card: ${a}`),{statusCode:500});return String(z.data?.id||"")}async function oe(a){return await D(a).readAll(a)}let he=eo({safeCardId:a=>M(a),artifactsStores:a=>v(a),cardFileMetadataStore:()=>O(),readCardFromStore:a=>w(a),updateCardLocalOnly:(a,b)=>L(a,b),writeChatRecord:(a,b,E,U,H)=>V(a,b,E,U,H)}).uploadCardFile;async function fe(a){let b=N(a);if(!b)return null;let E=await b.boardOps.getConfig({params:{key:"chat-handler-flow"}}),H=(E.status==="success"?E.data?.value:null)??b.chatHandlerFlow??null,re=b.chatHandlerRef;return H==null&&(!re||typeof re!="object")?null:{ctx:b,handlerFlow:H,handlerRef:re}}function Ce(a){let b=typeof a=="string"?a.trim():"";if(b.length<Nt.length*2||!b.startsWith(Nt)||!b.endsWith(Nt))return null;let E=b.slice(Nt.length,b.length-Nt.length).trim(),U=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(E);return U?{assistant:U[1].trim().toLowerCase(),text:U[2].trim()}:{assistant:"echo",text:E}}async function _e(a,b,E=false,U="",H=""){try{let re=await fe(a);if(!re){try{await ce(a,!1);}catch{}return}let{ctx:z,handlerFlow:ue,handlerRef:Me}=re;if(!E)try{await ce(a,!0);}catch{}let xe={boardId:o,cardId:String(a),lastChatEntryId:b,...U?{turnId:U}:{},...typeof H=="string"&&H.trim()?{probe:H.trim()}:{},...R,...p?{serverUrl:p}:{}},$e=ue!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:po}}:Me;tt(z.boardAdapter)?await f(z,"chat-agent").enqueueRequest({boardId:o,ref:$e,args:ue!=null?{...xe,__chatHandlerFlow:ue}:xe}):f(z,"chat-agent").enqueueRequest({boardId:o,ref:$e,args:ue!=null?{...xe,__chatHandlerFlow:ue}:xe}),await Promise.resolve(z.boardAdapter.requestProcessAccumulated?.());}catch(re){try{await ce(a,!1);}catch{}s.warn(`[chat-handler] queue failed for card "${a}": ${re instanceof Error?re.message:String(re)}`);}}async function He(a,b,E){if(b.howToRun==="built-in"&&zr(b)===po){let U=u,H=E.__chatHandlerFlow,re={...E};return delete re.__chatHandlerFlow,U?U.run(H,re,{boardId:o,cardId:String(re.cardId||""),label:a.label,logger:s,serverUrl:p,executionExtra:R}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return c.invoke(b,E)}async function Je(a,b=false){b||await P();let E=typeof a.args?.cardId=="string"?a.args.cardId:"",U=E?N(E):j();if(!U)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let H=await He(U,a.ref,a.args);if(!H.dispatched){if(E)try{await ce(E,!1);}catch{}throw new Error(H.error||`chat-agent dispatch failed for card "${E||"unknown"}"`)}}async function De(a,b,E){if(b==="chat-send"){let H=E&&typeof E["turn-id"]=="string"?E["turn-id"]:E&&typeof E.turnId=="string"?E.turnId:E&&typeof E.turn=="string"?E.turn:"";if(E&&"files"in E&&E.files!==void 0&&E.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let re=ve(),z=Ce(E?.text),ue=z?z.text:E?.text,Me=await mt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:a,role:"user",text:ue,turn_id:H,files:[]},re);if(Me?.status!=="success")throw new Error(rt(Me,`chat-send append failed for card ${a}`));let xe=Me?.data?.id;if(typeof xe!="string"||!xe)throw new Error(`chat-send did not return an append id for card ${a}`);let $e=await mt("setstate.chat-processing-started",{board_id:o,card_id:a},re);if($e?.status!=="success")throw new Error(rt($e,`chat-send processing update failed for card ${a}`));_e(a,xe,true,H,z?.assistant||"");return}await et(a,H=>{let re=new Date().toISOString(),z=H.card_data&&typeof H.card_data=="object"?H.card_data:{};if(H.card_data=z,b==="file-upload"){let ue=O().normalizeIncoming(E?.files,re);return ue.length>0&&O().merge(z,ue),H}if(b==="action"){let ue=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!ue)return H;z.lastAction={buttonId:ue,at:re},z.lastActionText=`${ue} @ ${re}`;}return H});}function We(a,b,E){let U=JSON.stringify(E),H=typeof Buffer<"u"?Buffer.byteLength(U):new TextEncoder().encode(U).length;a.writeHead(b,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":H}),a.end(U);}async function ze(a,b,E){let U=await w(a);if(!U)throw Object.assign(new Error("Card not found"),{statusCode:404});let H=O().resolve(U.card_data,b,E);if(!H.ok&&H.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!H.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let re=H.file,z=M(a),ue=v(a),Me=String(re.stored_name||""),xe=`${z}/${Me}`,$e=ue.files?await ue.files.getBytes(xe):null;if(!$e)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:re,bytes:$e}}async function dt(a,b,E,U){let{fileRecord:H,bytes:re}=await ze(b,E,U),z=String(H.name||H.stored_name||"download.bin"),ue=String(H.mime_type||"application/octet-stream");a.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${z}"`,"Content-Length":re.length}),a.end(re);}function At(a){let b=String(a||"").toLowerCase();return b.startsWith("text/")||b.includes("json")||b.includes("xml")||b.includes("javascript")||b.includes("typescript")||b.includes("yaml")||b.includes("csv")}function xt(a,b,E){let U=a.split(/\r?\n/);return (b==="head"?U.slice(0,E):U.slice(-E)).join(`
|
|
7
|
+
`)}async function lt(a){let b=[];for await(let U of a)b.push(U);let E=typeof Buffer<"u"?Buffer.concat(b).toString("utf-8").trim():new TextDecoder().decode(wr(b)).trim();return E?JSON.parse(E):{}}async function It(a,b){let E=typeof b.ref=="string"?b.ref.trim():"";if(!E)return {status:"fail",error:"board-worker success callback requires body.ref"};let U=d[0];return U?U.boardOps.sourceDataFetched({params:{token:a,ref:E}}):{status:"fail",error:"no board context"}}async function jt(a,b){let E=typeof b.reason=="string"&&b.reason.trim()?b.reason:"unknown",U=d[0];return U?U.boardOps.sourceDataFetchFailure({params:{token:a,reason:E}}):{status:"fail",error:"no board context"}}let Gr=fo({sseHub:_,queueSseHub:I,corsHeaders:r,json:We,buildPublishedRuntimePayload:()=>Ke(),onSseClientConnected:S,onChannelSubscribed:B,onChannelUnsubscribed:x,apiBasePath:t,readJsonBody:a=>lt(a),initBoardAndSetup:()=>P(),bootstrapBoard:()=>C(),boardContexts:d,publishPersistedStateSnapshot:a=>se(a),upsertCardsFromSource:(a,b)=>G(a,b)}).handleWatchersRoutes,bt=co({apiBasePath:t,json:We,readJsonBody:a=>lt(a),bootstrapBoard:()=>C(),createMcpFacade:()=>Be(),createMcpToolRegistry:a=>we(a),resolveCardFileDownloadPayload:(a,b,E)=>ze(a,b,E),isLikelyTextMimeType:a=>At(a),sliceTextByLines:(a,b,E)=>xt(a,b,E)}).handleAgentfaceApi,Rr=lo({apiBasePath:t,json:We,readJsonBody:a=>lt(a),initBoardAndSetup:()=>P(),createMcpWebhookToolRegistry:()=>je()}).handleWebhooksApi,pt=vr({apiBasePath:t,json:We,readJsonBody:a=>lt(a),initBoardAndSetup:()=>P(),bootstrapBoard:()=>C(),buildPublishedRuntimePayload:()=>Ke(),createMcpControlplaneToolRegistry:()=>ve(),retriggerCard:a=>h(a),applyCardAction:(a,b,E)=>De(a,b,E),resolveChatHandlerTarget:a=>fe(a),sendCardFileDownloadResponse:(a,b,E,U)=>dt(a,b,E,U)}).handleRuntimeApi,Mt=mo({apiBasePath:t,emitNotifications:a=>ae(a),readJsonBody:a=>lt(a),json:(a,b,E)=>We(a,b,E)}).handleNotifyRoute;async function W(a,b,E){return !!(await bt(a,b,E)||await Rr(a,b,E)||await Gr(a,b,E)||await Mt(a,b,E)||await pt(a,b,E))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:W,emitNotification(a){if(a.kind==="notification-batch"){ae(a.notifications);return}ae([a]);},buildPublishedRuntimePayload:Ke,__drainProcessAccumulatedLane:K,handleChatAgentRequest:Je,clearChatRecords:q,reportSourceFetched(a,b){return It(a,{ref:b})},reportSourceFetchFailure(a,b){return jt(a,{reason:b})},get cardStore(){return d[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function ba(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...go,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,s=new Map,c="boards-config.json";function u(){let I=n.getText(c);if(!I)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(I)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function m(I){n.putText(c,JSON.stringify(I,null,2));}function p(I){let y=String(I||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return y.length>0&&y.length<=64?y:null}function R(I){if(s.has(I))return s.get(I);let d=u().boards.find(l=>l.id===I)||{},i=o(I,d);return s.set(I,i),i}function S(I,y,d){let i=JSON.stringify(d),l=typeof Buffer<"u"?Buffer.byteLength(i):new TextEncoder().encode(i).length;I.writeHead(y,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":l}),I.end(i);}async function A(I,y,d){let i=I.method||"GET",l=d.pathname;if(i==="GET"&&l===t)return S(y,200,{ok:true,boards:u().boards}),true;if(i==="POST"&&l===t){let g=[];for await(let J of I)g.push(J);let f=typeof Buffer<"u"?Buffer.concat(g).toString("utf-8").trim():new TextDecoder().decode(wr(g)).trim(),k={};try{k=f?JSON.parse(f):{};}catch{k={};}let v=p(k.id);if(!v)return S(y,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let O=u();if(O.boards.some(J=>J.id===v))return S(y,409,{error:`Board "${v}" is already registered`}),true;let M=typeof k.label=="string"&&k.label.trim()?k.label.trim():v,$={id:v,label:M};for(let[J,Z]of Object.entries(k))J==="id"||J==="label"||Z!=null&&($[J]=Z);return O.boards.push($),m(O),S(y,200,{ok:true,board:$}),true}return false}async function B(I,y,d){let l=d.pathname.match(new RegExp(`^${ot(t)}/([^/]+)(/|$)`));if(!l)return false;let g=p(decodeURIComponent(l[1]));return g?u().boards.some(v=>v.id===g)?!!await R(g).handleRuntimeApi(I,y,d):(S(y,404,{error:`Board "${g}" not registered. POST ${t} with {id} to register it first.`}),true):(S(y,400,{error:"Invalid board id"}),true)}async function x(I,y,d){return !!(await A(I,y,d)||await B(I,y,d))}function _(I){if(!u().boards.some(d=>d.id===I))throw Object.assign(new Error(`Board "${I}" not registered`),{statusCode:404});return {service:R(I)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:x,requireBoardService:_}}exports.createMultiBoardServerRuntime=ba;exports.createRoutesRuntimeApi=vr;exports.createSingleBoardServerRuntime=Ca;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
|
|
8
8
|
//# sourceMappingURL=server-runtime-controlface.js.map
|