yaml-flow 8.11.3 → 8.11.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/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 +4 -4
- package/examples/board/test/server-http-test-browser.ts +1 -1
- package/examples/board/test/server-http-test.js +1 -1
- package/lib/board-live-cards-node.cjs +2 -2
- package/lib/board-live-cards-node.d.cts +2 -2
- package/lib/board-live-cards-node.d.ts +2 -2
- package/lib/board-live-cards-node.js +2 -2
- package/lib/board-live-cards-public.cjs +1 -1
- 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 +1 -1
- package/lib/board-live-cards-server-runtime.d.ts +1 -1
- package/lib/board-live-cards-server-runtime.js +1 -1
- package/lib/board-livegraph-runtime/index.cjs +1 -1
- package/lib/board-livegraph-runtime/index.d.cts +1 -0
- package/lib/board-livegraph-runtime/index.d.ts +1 -0
- package/lib/board-livegraph-runtime/index.js +1 -1
- package/lib/card-store-public.cjs +1 -1
- package/lib/card-store-public.js +1 -1
- package/lib/{chunk-MEL5LKF7.js → chunk-23PEDGFN.js} +2 -2
- package/lib/{chunk-O65MSWUE.cjs → chunk-52XPRCZC.cjs} +2 -2
- package/lib/chunk-5RUSICUC.cjs +3 -0
- package/lib/chunk-7Y47QXMX.cjs +2 -0
- package/lib/chunk-AW3COGCI.cjs +3 -0
- package/lib/chunk-CODPG5MY.js +3 -0
- package/lib/chunk-EHREWADE.js +2 -0
- package/lib/chunk-EOVTMJYZ.js +2 -0
- package/lib/chunk-FULAMLUU.js +3 -0
- package/lib/chunk-HOSD6UHA.js +3 -0
- package/lib/chunk-I3ZOFU3F.js +2 -0
- package/lib/chunk-J7KE7SPA.cjs +2 -0
- package/lib/chunk-NOAERAOE.cjs +2 -0
- package/lib/chunk-Q444D72R.js +2 -0
- package/lib/chunk-QKWQ4HRE.js +3 -0
- package/lib/chunk-R7SQQSDX.js +2 -0
- package/lib/chunk-SIPLKLWU.cjs +2 -0
- package/lib/{chunk-HLJH7LGW.js → chunk-SK2R5ILQ.js} +3 -3
- package/lib/chunk-VI36DRWG.cjs +2 -0
- package/lib/chunk-WE7JOO4T.cjs +3 -0
- package/lib/chunk-WGYS2L4V.js +2 -0
- package/lib/chunk-X5MLNGGM.cjs +16 -0
- package/lib/{chunk-FFHG3CFU.cjs → chunk-YAPTL2MP.cjs} +2 -2
- package/lib/chunk-ZWXZ5DBX.cjs +3 -0
- package/lib/cloud-storage.cjs +1 -1
- package/lib/cloud-storage.js +1 -1
- package/lib/continuous-event-graph/index.cjs +1 -1
- package/lib/continuous-event-graph/index.js +1 -1
- package/lib/event-graph/index.cjs +1 -1
- package/lib/event-graph/index.js +1 -1
- package/lib/firestore-storage/index.cjs +1 -1
- package/lib/firestore-storage/index.js +1 -1
- package/lib/index.cjs +2 -2
- package/lib/index.js +1 -1
- package/lib/localstorage-storage/index.cjs +1 -1
- package/lib/localstorage-storage/index.js +1 -1
- package/lib/server-jobs-queue-runner/index.d.cts +1 -1
- package/lib/server-jobs-queue-runner/index.d.ts +1 -1
- package/lib/server-runtime/index.cjs +1 -1
- package/lib/server-runtime/index.d.cts +2 -2
- package/lib/server-runtime/index.d.ts +2 -2
- package/lib/server-runtime/index.js +1 -1
- package/lib/server-runtime-agentface/index.d.cts +1 -1
- package/lib/server-runtime-agentface/index.d.ts +1 -1
- package/lib/server-runtime-controlface/index.cjs +1 -1
- package/lib/server-runtime-controlface/index.d.cts +1 -1
- package/lib/server-runtime-controlface/index.d.ts +1 -1
- 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 +7 -4
- package/lib/server-runtime-core/index.d.ts +7 -4
- package/lib/server-runtime-core/index.js +1 -1
- package/lib/server-runtime-watchers/index.d.cts +3 -3
- package/lib/server-runtime-watchers/index.d.ts +3 -3
- package/lib/server-runtime-webhooks/index.d.cts +1 -1
- package/lib/server-runtime-webhooks/index.d.ts +1 -1
- package/lib/{sse-hub-D_94fV87.d.ts → sse-hub-D_QHswxL.d.ts} +1 -1
- package/lib/{sse-hub-BRBvymHR.d.cts → sse-hub-XO6crN9o.d.cts} +1 -1
- package/lib/{types-BsqzUZNl.d.ts → types-B8Yieskx.d.ts} +2 -0
- package/lib/{types-DxhB6Toz.d.cts → types-gTf9pAyC.d.cts} +2 -0
- package/package.json +1 -1
- package/lib/chunk-5EA2ESS4.cjs +0 -16
- package/lib/chunk-5VTIOM2U.js +0 -3
- package/lib/chunk-5XLFPPTY.cjs +0 -2
- package/lib/chunk-7QNEV5S3.js +0 -2
- package/lib/chunk-BAG7MHZP.cjs +0 -3
- package/lib/chunk-CZ6ZFWFT.js +0 -2
- package/lib/chunk-EZOXABJ2.js +0 -3
- package/lib/chunk-G4XXRHL2.cjs +0 -3
- package/lib/chunk-HVLWVMG6.cjs +0 -3
- package/lib/chunk-LODXIALE.cjs +0 -2
- package/lib/chunk-NMOUBZXX.cjs +0 -2
- package/lib/chunk-SEUSFOMM.js +0 -3
- package/lib/chunk-VGT3TRQG.js +0 -3
- package/lib/chunk-WDPOGXTY.js +0 -2
- package/lib/chunk-YQ4MW72D.cjs +0 -3
- package/lib/chunk-ZCU5O2LR.js +0 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var ServerRuntimeControlface=(function(exports){'use strict';var xo=Object.defineProperty;var To=(e,t,r)=>t in e?xo(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var tn=(e,t,r)=>To(e,t+"",r);var Qt="b64:";function Io(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 Po(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 xe(e){return `${Qt}${Io(JSON.stringify(e))}`}function st(e){if(!e.startsWith(Qt))throw new Error(`Invalid ref format (expected ${Qt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Po(e.slice(Qt.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 rn(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function Ze(e){return typeof e.journalStorage=="function"}function nn(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?st(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function at(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function xr(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 fe(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 mt(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 Gt(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 on(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,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 et(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 f=c.find(g=>typeof g=="string"&&g.trim());if(typeof f=="string")return `Validation failed: ${f}`}let u=s.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function Tr(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpControlplaneToolRegistry:s,retriggerCard:c,applyCardAction:u,resolveChatHandlerTarget:f,sendCardFileDownloadResponse:g}=e;async function k(S,b,O){let P=S.method||"GET",_=O,v=_.pathname;try{if(P==="POST"&&v===`${t}/mcp-actions`){await o();let d=Date.now(),m=new Date(d).toISOString(),p=await n(S),R=typeof p.tool=="string"?p.tool.trim():"",w=p.args&&typeof p.args=="object"&&!Array.isArray(p.args)?p.args:{};if(!R)return r(b,400,{error:"tool is required"}),!0;let B=fe(w,"card_id");if(!B)return r(b,400,{error:"MCP action requires card_id"}),!0;if(R==="retrigger-card"||R==="retrigger"){await c(B);let Q=Date.now();return r(b,200,{status:"success",data:{ok:!0,cardId:B,actionType:R,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(Q).toISOString(),responseSentAtMs:Q,responseStatus:200}}),!0}let j=ut(w,"payload");if(R==="chat-send"&&!await f(B)){let Q=Date.now();return r(b,409,{error:`chat handler is not configured for card: ${B}`,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(Q).toISOString(),responseSentAtMs:Q,responseStatus:409}),!0}if(R==="chat-send"){let Q=typeof j["turn-id"]=="string"?j["turn-id"]:typeof j.turnId=="string"?j.turnId:typeof j.turn=="string"?j.turn:"";if(!Q||!String(Q).trim()){let ne=Date.now();return r(b,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${B}`,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(ne).toISOString(),responseSentAtMs:ne,responseStatus:400}),!0}}await u(B,R,j);let U=Date.now();return r(b,200,{status:"success",data:{ok:!0,cardId:B,actionType:R,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(U).toISOString(),responseSentAtMs:U,responseStatus:200}}),!0}if(P==="POST"&&v===`${t}/mcp-controlplane`){await o();let d=await n(S),m=typeof d.tool=="string"?d.tool.trim():"",p=d.args&&typeof d.args=="object"&&!Array.isArray(d.args)?d.args:{};if(!m)return r(b,400,{error:"tool is required"}),!0;try{let R=await pt(m,p,s());if(R&&typeof R=="object"&&!Array.isArray(R)){let w=R;if(w.status==="fail")return r(b,400,{error:et(R,"Request failed")}),!0;if(w.status==="error")return r(b,500,{error:et(R,"Internal error")}),!0}r(b,200,R);}catch(R){let w=typeof R?.statusCode=="number"?Number(R.statusCode):500,B=R instanceof Error?R.message:String(R);r(b,w,{error:B});}return !0}let y=v.match(new RegExp(`^${at(t)}/cards/([^/]+)/retrigger$`));if(P==="POST"&&y){await o();let d=decodeURIComponent(y[1]);return await c(d),r(b,200,{ok:!0}),!0}let l=v.match(new RegExp(`^${at(t)}/cards/([^/]+)/actions$`));if(P==="POST"&&l){await o();let d=decodeURIComponent(l[1]),m=Date.now(),p=new Date(m).toISOString(),R=await n(S),w=R?.actionType;if(w==="chat-send"&&!await f(d)){let j=Date.now();return r(b,409,{error:`chat handler is not configured for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(j).toISOString(),responseSentAtMs:j,responseStatus:409}),!0}if(w==="chat-send"){let j=R?.payload??{},U=typeof j["turn-id"]=="string"?j["turn-id"]:typeof j.turnId=="string"?j.turnId:typeof j.turn=="string"?j.turn:"";if(!U||!String(U).trim()){let Q=Date.now();return r(b,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(Q).toISOString(),responseSentAtMs:Q,responseStatus:400}),!0}}await u(d,w,R?.payload);let B=Date.now();return r(b,200,{ok:!0,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(B).toISOString(),responseSentAtMs:B,responseStatus:200}),!0}let i=v.match(new RegExp(`^${at(t)}/cards/([^/]+)/files/(\\d+)$`));if(P==="GET"&&i){let d=decodeURIComponent(i[1]),m=parseInt(i[2],10),p=_.searchParams.get("sn");return await g(b,d,m,p),!0}return !1}catch(y){let l=y?.statusCode||500;return r(b,l,{error:String(y?.message||y)}),true}}return {handleRuntimeApi:k}}function Wt(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 _o(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 Eo(e){return e.category?e:{...e,category:_o(e.kind)}}function Le(e){return e.map(t=>Eo(t))}function Me(e){return {...e,category:e.category??"batch",notifications:Le(e.notifications)}}var yt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ze(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function ht(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function an(e){return e.tasks??{}}function Ir(e){return e?e.status===yt.FAILED||e.status===yt.INACTIVATED:false}function sn(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function un(e){return e.maxExecutions}function cn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===yt.COMPLETED){let s=e.tasks[n];s&&ze(s).forEach(u=>r.add(u));}return Array.from(r)}function dn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;ze(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function ln(e,t,r){let n=e.tasks[t]??zt(),o={};if(r){let c=r.tasks[t],u=ht(c);for(let f of u)for(let[g,k]of Object.entries(r.tasks))if(ze(k).includes(f)){let S=e.tasks[g];S?.lastDataHash&&(o[f]=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 fn(e,t,r,n,o,s){let c=e.tasks[r]??zt(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let f;n&&u.on&&u.on[n]?f=u.on[n]:f=ze(u);let g=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let b=u.requires??[];for(let O of b)for(let[P,_]of Object.entries(t.tasks))if(ze(_).includes(O)){let v=e.tasks[P];v?.lastDataHash&&(g[O]=v.lastDataHash);break}}let k={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:g,error:void 0},S=[...new Set([...e.availableOutputs,...f])];return {...e,tasks:{...e.tasks,[r]:k},availableOutputs:S,lastUpdated:new Date().toISOString()}}function mn(e,t,r,n){let o=e.tasks[r]??zt(),s=t.tasks[r];if(s?.retry){let f=o.retryCount+1;if(f<=s.retry.max_attempts){let g={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:g},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 f=s.circuit_breaker.on_break;u=[...new Set([...u,...f])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:u,lastUpdated:new Date().toISOString()}}function pn(e,t,r,n){let o=e.tasks[t]??zt(),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 gn(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 zt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function It(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=hn();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 Bo(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:ln(n,t.taskName,r)};case "task-completed":return {config:r,state:fn(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:mn(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:pn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:gn(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:Mo(n,t.action)};case "task-upsert":return Oo(e,t.taskName,t.taskConfig);case "task-removal":return Fo(e,t.taskName);case "node-requires-add":return qo(e,t.nodeName,t.tokens);case "node-requires-remove":return No(e,t.nodeName,t.tokens);case "node-provides-add":return jo(e,t.nodeName,t.tokens);case "node-provides-remove":return Lo(e,t.nodeName,t.tokens);default:return e}}function yn(e,t){return t.reduce((r,n)=>Bo(r,n),e)}function Oo(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]:hn()},lastUpdated:new Date().toISOString()}}}function Fo(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 qo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ht(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 No(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ht(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 jo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ze(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 Lo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ze(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 Rt(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function kt(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 hn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Mo(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 qt(e){let{config:t,state:r}=e,n=an(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=Do(n),c=cn(t,r.tasks),u=new Set([...c,...r.availableOutputs]),f=[],g=[],k=[],S=[];for(let[O,P]of Object.entries(n)){let _=r.tasks[O],v=sn(P,t.settings),y=v!=="once";if(_?.status===yt.RUNNING||Ir(_))continue;let l=un(P);if(l!==void 0&&_&&_.executionCount>=l||P.circuit_breaker&&_&&_.executionCount>=P.circuit_breaker.max_executions||!y&&_?.status===yt.COMPLETED)continue;if(y&&_?.status===yt.COMPLETED){let R=ht(P),w=false;switch(v){case "data-changed":{R.length>0&&R.some(j=>{for(let[U,Q]of Object.entries(n))if(ze(Q).includes(j)){let ne=r.tasks[U];if(!ne)continue;let J=_.lastConsumedHashes?.[j];return ne.lastDataHash==null?ne.executionCount>_.lastEpoch:ne.lastDataHash!==J}return false})||(w=true);break}case "epoch-changed":{R.length>0&&R.some(j=>{for(let[U,Q]of Object.entries(n))if(ze(Q).includes(j)){let ne=r.tasks[U];if(ne&&ne.executionCount>_.lastEpoch)return true}return false})||(w=true);break}case "time-based":{let B=P.refreshInterval??0;if(B<=0){w=true;break}let j=_.completedAt;if(!j){w=true;break}(Date.now()-Date.parse(j))/1e3<B&&(w=true);break}case "manual":w=true;break}if(w)continue}let i=ht(P);if(i.length===0){f.push(O);continue}let d=[],m=[],p=[];for(let R of i){if(u.has(R))continue;let w=s[R]||[];w.length===0?d.push(R):w.every(j=>Ir(r.tasks[j]))?p.push({token:R,failedProducer:w[0]}):m.push(R);}d.length>0?k.push({taskName:O,missingTokens:d}):p.length>0?S.push({taskName:O,failedTokens:p.map(R=>R.token),failedProducers:[...new Set(p.map(R=>R.failedProducer))]}):m.length>0?g.push({taskName:O,waitingOn:m}):f.push(O);}let b={};if(f.length>1){let O=dn(f,n);for(let[P,_]of Object.entries(O))_.length>1&&(b[P]=_);}return {eligible:f,pending:g,unresolved:k,blocked:S,conflicts:b}}function Do(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of ze(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 Nt=class{constructor(){tn(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Pr(e){let t=_r(e);return $o(t)}function _r(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(_r).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+_r(t[n])).join(",")+"}"}function $o(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 Uo(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 Vo(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 Uo(t)}function Ko(e){try{let t=JSON.parse(Vo(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Yt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:s}=t,c=new Nt,u="state"in e&&"config"in e?e:It(e),f=false,g=new Set,k=new Map(Object.entries(n)),S=new Nt,b=false,O=false;function P(){if(!f){if(b){O=true;return}b=true;try{do O=!1,_();while(O)}finally{b=false;}}}function _(){let i=S.drain(),d=c.drain(),m=[...i,...d];if(m.length>0&&(u=yn(u,m),o)){for(let R of m)if(R.type==="task-removal")try{o(R.taskName);}catch(w){console.warn("[reactive] onNodeRemoved failed:",w instanceof Error?w.message:String(w));}}let p=qt(u);m.length>0&&s?.(m,u,p);for(let R of p.eligible)l(R);for(let R of m)if(R.type==="task-progress"){let{taskName:w,update:B}=R;if(!u.config.tasks[w])continue;let U=u.state.tasks[w];if(!U||U.status!=="running")continue;let Q=Rn(w),ne=y(w,Q,B).catch(J=>{f||(S.append({type:"task-failed",taskName:w,error:J.message??String(J),timestamp:new Date().toISOString()}),P());}).finally(()=>{g.delete(ne);});g.add(ne);}}function v(i){let m=u.config.tasks[i].requires??[],p=new Map;for(let[w,B]of Object.entries(u.config.tasks))for(let j of B.provides??[])p.set(j,w);let R={};for(let w of m){let B=p.get(w);B?R[w]=u.state.tasks[B]?.data:R[w]=void 0;}return R}async function y(i,d,m){let p=u.config.tasks[i],R=p.taskHandlers??[],w=v(i);for(let B of R){let j=k.get(B);if(!j)throw new Error(`Handler '${B}' not found in registry (task '${i}')`);let U={nodeId:i,state:w,taskState:u.state.tasks[i],config:p,callbackToken:d,update:m};if(await j(U)==="task-initiate-failure")throw new Error(`Handler '${B}' returned task-initiate-failure (task '${i}')`)}}function l(i){let m=u.config.tasks[i]?.taskHandlers;if(!m||m.length===0)return;S.append({type:"task-started",taskName:i,timestamp:new Date().toISOString()}),P();let p=Rn(i),R=y(i,p).catch(w=>{f||(S.append({type:"task-failed",taskName:i,error:w.message??String(w),timestamp:new Date().toISOString()}),P());}).finally(()=>{g.delete(R);});g.add(R);}return {push(i){f||(i.type==="task-completed"&&i.data&&!i.dataHash&&(i={...i,dataHash:Pr(i.data)}),c.append(i),P());},pushAll(i){if(!f){for(let d of i)d.type==="task-completed"&&d.data&&!d.dataHash?c.append({...d,dataHash:Pr(d.data)}):c.append(d);P();}},resolveCallback(i,d,m){if(f)return;let p=Ko(i);if(!p)return;let{taskName:R}=p;if(u.config.tasks[R]){if(m&&m.length>0)c.append({type:"task-failed",taskName:R,error:m.join("; "),timestamp:new Date().toISOString()});else {let w=d&&Object.keys(d).length>0?Pr(d):void 0;c.append({type:"task-completed",taskName:R,data:d,dataHash:w,timestamp:new Date().toISOString()});}P();}},addNode(i,d){f||(c.append({type:"task-upsert",taskName:i,taskConfig:d,timestamp:new Date().toISOString()}),P());},removeNode(i){f||(c.append({type:"task-removal",taskName:i,timestamp:new Date().toISOString()}),P());},addRequires(i,d){f||(c.append({type:"node-requires-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),P());},removeRequires(i,d){f||(c.append({type:"node-requires-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),P());},addProvides(i,d){f||(c.append({type:"node-provides-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),P());},removeProvides(i,d){f||(c.append({type:"node-provides-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),P());},registerHandler(i,d){k.set(i,d);},unregisterHandler(i){k.delete(i);},retrigger(i){f||u.config.tasks[i]&&(c.append({type:"task-restart",taskName:i,timestamp:new Date().toISOString()}),P());},retriggerAll(i){if(!f){for(let d of i)u.config.tasks[d]&&c.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});P();}},snapshot(){return Rt(u)},getState(){return u},getSchedule(){return qt(u)},async waitForHandlers(){g.size>0&&await Promise.allSettled([...g]);},async dispose(i){i?.wait&&g.size>0&&await Promise.allSettled([...g]),f=true;}}}function Xt(){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 Ho=Xt();Ho("./jsonata-sync.cjs");var Jo=Xt(),Zt=Jo("./jsonata-sync.cjs"),bn=Zt;function kn(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 Sn(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 Qo(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 Zt(o.expr).evaluate(n);Sn(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Go(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=bn(s.expr).evaluate(n);Sn(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 Wo(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Zt(e).evaluate(n)}function zo(e,t){return t.startsWith("fetched_sources.")?kn(e._sourcesData??{},t.slice(16)):kn(e,t)}var Cn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Yo=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Xo(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))Yo.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));}});}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`):Cn.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...Cn].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);});}return {ok:t.length===0,errors:t}}async function Zo(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 Zt(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function ea(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]=bn(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Ge={run:Qo,runSync:Go,eval:Wo,resolve:zo,validate:Xo,enrichSources:Zo,enrichSourcesSync:ea};function er(e){return JSON.stringify(e)}function tr(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 rr(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Er(e,t){return rr(e)?e.then(t):t(e)}function vn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Br(e,t){return {readValues(n){let o=e(n);return Er(o.listKeys(),s=>{let c=[...s].sort();if(c.length===0)return {version:null,values:{}};let u={},f=null;for(let g of c){let k=o.read(g);rr(k)?f=(f??Promise.resolve()).then(async()=>{u[g]=await k;}):u[g]=k;}return f?f.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,s){let c=e(n),u=null;for(let f of s){let g=c.delete(f);rr(g)&&(u=(u??Promise.resolve()).then(()=>g).then(()=>{}));}for(let[f,g]of Object.entries(o)){let k=c.write(f,g);rr(k)&&(u=(u??Promise.resolve()).then(()=>k).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function nr(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 Er(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let s=vn(o.values,n);return Er(e.writeValues(r,s,n.deleteKeys),c=>({ok:true,newVersion:c}))})}}}function wn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function An(e){return {readEntriesAfterCursor(t){let r=wn(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 wn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function xn(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 or(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ct(e,t){return or(e)?e.then(t):t(e)}function Or(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);or(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function ta(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function ra(e,t){let r=e.match(t);return r?r[1]:null}function Tn(e,t,r){let n={},o=Or(e,s=>{let c=r(s);if(c)return ct(t(s),u=>{n[c]=u;})});return or(o)?o.then(()=>n):n}function ar(e,t){return {readSourceData(r,n){return ct(e.read(`${r}/${n}`),ta)},ingestSourceDataStaged(r,n,o,s){return ct(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 ct(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function Fr(e,t){let r=(n,o)=>{try{let s=o(n);return or(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 ct(e.read(n),s=>e.write(n,[...s??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ct(e.read(n),s=>{let c=s;if(!(!c||c.length===0))return ct(Or(c,u=>r(u,o)),()=>e.delete(n))})}}}function qr(e,t,r){return {readRuntime(n){return ct(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function sr(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return ct(e.listKeys("cards/"),t=>Tn(t,r=>e.read(r),r=>ra(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return Or(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 ct(e.listKeys("data-objects/"),t=>Tn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}var tt="sys_keys_board_state",Pe="__sys_keys_board_state_init";function In(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e.__private;return !!t&&typeof t=="object"&&!Array.isArray(t)&&t.visible_controlplane_only===true}function Nr(e){let t=e.filter(o=>!In(o)),r=[...new Set(t.map(o=>o.id).filter(o=>typeof o=="string"&&o.length>0))].sort(),n=[...new Set(t.flatMap(o=>Array.isArray(o.provides)?o.provides:[]).map(o=>o&&typeof o=="object"&&!Array.isArray(o)?o.bindTo:void 0).filter(o=>typeof o=="string"&&o.length>0&&o!==tt))].sort();return {card_ids:r,data_object_keys:n}}function jr(e,t){let r=e.filter(s=>!In(s)),n=[...new Set(r.map(s=>s.id).filter(s=>typeof s=="string"&&s.length>0))].sort(),o=[...new Set(Object.entries(t).filter(([s])=>s!==Pe).flatMap(([,s])=>Array.isArray(s.provides)?s.provides:[]).filter(s=>typeof s=="string"&&s.length>0&&s!==tt))].sort();return {card_ids:n,data_object_keys:o}}function vt(){return {id:Pe,meta:{title:"System Keys Board State",synthetic:true},provides:[{bindTo:tt,ref:`card_data.${tt}`}],card_data:{[tt]:{card_ids:[],data_object_keys:[]}},__private:{visible_controlplane_only:true}}}function Dt(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 f={...o},g=f;for(let k=0;k<u.length-1;k++){let S=u[k],b=g[S],O=b&&typeof b=="object"&&!Array.isArray(b)?{...b}:{};g[S]=O,g=O;}return g[u[u.length-1]]=c,f}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,f]of Object.entries(s))o[u]!==f.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],f=Object.entries(c).find(([,g])=>g.key===s);return u&&u.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:f&&f[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${f[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,c){let u=r(),f=c??u[o]?.key??e.defaultCardKey(o),g=e.writeCard(f,s);u[o]={key:f,checksum:g,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,s,c){let u=r(),f=u[o];if(!f||!e.cardExists(f.key))throw new Error(`card "${o}" not found`);let g=e.readCard(f.key);if(!g||typeof g!="object"||Array.isArray(g))throw new Error(`card "${o}" is not patchable`);let k=n(g,s,c),S=e.writeCard(f.key,k);u[o]={key:f.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 ir(e,t){return ar(e,t)}function Pn(e){return An(e)}var ur="v1",dt="board/graph",_n="board/lastJournalProcessedId";function En(e){return `cards/${e}/runtime`}function Bn(e){return nr(e,ur)}function cr(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 tr(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",er(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 On(e){return sr(e)}function jt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function na(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Lt(e,t){return e?.lastRequestedToken?na(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Lr(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Mt(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function Ct(e){let t=e.cards.filter(u=>u.name!==Pe);if(t.length===e.cards.length)return e;let r=new Set;for(let u of t)for(let f of u.requires)r.add(f);let n=t.map(u=>({name:u.name,fanOut:u.unblocks.length})).sort((u,f)=>f.fanOut-u.fanOut||u.name.localeCompare(f.name)),o=n.length>0?n[0]:{name:null,fanOut:0},s=u=>t.filter(f=>f.status===u).length,c=t.filter(u=>u.requires.length===0&&u.unblocks.length===0).length;return {...e,summary:{...e.summary,card_count:t.length,completed:s("completed"),eligible:s("eligible"),pending:s("pending"),blocked:s("blocked"),unresolved:s("unresolved"),failed:s("failed"),in_progress:s("in-progress"),orphan_cards:c,topology:{edge_count:r.size,max_fan_out_card:o.name,max_fan_out:o.fanOut}},cards:t}}function dr(e){let{[tt]:t,...r}=e;return r}function bt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=qt(t),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let P of s.pending)u.set(P.taskName,P.waitingOn);for(let P of s.unresolved)u.set(P.taskName,P.missingTokens);for(let P of s.blocked)u.set(P.taskName,P.failedTokens);let f=new Map;for(let[P,_]of Object.entries(n))for(let v of _.requires??[]){let y=f.get(v)??[];y.push(P),f.set(v,y);}let g=o.sort().map(P=>{let _=r[P],v=n[P]??{requires:[],provides:[]};_.status==="completed"?c.completed+=1:_.status==="failed"?c.failed+=1:_.status==="in-progress"&&(c.in_progress+=1);let y=v.requires??[],l=v.provides??[],i=Object.keys(_.data??{}).sort(),d=y.filter(j=>t.state.availableOutputs.includes(j)),m=y.filter(j=>!t.state.availableOutputs.includes(j)),p=u.get(P)??m,R=new Set;for(let j of l)for(let U of f.get(j)??[])U!==P&&R.add(U);let w=_.failedAt,B=_.error?{message:_.error,code:"TASK_FAILED",at:w,source:"task-runtime"}:void 0;return {name:P,status:_.status,error:B,requires:y,requires_satisfied:d,requires_missing:m,provides_declared:l,provides_runtime:i,blocked_by:p,unblocks:Array.from(R).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 k=g.map(P=>({name:P.name,fanOut:P.unblocks.length})).sort((P,_)=>_.fanOut-P.fanOut||P.name.localeCompare(_.name)),S=k.length>0?k[0]:{name:null,fanOut:0},b=new Set;for(let P of Object.values(n))for(let _ of P.requires??[])b.add(_);let O=0;for(let[P,_]of Object.entries(n)){let v=(_.requires??[]).length===0,l=(_.provides??[]).some(i=>(f.get(i)??[]).some(d=>d!==P));v&&!l&&(O+=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:O,topology:{edge_count:Array.from(b).length,max_fan_out_card:S.name,max_fan_out:S.fanOut}},cards:g}}function oa(){return new Date().toISOString()}function Fn(e,t,r,n,o,s,c){return async u=>{let f=[],g=r.cardStore.readCard(u.nodeId);if(!g)return "task-initiate-failure";let k=g.id;if(k===Pe){let G=r.activeTaskConfigs?.(),X={[tt]:G?jr(Object.keys(G).filter(Y=>Y!==Pe).map(Y=>r.cardStore.readCard(Y)).filter(Y=>!!Y),G):Nr(r.cardStore.readAllCards())};return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(X),n(u.nodeId,X),"task-initiated"}let S=g.card_data??{},b=g.source_defs??[],O=b,P=r.cardRuntimeStore.readRuntime(k),_=false,v=()=>{_&&(r.cardRuntimeStore.writeRuntime(k,P),_=false);},y=G=>jt(P._sources[G]),l=(G,X)=>{P._sources[G]=jt(X),_=true;},i=u.taskState?.executionCount??0;if(P._lastExecutionCount!==i&&(P._sources={},P._lastExecutionCount=i,_=true),u.update){let G=u.update,X=G.outputFile;if(X){let Y=y(X);if(G.failure){let E=G.rqt??Y.lastRequestedToken??Y.queueRequestedToken;E&&l(X,Mt(Y,E));}else {let E=G.rqt;if(!Y.lastCompletedToken||E>Y.lastCompletedToken){let T=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,$=false;T&&($=r.fetchedSourcesStore.commitSourceData(k,X,T)),$?l(X,Lr(Y,E)):l(X,Mt(Y,E));}}v();}}let m={};for(let G of b)if(G.outputFile){let X=r.fetchedSourcesStore.readSourceData(k,G.outputFile);X!==null&&(m[G.bindTo]=X);}let p={};for(let[G,X]of Object.entries(u.state??{}))if(X!==null&&typeof X=="object"&&!Array.isArray(X)){let Y=X[G];p[G]=Y!==void 0?Y:X;}else p[G]=X;let R={id:k,card_data:{...S},requires:p,source_defs:b,compute:g.compute};R._sourcesData=m,g.compute&&Ge.runSync(R,{sourcesData:m}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(k,R.computed_values??{});let w={...g},B=Ge.enrichSourcesSync(Array.isArray(g.source_defs)?g.source_defs:void 0,{card_data:g.card_data,requires:p}),j=e.value;w.source_defs=Array.isArray(B)?B.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:j})):B;let U=oa(),Q=u.update?void 0:U,ne=O.filter(G=>{let X=G.outputFile;if(typeof X!="string"||!X)return true;let Y=y(X);Q&&(Y={...Y,queueRequestedToken:Q},l(X,Y));let E=Y.queueRequestedToken??Y.lastRequestedToken??U,T=Lt(Y,E);return T==="in-flight"?false:T==="dispatch"});if(v(),ne.length>0){let G=false,X=U;for(let Y of ne){let E=Y.outputFile;if(typeof E!="string"||!E)continue;let T=y(E),$=T.queueRequestedToken??U;l(E,{...T,lastRequestedToken:$}),X=$,G=true;}return G&&v(),G&&(f.push({taskKind:"source-fetch",payload:{boardRef:xe(e),enrichedCard:w,callbackToken:u.callbackToken,rqt:X}}),r.executionRequestStore.appendEntries(t,f)),"task-initiated"}if(O.some(G=>{let X=G.outputFile;if(typeof X!="string"||!X)return false;let Y=y(X),E=Y.queueRequestedToken??Y.lastRequestedToken??U;return Lt(Y,E)==="in-flight"}))return "task-initiated";let ae=g.provides??[],ue={};for(let{bindTo:G,ref:X}of ae)ue[G]=Ge.resolve(R,X);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(ue),n(u.nodeId,ue),f.length>0&&r.executionRequestStore.appendEntries(t,f),"task-initiated"}}var $t={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function lr(e){return {[dt]:e.graph,[_n]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function fr(e){let t=e[dt],r=e[_n],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${dt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function Ut(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 mr(e,t={}){function r(g){return {status:"success",data:g}}function n(g){return {status:"fail",error:g}}function o(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}async function s(g){let k=t.emitNotification;if(!k||g.length===0)return;let S=Le(g);if(S.length===1){await k(S[0]);return}await k(Me({kind:"notification-batch",notifications:S}));}function c(g){let k=g.params?.id;if(k){let S=e.readCard(k);if(!S)throw new Error(`card "${k}" not found`);return [S]}return e.readAllCards()}function u(g){return Me({kind:"notification-batch",notifications:Le(g.map(k=>({kind:"card_refreshed",cardId:k.id,card:k})))})}function f(g){if(Array.isArray(g))return g;if(g&&typeof g=="object"){let k=g;return Array.isArray(k.files)?k.files:[g]}return null}return {get(g){try{return r({cards:c(g)})}catch(k){return o(k)}},buildNotificationBatch(g){try{return r(u(c(g)))}catch(k){return o(k)}},set(g){try{let k=g.body;if(k==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(k)?k:[k];for(let b of S){if(typeof b.id!="string")return n("each card must have a string `id` field");e.writeCard(b.id,b);}return s(S.map(b=>({kind:"card_refreshed",cardId:b.id,card:b}))),r({count:S.length})}catch(k){return o(k)}},del(g){try{let k=g.body?.ids??[],S=g.params?.id,b=S?[...k,S]:k;if(b.length===0)return n("del requires body.ids (string[]) or params.id");for(let O of b)e.removeCard(O);return s(b.map(O=>({kind:"card_removed",cardId:O}))),r({count:b.length})}catch(k){return o(k)}},patch(g){try{let k=g.params?.id,S=g.params?.path;if(!k)return n("patch requires params.id");if(!S)return n("patch requires params.path");let b=g.body,O=b&&Object.prototype.hasOwnProperty.call(b,"value")?b.value:g.body;e.patchCard(k,S,O);let P=e.readCard(k);return P?(s([{kind:"card_refreshed",cardId:k,card:P}]),r({count:1})):n(`card "${k}" not found`)}catch(k){return o(k)}},appendFiles(g){try{let k=g.params?.id;if(!k)return n("appendFiles requires params.id");let S=e.readCard(k);if(!S)return n(`card "${k}" not found`);let b=f(g.body);if(!b||b.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let O=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},P=Array.isArray(O.files)?O.files:[],_=[...P,...b],v=b.map((l,i)=>({idx:P.length+i,entry:l})),y=this.patch({params:{id:k,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:v})}catch(k){return o(k)}}}}function pe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function le(e){return {status:"fail",error:e}}function ke(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function aa(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 jn(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(jn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function qn(e){return aa(JSON.stringify(e))}function Nn(e){try{let t=JSON.parse(jn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Qe(){return new Date().toISOString()}function sa(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 Ln(e,t,r={}){Wt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),s=xe(e),c=r.boardRuntimeStoreRef,u=r.scratchStoreRef,f=r.taskExecutorRef,g=r.chatHandlerFlow,k=r.emitNotification??(L=>{if(!t.publishBoardChangeNotifications)return;let A=L.kind==="notification-batch"?L.notifications:[L];return t.publishBoardChangeNotifications(A)});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 b(L){if(L.length!==0)try{let A=Le(L),W=Me({kind:"notification-batch",notifications:A}),q=k(W);q&&typeof q.catch=="function"&&q.catch(V=>o(`[board-live-cards-public] emitNotification failed: ${V instanceof Error?V.message:String(V)}`));}catch(A){o(`[board-live-cards-public] emitNotification failed: ${A instanceof Error?A.message:String(A)}`);}}function O(){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 A=t.kvStorageForRef(L);return {readIndex(){return A.read("_index")},writeIndex(W){A.write("_index",W);},readCard(W){return A.read(W)},writeCard(W,q){return A.write(W,q),t.hashFn(q)},removeCard(W){A.delete(W);},cardExists(W){return A.read(W)!==null},defaultCardKey(W){return W}}}let P={readValues(L){let A=t.kvStorageForRef(S()),W=A.listKeys().sort();if(W.length===0)return {version:null,values:{}};let q={};for(let V of W)q[V]=A.read(V);return {version:t.hashFn(q),values:q}},writeValues(L,A,W){let q=t.kvStorageForRef(S());for(let V of W)q.delete(V);for(let[V,oe]of Object.entries(A))q.write(V,oe);return t.hashFn(A)}},_=()=>cr(t.kvStorageForRef(S())),v=()=>Bn(P),y=()=>Pn(t.journalAdapterForRef(S())),l=()=>Dt(O(),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 On(t.kvStorageForRef(L))};function d(){return f??_().readTaskExecutorRef()}function m(){return !!v().readSnapshot(e.value).values[dt]}function p(){let L=v().readSnapshot(e.value);if(!L.values[dt])throw new Error(`Board not initialized at ${e.value}`);return fr(L.values)}function R(L,A){let W=v().commitSnapshot(e.value,{schemaVersion:ur,expectedVersion:A,commitId:t.genId(),committedAt:Qe(),deleteKeys:[],shallowMerge:lr(L)});if(!W.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${A??"null"} current=${W.currentVersion??"null"}`)}function w(L){y().appendEvent(L);}async function B(){let A=sa((a,C)=>{let x=a.payload,D=(x?.enrichedCard??{}).id??x?.cardId??"unknown";w({type:"task-failed",taskName:D,error:C,timestamp:Qe()});}),W=p(),q=kt(W.graph),{events:V,newCursor:oe}=y().readEntriesAfterCursor(W.lastDrainedJournalId),de=$(),ie=ir(de,a=>t.resolveBlob(a)),Re={...W.runtimeByCardId},Ee=new Map,qe={readRuntime(a){return Ee.get(a)??Re[a]??{_sources:{}}},writeRuntime(a,C){Ee.set(a,C),Re[a]=C;}},Ne=[],je=new Map,He={readSourceData(a,C){let x=`${a}/${C}`;return je.has(x)?je.get(x):ie.readSourceData(a,C)},ingestSourceDataStaged(a,C,x,H){ie.ingestSourceDataStaged(a,C,x,H);},commitSourceData(a,C,x){let H=`${a}/.staged/${x}/${C}`,D=de.read(H);if(D==null){let re=de.keyRef?.(H);re&&(D=t.resolveBlob(re));}if(D==null)return false;let Z=`${a}/${C}`,se=D.trim();try{je.set(Z,JSON.parse(se));}catch{je.set(Z,se);}return Ne.push({cardId:a,outputFile:C,deliveryToken:x}),true},hasSource(a,C){let x=`${a}/${C}`;return je.has(x)?true:ie.hasSource(a,C)},listSources(a){let C=ie.listSources(a),x=new Set;for(let D of je.keys())D.startsWith(`${a}/`)&&x.add(D.slice(`${a}/`.length));let H=new Set([...C,...x]);return Array.from(H)}},ot=()=>q.config.tasks,Xe={cardStore:l(),cardRuntimeStore:qe,fetchedSourcesStore:He,outputStore:i(),executionRequestStore:A,activeTaskConfigs:()=>ot()},lt=[],Et=[],ft=[],At=new Map,Bt=new Set,Xr=(a,C)=>{lt.push({type:"task-completed",taskName:a,data:C,timestamp:Qe()});},Ot=(a,C)=>{w({type:"task-failed",taskName:a,error:C,timestamp:Qe()});},xt=Yt(q,{handlers:{"card-handler":Fn(e,oe,Xe,Xr,Ot,(a,C)=>{Et.push({cardId:a,values:C});},a=>{ft.push(a);})},onNodeRemoved:a=>{At.delete(a),Ee.delete(a),delete Re[a],Bt.add(a);}});for(ot=()=>xt.getState().config.tasks,lt=V;lt.length>0;){let a=lt;lt=[];for(let C of a)if(C.type==="task-restart"){let x=Xe.cardStore.readCard(C.taskName);x&&At.set(C.taskName,x);}xt.pushAll(a),await xt.waitForHandlers();}let Kt=xt.getState();await xt.dispose({wait:true});let en=v().readSnapshot(e.value).version;R({lastDrainedJournalId:oe,graph:Rt(Kt),runtimeByCardId:Re},en);for(let{cardId:a,values:C}of Et)Xe.outputStore.writeComputedValues(a,C);for(let a of ft)Xe.outputStore.writeDataObjects(a);for(let{cardId:a,outputFile:C,deliveryToken:x}of Ne)ie.commitSourceData(a,C,x);let Tt;try{Tt=Ct(bt(s,Kt)),Xe.outputStore.writeStatusSnapshot(Tt);}catch(a){o(`[board-live-cards-public] status publish failed: ${a instanceof Error?a.message:String(a)}`);}let wt=[];for(let{cardId:a,values:C}of Et)wt.push({kind:"computed_values",cardId:a,values:C});for(let a of ft)for(let[C,x]of Object.entries(a))C&&wt.push({kind:"data_object",key:C,payload:x});for(let[a,C]of At)wt.push({kind:"card_refreshed",cardId:a,card:C});for(let a of Bt)wt.push({kind:"card_removed",cardId:a});Tt!==void 0&&wt.push({kind:"status",status:Tt}),b(wt);let gt=d()??{howToRun:"built-in",whatToRun:xe({kind:"built-in",value:"source-cli-task-executor"})},Ht=t.supportsDirectSourceOutput?.(gt)===true;A.dispatchEntriesForJournalId(oe,a=>{if(a.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${a.taskKind}" \u2014 skipping`);return}let C=a.payload,x=C.enrichedCard?.id??"unknown",H=C.enrichedCard?.source_defs??[];if(gt.howToRun==="queue-storage"&&Ht){try{let D=t.queueStorageForRef(j(),"task-executor"),Z=typeof gt.extra?.boardId=="string"?gt.extra.boardId:void 0,se=[];for(let re of H){if(!re.outputFile){o(`[dispatch] source "${re.bindTo}" has no outputFile \u2014 skipping`);continue}let $e=t.genId(),be=`${x}/.staged/${$e}/${re.outputFile}`,Je=de.keyRef?.(be);if(!Je)continue;let Jt={ref:xe(Je),deliveryToken:$e,outputFile:re.outputFile,cardId:x},Ft=qn({cbk:C.callbackToken,rg:e.value,br:xe(e),cid:x,b:re.bindTo,d:re.outputFile,cs:void 0,rqt:C.rqt,dt:Jt.deliveryToken});se.push({...Z?{boardId:Z}:{},ref:gt,args:{source_def:re,base_ref:xe(e),callback:n.createCallback(Ft),output:Jt}});}se.length>0&&D.enqueueMany(se);}catch(D){Ot(x,D instanceof Error?D.message:String(D));}return}for(let D of H){if(!D.outputFile){o(`[dispatch] source "${D.bindTo}" has no outputFile \u2014 skipping`);continue}let Z;if(Ht){let re=t.genId(),$e=`${x}/.staged/${re}/${D.outputFile}`,be=de.keyRef?.($e);be&&(Z={ref:xe(be),deliveryToken:re,outputFile:D.outputFile,cardId:x});}let se=qn({cbk:C.callbackToken,rg:e.value,br:xe(e),cid:x,b:D.bindTo,d:D.outputFile,cs:void 0,rqt:C.rqt,...Z?{dt:Z.deliveryToken}:{}});t.dispatchExecution(gt,{source_def:D,base_ref:xe(e),callback:n.createCallback(se),...Z?{output:Z}:{}}).catch(re=>Ot(x,re instanceof Error?re.message:String(re)));}});}function j(){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 U(){t.queueStorageForRef(j(),"process-accumulated").enqueue({boardRef:xe(e)}),t.requestProcessAccumulated?.();}function Q(){let L=t.queueStorageForRef(j(),"process-accumulated");for(;;){let A=L.lease({max:64,visibilityMs:1e3});if(A.length<=0)return;for(let W of A)L.ack(W.id,W.leaseToken);if(A.length<64)return}}async function ne(){try{let L=()=>{let W=p(),{events:q}=y().readEntriesAfterCursor(W.lastDrainedJournalId);q.length<=0||U();},A=await rn(t.lock,B,L);return pe({ran:A!==!1})}catch(L){return ke(L)}}function J(){U();}function ae(L){try{let A=L.params?.cardStoreRef;if(!A)return le("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 le("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!m()){let Ee=It($t);R({lastDrainedJournalId:"",graph:Rt(Ee),runtimeByCardId:{}},null);}let W=L.params?.outputsStoreRef;if(!W)return le("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let q=L.params?.queueStoreRef;if(!q)return le("init requires params.queueStoreRef \u2014 pass the queue store ref here");let V=L.params?.fetchedSourcesStoreRef;if(!V)return le("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");u=L.params?.scratchStoreRef;let oe=L.params?.chatStoreRef;if(!oe)return le("init requires params.chatStoreRef \u2014 pass the chat store ref here");let de=L.params?.artifactsStoreRef;if(!de)return le("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let ie=_();ie.writeBoardRuntimeStoreRef(c),ie.writeCardStoreRef(A),ie.writeOutputsStoreRef(W),ie.writeQueueStoreRef(q),ie.writeFetchedSourcesStoreRef(V),ie.writeChatStoreRef(oe),ie.writeArtifactsStoreRef(de),l().writeCard(vt().id,vt());let Re=h({params:{cardId:vt().id,restart:!0}});if(Re.status!=="success")return Re;try{i().writeStatusSnapshot(Ct(bt(s,kt(p().graph))));}catch{}return pe()}catch(A){return ke(A)}}function ue(L){try{let A=i().readStatusSnapshot();if(!A){A=Ct(bt(s,kt(p().graph)));try{i().writeStatusSnapshot(A);}catch{}}return pe(A)}catch(A){return ke(A)}}function G(L){try{let A=L.params?.id;if(!A)return le("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(A);}catch{}return w({type:"task-removal",taskName:A,timestamp:Qe()}),A!==Pe&&w({type:"task-restart",taskName:Pe,timestamp:Qe()}),J(),pe()}catch(A){return ke(A)}}function X(L){try{let A=L.params?.cardId;if(!A)return le("addCardFiles requires params.cardId");let W=mr(l(),{emitNotification:k}).appendFiles({params:{id:A},body:L.body});return W.status!=="success"?W:pe({cardId:A,files_added:W.data.files_added,notified:!0})}catch(A){return ke(A)}}function Y(L){try{let A=L.params?.id;return A?(w({type:"task-restart",taskName:A,timestamp:Qe()}),J(),pe()):le("retrigger requires params.id")}catch(A){return ke(A)}}async function E(L){return Q(),ne()}function T(){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 $(){return t.blobStorageForRef(T())}function h(L){try{let A=L.params?.cardId,W=L.params?.all,q=!!L.params?.restart;if(!A&&!W)return le("upsertCard requires --card-id <id> or --all");let V=W?l().readAllCards().map(de=>de.id):[A];for(let de of V)if(!l().readCard(de))return le(`Card "${de}" not found in board at ${e.value}`);let oe=!1;for(let de of V){let ie=l().readCard(de),Re=Ut(ie),Ee=t.hashFn(Re),qe=t.kvStorage("card-upsert"),Ne=qe.read(de),je=Ne?.taskConfigHash!==Ee;if(!(!je&&!q)){if(je){let He=Ne?.blobRef??l().readCardKey(de)??de;w({type:"task-upsert",taskName:de,taskConfig:Re,timestamp:Qe()}),qe.write(de,{blobRef:He,taskConfigHash:Ee,updatedAt:Qe()}),oe=oe||de!==Pe;}q&&w({type:"task-restart",taskName:de,timestamp:Qe()});}}return oe&&w({type:"task-restart",taskName:Pe,timestamp:Qe()}),J(),pe()}catch(A){return ke(A)}}function I(L){try{let A=L.params?.token;if(!A)return le("taskFailed requires params.token");let W=L.params?.error??"unknown error",q=pr(A);return q?(w({type:"task-failed",taskName:q.taskName,error:W,timestamp:Qe()}),J(),pe()):le("Invalid callback token")}catch(A){return ke(A)}}function F(L){try{let A=L.params?.token;if(!A)return le("taskProgress requires params.token");let q=(L.body??{}).update??{},V=pr(A);return V?(w({type:"task-progress",taskName:V.taskName,update:q,timestamp:Qe()}),J(),pe()):le("Invalid callback token")}catch(A){return ke(A)}}function M(L){try{let A=L.params?.token,W=L.params?.ref;if(!A)return le("sourceDataFetched requires params.token");if(!W)return le("sourceDataFetched requires params.ref");let q=Nn(A);if(!q)return le("Invalid source token");let{cbk:V,cid:oe,b:de,d:ie,cs:Re,rqt:Ee,dt:qe}=q,Ne=ir($(),Xe=>t.resolveBlob(Xe)),je=qe||t.genId();qe||Ne.ingestSourceDataStaged(oe,ie,st(W),je);let He=pr(V);if(!He)return le("Invalid callback token embedded in source token");let ot=Qe();return w({type:"task-progress",taskName:He.taskName,update:{bindTo:de,outputFile:ie,fetchedAt:ot,deliveryToken:je,sourceChecksum:Re,rqt:Ee},timestamp:ot}),J(),pe()}catch(A){return ke(A)}}function N(L){try{let A=L.params?.token,W=L.params?.reason??"unknown";if(!A)return le("sourceDataFetchFailure requires params.token");let q=Nn(A);if(!q)return le("Invalid source token");let{cbk:V,b:oe,d:de,cs:ie,rqt:Re}=q,Ee=pr(V);return Ee?(w({type:"task-progress",taskName:Ee.taskName,update:{bindTo:oe,outputFile:de,failure:!0,reason:W,sourceChecksum:ie,rqt:Re},timestamp:Qe()}),J(),pe()):le("Invalid callback token embedded in source token")}catch(A){return ke(A)}}function K(L){try{let A=_().readCardStoreRef();return A?pe({storeRef:A}):le(`Board at ${e.value} has no card store configured`)}catch(A){return ke(A)}}function te(L){try{return pe({storeRef:c??null})}catch(A){return ke(A)}}function ce(L){try{let A=_().readOutputsStoreRef();return A?pe({storeRef:A}):le(`Board at ${e.value} has no outputs store configured`)}catch(A){return ke(A)}}function Ae(L){try{return pe({storeRef:u??null})}catch(A){return ke(A)}}function Ie(L){try{let A=_().readChatStoreRef();return pe({storeRef:A})}catch(A){return ke(A)}}function ve(L){try{let A=_().readArtifactsStoreRef();return pe({storeRef:A})}catch(A){return ke(A)}}function ye(L){try{let A=_().readFetchedSourcesStoreRef();return pe({storeRef:A})}catch(A){return ke(A)}}function he(L){try{let A=L.params?.key;if(!A)return le("getConfig requires params.key");let W=_(),q;switch(A){case "task-executor":q=f??null;break;case "chat-handler-flow":q=g??null;break;case "board-runtime-store-ref":q=W.readBoardRuntimeStoreRef();break;case "card-store-ref":q=W.readCardStoreRef();break;case "outputs-store-ref":q=W.readOutputsStoreRef();break;case "scratch-store-ref":q=u??null;break;case "chat-store-ref":q=W.readChatStoreRef();break;case "artifacts-store-ref":q=W.readArtifactsStoreRef();break;case "fetched-sources-store-ref":q=W.readFetchedSourcesStoreRef();break;default:return le(`getConfig: unknown key "${A}"`)}return pe({value:q})}catch(A){return ke(A)}}function Ue(L){try{let A=L.params?.key;if(!A)return le("getOutputsDataObject requires params.key");if(A===tt)return pe(null);let W=i().readDataObject(A);return pe(W)}catch(A){return ke(A)}}function Ce(L){try{return pe(dr(i().readAllDataObjects()))}catch(A){return ke(A)}}function De(L){try{let A=L.params?.key;if(!A)return le("getOutputsComputedValues requires params.key");let W=i().readComputedValues(A);return pe(W)}catch(A){return ke(A)}}function Ve(L){try{return pe(i().readAllComputedValues())}catch(A){return ke(A)}}function ge(){return ir($(),L=>t.resolveBlob(L))}function Ye(L){let A=$().keyRef?.(L);if(!A)throw new Error("configured fetched-sources store does not support keyRef");return xe(A)}function Ke(L){try{let A=L.params?.key;if(!A)return le("getOutputsFetchedSources requires params.key");let W=ge().listSources(A),q={};for(let V of W)q[V]=Ye(`${A}/${V}`);return pe(q)}catch(A){return ke(A)}}function nt(L){try{let A=ge(),W=new Set;for(let V of $().listKeys()){let oe=V.indexOf("/");oe>0&&!V.includes("/.staged/")&&W.add(V.slice(0,oe));}let q={};for(let V of W){let oe=A.listSources(V);if(oe.length>0){q[V]={};for(let de of oe)q[V][de]=Ye(`${V}/${de}`);}}return pe(q)}catch(A){return ke(A)}}function St(L){try{let A=l().readAllCards().filter(ie=>ie.id!==Pe),W=ue({});if(W.status!=="success")return W;let q=Ce({});if(q.status!=="success")return q;let V=Ve({});if(V.status!=="success")return V;let oe=V.data,de={};for(let ie of A){let Re=typeof ie?.id=="string"?ie.id:null;if(!Re)continue;let Ee=ie.card_data&&typeof ie.card_data=="object"&&!Array.isArray(ie.card_data)?ie.card_data:{};de[Re]={schema_version:"v1",card_id:Re,card_data:{...Ee},computed_values:oe[Re]&&typeof oe[Re]=="object"?oe[Re]:{}};}return pe({cardDefinitions:A,statusSnapshot:W.data,dataObjectsByToken:q.data,cardRuntimeById:de})}catch(A){return ke(A)}}return {init:ae,status:ue,getBoardRuntimeStoreRef:te,getCardStoreRef:K,getOutputsStoreRef:ce,getScratchStoreRef:Ae,getChatStoreRef:Ie,getArtifactsStoreRef:ve,getFetchedSourcesStoreRef:ye,getConfig:he,getOutputsDataObject:Ue,getAllOutputsDataObjects:Ce,getOutputsComputedValues:De,getAllOutputsComputedValues:Ve,getOutputsFetchedSources:Ke,getAllOutputsFetchedSources:nt,buildSseOneShotPayload:St,removeCard:G,addCardFiles:X,retrigger:Y,processAccumulatedEvents:E,upsertCard:h,taskFailed:I,taskProgress:F,sourceDataFetched:M,sourceDataFetchFailure:N}}function Mn(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 cr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return cr(t.kvStorage("config"))};function s(){let l=o().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 i=t.kvStorageForRef(l);return {readIndex(){return i.read("_index")},writeIndex(d){i.write("_index",d);},readCard(d){return i.read(d)},writeCard(d,m){return i.write(d,m),t.hashFn(m)},removeCard(d){i.delete(d);},cardExists(d){return i.read(d)!==null},defaultCardKey(d){return d}}}let c=()=>Dt(s(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function f(l,i){let d=t.validateSchema(i),m=[],p=u();if(p&&Array.isArray(i.source_defs))for(let w of i.source_defs){let B=typeof w.bindTo=="string"?w.bindTo:"(unknown)";try{let j;try{j=await t.invokeExecutor(p,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(w)});}catch(Q){let ne=Q;if(j=typeof ne?.stdout=="string"?ne.stdout:"",!j.trim()){m.push(`source "${B}": executor validate-source-def failed \u2014 ${Q instanceof Error?Q.message:String(Q)}`);continue}}let U=JSON.parse(j.trim());if(!U.ok&&Array.isArray(U.errors))for(let Q of U.errors)m.push(`source "${B}": ${Q}`);}catch(j){m.push(`source "${B}": executor validate-source-def failed \u2014 ${j instanceof Error?j.message:String(j)}`);}}let R=[...d.errors,...m];return pe({cardId:l,isValid:R.length===0,issues:R})}function g(l,i){let d=l.params?.sourceIdx,m=l.params?.outRef;if(d===void 0)return le(`${i} requires params.sourceIdx`);if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return le(`${i} requires card JSON object in body`);let p=l.body,R=p["card-content"]??p,w=p["mock-projections"]??{},B=R.source_defs??[];if(d<0||d>=B.length)return le(`sourceIdx ${d} out of range (card has ${B.length} source(s))`);let j=B[d],U=typeof j.bindTo=="string"?j.bindTo:"source";return {src:j,bindTo:U,outRef:m,mockProjections:w}}async function k(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return le("validateCardPreflight requires card JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)";return await f(m,d)}catch(i){return ke(i)}}async function S(l){try{let i=g(l,"probeSourcePreflight");if("status"in i)return i;let d=u();if(!d)return le("No task-executor registered for this board");try{let m={...i.src,_projections:i.mockProjections},p=await t.invokeExecutor(d,"probe-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(m)}),R=JSON.parse(p.trim());return R.ok?pe({bindTo:i.bindTo,reachable:R.reachable,latencyMs:R.latencyMs,note:R.note}):le(R.error??"Preflight probe failed")}catch{return le("Executor does not support probe-source-preflight")}}catch(i){return ke(i)}}async function b(l){try{let i=g(l,"runSourcePreflight");if("status"in i)return i;let d=u();if(!d)return le("No task-executor registered for this board");try{let m={...i.src,_projections:i.mockProjections},p=await t.invokeExecutor(d,"run-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(m)}),R=JSON.parse(p.trim());if(!R.ok)return pe({bindTo:i.bindTo,ok:!1,result:null,issues:[R.error??"Preflight run failed"]});if(i.outRef){let w=st(i.outRef);t.absoluteBlob.write(w.value,JSON.stringify(R.resultValue,null,2));}return pe({bindTo:typeof R.bindTo=="string"?R.bindTo:i.bindTo,ok:!0,result:R.resultValue??null,issues:[]})}catch(m){let p=m instanceof Error?m.message:String(m);return pe({bindTo:i.bindTo,ok:!1,result:null,issues:[p]})}}catch(i){return ke(i)}}async function O(l){try{let i=u();if(!i)return le("No task-executor registered for this board");let d=await t.invokeExecutor(i,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return pe(JSON.parse(d.trim()))}catch(i){return ke(i)}}function P(l){try{let i=l.body;if(!i||!Array.isArray(i.ops))return le("updatesInCardStore requires body.ops array");let d=i.ops,m=c();for(let p of d){let R=p.op,w=p.id;if(!w)return le('op is missing "id"');if(R==="update"){let B=p["card-content"];if(!B)return le(`update op for "${w}" is missing "card-content"`);m.writeCard(w,B);}else return le(`Unknown op type: "${R??"(none)"}"`)}return pe()}catch(i){return ke(i)}}function _(l){try{let i=l.body;if(!i||!Array.isArray(i.ids))return le("readFromCardStore requires body.ids array");let d=i.ids,m=c(),p=d.map(R=>({id:R,"card-content":m.readCard(R)}));return pe({cards:p})}catch(i){return ke(i)}}function v(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return le("evalCardCompute requires a JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)",p=i["mock-fetched-sources"]??{},R=i["mock-requires"]??{},w=d.compute;if(!w||!Array.isArray(w)||w.length===0)return pe({cardId:m,ok:!0,computed_values:{},errors:[]});let B={id:m,card_data:d.card_data??{},requires:R,source_defs:d.source_defs,compute:w},j=Ge.runSync(B,{sourcesData:p}),U=j.node.computed_values??{},Q=j.errors??[];return pe({cardId:m,ok:Q.length===0,computed_values:U,errors:Q})}catch(i){return ke(i)}}async function y(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return le("simulateCardCycle requires a JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)",p=i["mock-fetched-sources"]??{},R=i["mock-requires"]??{},w=await f(m,d),B=w.status==="success"?{isValid:w.data.isValid,issues:w.data.issues}:{isValid:!1,issues:[w.status==="fail"?w.error:"internal error"]},j=d.source_defs??[],U=d.card_data??{},Q=[],ne=[];if(j.length>0){Q=Ge.enrichSourcesSync(j,{card_data:U,requires:R});for(let $ of Q){let h=$.projections,I=$._projections;if(h&&I){for(let F of Object.keys(h))if(I[F]===void 0){let M=typeof $.bindTo=="string"?$.bindTo:"(unknown)";ne.push({bindTo:M,key:F,error:`Projection "${F}" resolved to undefined`});}}}}let J=[],ae={...p},ue=i["task-executor-ref"],G=(ue?.howToRun&&ue?.whatToRun?ue:void 0)??u();for(let $=0;$<Q.length;$++){let h=Q[$],I=typeof h.bindTo=="string"?h.bindTo:`source_${$}`;if(!G){J.push({bindTo:I,skipped:!0,error:"No task executor configured"});continue}try{let F={...h},M=await t.invokeExecutor(G,"run-source-preflight",{timeout:h.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(F)}),N=JSON.parse(M.trim());N.ok&&!Object.prototype.hasOwnProperty.call(p,I)&&Object.prototype.hasOwnProperty.call(N,"resultValue")&&(ae[I]=N.resultValue),J.push({bindTo:I,reachable:N.reachable,latencyMs:N.latencyMs,error:N.ok?void 0:N.error});}catch{J.push({bindTo:I,skipped:!0,error:"Executor does not support run-source-preflight"});}}let X=d.compute,Y={},E=[];if(X&&Array.isArray(X)&&X.length>0){let $={id:m,card_data:U,requires:R,source_defs:d.source_defs,compute:X},h=Ge.runSync($,{sourcesData:ae});Y=h.node.computed_values??{},E=h.errors??[];}let T=B.isValid&&ne.length===0&&E.length===0&&J.every($=>$.reachable!==!1);return pe({cardId:m,ok:T,validation:B,source_probes:J,projection_errors:ne,fetched_sources:ae,computed_values:Y,compute_errors:E})}catch(i){return ke(i)}}return {validateCardPreflight:k,probeSourcePreflight:S,runSourcePreflight:b,evalCardCompute:v,simulateCardCycle:y,describeTaskExecutorCapabilities:O,updatesInCardStore:P,readFromCardStore:_}}function gr(e,t={}){function r(g){return {status:"success",data:g}}function n(g){return {status:"fail",error:g}}function o(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}async function s(g){let k=t.emitNotification;if(!k||g.length===0)return;let S=Le(g);if(S.length===1){await k(S[0]);return}await k(Me({kind:"notification-batch",notifications:S}));}async function c(g){let k=g.params?.id;if(k){let S=await e.readCard(k);if(!S)throw new Error(`card "${k}" not found`);return [S]}return await e.readAllCards()}function u(g){return Me({kind:"notification-batch",notifications:Le(g.map(k=>({kind:"card_refreshed",cardId:k.id,card:k})))})}function f(g){if(Array.isArray(g))return g;if(g&&typeof g=="object"){let k=g;return Array.isArray(k.files)?k.files:[g]}return null}return {async get(g){try{return r({cards:await c(g)})}catch(k){return o(k)}},async buildNotificationBatch(g){try{return r(u(await c(g)))}catch(k){return o(k)}},async set(g){try{let k=g.body;if(k==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(k)?k:[k];for(let b of S){if(typeof b.id!="string")return n("each card must have a string `id` field");await e.writeCard(b.id,b);}return await s(S.map(b=>({kind:"card_refreshed",cardId:b.id,card:b}))),r({count:S.length})}catch(k){return o(k)}},async del(g){try{let k=g.body?.ids??[],S=g.params?.id,b=S?[...k,S]:k;if(b.length===0)return n("del requires body.ids (string[]) or params.id");for(let O of b)await e.removeCard(O);return await s(b.map(O=>({kind:"card_removed",cardId:O}))),r({count:b.length})}catch(k){return o(k)}},async patch(g){try{let k=g.params?.id,S=g.params?.path;if(!k)return n("patch requires params.id");if(!S)return n("patch requires params.path");let b=g.body,O=b&&Object.prototype.hasOwnProperty.call(b,"value")?b.value:g.body;await e.patchCard(k,S,O);let P=await e.readCard(k);return P?(await s([{kind:"card_refreshed",cardId:k,card:P}]),r({count:1})):n(`card "${k}" not found`)}catch(k){return o(k)}},async appendFiles(g){try{let k=g.params?.id;if(!k)return n("appendFiles requires params.id");let S=await e.readCard(k);if(!S)return n(`card "${k}" not found`);let b=f(g.body);if(!b||b.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let O=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},P=Array.isArray(O.files)?O.files:[],_=[...P,...b],v=b.map((l,i)=>({idx:P.length+i,entry:l})),y=await this.patch({params:{id:k,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:v})}catch(k){return o(k)}}}}async function Dn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Mr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Dr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Mr(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(Mr)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Mr(t),reason:t.reason}))}}}function $n(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 tr(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",er(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 ia(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function yr(e,t){return ia(e)?e.then(t):t(e)}function Un(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]=Un(r[n],o):r[n]=o;return r}function hr(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]:hr(s,o,r)}}function Vn(e){return {read:r=>e.read(r),get(r,n){return yr(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 yr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return yr(e.read(r),o=>e.write(r,Un(o??{},n)))},patch(r,n,o){return yr(e.read(r),s=>{let c=n.split(".").filter(Boolean);return e.write(r,hr(s??{},c,o))})}}}function Rr(e){return Vn(e)}function kr(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 Cr(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(([,f])=>f.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),f=await e.writeCard(u,o);c[n]={key:u,checksum:f,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 f=await e.readCard(u.key);if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`card "${n}" is not patchable`);let g=String(o||"").split(".").filter(Boolean),k=hr(f,g,s),S=await e.writeCard(u.key,k);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 Te(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function we(e){return {status:"fail",error:e}}function _e(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Fe(){return new Date().toISOString()}function ua(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 Jn(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 br(e){try{let t=JSON.parse(Jn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Kn(e){return ua(JSON.stringify(e))}function Hn(e){try{let t=JSON.parse(Jn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ca(e){return qr(e,En,()=>({_sources:{}}))}function da(e,t){return ar(e,t)}function la(e){return sr(e)}function fa(e,t){return Fr(e,t)}function ma(e,t,r,n,o,s){return async c=>{let u=[],f=await r.cardStore.readCard(c.nodeId);if(!f)return "task-initiate-failure";let g=f.id;if(g===Pe){let J=r.activeTaskConfigs?.(),ae={[tt]:J?jr((await Promise.all(Object.keys(J).filter(ue=>ue!==Pe).map(ue=>r.cardStore.readCard(ue)))).filter(ue=>!!ue),J):await Nr(await r.cardStore.readAllCards())};return (s??(()=>{}))(ae),n(c.nodeId,ae),"task-initiated"}let k=f.card_data??{},S=f.source_defs??[],b=S,O=await r.cardRuntimeStore.readRuntime(g),P=false,_=async()=>{P&&(await r.cardRuntimeStore.writeRuntime(g,O),P=false);},v=J=>jt(O._sources[J]),y=(J,ae)=>{O._sources[J]=jt(ae),P=true;},l=c.taskState?.executionCount??0;if(O._lastExecutionCount!==l&&(O._sources={},O._lastExecutionCount=l,P=true),c.update){let J=c.update.outputFile;if(J){let ae=v(J);if(c.update.failure){let ue=c.update.rqt??ae.lastRequestedToken??ae.queueRequestedToken;ue&&y(J,Mt(ae,ue));}else {let ue=c.update.rqt;if(!ae.lastCompletedToken||ue>ae.lastCompletedToken){let G=typeof c.update.deliveryToken=="string"?c.update.deliveryToken:void 0,X=G?await r.fetchedSourcesStore.commitSourceData(g,J,G):false;y(J,X?Lr(ae,ue):Mt(ae,ue));}}await _();}}let i={};for(let J of S){if(!J.outputFile)continue;let ae=await r.fetchedSourcesStore.readSourceData(g,J.outputFile);ae!==null&&(i[J.bindTo]=ae);}let d={};for(let[J,ae]of Object.entries(c.state??{}))if(ae!==null&&typeof ae=="object"&&!Array.isArray(ae)){let ue=ae[J];d[J]=ue!==void 0?ue:ae;}else d[J]=ae;let m={id:g,card_data:{...k},requires:d,source_defs:S,compute:f.compute};m._sourcesData=i,f.compute&&Ge.runSync(m,{sourcesData:i}),(o??(()=>{}))(g,m.computed_values??{});let p=Ge.enrichSourcesSync(Array.isArray(f.source_defs)?f.source_defs:void 0,{card_data:f.card_data,requires:d}),R={...f,source_defs:Array.isArray(p)?p.map(J=>({...J,boardDir:typeof J.boardDir=="string"&&J.boardDir?J.boardDir:e.value})):p},w=Fe(),B=c.update?void 0:w,j=b.filter(J=>{let ae=J.outputFile;if(typeof ae!="string"||!ae)return true;let ue=v(ae);B&&(ue={...ue,queueRequestedToken:B},y(ae,ue));let G=ue.queueRequestedToken??ue.lastRequestedToken??w;return Lt(ue,G)==="dispatch"});if(await _(),j.length>0){let J=false,ae=w;for(let ue of j){let G=ue.outputFile;if(typeof G!="string"||!G)continue;let X=v(G),Y=X.queueRequestedToken??w;y(G,{...X,lastRequestedToken:Y}),ae=Y,J=true;}return J&&await _(),J&&(u.push({taskKind:"source-fetch",payload:{boardRef:xe(e),enrichedCard:R,callbackToken:c.callbackToken,rqt:ae}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(b.some(J=>{let ae=J.outputFile;if(typeof ae!="string"||!ae)return false;let ue=v(ae),G=ue.queueRequestedToken??ue.lastRequestedToken??w;return Lt(ue,G)==="in-flight"}))return "task-initiated";let Q=f.provides??[],ne={};for(let{bindTo:J,ref:ae}of Q)ne[J]=Ge.resolve(m,ae);return (s??(()=>{}))(ne),n(c.nodeId,ne),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Qn(e,t,r={}){Wt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),s=xe(e),c=r.emitNotification??(E=>{if(!t.publishBoardChangeNotifications)return;let T=E.kind==="notification-batch"?E.notifications:[E];return t.publishBoardChangeNotifications(T)}),u=null,f=r.boardRuntimeStoreRef,g=r.scratchStoreRef,k=r.taskExecutorRef,S=r.chatHandlerFlow;function b(){if(!f)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return f}function O(E){if(E.length!==0)try{let T=Le(E),$=Me({kind:"notification-batch",notifications:T});return Promise.resolve(c($)).catch(h=>{o(`[async-board-live-cards-public] emitNotification failed: ${h instanceof Error?h.message:String(h)}`);})}catch(T){o(`[async-board-live-cards-public] emitNotification failed: ${T instanceof Error?T.message:String(T)}`);return}}let P=()=>$n(t.kvStorageForRef(b())),_=e.value,v=()=>nr(Br(()=>t.kvStorageForRef(b()),t.hashFn),"v1"),y=async()=>{let E=await P().readOutputsStoreRef();if(!E)throw new Error(`Board at ${e.value} has no outputs store configured.`);return la(t.kvStorageForRef(E))},l=async()=>{let E=await P().readCardStoreRef();if(!E)throw new Error(`Board at ${e.value} has no card store configured.`);let T=t.kvStorageForRef(E);return Cr(kr(Rr(T),t.hashFn),o)};async function i(){return !!(await v().readSnapshot(_)).values[dt]}async function d(){let E=await v().readSnapshot(_);if(!E.values[dt])throw new Error(`Board not initialized at ${e.value}`);return fr(E.values)}async function m(E,T){let $=await v().commitSnapshot(_,{schemaVersion:"v1",expectedVersion:T,deleteKeys:[],shallowMerge:lr(E)});if(!$.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${T??"null"} current=${$.currentVersion??"null"}`)}let p=()=>xn(t.journalStorageForRef(b()));async function R(){return k??await P().readTaskExecutorRef()}async function w(){return dr(await(await y()).readAllDataObjects())}async function B(E){await p().appendEvent(E);}async function j(){let E=await P().readFetchedSourcesStoreRef();if(!E)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return E}async function U(){return t.blobStorageForRef(await j())}async function Q(){return da(await U(),E=>t.resolveBlob(E))}async function ne(E){let T=(await U()).keyRef?.(E);if(!T)throw new Error("configured fetched-sources store does not support keyRef");let $=await Promise.resolve(T);return xe($)}async function J(){let E=fa(t.kvStorageForRef(b()),async(q,V)=>{let oe=q.payload,ie=(oe.enrichedCard??{}).id??oe.cardId??"unknown";await B({type:"task-failed",taskName:ie,error:V,timestamp:Fe()});}),T=ca(t.kvStorageForRef(b())),$=await U(),h=await Q(),I=await l(),F=await y(),M=new Map,N=new Map,K=[],te=[],ce=[],Ae=new Map,Ie=new Set,ve={async readRuntime(q){return M.get(q)??await T.readRuntime(q)},async writeRuntime(q,V){M.set(q,V),Ce[q]=V;}},ye={async readSourceData(q,V){let oe=`${q}/${V}`;return N.has(oe)?N.get(oe):await h.readSourceData(q,V)},ingestSourceDataStaged(q,V,oe,de){return h.ingestSourceDataStaged(q,V,oe,de)},async commitSourceData(q,V,oe){let de=`${q}/.staged/${oe}/${V}`,ie=await $.read(de);if(ie==null){let qe=await Promise.resolve($.keyRef?.(de));qe&&(ie=await t.resolveBlob(qe));}if(ie==null)return false;let Re=`${q}/${V}`,Ee=ie.trim();try{N.set(Re,JSON.parse(Ee));}catch{N.set(Re,Ee);}return K.push({cardId:q,outputFile:V,deliveryToken:oe}),true},async hasSource(q,V){let oe=`${q}/${V}`;return N.has(oe)||await h.hasSource(q,V)},async listSources(q){let V=await h.listSources(q),oe=[...N.keys()].filter(de=>de.startsWith(`${q}/`)).map(de=>de.slice(`${q}/`.length));return [...new Set([...V,...oe])]}},he=await d(),Ue=kt(he.graph),Ce={...he.runtimeByCardId},{events:De,newCursor:Ve}=await p().readEntriesAfterCursor(he.lastDrainedJournalId),ge=De,Ye=()=>Ue.config.tasks,Ke=Yt(Ue,{handlers:{"card-handler":ma(e,Ve,{cardStore:I,cardRuntimeStore:ve,fetchedSourcesStore:ye,outputStore:F,executionRequestStore:E,activeTaskConfigs:()=>Ye()},(q,V)=>{ge.push({type:"task-completed",taskName:q,data:V,timestamp:Fe()});},(q,V)=>{te.push({cardId:q,values:V});},q=>{ce.push(q);})},onNodeRemoved:q=>{Ae.delete(q),M.delete(q),delete Ce[q],Ie.add(q);}});for(Ye=()=>Ke.getState().config.tasks;ge.length>0;){let q=ge;ge=[];for(let V of q)if(V.type==="task-restart"){let oe=await I.readCard(V.taskName);oe&&Ae.set(V.taskName,oe);}Ke.pushAll(q),await Ke.waitForHandlers();}let nt=Ke.getState();await Ke.dispose({wait:true}),await m({lastDrainedJournalId:Ve,graph:Rt(nt),runtimeByCardId:Ce},(await v().readSnapshot(_)).version);for(let{cardId:q,values:V}of te)await F.writeComputedValues(q,V);for(let q of ce)await F.writeDataObjects(q);for(let[q,V]of M)await T.writeRuntime(q,V);for(let q of K)await h.commitSourceData(q.cardId,q.outputFile,q.deliveryToken);let St=Ct(bt(s,nt));await F.writeStatusSnapshot(St);let L=[];for(let{cardId:q,values:V}of te)L.push({kind:"computed_values",cardId:q,values:V});for(let q of ce)for(let[V,oe]of Object.entries(q))L.push({kind:"data_object",key:V,payload:oe});for(let[q,V]of Ae)L.push({kind:"card_refreshed",cardId:q,card:V});for(let q of Ie)L.push({kind:"card_removed",cardId:q});L.push({kind:"status",status:St}),await O(L);let A=await R();if(!A)return;let W=t.supportsDirectSourceOutput?.(A)===true;await E.dispatchEntriesForJournalId(Ve,async q=>{if(q.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${q.taskKind}" \u2014 skipping`);return}let V=q.payload,oe=V.enrichedCard?.id??"unknown",de=V.enrichedCard?.source_defs??[];if(A.howToRun==="queue-storage"&&W){try{let ie=await P().readQueueStoreRef();if(!ie)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let Re=t.queueStorageForRef(ie,"task-executor"),Ee=typeof A.extra?.boardId=="string"?A.extra.boardId:void 0,qe=[];for(let Ne of de){if(!Ne.outputFile)continue;let je=t.genId(),He=`${oe}/.staged/${je}/${Ne.outputFile}`,ot=await Promise.resolve($.keyRef?.(He));if(!ot)continue;let Xe={ref:xe(ot),deliveryToken:je,outputFile:Ne.outputFile,cardId:oe},lt=Kn({cbk:V.callbackToken,rg:e.value,br:xe(e),cid:oe,b:Ne.bindTo,d:Ne.outputFile,cs:void 0,rqt:V.rqt,dt:Xe.deliveryToken});qe.push({...Ee?{boardId:Ee}:{},ref:A,args:{source_def:Ne,base_ref:xe(e),callback:n.createCallback(lt),output:Xe}});}qe.length>0&&await Re.enqueueMany(qe);}catch(ie){await B({type:"task-failed",taskName:oe,error:ie instanceof Error?ie.message:String(ie),timestamp:Fe()});}return}for(let ie of de){if(!ie.outputFile)continue;let Re;if(W){let Ne=t.genId(),je=`${oe}/.staged/${Ne}/${ie.outputFile}`,He=await Promise.resolve($.keyRef?.(je));He&&(Re={ref:xe(He),deliveryToken:Ne,outputFile:ie.outputFile,cardId:oe});}let Ee=Kn({cbk:V.callbackToken,rg:e.value,br:xe(e),cid:oe,b:ie.bindTo,d:ie.outputFile,cs:void 0,rqt:V.rqt,...Re?{dt:Re.deliveryToken}:{}}),qe=await t.dispatchExecution(A,{source_def:ie,base_ref:xe(e),callback:n.createCallback(Ee),...Re?{output:Re}:{}});qe.dispatched||await B({type:"task-failed",taskName:oe,error:qe.error??"dispatch failed",timestamp:Fe()});}});}async function ae(){try{let E=async()=>{let $=await d(),{events:h}=await p().readEntriesAfterCursor($.lastDrainedJournalId);h.length>0&&await G();},T=await Dn(t.lock,J,E);return Te({ran:T!==!1})}catch(E){return _e(E)}}async function ue(){return u||(u=ae().finally(()=>{u=null;}),u)}async function G(){let E=await P().readQueueStoreRef();if(!E)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);await t.queueStorageForRef(E,"process-accumulated").enqueue({boardRef:xe(e)}),await t.requestProcessAccumulated?.();}async function X(){let E=await P().readQueueStoreRef();if(!E)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let T=t.queueStorageForRef(E,"process-accumulated");for(;;){let $=await T.lease({max:64,visibilityMs:1e3});if($.length<=0)return;for(let h of $)await T.ack(h.id,h.leaseToken);if($.length<64)return}}function Y(){G();}return {async init(E){try{let T=E.params?.cardStoreRef;if(!T)return we("init requires params.cardStoreRef");if(f=E.params?.boardRuntimeStoreRef,!f)return we("init requires params.boardRuntimeStoreRef");let $=E.params?.outputsStoreRef;if(!$)return we("init requires params.outputsStoreRef");let h=E.params?.queueStoreRef;if(!h)return we("init requires params.queueStoreRef");let I=E.params?.fetchedSourcesStoreRef;if(!I)return we("init requires params.fetchedSourcesStoreRef");g=E.params?.scratchStoreRef;let F=E.params?.chatStoreRef;if(!F)return we("init requires params.chatStoreRef");let M=E.params?.artifactsStoreRef;if(!M)return we("init requires params.artifactsStoreRef");await i()||await m({lastDrainedJournalId:"",graph:Rt(It($t)),runtimeByCardId:{}},null);let N=P();await N.writeBoardRuntimeStoreRef(f),await N.writeCardStoreRef(T),await N.writeOutputsStoreRef($),await N.writeQueueStoreRef(h),await N.writeFetchedSourcesStoreRef(I),await N.writeChatStoreRef(F),await N.writeArtifactsStoreRef(M),await(await l()).writeCard(Pe,vt());let K=t.kvStorage("card-upsert"),te=vt(),ce=Ut(te),Ae=t.hashFn(ce),ve=(await K.read(Pe))?.blobRef??await(await l()).readCardKey(Pe)??Pe;return await B({type:"task-upsert",taskName:Pe,taskConfig:ce,timestamp:Fe()}),await K.write(Pe,{blobRef:ve,taskConfigHash:Ae,updatedAt:Fe()}),await B({type:"task-restart",taskName:Pe,timestamp:Fe()}),Y(),await(await y()).writeStatusSnapshot(Ct(bt(s,kt((await d()).graph)))),Te()}catch(T){return _e(T)}},async status(E){try{let T=await y(),$=await T.readStatusSnapshot();return $||($=Ct(bt(s,kt((await d()).graph))),await T.writeStatusSnapshot($)),Te($)}catch(T){return _e(T)}},async getCardStoreRef(E){try{let T=await P().readCardStoreRef();return T?Te({storeRef:T}):we(`Board at ${e.value} has no card store configured`)}catch(T){return _e(T)}},async getBoardRuntimeStoreRef(E){try{return Te({storeRef:f??null})}catch(T){return _e(T)}},async getOutputsStoreRef(E){try{let T=await P().readOutputsStoreRef();return T?Te({storeRef:T}):we(`Board at ${e.value} has no outputs store configured`)}catch(T){return _e(T)}},async getScratchStoreRef(E){try{return Te({storeRef:g??null})}catch(T){return _e(T)}},async getChatStoreRef(E){try{return Te({storeRef:await P().readChatStoreRef()})}catch(T){return _e(T)}},async getArtifactsStoreRef(E){try{return Te({storeRef:await P().readArtifactsStoreRef()})}catch(T){return _e(T)}},async getFetchedSourcesStoreRef(E){try{return Te({storeRef:await P().readFetchedSourcesStoreRef()})}catch(T){return _e(T)}},async getConfig(E){try{let T=E.params?.key;if(!T)return we("getConfig requires params.key");let $=P(),h;switch(T){case "task-executor":h=k??null;break;case "chat-handler-flow":h=S??null;break;case "board-runtime-store-ref":h=await $.readBoardRuntimeStoreRef();break;case "card-store-ref":h=await $.readCardStoreRef();break;case "outputs-store-ref":h=await $.readOutputsStoreRef();break;case "scratch-store-ref":h=g??null;break;case "chat-store-ref":h=await $.readChatStoreRef();break;case "artifacts-store-ref":h=await $.readArtifactsStoreRef();break;case "fetched-sources-store-ref":h=await $.readFetchedSourcesStoreRef();break;default:return we(`getConfig: unknown key "${T}"`)}return Te({value:h})}catch(T){return _e(T)}},async getOutputsDataObject(E){try{let T=E.params?.key;if(!T)return we("getOutputsDataObject requires params.key");if(T===tt)return Te(null);let $=await w();return Te($[T]??null)}catch(T){return _e(T)}},async getAllOutputsDataObjects(E){try{return Te(await w())}catch(T){return _e(T)}},async getOutputsComputedValues(E){try{let T=E.params?.key;return T?Te(await(await y()).readComputedValues(T)):we("getOutputsComputedValues requires params.key")}catch(T){return _e(T)}},async getAllOutputsComputedValues(E){try{return Te(await(await y()).readAllComputedValues())}catch(T){return _e(T)}},async getOutputsFetchedSources(E){try{let T=E.params?.key;if(!T)return we("getOutputsFetchedSources requires params.key");let $=await(await Q()).listSources(T),h={};for(let I of $)h[I]=await ne(`${T}/${I}`);return Te(h)}catch(T){return _e(T)}},async getAllOutputsFetchedSources(E){try{let T=await Q(),$=await(await U()).listKeys(),h=new Set;for(let F of $){let M=F.indexOf("/");M>0&&!F.includes("/.staged/")&&h.add(F.slice(0,M));}let I={};for(let F of h){let M=await T.listSources(F);if(M.length!==0){I[F]={};for(let N of M)I[F][N]=await ne(`${F}/${N}`);}}return Te(I)}catch(T){return _e(T)}},async buildSseOneShotPayload(E){try{let T=(await(await l()).readAllCards()).filter(N=>N.id!==Pe),$=await this.status({});if($.status!=="success")return $;let h=await this.getAllOutputsDataObjects({});if(h.status!=="success")return h;let I=await this.getAllOutputsComputedValues({});if(I.status!=="success")return I;let F=I.data,M={};for(let N of T){let K=typeof N?.id=="string"?N.id:null;if(!K)continue;let te=N.card_data&&typeof N.card_data=="object"&&!Array.isArray(N.card_data)?N.card_data:{};M[K]={schema_version:"v1",card_id:K,card_data:{...te},computed_values:F[K]&&typeof F[K]=="object"?F[K]:{}};}return Te({cardDefinitions:T,statusSnapshot:$.data,dataObjectsByToken:h.data,cardRuntimeById:M})}catch(T){return _e(T)}},async addCardFiles(E){try{let T=E.params?.cardId;if(!T)return we("addCardFiles requires params.cardId");let h=await gr(await l(),{emitNotification:c}).appendFiles({params:{id:T},body:E.body});return h.status!=="success"?h:Te({cardId:T,files_added:h.data.files_added,notified:!0})}catch(T){return _e(T)}},async removeCard(E){try{let T=E.params?.id;if(!T)return we("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(T);}catch{}return await B({type:"task-removal",taskName:T,timestamp:Fe()}),T!==Pe&&await B({type:"task-restart",taskName:Pe,timestamp:Fe()}),Y(),Te()}catch(T){return _e(T)}},async retrigger(E){try{let T=E.params?.id;return T?(await B({type:"task-restart",taskName:T,timestamp:Fe()}),Y(),Te()):we("retrigger requires params.id")}catch(T){return _e(T)}},async processAccumulatedEvents(E){return await X(),ue()},async upsertCard(E){try{let T=E.params?.cardId,$=E.params?.all,h=!!E.params?.restart;if(!T&&!$)return we("upsertCard requires --card-id <id> or --all");let I=await l(),F=$?(await I.readAllCards()).map(K=>K.id):[T];for(let K of F)if(!await I.readCard(K))return we(`Card "${K}" not found in board at ${e.value}`);let M=t.kvStorage("card-upsert"),N=!1;for(let K of F){let te=await I.readCard(K);if(!te)continue;let ce=Ut(te),Ae=t.hashFn(ce),Ie=await M.read(K),ve=Ie?.taskConfigHash!==Ae;if(!(!ve&&!h)){if(ve){let ye=Ie?.blobRef??await I.readCardKey(K)??K;await B({type:"task-upsert",taskName:K,taskConfig:ce,timestamp:Fe()}),await M.write(K,{blobRef:ye,taskConfigHash:Ae,updatedAt:Fe()}),N=N||K!==Pe;}h&&await B({type:"task-restart",taskName:K,timestamp:Fe()});}}return N&&await B({type:"task-restart",taskName:Pe,timestamp:Fe()}),Y(),Te()}catch(T){return _e(T)}},async taskFailed(E){try{let T=E.params?.token;if(!T)return we("taskFailed requires params.token");let $=E.params?.error??"unknown error",h=br(T);return h?(await B({type:"task-failed",taskName:h.taskName,error:$,timestamp:Fe()}),Y(),Te()):we("Invalid callback token")}catch(T){return _e(T)}},async taskProgress(E){try{let T=E.params?.token;if(!T)return we("taskProgress requires params.token");let $=(E.body??{}).update??{},h=br(T);return h?(await B({type:"task-progress",taskName:h.taskName,update:$,timestamp:Fe()}),Y(),Te()):we("Invalid callback token")}catch(T){return _e(T)}},async sourceDataFetched(E){try{let T=E.params?.token,$=E.params?.ref;if(!T)return we("sourceDataFetched requires params.token");if(!$)return we("sourceDataFetched requires params.ref");let h=Hn(T);if(!h)return we("Invalid source token");let I=await Q(),F=h.dt||t.genId();h.dt||await I.ingestSourceDataStaged(h.cid,h.d,st($),F);let M=br(h.cbk);return M?(await B({type:"task-progress",taskName:M.taskName,update:{bindTo:h.b,outputFile:h.d,fetchedAt:Fe(),deliveryToken:F,sourceChecksum:h.cs,rqt:h.rqt},timestamp:Fe()}),Y(),Te()):we("Invalid callback token embedded in source token")}catch(T){return _e(T)}},async sourceDataFetchFailure(E){try{let T=E.params?.token,$=E.params?.reason??"unknown";if(!T)return we("sourceDataFetchFailure requires params.token");let h=Hn(T);if(!h)return we("Invalid source token");let I=br(h.cbk);return I?(await B({type:"task-progress",taskName:I.taskName,update:{bindTo:h.b,outputFile:h.d,failure:!0,reason:$,sourceChecksum:h.cs,rqt:h.rqt},timestamp:Fe()}),Y(),Te()):we("Invalid callback token embedded in source token")}catch(T){return _e(T)}}}}async function pa(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Gn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=Le(n);if(s.length===1){await o(s[0]);return}await o(Me({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 pa(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 $r(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ga(e){return {...$r(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function ya(e){return {...$r(e),reason:e.reason}}function Ur(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(ga)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map($r)},peekDeadLetter(){return e.peekDeadLetter().map(ya)}}}function ha(e,t){return e.peekActive().find(r=>r.id===t)}function Wn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=Le(n);if(s.length===1){await o(s[0]);return}await o(Me({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=ha(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 zn(){return new Date().toISOString()}function Yn(e){return new TextEncoder().encode(e).byteLength}function Ra(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Xn(e){function t(r){let n=e.stat?Ra(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:Yn(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??zn(),s.size=s.size??Yn(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??zn(),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 Zn(){function e(o,s){if(!Array.isArray(o))return [];let c=[];for(let u of o){if(!u||typeof u!="object")continue;let f=u;typeof f.stored_name=="string"&&c.push({name:typeof f.name=="string"?f.name:f.stored_name,stored_name:f.stored_name,size:typeof f.size=="number"&&Number.isFinite(f.size)?f.size:null,mime_type:typeof f.mime_type=="string"?f.mime_type:null,uploaded_at:typeof f.uploaded_at=="string"?f.uploaded_at:s||null,chat:f.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(f=>f.stored_name));for(let f of s)u.has(f.stored_name)||(c.push(f),u.add(f.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 f=u[s];return !f||!f.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==f.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:f}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function eo(e,t={}){let r=t.emitNotification;function n(y){let l=typeof y=="number"?y:Number(y);return Number.isInteger(l)&&l>0?l:null}function o(y,l){let i=l;for(let d=y.length-1;d>=0;d-=1)if(y[d]?.role==="user"&&(i-=1,i===0))return y.slice(d);return y}function s(y){return y.some(l=>typeof l?.turn=="string"&&l.turn!=="")}function c(y,l){if(l<=0)return [];if(!s(y))return o(y,l);let i=new Map,d=[];for(let p of y){let R=typeof p?.turn=="string"?p.turn:"";i.has(R)||(i.set(R,[]),d.push(R)),i.get(R).push(p);}return d.slice(Math.max(0,d.length-l)).flatMap(p=>i.get(p)??[])}function u(y){return {status:"success",data:y}}function f(y){return {status:"fail",error:y}}function g(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}function k(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 l=Le(y);if(l.length===1){await r(l[0]);return}await r(Me({kind:"notification-batch",notifications:l}));}async function b(y){let l=await e.readAll(y);return c(l,1).map(k)}async function O(y){let l=Date.now();return {kind:"card_chats",cardId:y,sentAt:new Date(l).toISOString(),sentAtMs:l,messages:await b(y),receiving:true,processing:await e.isProcessing(y)}}async function P(y,l="command envelope"){let i=typeof y.cardId=="string"?y.cardId:void 0;if(!y.command)return f(`chat-store: ${l} missing "command"`);if(!i)return f(`chat-store: ${l} missing "cardId"`);if(y.command==="append")return await v.append({params:{cardId:i},body:{role:y.role,text:y.text,files:y.files,turn:y.turn}});if(y.command==="read-all")return await v.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 v.readAfter({params:{cardId:i},body:{cursor:y.cursor??null}});if(y.command==="clear")return await v.clear({params:{cardId:i}});if(y.command==="set-processing")return await v.setProcessing({params:{cardId:i},body:{active:y.active}});if(y.command==="is-processing")return await v.isProcessing({params:{cardId:i}});if(y.command==="get-config")return await v.getConfig({params:{cardId:i}});if(y.command==="set-config"){let{command:d,cardId:m,...p}=y;return await v.setConfig({params:{cardId:i},body:p})}return f(`chat-store: unknown command "${String(y.command)}"`)}async function _(y){if(!Array.isArray(y.commands)||y.commands.length===0)return f('chat-store: command envelope must include a non-empty "commands" array');let l=[];for(let i=0;i<y.commands.length;i+=1){let d=y.commands[i];if(!d||typeof d!="object"||Array.isArray(d))return f(`chat-store: command envelope entry ${i} must be an object`);let m={cardId:y.cardId,...d},p=await P(m,`command envelope entry ${i}`);if(p.status!=="success")return p;l.push({index:i,command:String(m.command),data:p.data});}return u({results:l})}let v={async append(y){try{let l=y.params?.cardId;if(!l)return f("append requires params.cardId");let i=y.body??{},d=typeof i.role=="string"?i.role:"",m=typeof i.text=="string"?i.text:"",p=Array.isArray(i.files)?i.files:[],R=typeof i.turn=="string"?i.turn:"";if(!d)return f("append requires body.role");let w=await e.append(l,d,m,p,R);return await S([{kind:"chat_messages",cardId:l,messages:await b(l)}]),u({id:w})}catch(l){return g(l)}},async readAll(y){try{let l=y.params?.cardId;if(!l)return f("readAll requires params.cardId");let i=y.body??{},d=typeof i.turnId=="string"?i.turnId:"",m=i.allTurns===!0,p=typeof i.tailTurnsBeforeId=="string"?i.tailTurnsBeforeId:"",R=i.tailTurns===void 0?i.lastUserTurns:i.tailTurns,w=R===void 0?m||d?void 0:1:n(R);if(R!==void 0&&w===null)return f("readAll requires body.tailTurns (positive integer)");let B=await e.readAll(l),j=B.filter(U=>!d||String(U.turn||"")===d);if(p){let U=w;if(typeof U!="number"||!Number.isInteger(U)||U<=0)return f("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let Q=new Map,ne=[];for(let G of B){let X=String(G.turn||"");Q.has(X)||(Q.set(X,[]),ne.push(X)),Q.get(X).push(G);}let J=ne.findIndex(G=>G===p),ae=Math.max(0,J-U);return j=(J===-1?[]:ne.slice(ae,J)).flatMap(G=>Q.get(G)??[]),u({records:j})}return u(typeof w=="number"?{records:c(j,w)}:{records:j})}catch(l){return g(l)}},async buildSseOneShotBatch(y){try{let l=y.params?.cardId;if(!l)return f("buildSseOneShotBatch requires params.cardId");let i=y.body??{},d=typeof i.receiving=="boolean"?i.receiving:!0,m=await O(l);return u(Me({kind:"notification-batch",notifications:[{...m,receiving:d}]}))}catch(l){return g(l)}},async readAfter(y){try{let l=y.params?.cardId;if(!l)return f("readAfter requires params.cardId");let d=(y.body??{}).cursor??null;return u(await e.readAfter(l,d))}catch(l){return g(l)}},async clear(y){try{let l=y.params?.cardId;return l?(await e.clear(l),u({ok:!0})):f("clear requires params.cardId")}catch(l){return g(l)}},async setProcessing(y){try{let l=y.params?.cardId;if(!l)return f("setProcessing requires params.cardId");let i=y.body??{};return typeof i.active!="boolean"?f("setProcessing requires body.active (boolean)"):(await e.setProcessing(l,i.active),await S([{kind:"chat_processing",cardId:l,active:i.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(l){return g(l)}},async isProcessing(y){try{let l=y.params?.cardId;return l?u({active:await e.isProcessing(l)}):f("isProcessing requires params.cardId")}catch(l){return g(l)}},async getConfig(y){try{let l=y.params?.cardId;return l?u({config:await e.getConfig(l)}):f("getConfig requires params.cardId")}catch(l){return g(l)}},async setConfig(y){try{let l=y.params?.cardId;if(!l)return f("setConfig requires params.cardId");let i=y.body??{};return await e.setConfig(l,i),u({ok:!0})}catch(l){return g(l)}},run:P,runBatch:_};return v}function Pt(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function to(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(Pt):[]:Pt(e)?[e]:[]}function ro(e,t,r){let n=0;return {accepted:e.filter(s=>{if(!Pt(s))return n++,false;let c=s;return typeof c.sentAtMs=="number"&&t-c.sentAtMs>r?(n++,false):true}),rejected:n}}function oo(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Vr(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 ka(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function no(e,t){if(t.kind==="status"){Vr(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 ao(e,t){if(ka(t)){for(let r of t.notifications)Pt(r)&&no(e,r);return}Pt(t)&&no(e,t);}function Kr(e){let t=new Map,r=0;function n(l){let i=JSON.stringify(l);return r++,`id: ${r}
|
|
1
|
+
var ServerRuntimeControlface=(function(exports){'use strict';var To=Object.defineProperty;var Io=(e,t,r)=>t in e?To(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var rn=(e,t,r)=>Io(e,t+"",r);var Jt="b64:";function Po(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 a of t)o+=String.fromCharCode(a);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function _o(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 a=0;a<n.length;a+=1)o[a]=n.charCodeAt(a);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Ie(e){return `${Jt}${Po(JSON.stringify(e))}`}function it(e){if(!e.startsWith(Jt))throw new Error(`Invalid ref format (expected ${Jt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(_o(e.slice(Jt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function nn(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function rt(e){return typeof e.journalStorage=="function"}function on(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?it(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function st(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pr(e){let t=e.reduce((o,a)=>o+a.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}function me(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function ut(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function ct(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function pt(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 Qt(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let a=Number(o);if(Number.isFinite(a))return a}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function an(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 gt(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 a=o,c=a.status;if(c==="success")return Object.prototype.hasOwnProperty.call(a,"data")?o:{status:"success",data:{}};if(c==="fail"||c==="error")return o}return {status:"success",data:o}}function nt(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 a=n.data;if(a&&typeof a=="object"&&!Array.isArray(a)){let c=a.issues;if(Array.isArray(c)){let f=c.find(k=>typeof k=="string"&&k.trim());if(typeof f=="string")return `Validation failed: ${f}`}let u=a.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function _r(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpControlplaneToolRegistry:a,retriggerCard:c,applyCardAction:u,resolveChatHandlerTarget:f,sendCardFileDownloadResponse:k}=e;async function R(b,S,_){let T=b.method||"GET",I=_,A=I.pathname;try{if(T==="POST"&&A===`${t}/mcp-actions`){await o();let d=Date.now(),m=new Date(d).toISOString(),p=await n(b),h=typeof p.tool=="string"?p.tool.trim():"",w=p.args&&typeof p.args=="object"&&!Array.isArray(p.args)?p.args:{};if(!h)return r(S,400,{error:"tool is required"}),!0;let O=me(w,"card_id");if(!O)return r(S,400,{error:"MCP action requires card_id"}),!0;if(h==="retrigger-card"||h==="retrigger"){await c(O);let J=Date.now();return r(S,200,{status:"success",data:{ok:!0,cardId:O,actionType:h,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:200}}),!0}let N=ct(w,"payload");if(h==="chat-send"&&!await f(O)){let J=Date.now();return r(S,409,{error:`chat handler is not configured for card: ${O}`,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:409}),!0}if(h==="chat-send"){let J=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!J||!String(J).trim()){let ae=Date.now();return r(S,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${O}`,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(ae).toISOString(),responseSentAtMs:ae,responseStatus:400}),!0}}await u(O,h,N);let U=Date.now();return r(S,200,{status:"success",data:{ok:!0,cardId:O,actionType:h,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(U).toISOString(),responseSentAtMs:U,responseStatus:200}}),!0}if(T==="POST"&&A===`${t}/mcp-controlplane`){await o();let d=await n(b),m=typeof d.tool=="string"?d.tool.trim():"",p=d.args&&typeof d.args=="object"&&!Array.isArray(d.args)?d.args:{};if(!m)return r(S,400,{error:"tool is required"}),!0;try{let h=await gt(m,p,a());if(h&&typeof h=="object"&&!Array.isArray(h)){let w=h;if(w.status==="fail")return r(S,400,{error:nt(h,"Request failed")}),!0;if(w.status==="error")return r(S,500,{error:nt(h,"Internal error")}),!0}r(S,200,h);}catch(h){let w=typeof h?.statusCode=="number"?Number(h.statusCode):500,O=h instanceof Error?h.message:String(h);r(S,w,{error:O});}return !0}let g=A.match(new RegExp(`^${st(t)}/cards/([^/]+)/retrigger$`));if(T==="POST"&&g){await o();let d=decodeURIComponent(g[1]);return await c(d),r(S,200,{ok:!0}),!0}let l=A.match(new RegExp(`^${st(t)}/cards/([^/]+)/actions$`));if(T==="POST"&&l){await o();let d=decodeURIComponent(l[1]),m=Date.now(),p=new Date(m).toISOString(),h=await n(b),w=h?.actionType;if(w==="chat-send"&&!await f(d)){let N=Date.now();return r(S,409,{error:`chat handler is not configured for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(N).toISOString(),responseSentAtMs:N,responseStatus:409}),!0}if(w==="chat-send"){let N=h?.payload??{},U=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!U||!String(U).trim()){let J=Date.now();return r(S,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:400}),!0}}await u(d,w,h?.payload);let O=Date.now();return r(S,200,{ok:!0,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(O).toISOString(),responseSentAtMs:O,responseStatus:200}),!0}let i=A.match(new RegExp(`^${st(t)}/cards/([^/]+)/files/(\\d+)$`));if(T==="GET"&&i){let d=decodeURIComponent(i[1]),m=parseInt(i[2],10),p=I.searchParams.get("sn");return await k(S,d,m,p),!0}return !1}catch(g){let l=g?.statusCode||500;return r(S,l,{error:String(g?.message||g)}),true}}return {handleRuntimeApi:R}}function Gt(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 Eo(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 Bo(e){return e.category?e:{...e,category:Eo(e.kind)}}function De(e){return e.map(t=>Bo(t))}function $e(e){return {...e,category:e.category??"batch",notifications:De(e.notifications)}}var Rt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ze(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function kt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function sn(e){return e.tasks??{}}function Er(e){return e?e.status===Rt.FAILED||e.status===Rt.INACTIVATED:false}function un(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function cn(e){return e.maxExecutions}function dn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===Rt.COMPLETED){let a=e.tasks[n];a&&Ze(a).forEach(u=>r.add(u));}return Array.from(r)}function ln(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Ze(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function fn(e,t,r){let n=e.tasks[t]??Wt(),o={};if(r){let c=r.tasks[t],u=kt(c);for(let f of u)for(let[k,R]of Object.entries(r.tasks))if(Ze(R).includes(f)){let b=e.tasks[k];b?.lastDataHash&&(o[f]=b.lastDataHash);break}}let a={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:a},lastUpdated:new Date().toISOString()}}function mn(e,t,r,n,o,a){let c=e.tasks[r]??Wt(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let f;n&&u.on&&u.on[n]?f=u.on[n]:f=Ze(u);let k=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let S=u.requires??[];for(let _ of S)for(let[T,I]of Object.entries(t.tasks))if(Ze(I).includes(_)){let A=e.tasks[T];A?.lastDataHash&&(k[_]=A.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:a,lastConsumedHashes:k,error:void 0},b=[...new Set([...e.availableOutputs,...f])];return {...e,tasks:{...e.tasks,[r]:R},availableOutputs:b,lastUpdated:new Date().toISOString()}}function pn(e,t,r,n){let o=e.tasks[r]??Wt(),a=t.tasks[r];if(a?.retry){let f=o.retryCount+1;if(f<=a.retry.max_attempts){let k={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:k},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(a?.on_failure&&a.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&c.executionCount>=a.circuit_breaker.max_executions){let f=a.circuit_breaker.on_break;u=[...new Set([...u,...f])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:u,lastUpdated:new Date().toISOString()}}function gn(e,t,r,n){let o=e.tasks[t]??Wt(),a={...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]:a},lastUpdated:new Date().toISOString()}}function yn(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 Wt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Tt(e,t){let r=`live-${Date.now()}`,n={};for(let a of Object.keys(e.tasks))n[a]=Rn();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 Oo(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:fn(n,t.taskName,r)};case "task-completed":return {config:r,state:mn(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:pn(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:gn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:yn(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:Do(n,t.action)};case "task-upsert":return Fo(e,t.taskName,t.taskConfig);case "task-removal":return qo(e,t.taskName);case "node-requires-add":return No(e,t.nodeName,t.tokens);case "node-requires-remove":return jo(e,t.nodeName,t.tokens);case "node-provides-add":return Lo(e,t.nodeName,t.tokens);case "node-provides-remove":return Mo(e,t.nodeName,t.tokens);default:return e}}function hn(e,t){return t.reduce((r,n)=>Oo(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]:Rn()},lastUpdated:new Date().toISOString()}}}function qo(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...a}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:a,lastUpdated:new Date().toISOString()}}}function No(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=kt(n),a=r.filter(c=>!o.includes(c));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...a]}}},state:e.state}}function jo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=kt(n),a=o.filter(c=>!r.includes(c));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:a}}},state:e.state}}function Lo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ze(n),a=r.filter(c=>!o.includes(c));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...a]}}},state:e.state}}function Mo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ze(n),a=o.filter(c=>!r.includes(c));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:a}}},state:e.state}}function Ct(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function bt(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 Rn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Do(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 Ft(e){let{config:t,state:r}=e,n=sn(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=$o(n),c=dn(t,r.tasks),u=new Set([...c,...r.availableOutputs]),f=[],k=[],R=[],b=[];for(let[_,T]of Object.entries(n)){let I=r.tasks[_],A=un(T,t.settings),g=A!=="once";if(I?.status===Rt.RUNNING||Er(I))continue;let l=cn(T);if(l!==void 0&&I&&I.executionCount>=l||T.circuit_breaker&&I&&I.executionCount>=T.circuit_breaker.max_executions||!g&&I?.status===Rt.COMPLETED)continue;if(g&&I?.status===Rt.COMPLETED){let h=kt(T),w=false;switch(A){case "data-changed":{h.length>0&&h.some(N=>{for(let[U,J]of Object.entries(n))if(Ze(J).includes(N)){let ae=r.tasks[U];if(!ae)continue;let Q=I.lastConsumedHashes?.[N];return ae.lastDataHash==null?ae.executionCount>I.lastEpoch:ae.lastDataHash!==Q}return false})||(w=true);break}case "epoch-changed":{h.length>0&&h.some(N=>{for(let[U,J]of Object.entries(n))if(Ze(J).includes(N)){let ae=r.tasks[U];if(ae&&ae.executionCount>I.lastEpoch)return true}return false})||(w=true);break}case "time-based":{let O=T.refreshInterval??0;if(O<=0){w=true;break}let N=I.completedAt;if(!N){w=true;break}(Date.now()-Date.parse(N))/1e3<O&&(w=true);break}case "manual":w=true;break}if(w)continue}let i=kt(T);if(i.length===0){f.push(_);continue}let d=[],m=[],p=[];for(let h of i){if(u.has(h))continue;let w=a[h]||[];w.length===0?d.push(h):w.every(N=>Er(r.tasks[N]))?p.push({token:h,failedProducer:w[0]}):m.push(h);}d.length>0?R.push({taskName:_,missingTokens:d}):p.length>0?b.push({taskName:_,failedTokens:p.map(h=>h.token),failedProducers:[...new Set(p.map(h=>h.failedProducer))]}):m.length>0?k.push({taskName:_,waitingOn:m}):f.push(_);}let S={};if(f.length>1){let _=ln(f,n);for(let[T,I]of Object.entries(_))I.length>1&&(S[T]=I);}return {eligible:f,pending:k,unresolved:R,blocked:b,conflicts:S}}function $o(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of Ze(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let a of o)t[a]||(t[a]=[]),t[a].includes(r)||t[a].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 qt=class{constructor(){rn(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Br(e){let t=Or(e);return Uo(t)}function Or(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Or).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Or(t[n])).join(",")+"}"}function Uo(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 Vo(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 Ko(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 a=0;a<n.length;a++)o[a]=n.charCodeAt(a);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function kn(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Vo(t)}function Ho(e){try{let t=JSON.parse(Ko(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function zt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:a}=t,c=new qt,u="state"in e&&"config"in e?e:Tt(e),f=false,k=new Set,R=new Map(Object.entries(n)),b=new qt,S=false,_=false;function T(){if(!f){if(S){_=true;return}S=true;try{do _=!1,I();while(_)}finally{S=false;}}}function I(){let i=b.drain(),d=c.drain(),m=[...i,...d];if(m.length>0&&(u=hn(u,m),o)){for(let h of m)if(h.type==="task-removal")try{o(h.taskName);}catch(w){console.warn("[reactive] onNodeRemoved failed:",w instanceof Error?w.message:String(w));}}let p=Ft(u);m.length>0&&a?.(m,u,p);for(let h of p.eligible)l(h);for(let h of m)if(h.type==="task-progress"){let{taskName:w,update:O}=h;if(!u.config.tasks[w])continue;let U=u.state.tasks[w];if(!U||U.status!=="running")continue;let J=kn(w),ae=g(w,J,O).catch(Q=>{f||(b.append({type:"task-failed",taskName:w,error:Q.message??String(Q),timestamp:new Date().toISOString()}),T());}).finally(()=>{k.delete(ae);});k.add(ae);}}function A(i){let m=u.config.tasks[i].requires??[],p=new Map;for(let[w,O]of Object.entries(u.config.tasks))for(let N of O.provides??[])p.set(N,w);let h={};for(let w of m){let O=p.get(w);O?h[w]=u.state.tasks[O]?.data:h[w]=void 0;}return h}async function g(i,d,m){let p=u.config.tasks[i],h=p.taskHandlers??[],w=A(i);for(let O of h){let N=R.get(O);if(!N)throw new Error(`Handler '${O}' not found in registry (task '${i}')`);let U={nodeId:i,state:w,taskState:u.state.tasks[i],config:p,callbackToken:d,update:m};if(await N(U)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${i}')`)}}function l(i){let m=u.config.tasks[i]?.taskHandlers;if(!m||m.length===0)return;b.append({type:"task-started",taskName:i,timestamp:new Date().toISOString()}),T();let p=kn(i),h=g(i,p).catch(w=>{f||(b.append({type:"task-failed",taskName:i,error:w.message??String(w),timestamp:new Date().toISOString()}),T());}).finally(()=>{k.delete(h);});k.add(h);}return {push(i){f||(i.type==="task-completed"&&i.data&&!i.dataHash&&(i={...i,dataHash:Br(i.data)}),c.append(i),T());},pushAll(i){if(!f){for(let d of i)d.type==="task-completed"&&d.data&&!d.dataHash?c.append({...d,dataHash:Br(d.data)}):c.append(d);T();}},resolveCallback(i,d,m){if(f)return;let p=Ho(i);if(!p)return;let{taskName:h}=p;if(u.config.tasks[h]){if(m&&m.length>0)c.append({type:"task-failed",taskName:h,error:m.join("; "),timestamp:new Date().toISOString()});else {let w=d&&Object.keys(d).length>0?Br(d):void 0;c.append({type:"task-completed",taskName:h,data:d,dataHash:w,timestamp:new Date().toISOString()});}T();}},addNode(i,d){f||(c.append({type:"task-upsert",taskName:i,taskConfig:d,timestamp:new Date().toISOString()}),T());},removeNode(i){f||(c.append({type:"task-removal",taskName:i,timestamp:new Date().toISOString()}),T());},addRequires(i,d){f||(c.append({type:"node-requires-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),T());},removeRequires(i,d){f||(c.append({type:"node-requires-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),T());},addProvides(i,d){f||(c.append({type:"node-provides-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),T());},removeProvides(i,d){f||(c.append({type:"node-provides-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),T());},registerHandler(i,d){R.set(i,d);},unregisterHandler(i){R.delete(i);},retrigger(i){f||u.config.tasks[i]&&(c.append({type:"task-restart",taskName:i,timestamp:new Date().toISOString()}),T());},retriggerAll(i){if(!f){for(let d of i)u.config.tasks[d]&&c.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});T();}},snapshot(){return Ct(u)},getState(){return u},getSchedule(){return Ft(u)},async waitForHandlers(){k.size>0&&await Promise.allSettled([...k]);},async dispose(i){i?.wait&&k.size>0&&await Promise.allSettled([...k]),f=true;}}}function Yt(){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 Jo=Yt();Jo("./jsonata-sync.cjs");var Qo=Yt(),Xt=Qo("./jsonata-sync.cjs"),Sn=Xt;function Cn(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 wn(e,t,r){let n=t.split("."),o=e;for(let a=0;a<n.length-1;a++)(o[n[a]]==null||typeof o[n[a]]!="object")&&(o[n[a]]={}),o=o[n[a]];o[n[n.length-1]]=r;}async function Go(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 a=await Xt(o.expr).evaluate(n);wn(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch{}return e}function Wo(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 a of e.compute)try{let c=Sn(a.expr).evaluate(n);wn(e.computed_values,a.bindTo,c),n.computed_values=e.computed_values;}catch(c){let u=c instanceof Error?c.message:String(c);o.push({bindTo:a.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function zo(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Xt(e).evaluate(n)}function Yo(e,t){return t.startsWith("fetched_sources.")?Cn(e._sourcesData??{},t.slice(16)):Cn(e,t)}var bn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Xo=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Zo(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))Xo.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 a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof a.ref!="string"||!a.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 a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof a.expr!="string"||!a.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((a,c)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`source_defs[${c}]: must be an object`);else {let u=a;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));}});}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,a)=>{if(!o||typeof o!="object"){t.push(`view.elements[${a}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${a}].kind: required, must be a string`):bn.has(o.kind)||t.push(`view.elements[${a}].kind: unknown kind "${o.kind}". Valid: ${[...bn].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${a}].data: must be an object`);});}return {ok:t.length===0,errors:t}}async function ea(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[a,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[a]=await Xt(c).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}}))}function ta(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[a,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[a]=Sn(c).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}})}var We={run:Go,runSync:Wo,eval:zo,resolve:Yo,validate:Zo,enrichSources:ea,enrichSourcesSync:ta};function Zt(e){return JSON.stringify(e)}function er(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 tr(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Fr(e,t){return tr(e)?e.then(t):t(e)}function An(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function qr(e,t){return {readValues(n){let o=e(n);return Fr(o.listKeys(),a=>{let c=[...a].sort();if(c.length===0)return {version:null,values:{}};let u={},f=null;for(let k of c){let R=o.read(k);tr(R)?f=(f??Promise.resolve()).then(async()=>{u[k]=await R;}):u[k]=R;}return f?f.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,a){let c=e(n),u=null;for(let f of a){let k=c.delete(f);tr(k)&&(u=(u??Promise.resolve()).then(()=>k).then(()=>{}));}for(let[f,k]of Object.entries(o)){let R=c.write(f,k);tr(R)&&(u=(u??Promise.resolve()).then(()=>R).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function rr(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 Fr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let a=An(o.values,n);return Fr(e.writeValues(r,a,n.deleteKeys),c=>({ok:true,newVersion:c}))})}}}function vn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function xn(e){return {readEntriesAfterCursor(t){let r=vn(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 vn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function Tn(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 nr(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function dt(e,t){return nr(e)?e.then(t):t(e)}function Nr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);nr(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function ra(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function na(e,t){let r=e.match(t);return r?r[1]:null}function In(e,t,r){let n={},o=Nr(e,a=>{let c=r(a);if(c)return dt(t(a),u=>{n[c]=u;})});return nr(o)?o.then(()=>n):n}function or(e,t){return {readSourceData(r,n){return dt(e.read(`${r}/${n}`),ra)},ingestSourceDataStaged(r,n,o,a){return dt(t(o),c=>e.write(`${r}/.staged/${a}/${n}`,c))},commitSourceData(r,n,o){let a=`${r}/.staged/${o}/${n}`,c=`${r}/${n}`;return e.renameKey(a,c)},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 jr(e,t){let r=(n,o)=>{try{let a=o(n);return nr(a)?a.catch(c=>t(n,c instanceof Error?c.message:String(c))):void 0}catch(a){try{return t(n,a instanceof Error?a.message:String(a))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return dt(e.read(n),a=>e.write(n,[...a??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return dt(e.read(n),a=>{let c=a;if(!(!c||c.length===0))return dt(Nr(c,u=>r(u,o)),()=>e.delete(n))})}}}function Lr(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 ar(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=>In(t,r=>e.read(r),r=>na(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return Nr(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=>In(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}var ot="sys_keys_board_state",ve="__sys_keys_board_state_init";function Pn(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e.__private;return !!t&&typeof t=="object"&&!Array.isArray(t)&&t.visible_controlplane_only===true}function Mr(e){let t=e.filter(o=>!Pn(o)),r=[...new Set(t.map(o=>o.id).filter(o=>typeof o=="string"&&o.length>0))].sort(),n=[...new Set(t.flatMap(o=>Array.isArray(o.provides)?o.provides:[]).map(o=>o&&typeof o=="object"&&!Array.isArray(o)?o.bindTo:void 0).filter(o=>typeof o=="string"&&o.length>0&&o!==ot))].sort();return {card_ids:r,data_object_keys:n}}function Dr(e,t){let r=e.filter(a=>!Pn(a)),n=[...new Set(r.map(a=>a.id).filter(a=>typeof a=="string"&&a.length>0))].sort(),o=[...new Set(Object.entries(t).filter(([a])=>a!==ve).flatMap(([,a])=>Array.isArray(a.provides)?a.provides:[]).filter(a=>typeof a=="string"&&a.length>0&&a!==ot))].sort();return {card_ids:n,data_object_keys:o}}function xt(){return {id:ve,meta:{title:"System Keys Board State",synthetic:true},provides:[{bindTo:ot,ref:`card_data.${ot}`}],card_data:{[ot]:{card_ids:[],data_object_keys:[]}},__private:{visible_controlplane_only:true}}}function Mt(e,t){function r(){return e.readIndex()??{}}function n(o,a,c){let u=String(a||"").split(".").filter(Boolean);if(u.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let f={...o},k=f;for(let R=0;R<u.length-1;R++){let b=u[R],S=k[b],_=S&&typeof S=="object"&&!Array.isArray(S)?{...S}:{};k[b]=_,k=_;}return k[u[u.length-1]]=c,f}return {readCard(o){let a=r()[o];return !a||!e.cardExists(a.key)?null:e.readCard(a.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[a,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 "${a}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[a,c]of Object.entries(r()))o[a]=c.checksum;return o},changedSince(o){let a=r(),c=[];for(let[u,f]of Object.entries(a))o[u]!==f.checksum&&c.push(u);for(let u of Object.keys(o))a[u]||c.push(u);return c},validateUpsert(o,a){let c=r(),u=c[o],f=Object.entries(c).find(([,k])=>k.key===a);return u&&u.key!==a?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${a}"`}:f&&f[0]!==o?{ok:false,error:`Key "${a}" is already mapped to card id "${f[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,a,c){let u=r(),f=c??u[o]?.key??e.defaultCardKey(o),k=e.writeCard(f,a);u[o]={key:f,checksum:k,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,a,c){let u=r(),f=u[o];if(!f||!e.cardExists(f.key))throw new Error(`card "${o}" not found`);let k=e.readCard(f.key);if(!k||typeof k!="object"||Array.isArray(k))throw new Error(`card "${o}" is not patchable`);let R=n(k,a,c),b=e.writeCard(f.key,R);u[o]={key:f.key,checksum:b,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let a=r(),c=a[o];c&&(e.removeCard(c.key),delete a[o],e.writeIndex(a));},readIndex(){return r()}}}function sr(e,t){return or(e,t)}function _n(e){return xn(e)}var ir="v1",lt="board/graph",En="board/lastJournalProcessedId";function Bn(e){return `cards/${e}/runtime`}function On(e){return rr(e,ir)}function ur(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 er(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Zt(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 Fn(e){return ar(e)}function Nt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function oa(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function jt(e,t){return e?.lastRequestedToken?oa(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function $r(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Lt(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function St(e){let t=e.cards.filter(u=>u.name!==ve);if(t.length===e.cards.length)return e;let r=new Set;for(let u of t)for(let f of u.requires)r.add(f);let n=t.map(u=>({name:u.name,fanOut:u.unblocks.length})).sort((u,f)=>f.fanOut-u.fanOut||u.name.localeCompare(f.name)),o=n.length>0?n[0]:{name:null,fanOut:0},a=u=>t.filter(f=>f.status===u).length,c=t.filter(u=>u.requires.length===0&&u.unblocks.length===0).length;return {...e,summary:{...e.summary,card_count:t.length,completed:a("completed"),eligible:a("eligible"),pending:a("pending"),blocked:a("blocked"),unresolved:a("unresolved"),failed:a("failed"),in_progress:a("in-progress"),orphan_cards:c,topology:{edge_count:r.size,max_fan_out_card:o.name,max_fan_out:o.fanOut}},cards:t}}function cr(e){let{[ot]:t,...r}=e;return r}function wt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),a=Ft(t),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let T of a.pending)u.set(T.taskName,T.waitingOn);for(let T of a.unresolved)u.set(T.taskName,T.missingTokens);for(let T of a.blocked)u.set(T.taskName,T.failedTokens);let f=new Map;for(let[T,I]of Object.entries(n))for(let A of I.requires??[]){let g=f.get(A)??[];g.push(T),f.set(A,g);}let k=o.sort().map(T=>{let I=r[T],A=n[T]??{requires:[],provides:[]};I.status==="completed"?c.completed+=1:I.status==="failed"?c.failed+=1:I.status==="in-progress"&&(c.in_progress+=1);let g=A.requires??[],l=A.provides??[],i=Object.keys(I.data??{}).sort(),d=g.filter(N=>t.state.availableOutputs.includes(N)),m=g.filter(N=>!t.state.availableOutputs.includes(N)),p=u.get(T)??m,h=new Set;for(let N of l)for(let U of f.get(N)??[])U!==T&&h.add(U);let w=I.failedAt,O=I.error?{message:I.error,code:"TASK_FAILED",at:w,source:"task-runtime"}:void 0;return {name:T,status:I.status,error:O,requires:g,requires_satisfied:d,requires_missing:m,provides_declared:l,provides_runtime:i,blocked_by:p,unblocks:Array.from(h).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}}});c.pending=a.pending.length,c.blocked=a.blocked.length,c.unresolved=a.unresolved.length;let R=k.map(T=>({name:T.name,fanOut:T.unblocks.length})).sort((T,I)=>I.fanOut-T.fanOut||T.name.localeCompare(I.name)),b=R.length>0?R[0]:{name:null,fanOut:0},S=new Set;for(let T of Object.values(n))for(let I of T.requires??[])S.add(I);let _=0;for(let[T,I]of Object.entries(n)){let A=(I.requires??[]).length===0,l=(I.provides??[]).some(i=>(f.get(i)??[]).some(d=>d!==T));A&&!l&&(_+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:c.completed,eligible:a.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:_,topology:{edge_count:Array.from(S).length,max_fan_out_card:b.name,max_fan_out:b.fanOut}},cards:k}}function aa(){return new Date().toISOString()}function qn(e,t,r,n,o,a,c){return async u=>{let f=[],k=r.cardStore.readCard(u.nodeId);if(!k)return "task-initiate-failure";let R=k.id;if(R===ve){let G=r.activeTaskConfigs?.(),Z={[ot]:G?Dr(Object.keys(G).filter(re=>re!==ve).map(re=>r.cardStore.readCard(re)).filter(re=>!!re),G):Mr(r.cardStore.readAllCards())};return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(Z),n(u.nodeId,Z),"task-initiated"}let b=k.card_data??{},S=k.source_defs??[],_=S,T=r.cardRuntimeStore.readRuntime(R),I=false,A=()=>{I&&(r.cardRuntimeStore.writeRuntime(R,T),I=false);},g=G=>Nt(T._sources[G]),l=(G,Z)=>{T._sources[G]=Nt(Z),I=true;},i=u.taskState?.executionCount??0;if(T._lastExecutionCount!==i&&(T._sources={},T._lastExecutionCount=i,I=true),u.update){let G=u.update,Z=G.outputFile;if(Z){let re=g(Z);if(G.failure){let B=G.rqt??re.lastRequestedToken??re.queueRequestedToken;B&&l(Z,Lt(re,B));}else {let B=G.rqt;if(!re.lastCompletedToken||B>re.lastCompletedToken){let x=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,K=false;x&&(K=r.fetchedSourcesStore.commitSourceData(R,Z,x)),K?l(Z,$r(re,B)):l(Z,Lt(re,B));}}A();}}let m={};for(let G of S)if(G.outputFile){let Z=r.fetchedSourcesStore.readSourceData(R,G.outputFile);Z!==null&&(m[G.bindTo]=Z);}let p={};for(let[G,Z]of Object.entries(u.state??{}))if(Z!==null&&typeof Z=="object"&&!Array.isArray(Z)){let re=Z[G];p[G]=re!==void 0?re:Z;}else p[G]=Z;let h={id:R,card_data:{...b},requires:p,source_defs:S,compute:k.compute};h._sourcesData=m,k.compute&&We.runSync(h,{sourcesData:m}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(R,h.computed_values??{});let w={...k},O=We.enrichSourcesSync(Array.isArray(k.source_defs)?k.source_defs:void 0,{card_data:k.card_data,requires:p}),N=e.value;w.source_defs=Array.isArray(O)?O.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:N})):O;let U=aa(),J=u.update?void 0:U,ae=_.filter(G=>{let Z=G.outputFile;if(typeof Z!="string"||!Z)return true;let re=g(Z);J&&(re={...re,queueRequestedToken:J},l(Z,re));let B=re.queueRequestedToken??re.lastRequestedToken??U,x=jt(re,B);return x==="in-flight"?false:x==="dispatch"});if(A(),ae.length>0){let G=false,Z=U;for(let re of ae){let B=re.outputFile;if(typeof B!="string"||!B)continue;let x=g(B),K=x.queueRequestedToken??U;l(B,{...x,lastRequestedToken:K}),Z=K,G=true;}return G&&A(),G&&(f.push({taskKind:"source-fetch",payload:{boardRef:Ie(e),enrichedCard:w,callbackToken:u.callbackToken,rqt:Z}}),r.executionRequestStore.appendEntries(t,f)),"task-initiated"}if(_.some(G=>{let Z=G.outputFile;if(typeof Z!="string"||!Z)return false;let re=g(Z),B=re.queueRequestedToken??re.lastRequestedToken??U;return jt(re,B)==="in-flight"}))return "task-initiated";let te=k.provides??[],ue={};for(let{bindTo:G,ref:Z}of te)ue[G]=We.resolve(h,Z);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(ue),n(u.nodeId,ue),f.length>0&&r.executionRequestStore.appendEntries(t,f),"task-initiated"}}var Dt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function dr(e){return {[lt]:e.graph,[En]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function lr(e){let t=e[lt],r=e[En],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${lt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function $t(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 fr(e,t={}){function r(R){return {status:"success",data:R}}function n(R){return {status:"fail",error:R}}function o(R){return {status:"error",error:R instanceof Error?R.message:String(R)}}function a(R){return R===ve}async function c(R){let b=t.emitNotification;if(!b||R.length===0)return;let S=De(R.filter(_=>_.kind!=="card_refreshed"?true:!a(_.cardId)));if(S.length!==0){if(S.length===1){await b(S[0]);return}await b($e({kind:"notification-batch",notifications:S}));}}function u(R){let b=R.params?.id;if(b){if(a(b))throw new Error(`card "${b}" not found`);let S=e.readCard(b);if(!S)throw new Error(`card "${b}" not found`);return [S]}return e.readAllCards().filter(S=>!a(S.id))}function f(R){let b=R.filter(S=>!a(S.id));return $e({kind:"notification-batch",notifications:De(b.map(S=>({kind:"card_refreshed",cardId:S.id,card:S})))})}function k(R){if(Array.isArray(R))return R;if(R&&typeof R=="object"){let b=R;return Array.isArray(b.files)?b.files:[R]}return null}return {get(R){try{return r({cards:u(R)})}catch(b){return o(b)}},buildNotificationBatch(R){try{return r(f(u(R)))}catch(b){return o(b)}},set(R){try{let b=R.body;if(b==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(b)?b:[b];for(let _ of S){if(typeof _.id!="string")return n("each card must have a string `id` field");e.writeCard(_.id,_);}return c(S.map(_=>({kind:"card_refreshed",cardId:_.id,card:_}))),r({count:S.length})}catch(b){return o(b)}},del(R){try{let b=R.body?.ids??[],S=R.params?.id,_=S?[...b,S]:b;if(_.length===0)return n("del requires body.ids (string[]) or params.id");for(let T of _)e.removeCard(T);return c(_.map(T=>({kind:"card_removed",cardId:T}))),r({count:_.length})}catch(b){return o(b)}},patch(R){try{let b=R.params?.id,S=R.params?.path;if(!b)return n("patch requires params.id");if(!S)return n("patch requires params.path");let _=R.body,T=_&&Object.prototype.hasOwnProperty.call(_,"value")?_.value:R.body;e.patchCard(b,S,T);let I=e.readCard(b);return I?(c([{kind:"card_refreshed",cardId:b,card:I}]),r({count:1})):n(`card "${b}" not found`)}catch(b){return o(b)}},appendFiles(R){try{let b=R.params?.id;if(!b)return n("appendFiles requires params.id");let S=e.readCard(b);if(!S)return n(`card "${b}" not found`);let _=k(R.body);if(!_||_.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let T=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},I=Array.isArray(T.files)?T.files:[],A=[...I,..._],g=_.map((i,d)=>({idx:I.length+d,entry:i})),l=this.patch({params:{id:b,path:"card_data.files"},body:{value:A}});return l.status!=="success"?l:r({files_added:g})}catch(b){return o(b)}}}}function ye(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function fe(e){return {status:"fail",error:e}}function Ce(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function sa(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,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function mr(e){try{let t=JSON.parse(Ln(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Nn(e){return sa(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 Qe(){return new Date().toISOString()}function ia(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 a of o)try{n(a);}catch(c){try{e(a,c instanceof Error?c.message:String(c));}catch{}}t.delete(r);}}}}function Mn(e,t,r={}){Gt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),a=Ie(e),c=r.boardRuntimeStoreRef,u=r.scratchStoreRef,f=r.taskExecutorRef,k=r.chatHandlerFlow,R=r.emitNotification??(j=>{if(!t.publishBoardChangeNotifications)return;let v=j.kind==="notification-batch"?j.notifications:[j];return t.publishBoardChangeNotifications(v)});function b(){if(!c)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return c}function S(j){if(j.length!==0)try{let v=De(j),W=$e({kind:"notification-batch",notifications:v}),F=R(W);F&&typeof F.catch=="function"&&F.catch(V=>o(`[board-live-cards-public] emitNotification failed: ${V instanceof Error?V.message:String(V)}`));}catch(v){o(`[board-live-cards-public] emitNotification failed: ${v instanceof Error?v.message:String(v)}`);}}function _(){let j=I().readCardStoreRef();if(!j)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let v=t.kvStorageForRef(j);return {readIndex(){return v.read("_index")},writeIndex(W){v.write("_index",W);},readCard(W){return v.read(W)},writeCard(W,F){return v.write(W,F),t.hashFn(F)},removeCard(W){v.delete(W);},cardExists(W){return v.read(W)!==null},defaultCardKey(W){return W}}}let T={readValues(j){let v=t.kvStorageForRef(b()),W=v.listKeys().sort();if(W.length===0)return {version:null,values:{}};let F={};for(let V of W)F[V]=v.read(V);return {version:t.hashFn(F),values:F}},writeValues(j,v,W){let F=t.kvStorageForRef(b());for(let V of W)F.delete(V);for(let[V,oe]of Object.entries(v))F.write(V,oe);return t.hashFn(v)}},I=()=>ur(t.kvStorageForRef(b())),A=()=>On(T),g=()=>_n(t.journalAdapterForRef(b())),l=()=>Mt(_(),o),i=()=>{let j=I().readOutputsStoreRef();if(!j)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Fn(t.kvStorageForRef(j))};function d(){return f??I().readTaskExecutorRef()}function m(){return !!A().readSnapshot(e.value).values[lt]}function p(){let j=A().readSnapshot(e.value);if(!j.values[lt])throw new Error(`Board not initialized at ${e.value}`);return lr(j.values)}function h(j,v){let W=A().commitSnapshot(e.value,{schemaVersion:ir,expectedVersion:v,commitId:t.genId(),committedAt:Qe(),deleteKeys:[],shallowMerge:dr(j)});if(!W.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${v??"null"} current=${W.currentVersion??"null"}`)}function w(j){g().appendEvent(j);}async function O(){let v=ia((Y,s)=>{let C=Y.payload,L=(C?.enrichedCard??{}).id??C?.cardId??"unknown";w({type:"task-failed",taskName:L,error:s,timestamp:Qe()});}),W=p(),F=bt(W.graph),{events:V,newCursor:oe}=g().readEntriesAfterCursor(W.lastDrainedJournalId),de=K(),ie=sr(de,Y=>t.resolveBlob(Y)),Re={...W.runtimeByCardId},Be=new Map,je={readRuntime(Y){return Be.get(Y)??Re[Y]??{_sources:{}}},writeRuntime(Y,s){Be.set(Y,s),Re[Y]=s;}},Le=[],Me=new Map,Ye={readSourceData(Y,s){let C=`${Y}/${s}`;return Me.has(C)?Me.get(C):ie.readSourceData(Y,s)},ingestSourceDataStaged(Y,s,C,E){ie.ingestSourceDataStaged(Y,s,C,E);},commitSourceData(Y,s,C){let E=`${Y}/.staged/${C}/${s}`,L=de.read(E);if(L==null){let X=de.keyRef?.(E);X&&(L=t.resolveBlob(X));}if(L==null)return false;let H=`${Y}/${s}`,ne=L.trim();try{Me.set(H,JSON.parse(ne));}catch{Me.set(H,ne);}return Le.push({cardId:Y,outputFile:s,deliveryToken:C}),true},hasSource(Y,s){let C=`${Y}/${s}`;return Me.has(C)?true:ie.hasSource(Y,s)},listSources(Y){let s=ie.listSources(Y),C=new Set;for(let L of Me.keys())L.startsWith(`${Y}/`)&&C.add(L.slice(`${Y}/`.length));let E=new Set([...s,...C]);return Array.from(E)}},Ge=()=>F.config.tasks,Xe={cardStore:l(),cardRuntimeStore:je,fetchedSourcesStore:Ye,outputStore:i(),executionRequestStore:v,activeTaskConfigs:()=>Ge()},ft=[],_t=[],Et=[],mt=new Map,Bt=new Set,Vt=(Y,s)=>{ft.push({type:"task-completed",taskName:Y,data:s,timestamp:Qe()});},Kt=(Y,s)=>{w({type:"task-failed",taskName:Y,error:s,timestamp:Qe()});},vt=zt(F,{handlers:{"card-handler":qn(e,oe,Xe,Vt,Kt,(Y,s)=>{_t.push({cardId:Y,values:s});},Y=>{Et.push(Y);})},onNodeRemoved:Y=>{mt.delete(Y),Be.delete(Y),delete Re[Y],Bt.add(Y);}});for(Ge=()=>vt.getState().config.tasks,ft=V;ft.length>0;){let Y=ft;ft=[];for(let s of Y)if(s.type==="task-restart"){let C=Xe.cardStore.readCard(s.taskName);C&&mt.set(s.taskName,C);}vt.pushAll(Y),await vt.waitForHandlers();}let wr=vt.getState();await vt.dispose({wait:true});let vr=A().readSnapshot(e.value).version;h({lastDrainedJournalId:oe,graph:Ct(wr),runtimeByCardId:Re},vr);for(let{cardId:Y,values:s}of _t)Xe.outputStore.writeComputedValues(Y,s);for(let Y of Et)Xe.outputStore.writeDataObjects(Y);for(let{cardId:Y,outputFile:s,deliveryToken:C}of Le)ie.commitSourceData(Y,s,C);let Ot;try{Ot=St(wt(a,wr)),Xe.outputStore.writeStatusSnapshot(Ot);}catch(Y){o(`[board-live-cards-public] status publish failed: ${Y instanceof Error?Y.message:String(Y)}`);}let ht=[];for(let{cardId:Y,values:s}of _t)ht.push({kind:"computed_values",cardId:Y,values:s});for(let Y of Et)for(let[s,C]of Object.entries(Y))s&&ht.push({kind:"data_object",key:s,payload:C});for(let[Y,s]of mt)Y!==ve&&ht.push({kind:"card_refreshed",cardId:Y,card:s});for(let Y of Bt)ht.push({kind:"card_removed",cardId:Y});Ot!==void 0&&ht.push({kind:"status",status:Ot}),S(ht);let At=d()??{howToRun:"built-in",whatToRun:Ie({kind:"built-in",value:"source-cli-task-executor"})},Ht=t.supportsDirectSourceOutput?.(At)===true;v.dispatchEntriesForJournalId(oe,Y=>{if(Y.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${Y.taskKind}" \u2014 skipping`);return}let s=Y.payload,C=s.enrichedCard?.id??"unknown",E=s.enrichedCard?.source_defs??[];if(At.howToRun==="queue-storage"&&Ht){try{let L=t.queueStorageForRef(N(),"task-executor"),H=typeof At.extra?.boardId=="string"?At.extra.boardId:void 0,ne=[];for(let X of E){if(!X.outputFile){o(`[dispatch] source "${X.bindTo}" has no outputFile \u2014 skipping`);continue}let le=t.genId(),Ue=`${C}/.staged/${le}/${X.outputFile}`,xe=de.keyRef?.(Ue);if(!xe)continue;let He={ref:Ie(xe),deliveryToken:le,outputFile:X.outputFile,cardId:C},Ar=Nn({cbk:s.callbackToken,rg:e.value,br:Ie(e),cid:C,b:X.bindTo,d:X.outputFile,cs:void 0,rqt:s.rqt,dt:He.deliveryToken});ne.push({...H?{boardId:H}:{},ref:At,args:{source_def:X,base_ref:Ie(e),callback:n.createCallback(Ar),output:He}});}ne.length>0&&L.enqueueMany(ne);}catch(L){Kt(C,L instanceof Error?L.message:String(L));}return}for(let L of E){if(!L.outputFile){o(`[dispatch] source "${L.bindTo}" has no outputFile \u2014 skipping`);continue}let H;if(Ht){let X=t.genId(),le=`${C}/.staged/${X}/${L.outputFile}`,Ue=de.keyRef?.(le);Ue&&(H={ref:Ie(Ue),deliveryToken:X,outputFile:L.outputFile,cardId:C});}let ne=Nn({cbk:s.callbackToken,rg:e.value,br:Ie(e),cid:C,b:L.bindTo,d:L.outputFile,cs:void 0,rqt:s.rqt,...H?{dt:H.deliveryToken}:{}});t.dispatchExecution(At,{source_def:L,base_ref:Ie(e),callback:n.createCallback(ne),...H?{output:H}:{}}).catch(X=>Kt(C,X instanceof Error?X.message:String(X)));}});}function N(){let j=I().readQueueStoreRef();if(!j)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);return j}function U(){t.queueStorageForRef(N(),"process-accumulated").enqueue({boardRef:Ie(e)}),t.requestProcessAccumulated?.();}function J(){let j=t.queueStorageForRef(N(),"process-accumulated");for(;;){let v=j.lease({max:64,visibilityMs:1e3});if(v.length<=0)return;for(let W of v)j.ack(W.id,W.leaseToken);if(v.length<64)return}}async function ae(){try{let j=()=>{let W=p(),{events:F}=g().readEntriesAfterCursor(W.lastDrainedJournalId);F.length<=0||U();},v=await nn(t.lock,O,j);return ye({ran:v!==!1})}catch(j){return Ce(j)}}function Q(){U();}function te(j){try{let v=j.params?.cardStoreRef;if(!v)return fe("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(c=j.params?.boardRuntimeStoreRef,!c)return fe("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!m()){let Be=Tt(Dt);h({lastDrainedJournalId:"",graph:Ct(Be),runtimeByCardId:{}},null);}let W=j.params?.outputsStoreRef;if(!W)return fe("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let F=j.params?.queueStoreRef;if(!F)return fe("init requires params.queueStoreRef \u2014 pass the queue store ref here");let V=j.params?.fetchedSourcesStoreRef;if(!V)return fe("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");u=j.params?.scratchStoreRef;let oe=j.params?.chatStoreRef;if(!oe)return fe("init requires params.chatStoreRef \u2014 pass the chat store ref here");let de=j.params?.artifactsStoreRef;if(!de)return fe("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let ie=I();ie.writeBoardRuntimeStoreRef(c),ie.writeCardStoreRef(v),ie.writeOutputsStoreRef(W),ie.writeQueueStoreRef(F),ie.writeFetchedSourcesStoreRef(V),ie.writeChatStoreRef(oe),ie.writeArtifactsStoreRef(de),l().writeCard(xt().id,xt());let Re=y({params:{cardId:xt().id,restart:!0}});if(Re.status!=="success")return Re;try{i().writeStatusSnapshot(St(wt(a,bt(p().graph))));}catch{}return ye()}catch(v){return Ce(v)}}function ue(j){try{let v=i().readStatusSnapshot();if(!v){v=St(wt(a,bt(p().graph)));try{i().writeStatusSnapshot(v);}catch{}}return ye(v)}catch(v){return Ce(v)}}function G(j){try{let v=j.params?.id;if(!v)return fe("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(v);}catch{}return w({type:"task-removal",taskName:v,timestamp:Qe()}),v!==ve&&w({type:"task-restart",taskName:ve,timestamp:Qe()}),Q(),ye()}catch(v){return Ce(v)}}function Z(j){try{let v=j.params?.cardId;if(!v)return fe("addCardFiles requires params.cardId");let W=fr(l(),{emitNotification:R}).appendFiles({params:{id:v},body:j.body});return W.status!=="success"?W:ye({cardId:v,files_added:W.data.files_added,notified:!0})}catch(v){return Ce(v)}}function re(j){try{let v=j.params?.id;return v?(w({type:"task-restart",taskName:v,timestamp:Qe()}),Q(),ye()):fe("retrigger requires params.id")}catch(v){return Ce(v)}}async function B(j){return J(),ae()}function x(){let j=I().readFetchedSourcesStoreRef();if(!j)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return j}function K(){return t.blobStorageForRef(x())}function y(j){try{let v=j.params?.cardId,W=j.params?.all,F=!!j.params?.restart;if(!v&&!W)return fe("upsertCard requires --card-id <id> or --all");let V=W?l().readAllCards().map(de=>de.id):[v];for(let de of V)if(!l().readCard(de))return fe(`Card "${de}" not found in board at ${e.value}`);let oe=!1;for(let de of V){let ie=l().readCard(de),Re=$t(ie),Be=t.hashFn(Re),je=t.kvStorage("card-upsert"),Le=je.read(de),Me=Le?.taskConfigHash!==Be;if(!(!Me&&!F)){if(Me){let Ye=Le?.blobRef??l().readCardKey(de)??de;w({type:"task-upsert",taskName:de,taskConfig:Re,timestamp:Qe()}),je.write(de,{blobRef:Ye,taskConfigHash:Be,updatedAt:Qe()}),oe=oe||de!==ve;}F&&w({type:"task-restart",taskName:de,timestamp:Qe()});}}return oe&&w({type:"task-restart",taskName:ve,timestamp:Qe()}),Q(),ye()}catch(v){return Ce(v)}}function P(j){try{let v=j.params?.token;if(!v)return fe("taskFailed requires params.token");let W=j.params?.error??"unknown error",F=mr(v);return F?(w({type:"task-failed",taskName:F.taskName,error:W,timestamp:Qe()}),Q(),ye()):fe("Invalid callback token")}catch(v){return Ce(v)}}function q(j){try{let v=j.params?.token;if(!v)return fe("taskProgress requires params.token");let F=(j.body??{}).update??{},V=mr(v);return V?(w({type:"task-progress",taskName:V.taskName,update:F,timestamp:Qe()}),Q(),ye()):fe("Invalid callback token")}catch(v){return Ce(v)}}function D(j){try{let v=j.params?.token,W=j.params?.ref;if(!v)return fe("sourceDataFetched requires params.token");if(!W)return fe("sourceDataFetched requires params.ref");let F=jn(v);if(!F)return fe("Invalid source token");let{cbk:V,cid:oe,b:de,d:ie,cs:Re,rqt:Be,dt:je}=F,Le=sr(K(),Xe=>t.resolveBlob(Xe)),Me=je||t.genId();je||Le.ingestSourceDataStaged(oe,ie,it(W),Me);let Ye=mr(V);if(!Ye)return fe("Invalid callback token embedded in source token");let Ge=Qe();return w({type:"task-progress",taskName:Ye.taskName,update:{bindTo:de,outputFile:ie,fetchedAt:Ge,deliveryToken:Me,sourceChecksum:Re,rqt:Be},timestamp:Ge}),Q(),ye()}catch(v){return Ce(v)}}function M(j){try{let v=j.params?.token,W=j.params?.reason??"unknown";if(!v)return fe("sourceDataFetchFailure requires params.token");let F=jn(v);if(!F)return fe("Invalid source token");let{cbk:V,b:oe,d:de,cs:ie,rqt:Re}=F,Be=mr(V);return Be?(w({type:"task-progress",taskName:Be.taskName,update:{bindTo:oe,outputFile:de,failure:!0,reason:W,sourceChecksum:ie,rqt:Re},timestamp:Qe()}),Q(),ye()):fe("Invalid callback token embedded in source token")}catch(v){return Ce(v)}}function $(j){try{let v=I().readCardStoreRef();return v?ye({storeRef:v}):fe(`Board at ${e.value} has no card store configured`)}catch(v){return Ce(v)}}function se(j){try{return ye({storeRef:c??null})}catch(v){return Ce(v)}}function ce(j){try{let v=I().readOutputsStoreRef();return v?ye({storeRef:v}):fe(`Board at ${e.value} has no outputs store configured`)}catch(v){return Ce(v)}}function be(j){try{return ye({storeRef:u??null})}catch(v){return Ce(v)}}function Te(j){try{let v=I().readChatStoreRef();return ye({storeRef:v})}catch(v){return Ce(v)}}function _e(j){try{let v=I().readArtifactsStoreRef();return ye({storeRef:v})}catch(v){return Ce(v)}}function pe(j){try{let v=I().readFetchedSourcesStoreRef();return ye({storeRef:v})}catch(v){return Ce(v)}}function ke(j){try{let v=j.params?.key;if(!v)return fe("getConfig requires params.key");let W=I(),F;switch(v){case "task-executor":F=f??null;break;case "chat-handler-flow":F=k??null;break;case "board-runtime-store-ref":F=W.readBoardRuntimeStoreRef();break;case "card-store-ref":F=W.readCardStoreRef();break;case "outputs-store-ref":F=W.readOutputsStoreRef();break;case "scratch-store-ref":F=u??null;break;case "chat-store-ref":F=W.readChatStoreRef();break;case "artifacts-store-ref":F=W.readArtifactsStoreRef();break;case "fetched-sources-store-ref":F=W.readFetchedSourcesStoreRef();break;default:return fe(`getConfig: unknown key "${v}"`)}return ye({value:F})}catch(v){return Ce(v)}}function Ve(j){try{let v=j.params?.key;if(!v)return fe("getOutputsDataObject requires params.key");if(v===ot)return ye(null);let W=i().readDataObject(v);return ye(W)}catch(v){return Ce(v)}}function Se(j){try{return ye(cr(i().readAllDataObjects()))}catch(v){return Ce(v)}}function Ke(j){try{let v=j.params?.key;if(!v)return fe("getOutputsComputedValues requires params.key");let W=i().readComputedValues(v);return ye(W)}catch(v){return Ce(v)}}function qe(j){try{return ye(i().readAllComputedValues())}catch(v){return Ce(v)}}function he(){return sr(K(),j=>t.resolveBlob(j))}function et(j){let v=K().keyRef?.(j);if(!v)throw new Error("configured fetched-sources store does not support keyRef");return Ie(v)}function Je(j){try{let v=j.params?.key;if(!v)return fe("getOutputsFetchedSources requires params.key");let W=he().listSources(v),F={};for(let V of W)F[V]=et(`${v}/${V}`);return ye(F)}catch(v){return Ce(v)}}function tt(j){try{let v=he(),W=new Set;for(let V of K().listKeys()){let oe=V.indexOf("/");oe>0&&!V.includes("/.staged/")&&W.add(V.slice(0,oe));}let F={};for(let V of W){let oe=v.listSources(V);if(oe.length>0){F[V]={};for(let de of oe)F[V][de]=et(`${V}/${de}`);}}return ye(F)}catch(v){return Ce(v)}}function yt(j){try{let v=l().readAllCards().filter(ie=>ie.id!==ve),W=ue({});if(W.status!=="success")return W;let F=Se({});if(F.status!=="success")return F;let V=qe({});if(V.status!=="success")return V;let oe=V.data,de={};for(let ie of v){let Re=typeof ie?.id=="string"?ie.id:null;if(!Re)continue;let Be=ie.card_data&&typeof ie.card_data=="object"&&!Array.isArray(ie.card_data)?ie.card_data:{};de[Re]={schema_version:"v1",card_id:Re,card_data:{...Be},computed_values:oe[Re]&&typeof oe[Re]=="object"?oe[Re]:{}};}return ye({cardDefinitions:v,statusSnapshot:W.data,dataObjectsByToken:F.data,cardRuntimeById:de})}catch(v){return Ce(v)}}return {init:te,status:ue,getBoardRuntimeStoreRef:se,getCardStoreRef:$,getOutputsStoreRef:ce,getScratchStoreRef:be,getChatStoreRef:Te,getArtifactsStoreRef:_e,getFetchedSourcesStoreRef:pe,getConfig:ke,getOutputsDataObject:Ve,getAllOutputsDataObjects:Se,getOutputsComputedValues:Ke,getAllOutputsComputedValues:qe,getOutputsFetchedSources:Je,getAllOutputsFetchedSources:tt,buildSseOneShotPayload:yt,removeCard:G,addCardFiles:Z,retrigger:re,processAccumulatedEvents:B,upsertCard:y,taskFailed:P,taskProgress:q,sourceDataFetched:D,sourceDataFetchFailure:M}}function Dn(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 ur(t.kvStorageForRef(r.boardRuntimeStoreRef))}return ur(t.kvStorage("config"))};function a(){let l=o().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 i=t.kvStorageForRef(l);return {readIndex(){return i.read("_index")},writeIndex(d){i.write("_index",d);},readCard(d){return i.read(d)},writeCard(d,m){return i.write(d,m),t.hashFn(m)},removeCard(d){i.delete(d);},cardExists(d){return i.read(d)!==null},defaultCardKey(d){return d}}}let c=()=>Mt(a(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function f(l,i){let d=t.validateSchema(i),m=[],p=u();if(p&&Array.isArray(i.source_defs))for(let w of i.source_defs){let O=typeof w.bindTo=="string"?w.bindTo:"(unknown)";try{let N;try{N=await t.invokeExecutor(p,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(w)});}catch(J){let ae=J;if(N=typeof ae?.stdout=="string"?ae.stdout:"",!N.trim()){m.push(`source "${O}": executor validate-source-def failed \u2014 ${J instanceof Error?J.message:String(J)}`);continue}}let U=JSON.parse(N.trim());if(!U.ok&&Array.isArray(U.errors))for(let J of U.errors)m.push(`source "${O}": ${J}`);}catch(N){m.push(`source "${O}": executor validate-source-def failed \u2014 ${N instanceof Error?N.message:String(N)}`);}}let h=[...d.errors,...m];return ye({cardId:l,isValid:h.length===0,issues:h})}function k(l,i){let d=l.params?.sourceIdx,m=l.params?.outRef;if(d===void 0)return fe(`${i} requires params.sourceIdx`);if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return fe(`${i} requires card JSON object in body`);let p=l.body,h=p["card-content"]??p,w=p["mock-projections"]??{},O=h.source_defs??[];if(d<0||d>=O.length)return fe(`sourceIdx ${d} out of range (card has ${O.length} source(s))`);let N=O[d],U=typeof N.bindTo=="string"?N.bindTo:"source";return {src:N,bindTo:U,outRef:m,mockProjections:w}}async function R(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return fe("validateCardPreflight requires card JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)";return await f(m,d)}catch(i){return Ce(i)}}async function b(l){try{let i=k(l,"probeSourcePreflight");if("status"in i)return i;let d=u();if(!d)return fe("No task-executor registered for this board");try{let m={...i.src,_projections:i.mockProjections},p=await t.invokeExecutor(d,"probe-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(m)}),h=JSON.parse(p.trim());return h.ok?ye({bindTo:i.bindTo,reachable:h.reachable,latencyMs:h.latencyMs,note:h.note}):fe(h.error??"Preflight probe failed")}catch{return fe("Executor does not support probe-source-preflight")}}catch(i){return Ce(i)}}async function S(l){try{let i=k(l,"runSourcePreflight");if("status"in i)return i;let d=u();if(!d)return fe("No task-executor registered for this board");try{let m={...i.src,_projections:i.mockProjections},p=await t.invokeExecutor(d,"run-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(m)}),h=JSON.parse(p.trim());if(!h.ok)return ye({bindTo:i.bindTo,ok:!1,result:null,issues:[h.error??"Preflight run failed"]});if(i.outRef){let w=it(i.outRef);t.absoluteBlob.write(w.value,JSON.stringify(h.resultValue,null,2));}return ye({bindTo:typeof h.bindTo=="string"?h.bindTo:i.bindTo,ok:!0,result:h.resultValue??null,issues:[]})}catch(m){let p=m instanceof Error?m.message:String(m);return ye({bindTo:i.bindTo,ok:!1,result:null,issues:[p]})}}catch(i){return Ce(i)}}async function _(l){try{let i=u();if(!i)return fe("No task-executor registered for this board");let d=await t.invokeExecutor(i,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return ye(JSON.parse(d.trim()))}catch(i){return Ce(i)}}function T(l){try{let i=l.body;if(!i||!Array.isArray(i.ops))return fe("updatesInCardStore requires body.ops array");let d=i.ops,m=c();for(let p of d){let h=p.op,w=p.id;if(!w)return fe('op is missing "id"');if(h==="update"){let O=p["card-content"];if(!O)return fe(`update op for "${w}" is missing "card-content"`);m.writeCard(w,O);}else return fe(`Unknown op type: "${h??"(none)"}"`)}return ye()}catch(i){return Ce(i)}}function I(l){try{let i=l.body;if(!i||!Array.isArray(i.ids))return fe("readFromCardStore requires body.ids array");let d=i.ids,m=c(),p=d.map(h=>({id:h,"card-content":m.readCard(h)}));return ye({cards:p})}catch(i){return Ce(i)}}function A(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return fe("evalCardCompute requires a JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)",p=i["mock-fetched-sources"]??{},h=i["mock-requires"]??{},w=d.compute;if(!w||!Array.isArray(w)||w.length===0)return ye({cardId:m,ok:!0,computed_values:{},errors:[]});let O={id:m,card_data:d.card_data??{},requires:h,source_defs:d.source_defs,compute:w},N=We.runSync(O,{sourcesData:p}),U=N.node.computed_values??{},J=N.errors??[];return ye({cardId:m,ok:J.length===0,computed_values:U,errors:J})}catch(i){return Ce(i)}}async function g(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return fe("simulateCardCycle requires a JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)",p=i["mock-fetched-sources"]??{},h=i["mock-requires"]??{},w=await f(m,d),O=w.status==="success"?{isValid:w.data.isValid,issues:w.data.issues}:{isValid:!1,issues:[w.status==="fail"?w.error:"internal error"]},N=d.source_defs??[],U=d.card_data??{},J=[],ae=[];if(N.length>0){J=We.enrichSourcesSync(N,{card_data:U,requires:h});for(let K of J){let y=K.projections,P=K._projections;if(y&&P){for(let q of Object.keys(y))if(P[q]===void 0){let D=typeof K.bindTo=="string"?K.bindTo:"(unknown)";ae.push({bindTo:D,key:q,error:`Projection "${q}" resolved to undefined`});}}}}let Q=[],te={...p},ue=i["task-executor-ref"],G=(ue?.howToRun&&ue?.whatToRun?ue:void 0)??u();for(let K=0;K<J.length;K++){let y=J[K],P=typeof y.bindTo=="string"?y.bindTo:`source_${K}`;if(!G){Q.push({bindTo:P,skipped:!0,error:"No task executor configured"});continue}try{let q={...y},D=await t.invokeExecutor(G,"run-source-preflight",{timeout:y.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(q)}),M=JSON.parse(D.trim());M.ok&&!Object.prototype.hasOwnProperty.call(p,P)&&Object.prototype.hasOwnProperty.call(M,"resultValue")&&(te[P]=M.resultValue),Q.push({bindTo:P,reachable:M.reachable,latencyMs:M.latencyMs,error:M.ok?void 0:M.error});}catch{Q.push({bindTo:P,skipped:!0,error:"Executor does not support run-source-preflight"});}}let Z=d.compute,re={},B=[];if(Z&&Array.isArray(Z)&&Z.length>0){let K={id:m,card_data:U,requires:h,source_defs:d.source_defs,compute:Z},y=We.runSync(K,{sourcesData:te});re=y.node.computed_values??{},B=y.errors??[];}let x=O.isValid&&ae.length===0&&B.length===0&&Q.every(K=>K.reachable!==!1);return ye({cardId:m,ok:x,validation:O,source_probes:Q,projection_errors:ae,fetched_sources:te,computed_values:re,compute_errors:B})}catch(i){return Ce(i)}}return {validateCardPreflight:R,probeSourcePreflight:b,runSourcePreflight:S,evalCardCompute:A,simulateCardCycle:g,describeTaskExecutorCapabilities:_,updatesInCardStore:T,readFromCardStore:I}}function pr(e,t={}){function r(k){return {status:"success",data:k}}function n(k){return {status:"fail",error:k}}function o(k){return {status:"error",error:k instanceof Error?k.message:String(k)}}async function a(k){let R=t.emitNotification;if(!R||k.length===0)return;let b=De(k);if(b.length===1){await R(b[0]);return}await R($e({kind:"notification-batch",notifications:b}));}async function c(k){let R=k.params?.id;if(R){let b=await e.readCard(R);if(!b)throw new Error(`card "${R}" not found`);return [b]}return await e.readAllCards()}function u(k){return $e({kind:"notification-batch",notifications:De(k.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function f(k){if(Array.isArray(k))return k;if(k&&typeof k=="object"){let R=k;return Array.isArray(R.files)?R.files:[k]}return null}return {async get(k){try{return r({cards:await c(k)})}catch(R){return o(R)}},async buildNotificationBatch(k){try{return r(u(await c(k)))}catch(R){return o(R)}},async set(k){try{let R=k.body;if(R==null)return n("set requires a body (card object or array of cards)");let b=Array.isArray(R)?R:[R];for(let S of b){if(typeof S.id!="string")return n("each card must have a string `id` field");await e.writeCard(S.id,S);}return await a(b.map(S=>({kind:"card_refreshed",cardId:S.id,card:S}))),r({count:b.length})}catch(R){return o(R)}},async del(k){try{let R=k.body?.ids??[],b=k.params?.id,S=b?[...R,b]:R;if(S.length===0)return n("del requires body.ids (string[]) or params.id");for(let _ of S)await e.removeCard(_);return await a(S.map(_=>({kind:"card_removed",cardId:_}))),r({count:S.length})}catch(R){return o(R)}},async patch(k){try{let R=k.params?.id,b=k.params?.path;if(!R)return n("patch requires params.id");if(!b)return n("patch requires params.path");let S=k.body,_=S&&Object.prototype.hasOwnProperty.call(S,"value")?S.value:k.body;await e.patchCard(R,b,_);let T=await e.readCard(R);return T?(await a([{kind:"card_refreshed",cardId:R,card:T}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},async appendFiles(k){try{let R=k.params?.id;if(!R)return n("appendFiles requires params.id");let b=await e.readCard(R);if(!b)return n(`card "${R}" not found`);let S=f(k.body);if(!S||S.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let _=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},T=Array.isArray(_.files)?_.files:[],I=[...T,...S],A=S.map((l,i)=>({idx:T.length+i,entry:l})),g=await this.patch({params:{id:R,path:"card_data.files"},body:{value:I}});return g.status!=="success"?g:r({files_added:A})}catch(R){return o(R)}}}}async function $n(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Ur(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Vr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Ur(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(Ur)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Ur(t),reason:t.reason}))}}}function Un(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 er(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Zt(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 ua(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function gr(e,t){return ua(e)?e.then(t):t(e)}function Vn(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]=Vn(r[n],o):r[n]=o;return r}function yr(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let a=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:yr(a,o,r)}}function Kn(e){return {read:r=>e.read(r),get(r,n){return gr(e.read(r),o=>{if(o===null)return null;let a=o;for(let c of n.split(".").filter(Boolean)){if(a===null||typeof a!="object"||Array.isArray(a))return null;a=a[c]??null;}return a??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return gr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return gr(e.read(r),o=>e.write(r,Vn(o??{},n)))},patch(r,n,o){return gr(e.read(r),a=>{let c=n.split(".").filter(Boolean);return e.write(r,yr(a??{},c,o))})}}}function hr(e){return Kn(e)}function Rr(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 kr(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,a]of Object.entries(await r())){if(!await e.cardExists(a.key))continue;let c=await e.readCard(a.key);c?n.push(c):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,a]of Object.entries(await r()))n[o]=a.checksum;return n},async changedSince(n){let o=await r(),a=[];for(let[c,u]of Object.entries(o))n[c]!==u.checksum&&a.push(c);for(let c of Object.keys(n))o[c]||a.push(c);return a},async validateUpsert(n,o){let a=await r(),c=a[n],u=Object.entries(a).find(([,f])=>f.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,a){let c=await r(),u=a??c[n]?.key??e.defaultCardKey(n),f=await e.writeCard(u,o);c[n]={key:u,checksum:f,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async patchCard(n,o,a){let c=await r(),u=c[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let f=await e.readCard(u.key);if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`card "${n}" is not patchable`);let k=String(o||"").split(".").filter(Boolean),R=yr(f,k,a),b=await e.writeCard(u.key,R);c[n]={key:u.key,checksum:b,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async removeCard(n){let o=await r(),a=o[n];a&&(await e.removeCard(a.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function Pe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function Ae(e){return {status:"fail",error:e}}function Ee(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Ne(){return new Date().toISOString()}function ca(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 Qn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function Cr(e){try{let t=JSON.parse(Qn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Hn(e){return ca(JSON.stringify(e))}function Jn(e){try{let t=JSON.parse(Qn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function da(e){return Lr(e,Bn,()=>({_sources:{}}))}function la(e,t){return or(e,t)}function fa(e){return ar(e)}function ma(e,t){return jr(e,t)}function pa(e,t,r,n,o,a){return async c=>{let u=[],f=await r.cardStore.readCard(c.nodeId);if(!f)return "task-initiate-failure";let k=f.id;if(k===ve){let Q=r.activeTaskConfigs?.(),te={[ot]:Q?Dr((await Promise.all(Object.keys(Q).filter(ue=>ue!==ve).map(ue=>r.cardStore.readCard(ue)))).filter(ue=>!!ue),Q):await Mr(await r.cardStore.readAllCards())};return (a??(()=>{}))(te),n(c.nodeId,te),"task-initiated"}let R=f.card_data??{},b=f.source_defs??[],S=b,_=await r.cardRuntimeStore.readRuntime(k),T=false,I=async()=>{T&&(await r.cardRuntimeStore.writeRuntime(k,_),T=false);},A=Q=>Nt(_._sources[Q]),g=(Q,te)=>{_._sources[Q]=Nt(te),T=true;},l=c.taskState?.executionCount??0;if(_._lastExecutionCount!==l&&(_._sources={},_._lastExecutionCount=l,T=true),c.update){let Q=c.update.outputFile;if(Q){let te=A(Q);if(c.update.failure){let ue=c.update.rqt??te.lastRequestedToken??te.queueRequestedToken;ue&&g(Q,Lt(te,ue));}else {let ue=c.update.rqt;if(!te.lastCompletedToken||ue>te.lastCompletedToken){let G=typeof c.update.deliveryToken=="string"?c.update.deliveryToken:void 0,Z=G?await r.fetchedSourcesStore.commitSourceData(k,Q,G):false;g(Q,Z?$r(te,ue):Lt(te,ue));}}await I();}}let i={};for(let Q of b){if(!Q.outputFile)continue;let te=await r.fetchedSourcesStore.readSourceData(k,Q.outputFile);te!==null&&(i[Q.bindTo]=te);}let d={};for(let[Q,te]of Object.entries(c.state??{}))if(te!==null&&typeof te=="object"&&!Array.isArray(te)){let ue=te[Q];d[Q]=ue!==void 0?ue:te;}else d[Q]=te;let m={id:k,card_data:{...R},requires:d,source_defs:b,compute:f.compute};m._sourcesData=i,f.compute&&We.runSync(m,{sourcesData:i}),(o??(()=>{}))(k,m.computed_values??{});let p=We.enrichSourcesSync(Array.isArray(f.source_defs)?f.source_defs:void 0,{card_data:f.card_data,requires:d}),h={...f,source_defs:Array.isArray(p)?p.map(Q=>({...Q,boardDir:typeof Q.boardDir=="string"&&Q.boardDir?Q.boardDir:e.value})):p},w=Ne(),O=c.update?void 0:w,N=S.filter(Q=>{let te=Q.outputFile;if(typeof te!="string"||!te)return true;let ue=A(te);O&&(ue={...ue,queueRequestedToken:O},g(te,ue));let G=ue.queueRequestedToken??ue.lastRequestedToken??w;return jt(ue,G)==="dispatch"});if(await I(),N.length>0){let Q=false,te=w;for(let ue of N){let G=ue.outputFile;if(typeof G!="string"||!G)continue;let Z=A(G),re=Z.queueRequestedToken??w;g(G,{...Z,lastRequestedToken:re}),te=re,Q=true;}return Q&&await I(),Q&&(u.push({taskKind:"source-fetch",payload:{boardRef:Ie(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:te}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(S.some(Q=>{let te=Q.outputFile;if(typeof te!="string"||!te)return false;let ue=A(te),G=ue.queueRequestedToken??ue.lastRequestedToken??w;return jt(ue,G)==="in-flight"}))return "task-initiated";let J=f.provides??[],ae={};for(let{bindTo:Q,ref:te}of J)ae[Q]=We.resolve(m,te);return (a??(()=>{}))(ae),n(c.nodeId,ae),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Gn(e,t,r={}){Gt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),a=Ie(e),c=r.emitNotification??(B=>{if(!t.publishBoardChangeNotifications)return;let x=B.kind==="notification-batch"?B.notifications:[B];return t.publishBoardChangeNotifications(x)}),u=null,f=r.boardRuntimeStoreRef,k=r.scratchStoreRef,R=r.taskExecutorRef,b=r.chatHandlerFlow;function S(){if(!f)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return f}function _(B){if(B.length!==0)try{let x=De(B),K=$e({kind:"notification-batch",notifications:x});return Promise.resolve(c(K)).catch(y=>{o(`[async-board-live-cards-public] emitNotification failed: ${y instanceof Error?y.message:String(y)}`);})}catch(x){o(`[async-board-live-cards-public] emitNotification failed: ${x instanceof Error?x.message:String(x)}`);return}}let T=()=>Un(t.kvStorageForRef(S())),I=e.value,A=()=>rr(qr(()=>t.kvStorageForRef(S()),t.hashFn),"v1"),g=async()=>{let B=await T().readOutputsStoreRef();if(!B)throw new Error(`Board at ${e.value} has no outputs store configured.`);return fa(t.kvStorageForRef(B))},l=async()=>{let B=await T().readCardStoreRef();if(!B)throw new Error(`Board at ${e.value} has no card store configured.`);let x=t.kvStorageForRef(B);return kr(Rr(hr(x),t.hashFn),o)};async function i(){return !!(await A().readSnapshot(I)).values[lt]}async function d(){let B=await A().readSnapshot(I);if(!B.values[lt])throw new Error(`Board not initialized at ${e.value}`);return lr(B.values)}async function m(B,x){let K=await A().commitSnapshot(I,{schemaVersion:"v1",expectedVersion:x,deleteKeys:[],shallowMerge:dr(B)});if(!K.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${x??"null"} current=${K.currentVersion??"null"}`)}let p=()=>Tn(t.journalStorageForRef(S()));async function h(){return R??await T().readTaskExecutorRef()}async function w(){return cr(await(await g()).readAllDataObjects())}async function O(B){await p().appendEvent(B);}async function N(){let B=await T().readFetchedSourcesStoreRef();if(!B)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return B}async function U(){return t.blobStorageForRef(await N())}async function J(){return la(await U(),B=>t.resolveBlob(B))}async function ae(B){let x=(await U()).keyRef?.(B);if(!x)throw new Error("configured fetched-sources store does not support keyRef");let K=await Promise.resolve(x);return Ie(K)}async function Q(){let B=ma(t.kvStorageForRef(S()),async(F,V)=>{let oe=F.payload,ie=(oe.enrichedCard??{}).id??oe.cardId??"unknown";await O({type:"task-failed",taskName:ie,error:V,timestamp:Ne()});}),x=da(t.kvStorageForRef(S())),K=await U(),y=await J(),P=await l(),q=await g(),D=new Map,M=new Map,$=[],se=[],ce=[],be=new Map,Te=new Set,_e={async readRuntime(F){return D.get(F)??await x.readRuntime(F)},async writeRuntime(F,V){D.set(F,V),Se[F]=V;}},pe={async readSourceData(F,V){let oe=`${F}/${V}`;return M.has(oe)?M.get(oe):await y.readSourceData(F,V)},ingestSourceDataStaged(F,V,oe,de){return y.ingestSourceDataStaged(F,V,oe,de)},async commitSourceData(F,V,oe){let de=`${F}/.staged/${oe}/${V}`,ie=await K.read(de);if(ie==null){let je=await Promise.resolve(K.keyRef?.(de));je&&(ie=await t.resolveBlob(je));}if(ie==null)return false;let Re=`${F}/${V}`,Be=ie.trim();try{M.set(Re,JSON.parse(Be));}catch{M.set(Re,Be);}return $.push({cardId:F,outputFile:V,deliveryToken:oe}),true},async hasSource(F,V){let oe=`${F}/${V}`;return M.has(oe)||await y.hasSource(F,V)},async listSources(F){let V=await y.listSources(F),oe=[...M.keys()].filter(de=>de.startsWith(`${F}/`)).map(de=>de.slice(`${F}/`.length));return [...new Set([...V,...oe])]}},ke=await d(),Ve=bt(ke.graph),Se={...ke.runtimeByCardId},{events:Ke,newCursor:qe}=await p().readEntriesAfterCursor(ke.lastDrainedJournalId),he=Ke,et=()=>Ve.config.tasks,Je=zt(Ve,{handlers:{"card-handler":pa(e,qe,{cardStore:P,cardRuntimeStore:_e,fetchedSourcesStore:pe,outputStore:q,executionRequestStore:B,activeTaskConfigs:()=>et()},(F,V)=>{he.push({type:"task-completed",taskName:F,data:V,timestamp:Ne()});},(F,V)=>{se.push({cardId:F,values:V});},F=>{ce.push(F);})},onNodeRemoved:F=>{be.delete(F),D.delete(F),delete Se[F],Te.add(F);}});for(et=()=>Je.getState().config.tasks;he.length>0;){let F=he;he=[];for(let V of F)if(V.type==="task-restart"){let oe=await P.readCard(V.taskName);oe&&be.set(V.taskName,oe);}Je.pushAll(F),await Je.waitForHandlers();}let tt=Je.getState();await Je.dispose({wait:true}),await m({lastDrainedJournalId:qe,graph:Ct(tt),runtimeByCardId:Se},(await A().readSnapshot(I)).version);for(let{cardId:F,values:V}of se)await q.writeComputedValues(F,V);for(let F of ce)await q.writeDataObjects(F);for(let[F,V]of D)await x.writeRuntime(F,V);for(let F of $)await y.commitSourceData(F.cardId,F.outputFile,F.deliveryToken);let yt=St(wt(a,tt));await q.writeStatusSnapshot(yt);let j=[];for(let{cardId:F,values:V}of se)j.push({kind:"computed_values",cardId:F,values:V});for(let F of ce)for(let[V,oe]of Object.entries(F))j.push({kind:"data_object",key:V,payload:oe});for(let[F,V]of be)F!==ve&&j.push({kind:"card_refreshed",cardId:F,card:V});for(let F of Te)j.push({kind:"card_removed",cardId:F});j.push({kind:"status",status:yt}),await _(j);let v=await h();if(!v)return;let W=t.supportsDirectSourceOutput?.(v)===true;await B.dispatchEntriesForJournalId(qe,async F=>{if(F.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${F.taskKind}" \u2014 skipping`);return}let V=F.payload,oe=V.enrichedCard?.id??"unknown",de=V.enrichedCard?.source_defs??[];if(v.howToRun==="queue-storage"&&W){try{let ie=await T().readQueueStoreRef();if(!ie)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let Re=t.queueStorageForRef(ie,"task-executor"),Be=typeof v.extra?.boardId=="string"?v.extra.boardId:void 0,je=[];for(let Le of de){if(!Le.outputFile)continue;let Me=t.genId(),Ye=`${oe}/.staged/${Me}/${Le.outputFile}`,Ge=await Promise.resolve(K.keyRef?.(Ye));if(!Ge)continue;let Xe={ref:Ie(Ge),deliveryToken:Me,outputFile:Le.outputFile,cardId:oe},ft=Hn({cbk:V.callbackToken,rg:e.value,br:Ie(e),cid:oe,b:Le.bindTo,d:Le.outputFile,cs:void 0,rqt:V.rqt,dt:Xe.deliveryToken});je.push({...Be?{boardId:Be}:{},ref:v,args:{source_def:Le,base_ref:Ie(e),callback:n.createCallback(ft),output:Xe}});}je.length>0&&await Re.enqueueMany(je);}catch(ie){await O({type:"task-failed",taskName:oe,error:ie instanceof Error?ie.message:String(ie),timestamp:Ne()});}return}for(let ie of de){if(!ie.outputFile)continue;let Re;if(W){let Le=t.genId(),Me=`${oe}/.staged/${Le}/${ie.outputFile}`,Ye=await Promise.resolve(K.keyRef?.(Me));Ye&&(Re={ref:Ie(Ye),deliveryToken:Le,outputFile:ie.outputFile,cardId:oe});}let Be=Hn({cbk:V.callbackToken,rg:e.value,br:Ie(e),cid:oe,b:ie.bindTo,d:ie.outputFile,cs:void 0,rqt:V.rqt,...Re?{dt:Re.deliveryToken}:{}}),je=await t.dispatchExecution(v,{source_def:ie,base_ref:Ie(e),callback:n.createCallback(Be),...Re?{output:Re}:{}});je.dispatched||await O({type:"task-failed",taskName:oe,error:je.error??"dispatch failed",timestamp:Ne()});}});}async function te(){try{let B=async()=>{let K=await d(),{events:y}=await p().readEntriesAfterCursor(K.lastDrainedJournalId);y.length>0&&await G();},x=await $n(t.lock,Q,B);return Pe({ran:x!==!1})}catch(B){return Ee(B)}}async function ue(){return u||(u=te().finally(()=>{u=null;}),u)}async function G(){let B=await T().readQueueStoreRef();if(!B)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);await t.queueStorageForRef(B,"process-accumulated").enqueue({boardRef:Ie(e)}),await t.requestProcessAccumulated?.();}async function Z(){let B=await T().readQueueStoreRef();if(!B)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let x=t.queueStorageForRef(B,"process-accumulated");for(;;){let K=await x.lease({max:64,visibilityMs:1e3});if(K.length<=0)return;for(let y of K)await x.ack(y.id,y.leaseToken);if(K.length<64)return}}function re(){G();}return {async init(B){try{let x=B.params?.cardStoreRef;if(!x)return Ae("init requires params.cardStoreRef");if(f=B.params?.boardRuntimeStoreRef,!f)return Ae("init requires params.boardRuntimeStoreRef");let K=B.params?.outputsStoreRef;if(!K)return Ae("init requires params.outputsStoreRef");let y=B.params?.queueStoreRef;if(!y)return Ae("init requires params.queueStoreRef");let P=B.params?.fetchedSourcesStoreRef;if(!P)return Ae("init requires params.fetchedSourcesStoreRef");k=B.params?.scratchStoreRef;let q=B.params?.chatStoreRef;if(!q)return Ae("init requires params.chatStoreRef");let D=B.params?.artifactsStoreRef;if(!D)return Ae("init requires params.artifactsStoreRef");await i()||await m({lastDrainedJournalId:"",graph:Ct(Tt(Dt)),runtimeByCardId:{}},null);let M=T();await M.writeBoardRuntimeStoreRef(f),await M.writeCardStoreRef(x),await M.writeOutputsStoreRef(K),await M.writeQueueStoreRef(y),await M.writeFetchedSourcesStoreRef(P),await M.writeChatStoreRef(q),await M.writeArtifactsStoreRef(D),await(await l()).writeCard(ve,xt());let $=t.kvStorage("card-upsert"),se=xt(),ce=$t(se),be=t.hashFn(ce),_e=(await $.read(ve))?.blobRef??await(await l()).readCardKey(ve)??ve;return await O({type:"task-upsert",taskName:ve,taskConfig:ce,timestamp:Ne()}),await $.write(ve,{blobRef:_e,taskConfigHash:be,updatedAt:Ne()}),await O({type:"task-restart",taskName:ve,timestamp:Ne()}),re(),await(await g()).writeStatusSnapshot(St(wt(a,bt((await d()).graph)))),Pe()}catch(x){return Ee(x)}},async status(B){try{let x=await g(),K=await x.readStatusSnapshot();return K||(K=St(wt(a,bt((await d()).graph))),await x.writeStatusSnapshot(K)),Pe(K)}catch(x){return Ee(x)}},async getCardStoreRef(B){try{let x=await T().readCardStoreRef();return x?Pe({storeRef:x}):Ae(`Board at ${e.value} has no card store configured`)}catch(x){return Ee(x)}},async getBoardRuntimeStoreRef(B){try{return Pe({storeRef:f??null})}catch(x){return Ee(x)}},async getOutputsStoreRef(B){try{let x=await T().readOutputsStoreRef();return x?Pe({storeRef:x}):Ae(`Board at ${e.value} has no outputs store configured`)}catch(x){return Ee(x)}},async getScratchStoreRef(B){try{return Pe({storeRef:k??null})}catch(x){return Ee(x)}},async getChatStoreRef(B){try{return Pe({storeRef:await T().readChatStoreRef()})}catch(x){return Ee(x)}},async getArtifactsStoreRef(B){try{return Pe({storeRef:await T().readArtifactsStoreRef()})}catch(x){return Ee(x)}},async getFetchedSourcesStoreRef(B){try{return Pe({storeRef:await T().readFetchedSourcesStoreRef()})}catch(x){return Ee(x)}},async getConfig(B){try{let x=B.params?.key;if(!x)return Ae("getConfig requires params.key");let K=T(),y;switch(x){case "task-executor":y=R??null;break;case "chat-handler-flow":y=b??null;break;case "board-runtime-store-ref":y=await K.readBoardRuntimeStoreRef();break;case "card-store-ref":y=await K.readCardStoreRef();break;case "outputs-store-ref":y=await K.readOutputsStoreRef();break;case "scratch-store-ref":y=k??null;break;case "chat-store-ref":y=await K.readChatStoreRef();break;case "artifacts-store-ref":y=await K.readArtifactsStoreRef();break;case "fetched-sources-store-ref":y=await K.readFetchedSourcesStoreRef();break;default:return Ae(`getConfig: unknown key "${x}"`)}return Pe({value:y})}catch(x){return Ee(x)}},async getOutputsDataObject(B){try{let x=B.params?.key;if(!x)return Ae("getOutputsDataObject requires params.key");if(x===ot)return Pe(null);let K=await w();return Pe(K[x]??null)}catch(x){return Ee(x)}},async getAllOutputsDataObjects(B){try{return Pe(await w())}catch(x){return Ee(x)}},async getOutputsComputedValues(B){try{let x=B.params?.key;return x?Pe(await(await g()).readComputedValues(x)):Ae("getOutputsComputedValues requires params.key")}catch(x){return Ee(x)}},async getAllOutputsComputedValues(B){try{return Pe(await(await g()).readAllComputedValues())}catch(x){return Ee(x)}},async getOutputsFetchedSources(B){try{let x=B.params?.key;if(!x)return Ae("getOutputsFetchedSources requires params.key");let K=await(await J()).listSources(x),y={};for(let P of K)y[P]=await ae(`${x}/${P}`);return Pe(y)}catch(x){return Ee(x)}},async getAllOutputsFetchedSources(B){try{let x=await J(),K=await(await U()).listKeys(),y=new Set;for(let q of K){let D=q.indexOf("/");D>0&&!q.includes("/.staged/")&&y.add(q.slice(0,D));}let P={};for(let q of y){let D=await x.listSources(q);if(D.length!==0){P[q]={};for(let M of D)P[q][M]=await ae(`${q}/${M}`);}}return Pe(P)}catch(x){return Ee(x)}},async buildSseOneShotPayload(B){try{let x=(await(await l()).readAllCards()).filter(M=>M.id!==ve),K=await this.status({});if(K.status!=="success")return K;let y=await this.getAllOutputsDataObjects({});if(y.status!=="success")return y;let P=await this.getAllOutputsComputedValues({});if(P.status!=="success")return P;let q=P.data,D={};for(let M of x){let $=typeof M?.id=="string"?M.id:null;if(!$)continue;let se=M.card_data&&typeof M.card_data=="object"&&!Array.isArray(M.card_data)?M.card_data:{};D[$]={schema_version:"v1",card_id:$,card_data:{...se},computed_values:q[$]&&typeof q[$]=="object"?q[$]:{}};}return Pe({cardDefinitions:x,statusSnapshot:K.data,dataObjectsByToken:y.data,cardRuntimeById:D})}catch(x){return Ee(x)}},async addCardFiles(B){try{let x=B.params?.cardId;if(!x)return Ae("addCardFiles requires params.cardId");let y=await pr(await l(),{emitNotification:c}).appendFiles({params:{id:x},body:B.body});return y.status!=="success"?y:Pe({cardId:x,files_added:y.data.files_added,notified:!0})}catch(x){return Ee(x)}},async removeCard(B){try{let x=B.params?.id;if(!x)return Ae("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(x);}catch{}return await O({type:"task-removal",taskName:x,timestamp:Ne()}),x!==ve&&await O({type:"task-restart",taskName:ve,timestamp:Ne()}),re(),Pe()}catch(x){return Ee(x)}},async retrigger(B){try{let x=B.params?.id;return x?(await O({type:"task-restart",taskName:x,timestamp:Ne()}),re(),Pe()):Ae("retrigger requires params.id")}catch(x){return Ee(x)}},async processAccumulatedEvents(B){return await Z(),ue()},async upsertCard(B){try{let x=B.params?.cardId,K=B.params?.all,y=!!B.params?.restart;if(!x&&!K)return Ae("upsertCard requires --card-id <id> or --all");let P=await l(),q=K?(await P.readAllCards()).map($=>$.id):[x];for(let $ of q)if(!await P.readCard($))return Ae(`Card "${$}" not found in board at ${e.value}`);let D=t.kvStorage("card-upsert"),M=!1;for(let $ of q){let se=await P.readCard($);if(!se)continue;let ce=$t(se),be=t.hashFn(ce),Te=await D.read($),_e=Te?.taskConfigHash!==be;if(!(!_e&&!y)){if(_e){let pe=Te?.blobRef??await P.readCardKey($)??$;await O({type:"task-upsert",taskName:$,taskConfig:ce,timestamp:Ne()}),await D.write($,{blobRef:pe,taskConfigHash:be,updatedAt:Ne()}),M=M||$!==ve;}y&&await O({type:"task-restart",taskName:$,timestamp:Ne()});}}return M&&await O({type:"task-restart",taskName:ve,timestamp:Ne()}),re(),Pe()}catch(x){return Ee(x)}},async taskFailed(B){try{let x=B.params?.token;if(!x)return Ae("taskFailed requires params.token");let K=B.params?.error??"unknown error",y=Cr(x);return y?(await O({type:"task-failed",taskName:y.taskName,error:K,timestamp:Ne()}),re(),Pe()):Ae("Invalid callback token")}catch(x){return Ee(x)}},async taskProgress(B){try{let x=B.params?.token;if(!x)return Ae("taskProgress requires params.token");let K=(B.body??{}).update??{},y=Cr(x);return y?(await O({type:"task-progress",taskName:y.taskName,update:K,timestamp:Ne()}),re(),Pe()):Ae("Invalid callback token")}catch(x){return Ee(x)}},async sourceDataFetched(B){try{let x=B.params?.token,K=B.params?.ref;if(!x)return Ae("sourceDataFetched requires params.token");if(!K)return Ae("sourceDataFetched requires params.ref");let y=Jn(x);if(!y)return Ae("Invalid source token");let P=await J(),q=y.dt||t.genId();y.dt||await P.ingestSourceDataStaged(y.cid,y.d,it(K),q);let D=Cr(y.cbk);return D?(await O({type:"task-progress",taskName:D.taskName,update:{bindTo:y.b,outputFile:y.d,fetchedAt:Ne(),deliveryToken:q,sourceChecksum:y.cs,rqt:y.rqt},timestamp:Ne()}),re(),Pe()):Ae("Invalid callback token embedded in source token")}catch(x){return Ee(x)}},async sourceDataFetchFailure(B){try{let x=B.params?.token,K=B.params?.reason??"unknown";if(!x)return Ae("sourceDataFetchFailure requires params.token");let y=Jn(x);if(!y)return Ae("Invalid source token");let P=Cr(y.cbk);return P?(await O({type:"task-progress",taskName:P.taskName,update:{bindTo:y.b,outputFile:y.d,failure:!0,reason:K,sourceChecksum:y.cs,rqt:y.rqt},timestamp:Ne()}),re(),Pe()):Ae("Invalid callback token embedded in source token")}catch(x){return Ee(x)}}}}async function ga(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Wn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=De(n);if(a.length===1){await o(a[0]);return}await o($e({kind:"notification-batch",notifications:a}));}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(a=>({kind:"message_enqueued",lane:t.lane,message:a}))),o},enqueueIfAbsent:e.enqueueIfAbsent?async(n,o)=>{let a=await e.enqueueIfAbsent(n,o);return a&&await r([{kind:"message_enqueued",lane:t.lane,message:a}]),a}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,a){return e.nack(n,o,a)},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 a=await ga(e,n);a&&await r([{kind:"message_enqueued",lane:t.lane,message:a}]);}return o},async discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Kr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ya(e){return {...Kr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function ha(e){return {...Kr(e),reason:e.reason}}function Hr(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(ya)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(Kr)},peekDeadLetter(){return e.peekDeadLetter().map(ha)}}}function Ra(e,t){return e.peekActive().find(r=>r.id===t)}function zn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=De(n);if(a.length===1){await o(a[0]);return}await o($e({kind:"notification-batch",notifications:a}));}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(a=>({kind:"message_enqueued",lane:t.lane,message:a}))),o},enqueueIfAbsent:e.enqueueIfAbsent?(n,o)=>{let a=e.enqueueIfAbsent(n,o);return a&&r([{kind:"message_enqueued",lane:t.lane,message:a}]),a}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,a){return e.nack(n,o,a)},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 a=Ra(e,n);a&&r([{kind:"message_enqueued",lane:t.lane,message:a}]);}return o},discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Yn(){return new Date().toISOString()}function Xn(e){return new TextEncoder().encode(e).byteLength}function ka(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Zn(e){function t(r){let n=e.stat?ka(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:Xn(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Yn(),a.size=a.size??Xn(n),a},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 a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Yn(),a.size=a.size??n.byteLength,a},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 eo(){function e(o,a){if(!Array.isArray(o))return [];let c=[];for(let u of o){if(!u||typeof u!="object")continue;let f=u;typeof f.stored_name=="string"&&c.push({name:typeof f.name=="string"?f.name:f.stored_name,stored_name:f.stored_name,size:typeof f.size=="number"&&Number.isFinite(f.size)?f.size:null,mime_type:typeof f.mime_type=="string"?f.mime_type:null,uploaded_at:typeof f.uploaded_at=="string"?f.uploaded_at:a||null,chat:f.chat===true});}return c}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,a){let c=t(o);if(a.length===0)return o.files=c,c;let u=new Set(c.map(f=>f.stored_name));for(let f of a)u.has(f.stored_name)||(c.push(f),u.add(f.stored_name));return o.files=c,c}function n(o,a,c){let u=t(o);if(!Number.isInteger(a)||a<0||a>=u.length)return {ok:false,reason:"index_out_of_range"};let f=u[a];return !f||!f.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==f.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:f}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function to(e,t={}){let r=t.emitNotification;function n(g){let l=typeof g=="number"?g:Number(g);return Number.isInteger(l)&&l>0?l:null}function o(g,l){let i=l;for(let d=g.length-1;d>=0;d-=1)if(g[d]?.role==="user"&&(i-=1,i===0))return g.slice(d);return g}function a(g){return g.some(l=>typeof l?.turn=="string"&&l.turn!=="")}function c(g,l){if(l<=0)return [];if(!a(g))return o(g,l);let i=new Map,d=[];for(let p of g){let h=typeof p?.turn=="string"?p.turn:"";i.has(h)||(i.set(h,[]),d.push(h)),i.get(h).push(p);}return d.slice(Math.max(0,d.length-l)).flatMap(p=>i.get(p)??[])}function u(g){return {status:"success",data:g}}function f(g){return {status:"fail",error:g}}function k(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}function R(g){return {role:String(g.role||"system"),text:String(g.text||""),files:Array.isArray(g.files)?g.files:[],...typeof g.turn=="string"&&g.turn?{turn:g.turn}:{}}}async function b(g){if(!r||g.length===0)return;let l=De(g);if(l.length===1){await r(l[0]);return}await r($e({kind:"notification-batch",notifications:l}));}async function S(g){let l=await e.readAll(g);return c(l,1).map(R)}async function _(g){let l=Date.now();return {kind:"card_chats",cardId:g,sentAt:new Date(l).toISOString(),sentAtMs:l,messages:await S(g),receiving:true,processing:await e.isProcessing(g)}}async function T(g,l="command envelope"){let i=typeof g.cardId=="string"?g.cardId:void 0;if(!g.command)return f(`chat-store: ${l} missing "command"`);if(!i)return f(`chat-store: ${l} missing "cardId"`);if(g.command==="append")return await A.append({params:{cardId:i},body:{role:g.role,text:g.text,files:g.files,turn:g.turn}});if(g.command==="read-all")return await A.readAll({params:{cardId:i},body:{lastUserTurns:g.lastUserTurns,tailTurns:g.tailTurns,turnId:g.turnId,allTurns:g.allTurns,tailTurnsBeforeId:g.tailTurnsBeforeId}});if(g.command==="read-after")return await A.readAfter({params:{cardId:i},body:{cursor:g.cursor??null}});if(g.command==="clear")return await A.clear({params:{cardId:i}});if(g.command==="set-processing")return await A.setProcessing({params:{cardId:i},body:{active:g.active}});if(g.command==="is-processing")return await A.isProcessing({params:{cardId:i}});if(g.command==="get-config")return await A.getConfig({params:{cardId:i}});if(g.command==="set-config"){let{command:d,cardId:m,...p}=g;return await A.setConfig({params:{cardId:i},body:p})}return f(`chat-store: unknown command "${String(g.command)}"`)}async function I(g){if(!Array.isArray(g.commands)||g.commands.length===0)return f('chat-store: command envelope must include a non-empty "commands" array');let l=[];for(let i=0;i<g.commands.length;i+=1){let d=g.commands[i];if(!d||typeof d!="object"||Array.isArray(d))return f(`chat-store: command envelope entry ${i} must be an object`);let m={cardId:g.cardId,...d},p=await T(m,`command envelope entry ${i}`);if(p.status!=="success")return p;l.push({index:i,command:String(m.command),data:p.data});}return u({results:l})}let A={async append(g){try{let l=g.params?.cardId;if(!l)return f("append requires params.cardId");let i=g.body??{},d=typeof i.role=="string"?i.role:"",m=typeof i.text=="string"?i.text:"",p=Array.isArray(i.files)?i.files:[],h=typeof i.turn=="string"?i.turn:"";if(!d)return f("append requires body.role");let w=await e.append(l,d,m,p,h);return await b([{kind:"chat_messages",cardId:l,messages:await S(l)}]),u({id:w})}catch(l){return k(l)}},async readAll(g){try{let l=g.params?.cardId;if(!l)return f("readAll requires params.cardId");let i=g.body??{},d=typeof i.turnId=="string"?i.turnId:"",m=i.allTurns===!0,p=typeof i.tailTurnsBeforeId=="string"?i.tailTurnsBeforeId:"",h=i.tailTurns===void 0?i.lastUserTurns:i.tailTurns,w=h===void 0?m||d?void 0:1:n(h);if(h!==void 0&&w===null)return f("readAll requires body.tailTurns (positive integer)");let O=await e.readAll(l),N=O.filter(U=>!d||String(U.turn||"")===d);if(p){let U=w;if(typeof U!="number"||!Number.isInteger(U)||U<=0)return f("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let J=new Map,ae=[];for(let G of O){let Z=String(G.turn||"");J.has(Z)||(J.set(Z,[]),ae.push(Z)),J.get(Z).push(G);}let Q=ae.findIndex(G=>G===p),te=Math.max(0,Q-U);return N=(Q===-1?[]:ae.slice(te,Q)).flatMap(G=>J.get(G)??[]),u({records:N})}return u(typeof w=="number"?{records:c(N,w)}:{records:N})}catch(l){return k(l)}},async buildSseOneShotBatch(g){try{let l=g.params?.cardId;if(!l)return f("buildSseOneShotBatch requires params.cardId");let i=g.body??{},d=typeof i.receiving=="boolean"?i.receiving:!0,m=await _(l);return u($e({kind:"notification-batch",notifications:[{...m,receiving:d}]}))}catch(l){return k(l)}},async readAfter(g){try{let l=g.params?.cardId;if(!l)return f("readAfter requires params.cardId");let d=(g.body??{}).cursor??null;return u(await e.readAfter(l,d))}catch(l){return k(l)}},async clear(g){try{let l=g.params?.cardId;return l?(await e.clear(l),u({ok:!0})):f("clear requires params.cardId")}catch(l){return k(l)}},async setProcessing(g){try{let l=g.params?.cardId;if(!l)return f("setProcessing requires params.cardId");let i=g.body??{};return typeof i.active!="boolean"?f("setProcessing requires body.active (boolean)"):(await e.setProcessing(l,i.active),await b([{kind:"chat_processing",cardId:l,active:i.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(l){return k(l)}},async isProcessing(g){try{let l=g.params?.cardId;return l?u({active:await e.isProcessing(l)}):f("isProcessing requires params.cardId")}catch(l){return k(l)}},async getConfig(g){try{let l=g.params?.cardId;return l?u({config:await e.getConfig(l)}):f("getConfig requires params.cardId")}catch(l){return k(l)}},async setConfig(g){try{let l=g.params?.cardId;if(!l)return f("setConfig requires params.cardId");let i=g.body??{};return await e.setConfig(l,i),u({ok:!0})}catch(l){return k(l)}},run:T,runBatch:I};return A}function It(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function ro(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(It):[]:It(e)?[e]:[]}function no(e,t,r){let n=0;return {accepted:e.filter(a=>{if(!It(a))return n++,false;let c=a;return typeof c.sentAtMs=="number"&&t-c.sentAtMs>r?(n++,false):true}),rejected:n}}function ao(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Jr(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 Ca(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function oo(e,t){if(t.kind==="status"){Jr(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 so(e,t){if(Ca(t)){for(let r of t.notifications)It(r)&&oo(e,r);return}It(t)&&oo(e,t);}function Qr(e){let t=new Map,r=0;function n(l){let i=JSON.stringify(l);return r++,`id: ${r}
|
|
2
2
|
data: ${i}
|
|
3
3
|
|
|
4
|
-
`}function o(l){let i=l;try{i.flushHeaders?.();}catch{}try{i.flush?.();}catch{}try{i.socket?.setNoDelay?.(!0);}catch{}try{i.socket?.uncork?.();}catch{}}function s(l,i){let d=t.get(l);if(d&&!(i&&d.res!==i)){t.delete(l);try{e.onSseClientDisconnected?.(l);}catch{}try{d.res.end();}catch{}}}function c(l,i,d){let m=t.get(l);m&&s(l,m.res),t.set(l,{res:i,subscribedChatCardIds:d?.subscribedChatCardIds??new Set,subscribedChannelNames:d?.subscribedChannelNames??new Set,subscribedCardChannels:d?.subscribedCardChannels??new Map});}function u(l,i){let d=t.get(l);if(!d)return;let m=n(i);try{d.res.write(m),o(d.res);}catch{s(l,d.res);}}function f(l){return Me({kind:"notification-batch",notifications:l})}async function g(l,i){let d=await e.buildChatOneShotBatch(l,i);return d.status==="success"?d.data:f([])}async function k(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.add(i),u(l,await g(i,true)),true):false}function S(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.delete(i),true):false}function b(l,i,d){let m=t.get(l);if(!m)return false;if(d){let p=m.subscribedCardChannels.get(d)??new Set;return p.add(i),m.subscribedCardChannels.set(d,p),true}return m.subscribedChannelNames.add(i),true}function O(l,i,d){let m=t.get(l);if(!m)return false;if(d){let p=m.subscribedCardChannels.get(d);return p&&(p.delete(i),p.size===0&&m.subscribedCardChannels.delete(d)),true}return m.subscribedChannelNames.delete(i),true}function P(l){return l.kind==="card_chats"||l.kind==="chat_messages"||l.kind==="chat_processing"}function _(l){return l.kind==="card_watchparty"}function v(l,i,d){return l.subscribedChannelNames.has(i)?true:!!l.subscribedCardChannels.get(d)?.has(i)}function y(l){if(!l||l.length===0)return;let i=[],d=new Map,m=new Map;for(let p of l)if(_(p)){let R=`${p.cardId}\0${p.channel}`,w=m.get(R)??[];w.push(p),m.set(R,w);}else if(P(p)){let R=d.get(p.cardId)??[];R.push(p),d.set(p.cardId,R);}else i.push(p);if(i.length>0){let p=f(i);for(let R of t.keys())u(R,p);}for(let[p,R]of d.entries()){let w=f(R);for(let[B,j]of t.entries())j.subscribedChatCardIds.has(p)&&u(B,w);}for(let[p,R]of m.entries()){let w=p.indexOf("\0"),B=w>=0?p.slice(0,w):"",j=w>=0?p.slice(w+1):p,U=f(R);for(let[Q,ne]of t.entries())!B||!j||v(ne,j,B)&&u(Q,U);}}return {size:()=>t.size,has:l=>t.has(l),get:l=>t.get(l),buildFrame:n,flushTransport:o,register:c,disconnect:s,writeFrame:u,subscribeChat:k,unsubscribeChat:S,subscribeChannel:b,unsubscribeChannel:O,broadcastNotificationBatch:y}}function Hr(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 Jr(e,t){return Hr(await e,t)}function Qr(e){let t=fe(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool requires a card private key with at least two identifier segments (e.g. chat.foundry_thread_id)"),{statusCode:400});return t}function Gr(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 so(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:s,getMcpFacade:c,getMcpCardStoreFacade:u}=e;function f(i){let d=fe(i,"board_id");if(!d)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(d!==t)throw Object.assign(new Error(`Unknown board_id: ${d}`),{statusCode:400})}function g(i){let d=fe(i,"client_id");if(!d)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return d}function k(i){f(i);let d=g(i),m=fe(i,"channel_name"),p=fe(i,"card_id")||void 0;if(!m)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:d,channelName:m,...p?{cardId:p}:{}}}function S(i){f(i);let d=fe(i,"card_id");if(!d)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:d}}async function b(i){await r();let{cardId:d}=S(i),m=g(i);if(!await n.subscribeChat(m,d))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:d,clientId:m,subscribed:true}}}async function O(i){await r();let{cardId:d}=S(i),m=g(i);if(!n.unsubscribeChat(m,d))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:d,clientId:m,subscribed:false}}}async function P(i,d){await r();let{clientId:m,channelName:p,cardId:R}=k(i);if(!n.has(m))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return d?(n.subscribeChannel(m,p,R),o?.(m,p,R?{cardId:R}:{})):(n.unsubscribeChannel(m,p,R),s?.(m,p,R?{cardId:R}:{})),{status:"success",data:{boardId:t,clientId:m,channelName:p,subscribed:d,...R?{cardId:R}:{}}}}async function _(i,d){let{cardId:m}=S(i);return await c().setChatProcessing({cardId:m,active:d}),{status:"success",data:{boardId:t,cardId:m,active:d}}}async function v(i){let{cardId:d}=S(i),m=await c().getChatProcessing({cardId:d});return {status:"success",data:{boardId:t,cardId:d,active:m.active}}}async function y(i){let{cardId:d}=S(i),m=Qr(i);if(!Object.prototype.hasOwnProperty.call(i,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(m.split(".").includes("visible_controlplane_only")){let p=await Jr(u().get({params:{id:d}}),"cardStore.get"),R=Array.isArray(p.cards)&&p.cards.length>0&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null,w=R?Gr(R,"visible_controlplane_only").value:void 0;if(i.value!==w)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:d,key:m}}}return Hr(await u().patch({params:{id:d,path:`__private.${m}`},body:{value:i.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:d,key:m}}}async function l(i){let{cardId:d}=S(i),m=Qr(i),p=await Jr(u().get({params:{id:d}}),"cardStore.get"),R=Array.isArray(p.cards)&&p.cards.length>0&&p.cards[0]&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null;if(!R)throw Object.assign(new Error(`Card "${d}" not found`),{statusCode:404});let w=Gr(R,m);return {status:"success",data:{boardId:t,cardId:d,key:m,exists:w.exists,value:w.value}}}return {requireCardArgs:S,subscribeChat:b,unsubscribeChat:O,watchChannel:P,setChatProcessing:_,getChatProcessing:v,setCardMeta:y,getCardMeta:l}}function io(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 b=[],O=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],P={};for(let v of O)P[v]=0;for(let v of S){let y=v,l=Array.isArray(y.cards)?y.cards:[];b.push(...l);for(let i of O)P[i]+=Number(y?.summary?.[i]||0);}let _=S[0];return {..._,cards:b,summary:{..._.summary||{},card_count:b.length,...P}}}async function c(){let S=[];for(let b of r)try{let O=await b.boardOps.buildSseOneShotPayload({});O.status==="success"&&O.data&&S.push(O.data);}catch{}return S}async function u(){let b=(await c()).map(O=>O.statusSnapshot).filter(Boolean);if(b.length===0){let O=r.map(P=>P.notification.status).filter(Boolean);return s(O)}return s(b)}async function f(){let S={},b=await c();for(let O of b)Object.assign(S,O.cardRuntimeById||{});if(Object.keys(S).length>0)return S;for(let O of r)for(let[P,_]of Object.entries(O.notification.computedValues)){let v=O.notification.cards[P];S[P]={schema_version:"v1",card_id:P,card_data:v?.card_data??{},computed_values:_??{}};}return S}async function g(){let S={},b=await c();for(let O of b)Object.assign(S,O.dataObjectsByToken||{});if(Object.keys(S).length===0)for(let O of r)Object.assign(S,O.notification.dataObjects||{});return S}async function k(){let S=await c(),b=S.flatMap(v=>Array.isArray(v.cardDefinitions)?v.cardDefinitions:[]),O={},P={};for(let v of S)Object.assign(O,v.dataObjectsByToken||{}),Object.assign(P,v.cardRuntimeById||{});let _={};for(let v of b){if(!v?.id)continue;let y=v.id;try{let l=await n(y),i=await o(y);(l.length>0||i)&&(_[y]={messages:l.map(d=>({role:String(d.role||"system"),text:String(d.text||""),files:Array.isArray(d.files)?d.files:[]})),receiving:!1,processing:i});}catch{}}return {boardId:t,cardDefinitions:b,statusSnapshot:await u(),dataObjectsByToken:O,cardRuntimeById:P,cardChatsByCardId:_}}return {readStatusSnapshot:u,readCardRuntimeArtifacts:f,readDataObjectsByToken:g,buildPublishedRuntimePayload:k}}function Ca(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 uo(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:s,writeChatRecord:c}=e;async function u(k){let S=[];try{let b=await o(k);if(!b)return S;let O=n().read(b.card_data&&typeof b.card_data=="object"?b.card_data:null);for(let P of O)S.push(String(P.stored_name??""));}catch{}return S}async function f(k,S,b,O){let P=t(k),_=r(k),v=Ca(S),y=await u(k),i=`${String(y.length+1).padStart(3,"0")}-${v}`.slice(-36);if(!_.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${k}`),{statusCode:500});return await _.files.putBytes(`${P}/${i}`,new Uint8Array(O),b||"application/octet-stream"),{name:v,stored_name:i,size:O.length,mime_type:b||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function g(k,S,b,O,P){if(!O.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let _=P?.inChat===true,v=await f(k,S,b,O),y=null;if(await s(k,l=>{let i=new Date().toISOString(),d=l.card_data&&typeof l.card_data=="object"?l.card_data:{};l.card_data=d;let m=n().normalizeIncoming([{name:v.name,stored_name:v.stored_name,size:v.size,mime_type:v.mime_type,uploaded_at:v.uploaded_at||i,chat:_}],i);return y=n().merge(d,m).findIndex(R=>R.stored_name===v.stored_name),l}),_&&P?.suppressChatRecordWrite!==true){let l=typeof y=="number"&&y>=0?` #${y}`:"";await c(k,"system",`file uploaded: ${v.name} as ${v.stored_name}${l}`,[],P?.turnId??"");}return {ok:true,file:{...v,...typeof y=="number"&&y>=0?{file_idx:y}:{},chat:_},...typeof y=="number"&&y>=0?{file_idx:y}:{}}}return {uploadCardFile:g,readCardStoredFileNames:u}}function co(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:fe(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=it(t,"tail_turns"),n=it(t,"tail"),o=fe(t,"turn_id"),s=t.all_turns===true,c=fe(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:fe(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:fe(t,"card_id"),fileIdx:Number(it(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:mt(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:mt(t,"candidate_card_content","candidate_card_content"),mockRequires:mt(t,"mock_requires","mock_requires"),mockFetchedSources:mt(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:mt(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:Gt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:mt(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:Gt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:fe(t,"card_id"),sourceIdx:Gt(t,"source_idx","source_idx"),mockRequires:mt(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:mt(t,"candidate_card_content","candidate_card_content"),mockRequires:ut(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:fe(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=fe(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:fe(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=fe(t,"turn_id"),n=fe(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:fe(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:fe(t,"card_id"),candidateCardContent:ut(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:fe(t,"card_id")})}}function lo(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:fe(t,"token"),ref:fe(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:fe(t,"token"),reason:fe(t,"reason")})}}function fo(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(u,f){let g=fe(u,"board_id");if(!g)throw Object.assign(new Error(`${f} requires board_id`),{statusCode:400});if(g!==t)throw Object.assign(new Error(`Unknown board_id: ${g}`),{statusCode:400})}function c(u,f){let{cardId:g}=o.requireCardArgs(u),k=fe(u,"turn_id");return s(u,f),n().manageAddChatAttachment({cardId:g,role:fe(u,"role")||"user",...k?{turn:k}:{},files:[{file_name:fe(u,"file_name"),content_type:fe(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 f=fe(u,"card_id"),g=fe(u,"file_name"),k=fe(u,"content_type")||"application/octet-stream",S=on(u);if(s(u,"manage.upload-card-file"),!f)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!g)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(f,g,k,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:f}=o.requireCardArgs(u),g=fe(u,"role")||"user",k=fe(u,"turn_id");return s(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:f,role:g,...typeof u.text=="string"?{text:u.text}:{},...k?{turn:k}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:f}=o.requireCardArgs(u);return s(u,"manage.patch-card"),n().managePatchCard({cardId:f,patch:ut(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:f}=o.requireCardArgs(u);return s(u,"manage.upsert-card"),n().manageUpsertCard({cardId:f,candidateCardContent:ut(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:f}=o.requireCardArgs(u);return s(u,"manage.remove-card"),n().manageRemoveCard({cardId:f},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:f}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:f})}}},"manage.admin-upsert-card":u=>{let f=fe(u,"board_id"),g=fe(u,"card_id");if(!f)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!g)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(f!==t)throw Object.assign(new Error(`Unknown board_id: ${f}`),{statusCode:400});return n().adminUpsertCard({cardId:g,candidateCardContent:ut(u,"candidate_card_content")})}}}function rt(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 mo(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 Oe(e){return Array.isArray(e)?e:[]}function zr(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 Wr(e,t){let r=z(e.view);return {elements:Oe(r.elements).map((o,s)=>{let c=z(o),u=z(c.data),f=typeof c.visible=="string"?!!zr(t,c.visible):true,g=typeof u.bind=="string"?u.bind:void 0,k=typeof u.maxRows=="number"?u.maxRows:void 0,S=g?zr(t,g):void 0,b={id:typeof c.id=="string"&&c.id?c.id:`element-${s}`,kind:c.kind,label:c.label,visible:f};return S!==void 0&&(b.resolved=Array.isArray(S)&&typeof k=="number"?S.slice(0,k):S),b})}}function po(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=z(c),f=typeof u.bindTo=="string"?u.bindTo:"",g=typeof u.ref=="string"?u.ref:"";if(!f||!g)continue;let k=zr(t,g);k!==void 0&&(s[f]=k);}return s}function ba(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 Sa(e){return {"card-content":e}}function Sr(e){let t={...e};return delete t.__private,t}function wa(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function va(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function Aa(e,t){let r=va(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 f=o;for(let g=0;g<u.length-1;g+=1){let k=u[g];(!f[k]||typeof f[k]!="object")&&(f[k]={}),f=f[k];}f[u[u.length-1]]=c;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=z(r.view),c=Oe(s.elements);for(let u of c){let f=z(z(u).data);if(typeof f.writeTo=="string"&&f.writeTo){o=f.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 wr(e){return z(e.__private).visible_controlplane_only===true}async function _t(e,t){let r=await We(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 go(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:s,sourceFetchDone:c,sourceFetchFailed:u,uploadCardFile:f,buildFileDownloadUrl:g,readFetchedSourceJsonByRef:k}=e;function S(h,I){if(typeof h=="function")return h;throw new Error(`${I} is not configured for this MCP facade`)}async function b(){let h=await We(n.get({}),"cardStore.get");return Array.isArray(h.cards)?h.cards.map(I=>z(I)).filter(I=>!wr(I)):[]}function O(h){if(Array.isArray(h.bytes))return new Uint8Array(h.bytes.map(I=>Math.max(0,Math.min(255,Number(I)||0))));if(typeof h.text=="string")return new TextEncoder().encode(h.text);if(typeof h.base64=="string"){let I=String(h.base64).replace(/-/g,"+").replace(/_/g,"/"),F=I+"=".repeat((4-I.length%4)%4),M=atob(F);return Uint8Array.from(M,N=>N.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function P(){let h=z(await We(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:h.version,commonSourceFields:z(h.commonSourceDefFields),sourceKinds:z(h.sourceKinds)}}async function _(){let h=z(await We(t.status({}),"status")),I=z(h.summary),F=Oe(h.cards),M=await We(n.get({}),"cardStore.get"),N=new Set((Array.isArray(M.cards)?M.cards.map(z):[]).filter(wr).map(te=>typeof te.id=="string"?te.id:"").filter(Boolean)),K=F.filter(te=>!N.has(String(z(te).name??"")));return {meta:z(h.meta),summary:{card_count:typeof I.card_count=="number"?I.card_count:0,completed:typeof I.completed=="number"?I.completed:0,eligible:typeof I.eligible=="number"?I.eligible:0,pending:typeof I.pending=="number"?I.pending:0,blocked:typeof I.blocked=="number"?I.blocked:0,in_progress:typeof I.in_progress=="number"?I.in_progress:0,failed:typeof I.failed=="number"?I.failed:0,unresolved:typeof I.unresolved=="number"?I.unresolved:0},cards:K.map(te=>{let ce=z(te);return {"card-id":typeof ce.name=="string"?ce.name:null,status:ce.status??null,error:ce.error??null,requires:Oe(ce.requires),requires_satisfied:Oe(ce.requires_satisfied),requires_missing:Oe(ce.requires_missing),provides_declared:Oe(ce.provides_declared),provides_runtime:Oe(ce.provides_runtime)}})}}async function v(h){let I=String(h.cardId||"").trim();if(!I)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let F=z(await We(t.status({}),"status")),N=Oe(F.cards).map(z).find(ge=>ge.name===I);if(!N)throw new Error(`card "${I}" not found in board status`);let K=z(await _t(n,I)),te=Sr(K),ce=Oe(N.requires_satisfied).filter(ge=>typeof ge=="string"&&!!ge),Ae=Oe(N.provides_runtime).filter(ge=>typeof ge=="string"&&!!ge),Ie=Object.fromEntries(await Promise.all(ce.map(async ge=>[ge,await We(t.getOutputsDataObject({params:{key:ge}}),`getOutputsDataObject(${ge})`)]))),ve=Object.fromEntries(await Promise.all(Ae.map(async ge=>[ge,await We(t.getOutputsDataObject({params:{key:ge}}),`getOutputsDataObject(${ge})`)]))),ye=z(await We(t.getOutputsComputedValues({params:{key:I}}),"getOutputsComputedValues")),he=await We(t.getOutputsFetchedSources({params:{key:I}}),"getOutputsFetchedSources"),Ue=Oe(K.source_defs).map(z),Ce={};for(let ge of Ue)typeof ge.bindTo=="string"&&typeof ge.outputFile=="string"&&(Ce[ge.outputFile]=ge.bindTo);let De={};for(let[ge,Ye]of Object.entries(he)){let Ke=Ce[ge]??ge;if(!k||typeof Ye!="string"){De[Ke]=null;continue}try{De[Ke]=k({cardId:I,ref:Ye});}catch{De[Ke]=null;}}let Ve={card_data:z(K.card_data),requires:Ie,fetched_sources:De,computed_values:ye};return {cardId:I,card_status_in_board:N,card_definition_and_static_data:te,refs_for_fetched_source_files:he,runtime_data:{requires:Ie,provides:ve,computed_values:ye,rendered_view:Wr(K,Ve)}}}async function y(h){let I=String(h.cardId||"").trim();if(!I)throw new Error("inspectChatMessagesOnCards requires cardId");let F=typeof h.turnId=="string"?h.turnId:"",M=h.allTurns===true,N=typeof h.tailTurnsBeforeId=="string"?h.tailTurnsBeforeId:"",K=M?void 0:h.lastUserTurns??(F?void 0:1),te=h.tail,ce={...K===void 0?{}:{tailTurns:K},...F?{turnId:F}:{},...M?{allTurns:true}:{},...N?{tailTurnsBeforeId:N}:{}},Ae=Object.keys(ce).length>0?{params:{cardId:I},body:ce}:{params:{cardId:I}},Ie=rt(await o.readAll(Ae),"chatStore.readAll"),ve=z(await _t(n,I)),ye=Oe(z(ve.card_data).files).map((Ce,De)=>({idx:De,stored_name:z(Ce).stored_name})).filter(Ce=>typeof Ce.stored_name=="string"&&Ce.stored_name.length>0),Ue=(Array.isArray(Ie.records)?Ie.records:[]).map(Ce=>{let Ve=z(Ce.payload),ge={...Ce},Ye=typeof Ce?.role=="string"?Ce.role:typeof Ve.role=="string"?String(Ve.role):"",Ke=typeof Ce?.text=="string"?Ce.text:typeof Ve.text=="string"?String(Ve.text):"";if(Ye==="system"){let nt=ba(Ke);if(nt!==null&&ye.some(L=>L.idx===nt)){let L=`Retrieve using inspect-file-contents --card-id ${I} --file-idx ${nt}`;ge.retrieval_hint=L,Object.keys(Ve).length>0&&typeof Ce.role!="string"&&(ge.payload={...Ve,retrieval_hint:L});}}return ge});return {cardId:I,messages:typeof te=="number"&&te>=0?Ue.slice(-te):Ue}}async function l(h){let I=String(h.cardId||"").trim(),F=Number(h.fileIdx);if(!I)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(F)||F<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let M=z(await _t(n,I)),N=Oe(z(M.card_data).files).map(z);if(F>=N.length)throw new Error(`attachment index ${F} is out of range for card "${I}"`);let K=N[F],te=typeof K.stored_name=="string"?K.stored_name:null;return {cardId:I,fileIdx:F,downloadUrl:g({cardId:I,fileIdx:F,storedName:te}),...typeof K.name=="string"?{name:K.name}:{},...typeof K.stored_name=="string"?{stored_name:K.stored_name}:{},...typeof K.mime_type=="string"?{mime_type:K.mime_type}:{},...typeof K.size=="number"?{size:K.size}:{},...typeof K.uploaded_at=="string"?{uploaded_at:K.uploaded_at}:{}}}async function i(h){return await r.validateCardPreflight({body:Sa(h.candidateCardContent)})}function d(h){if(!h.mockRequires||typeof h.mockRequires!="object"||Array.isArray(h.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!h.mockFetchedSources||typeof h.mockFetchedSources!="object"||Array.isArray(h.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let I=r.evalCardCompute({body:{"card-content":h.candidateCardContent,"mock-requires":h.mockRequires,"mock-fetched-sources":h.mockFetchedSources}});if(I.status!=="success")return I;let F=z(mo(I,"evalCardCompute")),M=z(h.candidateCardContent),N={card_data:z(M.card_data),requires:z(h.mockRequires),fetched_sources:z(h.mockFetchedSources),computed_values:z(F.computed_values)};return {status:"success",data:{cardId:typeof F.cardId=="string"?F.cardId:typeof M.id=="string"?M.id:"(unknown)",ok:F.ok===true,computed_values:z(F.computed_values),errors:Oe(F.errors).map(K=>{let te=z(K);return {bindTo:typeof te.bindTo=="string"?te.bindTo:"",error:typeof te.error=="string"?te.error:""}}),provides_outputs:po(M,N),rendered_view:Wr(M,N)}}}async function m(h){return await r.probeSourcePreflight({params:{sourceIdx:h.sourceIdx},body:{"card-content":h.candidateCardContent,"mock-projections":h.mockProjections}})}async function p(h){return await r.runSourcePreflight({params:{sourceIdx:h.sourceIdx},body:{"card-content":h.candidateCardContent,"mock-projections":h.mockProjections}})}async function R(h){let I=String(h.cardId||"").trim();if(!I)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!h.mockRequires||typeof h.mockRequires!="object"||Array.isArray(h.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let F=z(await _t(n,I)),M=Oe(F.source_defs).filter(K=>!!K&&typeof K=="object"&&!Array.isArray(K)),N={};if(h.sourceIdx>=0&&h.sourceIdx<M.length){let K=M[h.sourceIdx],te=Ge.enrichSourcesSync([K],{card_data:z(F.card_data),requires:h.mockRequires});Array.isArray(te)&&te.length>0&&(N=z(te[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:h.sourceIdx},body:{"card-content":F,"mock-requires":h.mockRequires,"mock-projections":N}})}async function w(h){let I=z(await We(r.simulateCardCycle({body:{"card-content":h.candidateCardContent,"mock-requires":h.mockRequires}}),"simulateCardCycle")),F=z(h.candidateCardContent),M=z(I.validation),N=Oe(I.source_probes),K=Oe(I.projection_errors),te=z(I.fetched_sources),ce=Oe(I.compute_errors),Ae=z(I.computed_values),Ie={card_data:z(F.card_data),requires:h.mockRequires,fetched_sources:te,computed_values:Ae},ve=[];for(let ye of Oe(M.issues))typeof ye=="string"&&ye&&ve.push(ye);for(let ye of N){let he=z(ye),Ue=typeof he.bindTo=="string"?he.bindTo:"source",Ce=typeof he.error=="string"?he.error:"";Ce&&ve.push(`${Ue}: ${Ce}`);}for(let ye of K){let he=z(ye),Ue=typeof he.bindTo=="string"?he.bindTo:"source",Ce=typeof he.key=="string"?he.key:"projection",De=typeof he.error=="string"?he.error:"projection failed";ve.push(`${Ue}.${Ce}: ${De}`);}for(let ye of ce){let he=z(ye),Ue=typeof he.bindTo=="string"?he.bindTo:"compute",Ce=typeof he.error=="string"?he.error:"compute failed";ve.push(`${Ue}: ${Ce}`);}return {status:"success",data:{cardId:typeof I.cardId=="string"?I.cardId:"(unknown)",ok:I.ok===true,issues:ve,provides_outputs:po(F,Ie),rendered_view:Wr(F,Ie)}}}async function B(h){let I=String(h.cardId||"").trim();if(!I)throw new Error("manageReadCard requires cardId");let F=await We(n.get({params:{id:I}}),"cardStore.get");return (Array.isArray(F.cards)?F.cards.map(z):[]).map(N=>Sr(N))}async function j(h){let I=await Promise.all(Oe(h.files).map(async F=>{let M=z(F),N=String(M.file_name??M.fileName??M.name??"").trim(),K=String(M.content_type??M.contentType??"application/octet-stream");if(!N)throw new Error("file entry requires file_name");return await f({cardId:h.cardId,fileName:N,contentType:K,bytes:O(M),suppressChatRecordWrite:true})}));for(let[F,M]of I.entries()){let N=z(M.file),K=typeof M.file_idx=="number"&&Number.isInteger(M.file_idx)&&M.file_idx>=0?M.file_idx:F,te=h.role==="assistant"?`AI generated: ${String(N.name||"")} as ${String(N.stored_name||"")} #${K}`:`file uploaded: ${String(N.name||"")} as ${String(N.stored_name||"")} #${K}`;rt(await o.append({params:{cardId:h.cardId},body:{role:"system",text:te,files:[],turn:h.turn}}),"chatStore.append(system attachment message)");}return I.map(F=>F.file)}async function U(h){let I=String(h.cardId||"").trim(),F=String(h.role||"user").trim()||"user",M=typeof h.turn=="string"?h.turn:"";if(!I)throw new Error("manageAddChatAttachment requires cardId");let N=await j({cardId:I,role:F,turn:M,files:h.files});return {status:"success",data:{cardId:I,turn:M,files:N}}}async function Q(h){let I=String(h.cardId||"").trim(),F=String(h.role||"").trim(),M=typeof h.text=="string"?h.text:"",N=typeof h.turn=="string"?h.turn:"";if(!I)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!F)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(F==="assistant"&&N){let ce=rt(await o.readAll({params:{cardId:I},body:{turnId:N}}),"chatStore.readAll(existing turn messages)"),Ae=Array.isArray(ce.records)?ce.records.find(Ie=>Ie.role==="assistant"&&String(Ie.turn||"")===N):void 0;if(Ae)return {status:"success",data:{cardId:I,id:String(Ae.id),role:F,turn:N,files:Array.isArray(Ae.files)?Ae.files:[]}}}let K=await j({cardId:I,role:F,turn:N,files:h.files}),te=rt(await o.append({params:{cardId:I},body:{role:F,text:M,files:K,turn:N}}),"chatStore.append");return {status:"success",data:{cardId:I,id:String(te.id),role:F,turn:N,files:K}}}async function ne(h,I={}){let F=String(h.cardId||"").trim(),M=z(h.patch);if(!F)throw new Error("managePatchCard requires cardId");let N=await B({cardId:F}),K=z(N[0]),te=Aa(K,M);return J({cardId:F,candidateCardContent:te},I)}async function J(h,I={}){let F=String(h.cardId||"").trim(),M=z(h.candidateCardContent),N=Sr(M);if(!F)throw new Error("manageUpsertCard requires cardId");if(typeof N.id!="string"||!N.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(N.id!==F)throw new Error(`candidateCardContent.id must match cardId (${F})`);let K=null;try{K=await i({candidateCardContent:N});}catch(ye){let he=ye instanceof Error?ye.message:String(ye);if(!/non-core adapter is not configured/i.test(he))throw ye;K=null;}if(K!==null){let ye=z(K),he=z(ye.data);if(ye.status!=="success"||he.isValid!==true)return {status:"fail",step:"validate",validation:K}}let te=null;try{te=await _t(n,F);}catch{te=null;}let ce=te?z(te):null;if(ce&&wr(ce)&&!I.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404});let Ae={...N,...ce&&wa(ce,"__private")?{__private:ce.__private}:{}},Ie=await n.set({body:Ae});rt(Ie,"cardStore.set");let ve;try{ve=await t.upsertCard({params:{cardId:F,restart:!0}}),rt(ve,"upsertCard");}catch(ye){try{te&&await n.set({body:te});}catch{}throw ye}return {status:"success",data:{validation:K,card_saved:null,board_result:ve}}}async function ae(h,I={}){let F=String(h.cardId||"").trim();if(!F)throw new Error("manageRemoveCard requires cardId");if(!I.allowControlplaneOnlyCards){let K=await We(n.get({params:{id:F}}),"cardStore.get");if((Array.isArray(K.cards)?K.cards.map(z):[]).some(wr))throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404})}let M=await t.removeCard({params:{id:F}});rt(M,"removeCard");let N=await n.del({params:{id:F}});return rt(N,"cardStore.del"),{status:"success",data:{board_result:M,store_result:N}}}async function ue(h){let I=String(h.cardId||"").trim();if(!I)throw new Error("adminReadCard requires cardId");let F=await We(n.get({params:{id:I}}),"cardStore.get");return Array.isArray(F.cards)?F.cards.map(M=>z(M)):[]}async function G(h){let I=String(h.cardId||"").trim(),F=z(h.candidateCardContent),M=Sr(F);if(!I)throw new Error("adminUpsertCard requires cardId");if(typeof M.id!="string"||!M.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(M.id!==I)throw new Error(`candidateCardContent.id must match cardId (${I})`);let N=await i({candidateCardContent:M}),K=z(N),te=z(K.data);if(K.status!=="success"||te.isValid!==true)return {status:"fail",step:"validate",validation:N};let ce=null;try{ce=await _t(n,I);}catch{ce=null;}let Ae=ce?z(z(ce).__private):{},Ie={...M,__private:{...Ae,visible_controlplane_only:true}},ve=await n.set({body:Ie});rt(ve,"cardStore.set");let ye;try{ye=await t.upsertCard({params:{cardId:I,restart:!0}}),rt(ye,"upsertCard");}catch(he){try{ce&&await n.set({body:ce});}catch{}throw he}return {status:"success",data:{validation:N,card_saved:null,board_result:ye}}}async function X(h){let I=String(h.cardId||"").trim();if(!I)throw new Error("getChatProcessing requires cardId");let F=mo(await o.isProcessing({params:{cardId:I}}),"chatStore.isProcessing");return {cardId:I,active:!!F.active}}async function Y(h){let I=String(h.cardId||"").trim();if(!I)throw new Error("setChatProcessing requires cardId");if(typeof h.active!="boolean")throw new Error("setChatProcessing requires boolean active");return rt(await o.setProcessing({params:{cardId:I},body:{active:h.active}}),"chatStore.setProcessing"),{cardId:I,active:h.active}}async function E(){let h=await S(s,"webhook.process-accumulated")();return h?.status==="fail"||h?.status==="error"?h:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(h??{},"data")?h.data??null:null}}}async function T(h){let I=String(h.token||"").trim(),F=String(h.ref||"").trim();if(!I)throw new Error("webhookSourceFetchDone requires token");if(!F)throw new Error("webhookSourceFetchDone requires ref");let M=await S(c,"webhook.source-fetch-done")({token:I,ref:F});return M?.status==="fail"||M?.status==="error"?M:{status:"success",data:{token:I,ref:F,runtime_result:Object.prototype.hasOwnProperty.call(M??{},"data")?M.data??null:null}}}async function $(h){let I=String(h.token||"").trim(),F=String(h.reason||"").trim();if(!I)throw new Error("webhookSourceFetchFailed requires token");if(!F)throw new Error("webhookSourceFetchFailed requires reason");let M=await S(u,"webhook.source-fetch-failed")({token:I,reason:F});return M?.status==="fail"||M?.status==="error"?M:{status:"success",data:{token:I,reason:F,runtime_result:Object.prototype.hasOwnProperty.call(M??{},"data")?M.data??null:null}}}return {listRuntimeCards:b,discoverSourceKinds:P,inspectBoardRuntimeStatus:_,inspectCardDefinitionAndRuntime:v,inspectChatMessagesOnCards:y,inspectFileContents:l,preflightValidateCandidateCardDefinition:i,preflightMaterializeCandidateCard:d,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:R,preflightRunOneCycleWithCandidateCard:w,manageReadCard:B,manageAddChatAttachment:U,manageAddChatEntryAndAnyAttachments:Q,managePatchCard:ne,manageUpsertCard:J,manageRemoveCard:ae,adminReadCard:ue,adminUpsertCard:G,getChatProcessing:X,setChatProcessing:Y,webhookProcessAccumulated:E,webhookSourceFetchDone:T,webhookSourceFetchFailed:$}}async function We(e,t){return rt(await e,t)}function yo(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:s,readCardRuntimeArtifacts:c,readCardFromStore:u,readCardDefinitions:f,processAccumulatedLaneInternal:g,reportSourceFetched:k,reportSourceFetchFailure:S,uploadCardFile:b,chatStorePublic:O,serverUrl:P,apiBasePath:_}=e;function v(){return t[0]??null}function y(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let p=m?.params?.key;return p?{status:"success",data:(await s())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let p=m?.params?.key;return p?{status:"success",data:(await c())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let p=m?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let R=n(p)??v();return R?R.boardOps.getOutputsFetchedSources({params:{key:p}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let p=m?.params?.id;if(!p)return {status:"fail",error:"removeCard requires params.id"};let R=n(p)??v();return R?R.boardOps.removeCard({params:{id:p}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"upsertCard requires params.cardId"};let R=n(p)??v();if(!R)return {status:"fail",error:"Board context is unavailable"};let w=await R.boardOps.upsertCard({params:{cardId:p,restart:m.params.restart===true}});if(w.status!=="success")return w;if(Ze(R.boardAdapter)){let B=await g(true);if(B.status!=="success")return B}return w}}}function l(){let m=()=>{let p=v();if(!p?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return p.nonCore};return {describeTaskExecutorCapabilities(p){return m().describeTaskExecutorCapabilities(p)},validateCardPreflight(p){return m().validateCardPreflight(p)},evalCardCompute(p){return m().evalCardCompute(p)},probeSourcePreflight(p){return m().probeSourcePreflight(p)},runSourcePreflight(p){return m().runSourcePreflight(p)},simulateCardCycle(p){return m().simulateCardCycle(p)}}}function i(){return {async get(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(p){let R=await u(p);return R?{status:"success",data:{cards:[R]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await f()}}},async set(m){let p=m.body;if(p==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let R=Array.isArray(p)?p:[p];for(let w of R){let B=w,j=typeof B.id=="string"?B.id:"";if(!j)return {status:"fail",error:"each card must have a string `id` field"};let U=r.get(j)??0,Q=t[U]??v();if(!Q)return {status:"fail",error:"Board context is unavailable"};let ne=await Q.cardStoreOps.set({body:B});if(ne.status!=="success")return ne;r.set(j,U);}return {status:"success",data:{count:R.length}}},async del(m){let p=[m.params?.id,...m.body?.ids??[]].filter(R=>typeof R=="string"&&!!R);if(p.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let R of p){let w=n(R)??v();if(!w)return {status:"fail",error:"Board context is unavailable"};let B=await w.cardStoreOps.del({params:{id:R}});if(B.status!=="success")return B;r.delete(R);}return {status:"success",data:{count:p.length}}},async patch(m){let p=typeof m.params?.id=="string"?m.params.id:void 0,R=typeof m.params?.path=="string"?m.params.path:void 0;if(!p||!R)return {status:"fail",error:"patch requires params.id and params.path"};let w=n(p)??v();return w?w.cardStoreOps.patch(m):{status:"fail",error:"Board context is unavailable"}},async appendFiles(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(!p)return {status:"fail",error:"appendFiles requires params.id"};let R=n(p)??v();return R?R.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function d(){return go({board:y(),nonCore:l(),cardStore:i(),chatStore:O,processAccumulated:()=>g(true),sourceFetchDone:({token:m,ref:p})=>k(m,p),sourceFetchFailed:({token:m,reason:p})=>S(m,p),uploadCardFile({cardId:m,fileName:p,contentType:R,bytes:w,suppressChatRecordWrite:B}){return b(m,p,R,w,{inChat:true,...B===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:p,storedName:R}){let w=`${P||""}${_}/cards/${encodeURIComponent(m)}/files/${p}`;return R?`${w}?sn=${encodeURIComponent(R)}`:w},readFetchedSourceJsonByRef({cardId:m,ref:p}){let R=n(m)??v();if(!R||Ze(R.boardAdapter))return null;let j=R.boardAdapter.resolveBlob(st(p)).trim();return j?JSON.parse(j):null}})}return {mcpBoardFacade:y,mcpNonCoreFacade:l,mcpCardStoreFacade:i,createMcpFacade:d}}function ho(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:s,createMcpToolRegistry:c,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:f,sliceTextByLines:g}=e;async function k(S,b,O){let P=S.method||"GET",_=O,v=_.pathname;try{if(P==="POST"&&v===`${t}/mcp`){await o();let y=await n(S),l=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!l)return r(b,400,{error:"tool is required"}),!0;if(l==="inspect.file-contents")return r(b,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let d=await pt(l,i,c(s()));if(d&&typeof d=="object"&&!Array.isArray(d)){let m=d;if(m.status==="fail")return r(b,400,{error:et(d,"Request failed")}),!0;if(m.status==="error")return r(b,500,{error:et(d,"Internal error")}),!0}r(b,200,d);}catch(d){let m=typeof d?.statusCode=="number"?Number(d.statusCode):500,p=d instanceof Error?d.message:String(d);r(b,m,{error:p});}return !0}if(P==="POST"&&v===`${t}/mcp-raw`){await o();let y=await n(S),l=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!l)return r(b,400,{error:"tool is required"}),!0;if(l!=="inspect.file-contents")return r(b,400,{error:`Tool does not support raw response: ${l}`}),!0;let d=fe(i,"card_id","cardId"),m=it(i,"file_idx","fileIdx"),p=it(i,"head-lines","headLines"),R=it(i,"tail-lines","tailLines"),w=it(i,"head-bytes","headBytes"),B=it(i,"tail-bytes","tailBytes");if(!d)return r(b,400,{error:"inspect.file-contents requires card_id"}),!0;if(m===void 0||!Number.isInteger(m)||m<0)return r(b,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([p,R,w,B].filter(E=>E!==void 0).length>1)return r(b,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[E,T]of [["head-lines",p],["tail-lines",R],["head-bytes",w],["tail-bytes",B]])if(T!==void 0&&(!Number.isInteger(T)||T<0))return r(b,400,{error:`inspect.file-contents requires ${E} to be a non-negative integer`}),!0;let U=await s().inspectFileContents({cardId:d,fileIdx:m}),Q=typeof U?.stored_name=="string"?U.stored_name:null,{fileRecord:ne,bytes:J}=await u(d,m,Q),ae=String(ne.name||ne.stored_name||"download.bin"),ue=String(ne.mime_type||"application/octet-stream"),G=(_.searchParams.get("resp")||"").trim().toLowerCase();if(G&&G!=="json-b64")return r(b,400,{error:`unsupported resp mode: ${G}`}),!0;let X=G==="json-b64",Y;if(p!==void 0||R!==void 0){if(!f(ue))return r(b,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let E=new TextDecoder().decode(J),T=p!==void 0?g(E,"head",p):g(E,"tail",R);Y=typeof Buffer<"u"?Buffer.from(T,"utf8"):new TextEncoder().encode(T);}else if(w!==void 0||B!==void 0){let E=w??B;Y=w!==void 0?J.slice(0,E):J.slice(Math.max(0,J.length-E));}else Y=J;if(X){let E=typeof Buffer<"u"?Buffer.from(Y).toString("base64"):btoa(String.fromCharCode(...Y));return r(b,200,{bodyBase64:E,mimeType:ue,filename:ae,byteLength:Y.length}),!0}return b.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${ae}"`,"Content-Length":Y.length}),b.end(Y),!0}return !1}catch(y){let l=y?.statusCode||500;return r(b,l,{error:String(y?.message||y)}),true}}return {handleAgentfaceApi:k}}function Ro(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function c(u,f,g){let k=u.method||"GET",S=g.pathname;try{if(k==="POST"&&S===`${t}/mcp-webhooks`){await o();let b=await n(u),O=typeof b.tool=="string"?b.tool.trim():"",P=b.args&&typeof b.args=="object"&&!Array.isArray(b.args)?b.args:{};if(!O)return r(f,400,{error:"tool is required"}),!0;try{let _=await pt(O,P,s());if(_&&typeof _=="object"&&!Array.isArray(_)){let v=_;if(v.status==="fail")return r(f,400,{error:et(_,"Request failed")}),!0;if(v.status==="error")return r(f,500,{error:et(_,"Internal error")}),!0}r(f,200,_);}catch(_){let v=typeof _?.statusCode=="number"?Number(_.statusCode):500,y=_ instanceof Error?_.message:String(_);r(f,v,{error:y});}return !0}return !1}catch(b){let O=b?.statusCode||500;return r(f,O,{error:String(b?.message||b)}),true}}return {handleWebhooksApi:c}}function Yr(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:s,onChannelSubscribed:c,onChannelUnsubscribed:u}=e;function f(k,S,b,O,P){if(!t.has(S)){n(k,404,{error:`SSE client not connected: ${S}`});return}P?(t.subscribeChannel(S,b,O.cardId),c?.(S,b,O)):(t.unsubscribeChannel(S,b,O.cardId),u?.(S,b,O)),n(k,200,{ok:true,clientId:S,channelName:b,...O.cardId?{cardId:O.cardId}:{},subscribed:P});}async function g(k,S,b,O){let P=O?.oneShot===true,_=O?.bootstrapPayload!==false,v=!P&&b?t.get(b):null,y=v?new Set(v.subscribedChatCardIds):new Set,l=v?new Set(v.subscribedChannelNames):new Set,i=v?new Map(Array.from(v.subscribedCardChannels.entries(),([m,p])=>[m,new Set(p)])):new Map;if(S.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(S),_){let m=await o(),p=t.buildFrame(m);S.write(p);}if(P){S.end();return}if(!b)throw new Error("clientId is required for streaming SSE");t.register(b,S,{subscribedChatCardIds:y,subscribedChannelNames:l,subscribedCardChannels:i});try{s?.(b,m=>{t.writeFrame(b,m);});}catch{}let d=setInterval(()=>{try{S.write(`: keepalive
|
|
4
|
+
`}function o(l){let i=l;try{i.flushHeaders?.();}catch{}try{i.flush?.();}catch{}try{i.socket?.setNoDelay?.(!0);}catch{}try{i.socket?.uncork?.();}catch{}}function a(l,i){let d=t.get(l);if(d&&!(i&&d.res!==i)){t.delete(l);try{e.onSseClientDisconnected?.(l);}catch{}try{d.res.end();}catch{}}}function c(l,i,d){let m=t.get(l);m&&a(l,m.res),t.set(l,{res:i,subscribedChatCardIds:d?.subscribedChatCardIds??new Set,subscribedChannelNames:d?.subscribedChannelNames??new Set,subscribedCardChannels:d?.subscribedCardChannels??new Map});}function u(l,i){let d=t.get(l);if(!d)return;let m=n(i);try{d.res.write(m),o(d.res);}catch{a(l,d.res);}}function f(l){return $e({kind:"notification-batch",notifications:l})}async function k(l,i){let d=await e.buildChatOneShotBatch(l,i);return d.status==="success"?d.data:f([])}async function R(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.add(i),u(l,await k(i,true)),true):false}function b(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.delete(i),true):false}function S(l,i,d){let m=t.get(l);if(!m)return false;if(d){let p=m.subscribedCardChannels.get(d)??new Set;return p.add(i),m.subscribedCardChannels.set(d,p),true}return m.subscribedChannelNames.add(i),true}function _(l,i,d){let m=t.get(l);if(!m)return false;if(d){let p=m.subscribedCardChannels.get(d);return p&&(p.delete(i),p.size===0&&m.subscribedCardChannels.delete(d)),true}return m.subscribedChannelNames.delete(i),true}function T(l){return l.kind==="card_chats"||l.kind==="chat_messages"||l.kind==="chat_processing"}function I(l){return l.kind==="card_watchparty"}function A(l,i,d){return l.subscribedChannelNames.has(i)?true:!!l.subscribedCardChannels.get(d)?.has(i)}function g(l){if(!l||l.length===0)return;let i=[],d=new Map,m=new Map;for(let p of l)if(I(p)){let h=`${p.cardId}\0${p.channel}`,w=m.get(h)??[];w.push(p),m.set(h,w);}else if(T(p)){let h=d.get(p.cardId)??[];h.push(p),d.set(p.cardId,h);}else i.push(p);if(i.length>0){let p=f(i);for(let h of t.keys())u(h,p);}for(let[p,h]of d.entries()){let w=f(h);for(let[O,N]of t.entries())N.subscribedChatCardIds.has(p)&&u(O,w);}for(let[p,h]of m.entries()){let w=p.indexOf("\0"),O=w>=0?p.slice(0,w):"",N=w>=0?p.slice(w+1):p,U=f(h);for(let[J,ae]of t.entries())!O||!N||A(ae,N,O)&&u(J,U);}}return {size:()=>t.size,has:l=>t.has(l),get:l=>t.get(l),buildFrame:n,flushTransport:o,register:c,disconnect:a,writeFrame:u,subscribeChat:R,unsubscribeChat:b,subscribeChannel:S,unsubscribeChannel:_,broadcastNotificationBatch:g}}function Gr(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 Wr(e,t){return Gr(await e,t)}function zr(e){let t=me(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool requires a card private key with at least two identifier segments (e.g. chat.foundry_thread_id)"),{statusCode:400});return t}function Yr(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 io(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:a,getMcpFacade:c,getMcpCardStoreFacade:u}=e;function f(i){let d=me(i,"board_id");if(!d)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(d!==t)throw Object.assign(new Error(`Unknown board_id: ${d}`),{statusCode:400})}function k(i){let d=me(i,"client_id");if(!d)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return d}function R(i){f(i);let d=k(i),m=me(i,"channel_name"),p=me(i,"card_id")||void 0;if(!m)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:d,channelName:m,...p?{cardId:p}:{}}}function b(i){f(i);let d=me(i,"card_id");if(!d)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:d}}async function S(i){await r();let{cardId:d}=b(i),m=k(i);if(!await n.subscribeChat(m,d))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:d,clientId:m,subscribed:true}}}async function _(i){await r();let{cardId:d}=b(i),m=k(i);if(!n.unsubscribeChat(m,d))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:d,clientId:m,subscribed:false}}}async function T(i,d){await r();let{clientId:m,channelName:p,cardId:h}=R(i);if(!n.has(m))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return d?(n.subscribeChannel(m,p,h),o?.(m,p,h?{cardId:h}:{})):(n.unsubscribeChannel(m,p,h),a?.(m,p,h?{cardId:h}:{})),{status:"success",data:{boardId:t,clientId:m,channelName:p,subscribed:d,...h?{cardId:h}:{}}}}async function I(i,d){let{cardId:m}=b(i);return await c().setChatProcessing({cardId:m,active:d}),{status:"success",data:{boardId:t,cardId:m,active:d}}}async function A(i){let{cardId:d}=b(i),m=await c().getChatProcessing({cardId:d});return {status:"success",data:{boardId:t,cardId:d,active:m.active}}}async function g(i){let{cardId:d}=b(i),m=zr(i);if(!Object.prototype.hasOwnProperty.call(i,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(m.split(".").includes("visible_controlplane_only")){let p=await Wr(u().get({params:{id:d}}),"cardStore.get"),h=Array.isArray(p.cards)&&p.cards.length>0&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null,w=h?Yr(h,"visible_controlplane_only").value:void 0;if(i.value!==w)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:d,key:m}}}return Gr(await u().patch({params:{id:d,path:`__private.${m}`},body:{value:i.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:d,key:m}}}async function l(i){let{cardId:d}=b(i),m=zr(i),p=await Wr(u().get({params:{id:d}}),"cardStore.get"),h=Array.isArray(p.cards)&&p.cards.length>0&&p.cards[0]&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null;if(!h)throw Object.assign(new Error(`Card "${d}" not found`),{statusCode:404});let w=Yr(h,m);return {status:"success",data:{boardId:t,cardId:d,key:m,exists:w.exists,value:w.value}}}return {requireCardArgs:b,subscribeChat:S,unsubscribeChat:_,watchChannel:T,setChatProcessing:I,getChatProcessing:A,setCardMeta:g,getCardMeta:l}}function uo(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e,a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1;function c(_){return {role:String(_.role||"system"),text:String(_.text||""),files:Array.isArray(_.files)?_.files:[],...typeof _.turn=="string"&&_.turn?{turn:_.turn}:{}}}function u(_){if(_.length===0)return null;if(_.length===1)return _[0];let T=[],I=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],A={};for(let l of I)A[l]=0;for(let l of _){let i=l,d=Array.isArray(i.cards)?i.cards:[];T.push(...d);for(let m of I)A[m]+=Number(i?.summary?.[m]||0);}let g=_[0];return {...g,cards:T,summary:{...g.summary||{},card_count:T.length,...A}}}async function f(){let _=[];for(let T of r)try{let I=await T.boardOps.buildSseOneShotPayload({});I.status==="success"&&I.data&&_.push(I.data);}catch{}return _}async function k(){let T=(await f()).map(I=>I.statusSnapshot).filter(Boolean);if(T.length===0){let I=r.map(A=>A.notification.status).filter(Boolean);return u(I)}return u(T)}async function R(){let _={},T=await f();for(let I of T)Object.assign(_,I.cardRuntimeById||{});if(Object.keys(_).length>0)return _;for(let I of r)for(let[A,g]of Object.entries(I.notification.computedValues)){let l=I.notification.cards[A];_[A]={schema_version:"v1",card_id:A,card_data:l?.card_data??{},computed_values:g??{}};}return _}async function b(){let _={},T=await f();for(let I of T)Object.assign(_,I.dataObjectsByToken||{});if(Object.keys(_).length===0)for(let I of r)Object.assign(_,I.notification.dataObjects||{});return _}async function S(){let _=await f(),T=_.flatMap(l=>Array.isArray(l.cardDefinitions)?l.cardDefinitions:[]),I={},A={};for(let l of _)Object.assign(I,l.dataObjectsByToken||{}),Object.assign(A,l.cardRuntimeById||{});let g={};for(let l of T){if(!l?.id)continue;let i=l.id;try{let d=await n(i,{tailTurns:a}),m=await o(i);(d.length>0||m)&&(g[i]={messages:d.map(p=>c(p)),receiving:!1,processing:m});}catch{}}return {boardId:t,cardDefinitions:T,statusSnapshot:await k(),dataObjectsByToken:I,cardRuntimeById:A,cardChatsByCardId:g}}return {readStatusSnapshot:k,readCardRuntimeArtifacts:R,readDataObjectsByToken:b,buildPublishedRuntimePayload:S}}function ba(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 co(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:a,writeChatRecord:c}=e;async function u(R){let b=[];try{let S=await o(R);if(!S)return b;let _=n().read(S.card_data&&typeof S.card_data=="object"?S.card_data:null);for(let T of _)b.push(String(T.stored_name??""));}catch{}return b}async function f(R,b,S,_){let T=t(R),I=r(R),A=ba(b),g=await u(R),i=`${String(g.length+1).padStart(3,"0")}-${A}`.slice(-36);if(!I.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${R}`),{statusCode:500});return await I.files.putBytes(`${T}/${i}`,new Uint8Array(_),S||"application/octet-stream"),{name:A,stored_name:i,size:_.length,mime_type:S||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function k(R,b,S,_,T){if(!_.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let I=T?.inChat===true,A=await f(R,b,S,_),g=null;if(await a(R,l=>{let i=new Date().toISOString(),d=l.card_data&&typeof l.card_data=="object"?l.card_data:{};l.card_data=d;let m=n().normalizeIncoming([{name:A.name,stored_name:A.stored_name,size:A.size,mime_type:A.mime_type,uploaded_at:A.uploaded_at||i,chat:I}],i);return g=n().merge(d,m).findIndex(h=>h.stored_name===A.stored_name),l}),I&&T?.suppressChatRecordWrite!==true){let l=typeof g=="number"&&g>=0?` #${g}`:"";await c(R,"system",`file uploaded: ${A.name} as ${A.stored_name}${l}`,[],T?.turnId??"");}return {ok:true,file:{...A,...typeof g=="number"&&g>=0?{file_idx:g}:{},chat:I},...typeof g=="number"&&g>=0?{file_idx:g}:{}}}return {uploadCardFile:k,readCardStoredFileNames:u}}function lo(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:me(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=ut(t,"tail_turns"),n=ut(t,"tail"),o=me(t,"turn_id"),a=t.all_turns===true,c=me(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:me(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...a?{allTurns:true}:{},...c?{tailTurnsBeforeId:c}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:me(t,"card_id"),fileIdx:Number(ut(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockRequires:pt(t,"mock_requires","mock_requires"),mockFetchedSources:pt(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockProjections:ct(t,"mock_projections"),sourceIdx:Qt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockProjections:ct(t,"mock_projections"),sourceIdx:Qt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:me(t,"card_id"),sourceIdx:Qt(t,"source_idx","source_idx"),mockRequires:pt(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockRequires:ct(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:me(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=me(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:me(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=me(t,"turn_id"),n=me(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:me(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:me(t,"card_id"),candidateCardContent:ct(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:me(t,"card_id")})}}function fo(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:me(t,"token"),ref:me(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:me(t,"token"),reason:me(t,"reason")})}}function mo(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function a(u,f){let k=me(u,"board_id");if(!k)throw Object.assign(new Error(`${f} requires board_id`),{statusCode:400});if(k!==t)throw Object.assign(new Error(`Unknown board_id: ${k}`),{statusCode:400})}function c(u,f){let{cardId:k}=o.requireCardArgs(u),R=me(u,"turn_id");return a(u,f),n().manageAddChatAttachment({cardId:k,role:me(u,"role")||"user",...R?{turn:R}:{},files:[{file_name:me(u,"file_name"),content_type:me(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=>(a(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 f=me(u,"card_id"),k=me(u,"file_name"),R=me(u,"content_type")||"application/octet-stream",b=an(u);if(a(u,"manage.upload-card-file"),!f)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!k)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(f,k,R,b,{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:f}=o.requireCardArgs(u),k=me(u,"role")||"user",R=me(u,"turn_id");return a(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:f,role:k,...typeof u.text=="string"?{text:u.text}:{},...R?{turn:R}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:f}=o.requireCardArgs(u);return a(u,"manage.patch-card"),n().managePatchCard({cardId:f,patch:ct(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:f}=o.requireCardArgs(u);return a(u,"manage.upsert-card"),n().manageUpsertCard({cardId:f,candidateCardContent:ct(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:f}=o.requireCardArgs(u);return a(u,"manage.remove-card"),n().manageRemoveCard({cardId:f},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:f}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:f})}}},"manage.admin-upsert-card":u=>{let f=me(u,"board_id"),k=me(u,"card_id");if(!f)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!k)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(f!==t)throw Object.assign(new Error(`Unknown board_id: ${f}`),{statusCode:400});return n().adminUpsertCard({cardId:k,candidateCardContent:ct(u,"candidate_card_content")})}}}function at(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 po(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 Fe(e){return Array.isArray(e)?e:[]}function Zr(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 Xr(e,t){let r=z(e.view);return {elements:Fe(r.elements).map((o,a)=>{let c=z(o),u=z(c.data),f=typeof c.visible=="string"?!!Zr(t,c.visible):true,k=typeof u.bind=="string"?u.bind:void 0,R=typeof u.maxRows=="number"?u.maxRows:void 0,b=k?Zr(t,k):void 0,S={id:typeof c.id=="string"&&c.id?c.id:`element-${a}`,kind:c.kind,label:c.label,visible:f};return b!==void 0&&(S.resolved=Array.isArray(b)&&typeof R=="number"?b.slice(0,R):b),S})}}function go(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Fe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],a={};for(let c of o){let u=z(c),f=typeof u.bindTo=="string"?u.bindTo:"",k=typeof u.ref=="string"?u.ref:"";if(!f||!k)continue;let R=Zr(t,k);R!==void 0&&(a[f]=R);}return a}function Sa(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 wa(e){return {"card-content":e}}function br(e){let t={...e};return delete t.__private,t}function va(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Aa(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function xa(e,t){let r=Aa(e);if(!t||Object.keys(t).length===0)return r;function n(o,a,c){let u=String(a||"").split(".").filter(Boolean);if(!u.length)return;let f=o;for(let k=0;k<u.length-1;k+=1){let R=u[k];(!f[R]||typeof f[R]!="object")&&(f[R]={}),f=f[R];}f[u[u.length-1]]=c;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,a=z(r.view),c=Fe(a.elements);for(let u of c){let f=z(z(u).data);if(typeof f.writeTo=="string"&&f.writeTo){o=f.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,a]of Object.entries(t))o!=="_stagedFiles"&&(a!==null&&typeof a=="object"&&!Array.isArray(a)&&r[o]!==null&&typeof r[o]=="object"&&!Array.isArray(r[o])?r[o]={...r[o],...a}:r[o]=a);return r}function Sr(e){return z(e.__private).visible_controlplane_only===true}async function Pt(e,t){let r=await ze(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 yo(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:a,sourceFetchDone:c,sourceFetchFailed:u,uploadCardFile:f,buildFileDownloadUrl:k,readFetchedSourceJsonByRef:R}=e;function b(y,P){if(typeof y=="function")return y;throw new Error(`${P} is not configured for this MCP facade`)}async function S(){let y=await ze(n.get({}),"cardStore.get");return Array.isArray(y.cards)?y.cards.map(P=>z(P)).filter(P=>!Sr(P)):[]}function _(y){if(Array.isArray(y.bytes))return new Uint8Array(y.bytes.map(P=>Math.max(0,Math.min(255,Number(P)||0))));if(typeof y.text=="string")return new TextEncoder().encode(y.text);if(typeof y.base64=="string"){let P=String(y.base64).replace(/-/g,"+").replace(/_/g,"/"),q=P+"=".repeat((4-P.length%4)%4),D=atob(q);return Uint8Array.from(D,M=>M.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function T(){let y=z(await ze(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:y.version,commonSourceFields:z(y.commonSourceDefFields),sourceKinds:z(y.sourceKinds)}}async function I(){let y=z(await ze(t.status({}),"status")),P=z(y.summary),q=Fe(y.cards),D=await ze(n.get({}),"cardStore.get"),M=new Set((Array.isArray(D.cards)?D.cards.map(z):[]).filter(Sr).map(se=>typeof se.id=="string"?se.id:"").filter(Boolean)),$=q.filter(se=>!M.has(String(z(se).name??"")));return {meta:z(y.meta),summary:{card_count:typeof P.card_count=="number"?P.card_count:0,completed:typeof P.completed=="number"?P.completed:0,eligible:typeof P.eligible=="number"?P.eligible:0,pending:typeof P.pending=="number"?P.pending:0,blocked:typeof P.blocked=="number"?P.blocked:0,in_progress:typeof P.in_progress=="number"?P.in_progress:0,failed:typeof P.failed=="number"?P.failed:0,unresolved:typeof P.unresolved=="number"?P.unresolved:0},cards:$.map(se=>{let ce=z(se);return {"card-id":typeof ce.name=="string"?ce.name:null,status:ce.status??null,error:ce.error??null,requires:Fe(ce.requires),requires_satisfied:Fe(ce.requires_satisfied),requires_missing:Fe(ce.requires_missing),provides_declared:Fe(ce.provides_declared),provides_runtime:Fe(ce.provides_runtime)}})}}async function A(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let q=z(await ze(t.status({}),"status")),M=Fe(q.cards).map(z).find(he=>he.name===P);if(!M)throw new Error(`card "${P}" not found in board status`);let $=z(await Pt(n,P)),se=br($),ce=Fe(M.requires_satisfied).filter(he=>typeof he=="string"&&!!he),be=Fe(M.provides_runtime).filter(he=>typeof he=="string"&&!!he),Te=Object.fromEntries(await Promise.all(ce.map(async he=>[he,await ze(t.getOutputsDataObject({params:{key:he}}),`getOutputsDataObject(${he})`)]))),_e=Object.fromEntries(await Promise.all(be.map(async he=>[he,await ze(t.getOutputsDataObject({params:{key:he}}),`getOutputsDataObject(${he})`)]))),pe=z(await ze(t.getOutputsComputedValues({params:{key:P}}),"getOutputsComputedValues")),ke=await ze(t.getOutputsFetchedSources({params:{key:P}}),"getOutputsFetchedSources"),Ve=Fe($.source_defs).map(z),Se={};for(let he of Ve)typeof he.bindTo=="string"&&typeof he.outputFile=="string"&&(Se[he.outputFile]=he.bindTo);let Ke={};for(let[he,et]of Object.entries(ke)){let Je=Se[he]??he;if(!R||typeof et!="string"){Ke[Je]=null;continue}try{Ke[Je]=R({cardId:P,ref:et});}catch{Ke[Je]=null;}}let qe={card_data:z($.card_data),requires:Te,fetched_sources:Ke,computed_values:pe};return {cardId:P,card_status_in_board:M,card_definition_and_static_data:se,refs_for_fetched_source_files:ke,runtime_data:{requires:Te,provides:_e,computed_values:pe,rendered_view:Xr($,qe)}}}async function g(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("inspectChatMessagesOnCards requires cardId");let q=typeof y.turnId=="string"?y.turnId:"",D=y.allTurns===true,M=typeof y.tailTurnsBeforeId=="string"?y.tailTurnsBeforeId:"",$=D?void 0:y.lastUserTurns??(q?void 0:1),se=y.tail,ce={...$===void 0?{}:{tailTurns:$},...q?{turnId:q}:{},...D?{allTurns:true}:{},...M?{tailTurnsBeforeId:M}:{}},be=Object.keys(ce).length>0?{params:{cardId:P},body:ce}:{params:{cardId:P}},Te=at(await o.readAll(be),"chatStore.readAll"),_e=z(await Pt(n,P)),pe=Fe(z(_e.card_data).files).map((Se,Ke)=>({idx:Ke,stored_name:z(Se).stored_name})).filter(Se=>typeof Se.stored_name=="string"&&Se.stored_name.length>0),Ve=(Array.isArray(Te.records)?Te.records:[]).map(Se=>{let qe=z(Se.payload),he={...Se},et=typeof Se?.role=="string"?Se.role:typeof qe.role=="string"?String(qe.role):"",Je=typeof Se?.text=="string"?Se.text:typeof qe.text=="string"?String(qe.text):"";if(et==="system"){let tt=Sa(Je);if(tt!==null&&pe.some(j=>j.idx===tt)){let j=`Retrieve using inspect-file-contents --card-id ${P} --file-idx ${tt}`;he.retrieval_hint=j,Object.keys(qe).length>0&&typeof Se.role!="string"&&(he.payload={...qe,retrieval_hint:j});}}return he});return {cardId:P,messages:typeof se=="number"&&se>=0?Ve.slice(-se):Ve}}async function l(y){let P=String(y.cardId||"").trim(),q=Number(y.fileIdx);if(!P)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 D=z(await Pt(n,P)),M=Fe(z(D.card_data).files).map(z);if(q>=M.length)throw new Error(`attachment index ${q} is out of range for card "${P}"`);let $=M[q],se=typeof $.stored_name=="string"?$.stored_name:null;return {cardId:P,fileIdx:q,downloadUrl:k({cardId:P,fileIdx:q,storedName:se}),...typeof $.name=="string"?{name:$.name}:{},...typeof $.stored_name=="string"?{stored_name:$.stored_name}:{},...typeof $.mime_type=="string"?{mime_type:$.mime_type}:{},...typeof $.size=="number"?{size:$.size}:{},...typeof $.uploaded_at=="string"?{uploaded_at:$.uploaded_at}:{}}}async function i(y){return await r.validateCardPreflight({body:wa(y.candidateCardContent)})}function d(y){if(!y.mockRequires||typeof y.mockRequires!="object"||Array.isArray(y.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!y.mockFetchedSources||typeof y.mockFetchedSources!="object"||Array.isArray(y.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let P=r.evalCardCompute({body:{"card-content":y.candidateCardContent,"mock-requires":y.mockRequires,"mock-fetched-sources":y.mockFetchedSources}});if(P.status!=="success")return P;let q=z(po(P,"evalCardCompute")),D=z(y.candidateCardContent),M={card_data:z(D.card_data),requires:z(y.mockRequires),fetched_sources:z(y.mockFetchedSources),computed_values:z(q.computed_values)};return {status:"success",data:{cardId:typeof q.cardId=="string"?q.cardId:typeof D.id=="string"?D.id:"(unknown)",ok:q.ok===true,computed_values:z(q.computed_values),errors:Fe(q.errors).map($=>{let se=z($);return {bindTo:typeof se.bindTo=="string"?se.bindTo:"",error:typeof se.error=="string"?se.error:""}}),provides_outputs:go(D,M),rendered_view:Xr(D,M)}}}async function m(y){return await r.probeSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":y.candidateCardContent,"mock-projections":y.mockProjections}})}async function p(y){return await r.runSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":y.candidateCardContent,"mock-projections":y.mockProjections}})}async function h(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!y.mockRequires||typeof y.mockRequires!="object"||Array.isArray(y.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let q=z(await Pt(n,P)),D=Fe(q.source_defs).filter($=>!!$&&typeof $=="object"&&!Array.isArray($)),M={};if(y.sourceIdx>=0&&y.sourceIdx<D.length){let $=D[y.sourceIdx],se=We.enrichSourcesSync([$],{card_data:z(q.card_data),requires:y.mockRequires});Array.isArray(se)&&se.length>0&&(M=z(se[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":q,"mock-requires":y.mockRequires,"mock-projections":M}})}async function w(y){let P=z(await ze(r.simulateCardCycle({body:{"card-content":y.candidateCardContent,"mock-requires":y.mockRequires}}),"simulateCardCycle")),q=z(y.candidateCardContent),D=z(P.validation),M=Fe(P.source_probes),$=Fe(P.projection_errors),se=z(P.fetched_sources),ce=Fe(P.compute_errors),be=z(P.computed_values),Te={card_data:z(q.card_data),requires:y.mockRequires,fetched_sources:se,computed_values:be},_e=[];for(let pe of Fe(D.issues))typeof pe=="string"&&pe&&_e.push(pe);for(let pe of M){let ke=z(pe),Ve=typeof ke.bindTo=="string"?ke.bindTo:"source",Se=typeof ke.error=="string"?ke.error:"";Se&&_e.push(`${Ve}: ${Se}`);}for(let pe of $){let ke=z(pe),Ve=typeof ke.bindTo=="string"?ke.bindTo:"source",Se=typeof ke.key=="string"?ke.key:"projection",Ke=typeof ke.error=="string"?ke.error:"projection failed";_e.push(`${Ve}.${Se}: ${Ke}`);}for(let pe of ce){let ke=z(pe),Ve=typeof ke.bindTo=="string"?ke.bindTo:"compute",Se=typeof ke.error=="string"?ke.error:"compute failed";_e.push(`${Ve}: ${Se}`);}return {status:"success",data:{cardId:typeof P.cardId=="string"?P.cardId:"(unknown)",ok:P.ok===true,issues:_e,provides_outputs:go(q,Te),rendered_view:Xr(q,Te)}}}async function O(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("manageReadCard requires cardId");let q=await ze(n.get({params:{id:P}}),"cardStore.get");return (Array.isArray(q.cards)?q.cards.map(z):[]).map(M=>br(M))}async function N(y){let P=await Promise.all(Fe(y.files).map(async q=>{let D=z(q),M=String(D.file_name??D.fileName??D.name??"").trim(),$=String(D.content_type??D.contentType??"application/octet-stream");if(!M)throw new Error("file entry requires file_name");return await f({cardId:y.cardId,fileName:M,contentType:$,bytes:_(D),suppressChatRecordWrite:true})}));for(let[q,D]of P.entries()){let M=z(D.file),$=typeof D.file_idx=="number"&&Number.isInteger(D.file_idx)&&D.file_idx>=0?D.file_idx:q,se=y.role==="assistant"?`AI generated: ${String(M.name||"")} as ${String(M.stored_name||"")} #${$}`:`file uploaded: ${String(M.name||"")} as ${String(M.stored_name||"")} #${$}`;at(await o.append({params:{cardId:y.cardId},body:{role:"system",text:se,files:[],turn:y.turn}}),"chatStore.append(system attachment message)");}return P.map(q=>q.file)}async function U(y){let P=String(y.cardId||"").trim(),q=String(y.role||"user").trim()||"user",D=typeof y.turn=="string"?y.turn:"";if(!P)throw new Error("manageAddChatAttachment requires cardId");let M=await N({cardId:P,role:q,turn:D,files:y.files});return {status:"success",data:{cardId:P,turn:D,files:M}}}async function J(y){let P=String(y.cardId||"").trim(),q=String(y.role||"").trim(),D=typeof y.text=="string"?y.text:"",M=typeof y.turn=="string"?y.turn:"";if(!P)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!q)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(q==="assistant"&&M){let ce=at(await o.readAll({params:{cardId:P},body:{turnId:M}}),"chatStore.readAll(existing turn messages)"),be=Array.isArray(ce.records)?ce.records.find(Te=>Te.role==="assistant"&&String(Te.turn||"")===M):void 0;if(be)return {status:"success",data:{cardId:P,id:String(be.id),role:q,turn:M,files:Array.isArray(be.files)?be.files:[]}}}let $=await N({cardId:P,role:q,turn:M,files:y.files}),se=at(await o.append({params:{cardId:P},body:{role:q,text:D,files:$,turn:M}}),"chatStore.append");return {status:"success",data:{cardId:P,id:String(se.id),role:q,turn:M,files:$}}}async function ae(y,P={}){let q=String(y.cardId||"").trim(),D=z(y.patch);if(!q)throw new Error("managePatchCard requires cardId");let M=await O({cardId:q}),$=z(M[0]),se=xa($,D);return Q({cardId:q,candidateCardContent:se},P)}async function Q(y,P={}){let q=String(y.cardId||"").trim(),D=z(y.candidateCardContent),M=br(D);if(!q)throw new Error("manageUpsertCard requires cardId");if(typeof M.id!="string"||!M.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(M.id!==q)throw new Error(`candidateCardContent.id must match cardId (${q})`);let $=null;try{$=await i({candidateCardContent:M});}catch(pe){let ke=pe instanceof Error?pe.message:String(pe);if(!/non-core adapter is not configured/i.test(ke))throw pe;$=null;}if($!==null){let pe=z($),ke=z(pe.data);if(pe.status!=="success"||ke.isValid!==true)return {status:"fail",step:"validate",validation:$}}let se=null;try{se=await Pt(n,q);}catch{se=null;}let ce=se?z(se):null;if(ce&&Sr(ce)&&!P.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${q}" not found`),{statusCode:404});let be={...M,...ce&&va(ce,"__private")?{__private:ce.__private}:{}},Te=await n.set({body:be});at(Te,"cardStore.set");let _e;try{_e=await t.upsertCard({params:{cardId:q,restart:!0}}),at(_e,"upsertCard");}catch(pe){try{se&&await n.set({body:se});}catch{}throw pe}return {status:"success",data:{validation:$,card_saved:null,board_result:_e}}}async function te(y,P={}){let q=String(y.cardId||"").trim();if(!q)throw new Error("manageRemoveCard requires cardId");if(!P.allowControlplaneOnlyCards){let $=await ze(n.get({params:{id:q}}),"cardStore.get");if((Array.isArray($.cards)?$.cards.map(z):[]).some(Sr))throw Object.assign(new Error(`Card "${q}" not found`),{statusCode:404})}let D=await t.removeCard({params:{id:q}});at(D,"removeCard");let M=await n.del({params:{id:q}});return at(M,"cardStore.del"),{status:"success",data:{board_result:D,store_result:M}}}async function ue(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("adminReadCard requires cardId");let q=await ze(n.get({params:{id:P}}),"cardStore.get");return Array.isArray(q.cards)?q.cards.map(D=>z(D)):[]}async function G(y){let P=String(y.cardId||"").trim(),q=z(y.candidateCardContent),D=br(q);if(!P)throw new Error("adminUpsertCard requires cardId");if(typeof D.id!="string"||!D.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(D.id!==P)throw new Error(`candidateCardContent.id must match cardId (${P})`);let M=await i({candidateCardContent:D}),$=z(M),se=z($.data);if($.status!=="success"||se.isValid!==true)return {status:"fail",step:"validate",validation:M};let ce=null;try{ce=await Pt(n,P);}catch{ce=null;}let be=ce?z(z(ce).__private):{},Te={...D,__private:{...be,visible_controlplane_only:true}},_e=await n.set({body:Te});at(_e,"cardStore.set");let pe;try{pe=await t.upsertCard({params:{cardId:P,restart:!0}}),at(pe,"upsertCard");}catch(ke){try{ce&&await n.set({body:ce});}catch{}throw ke}return {status:"success",data:{validation:M,card_saved:null,board_result:pe}}}async function Z(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("getChatProcessing requires cardId");let q=po(await o.isProcessing({params:{cardId:P}}),"chatStore.isProcessing");return {cardId:P,active:!!q.active}}async function re(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("setChatProcessing requires cardId");if(typeof y.active!="boolean")throw new Error("setChatProcessing requires boolean active");return at(await o.setProcessing({params:{cardId:P},body:{active:y.active}}),"chatStore.setProcessing"),{cardId:P,active:y.active}}async function B(){let y=await b(a,"webhook.process-accumulated")();return y?.status==="fail"||y?.status==="error"?y:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(y??{},"data")?y.data??null:null}}}async function x(y){let P=String(y.token||"").trim(),q=String(y.ref||"").trim();if(!P)throw new Error("webhookSourceFetchDone requires token");if(!q)throw new Error("webhookSourceFetchDone requires ref");let D=await b(c,"webhook.source-fetch-done")({token:P,ref:q});return D?.status==="fail"||D?.status==="error"?D:{status:"success",data:{token:P,ref:q,runtime_result:Object.prototype.hasOwnProperty.call(D??{},"data")?D.data??null:null}}}async function K(y){let P=String(y.token||"").trim(),q=String(y.reason||"").trim();if(!P)throw new Error("webhookSourceFetchFailed requires token");if(!q)throw new Error("webhookSourceFetchFailed requires reason");let D=await b(u,"webhook.source-fetch-failed")({token:P,reason:q});return D?.status==="fail"||D?.status==="error"?D:{status:"success",data:{token:P,reason:q,runtime_result:Object.prototype.hasOwnProperty.call(D??{},"data")?D.data??null:null}}}return {listRuntimeCards:S,discoverSourceKinds:T,inspectBoardRuntimeStatus:I,inspectCardDefinitionAndRuntime:A,inspectChatMessagesOnCards:g,inspectFileContents:l,preflightValidateCandidateCardDefinition:i,preflightMaterializeCandidateCard:d,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:h,preflightRunOneCycleWithCandidateCard:w,manageReadCard:O,manageAddChatAttachment:U,manageAddChatEntryAndAnyAttachments:J,managePatchCard:ae,manageUpsertCard:Q,manageRemoveCard:te,adminReadCard:ue,adminUpsertCard:G,getChatProcessing:Z,setChatProcessing:re,webhookProcessAccumulated:B,webhookSourceFetchDone:x,webhookSourceFetchFailed:K}}async function ze(e,t){return at(await e,t)}function ho(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:a,readCardRuntimeArtifacts:c,readCardFromStore:u,readCardDefinitions:f,processAccumulatedLaneInternal:k,reportSourceFetched:R,reportSourceFetchFailure:b,uploadCardFile:S,chatStorePublic:_,serverUrl:T,apiBasePath:I}=e;function A(){return t[0]??null}function g(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let p=m?.params?.key;return p?{status:"success",data:(await a())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let p=m?.params?.key;return p?{status:"success",data:(await c())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let p=m?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let h=n(p)??A();return h?h.boardOps.getOutputsFetchedSources({params:{key:p}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let p=m?.params?.id;if(!p)return {status:"fail",error:"removeCard requires params.id"};let h=n(p)??A();return h?h.boardOps.removeCard({params:{id:p}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"upsertCard requires params.cardId"};let h=n(p)??A();if(!h)return {status:"fail",error:"Board context is unavailable"};let w=await h.boardOps.upsertCard({params:{cardId:p,restart:m.params.restart===true}});if(w.status!=="success")return w;if(rt(h.boardAdapter)){let O=await k(true);if(O.status!=="success")return O}return w}}}function l(){let m=()=>{let p=A();if(!p?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return p.nonCore};return {describeTaskExecutorCapabilities(p){return m().describeTaskExecutorCapabilities(p)},validateCardPreflight(p){return m().validateCardPreflight(p)},evalCardCompute(p){return m().evalCardCompute(p)},probeSourcePreflight(p){return m().probeSourcePreflight(p)},runSourcePreflight(p){return m().runSourcePreflight(p)},simulateCardCycle(p){return m().simulateCardCycle(p)}}}function i(){return {async get(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(p){let h=await u(p);return h?{status:"success",data:{cards:[h]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await f()}}},async set(m){let p=m.body;if(p==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let h=Array.isArray(p)?p:[p];for(let w of h){let O=w,N=typeof O.id=="string"?O.id:"";if(!N)return {status:"fail",error:"each card must have a string `id` field"};let U=r.get(N)??0,J=t[U]??A();if(!J)return {status:"fail",error:"Board context is unavailable"};let ae=await J.cardStoreOps.set({body:O});if(ae.status!=="success")return ae;r.set(N,U);}return {status:"success",data:{count:h.length}}},async del(m){let p=[m.params?.id,...m.body?.ids??[]].filter(h=>typeof h=="string"&&!!h);if(p.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let h of p){let w=n(h)??A();if(!w)return {status:"fail",error:"Board context is unavailable"};let O=await w.cardStoreOps.del({params:{id:h}});if(O.status!=="success")return O;r.delete(h);}return {status:"success",data:{count:p.length}}},async patch(m){let p=typeof m.params?.id=="string"?m.params.id:void 0,h=typeof m.params?.path=="string"?m.params.path:void 0;if(!p||!h)return {status:"fail",error:"patch requires params.id and params.path"};let w=n(p)??A();return w?w.cardStoreOps.patch(m):{status:"fail",error:"Board context is unavailable"}},async appendFiles(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(!p)return {status:"fail",error:"appendFiles requires params.id"};let h=n(p)??A();return h?h.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function d(){return yo({board:g(),nonCore:l(),cardStore:i(),chatStore:_,processAccumulated:()=>k(true),sourceFetchDone:({token:m,ref:p})=>R(m,p),sourceFetchFailed:({token:m,reason:p})=>b(m,p),uploadCardFile({cardId:m,fileName:p,contentType:h,bytes:w,suppressChatRecordWrite:O}){return S(m,p,h,w,{inChat:true,...O===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:p,storedName:h}){let w=`${T||""}${I}/cards/${encodeURIComponent(m)}/files/${p}`;return h?`${w}?sn=${encodeURIComponent(h)}`:w},readFetchedSourceJsonByRef({cardId:m,ref:p}){let h=n(m)??A();if(!h||rt(h.boardAdapter))return null;let N=h.boardAdapter.resolveBlob(it(p)).trim();return N?JSON.parse(N):null}})}return {mcpBoardFacade:g,mcpNonCoreFacade:l,mcpCardStoreFacade:i,createMcpFacade:d}}function Ro(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:a,createMcpToolRegistry:c,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:f,sliceTextByLines:k}=e;async function R(b,S,_){let T=b.method||"GET",I=_,A=I.pathname;try{if(T==="POST"&&A===`${t}/mcp`){await o();let g=await n(b),l=typeof g.tool=="string"?g.tool.trim():"",i=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!l)return r(S,400,{error:"tool is required"}),!0;if(l==="inspect.file-contents")return r(S,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let d=await gt(l,i,c(a()));if(d&&typeof d=="object"&&!Array.isArray(d)){let m=d;if(m.status==="fail")return r(S,400,{error:nt(d,"Request failed")}),!0;if(m.status==="error")return r(S,500,{error:nt(d,"Internal error")}),!0}r(S,200,d);}catch(d){let m=typeof d?.statusCode=="number"?Number(d.statusCode):500,p=d instanceof Error?d.message:String(d);r(S,m,{error:p});}return !0}if(T==="POST"&&A===`${t}/mcp-raw`){await o();let g=await n(b),l=typeof g.tool=="string"?g.tool.trim():"",i=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!l)return r(S,400,{error:"tool is required"}),!0;if(l!=="inspect.file-contents")return r(S,400,{error:`Tool does not support raw response: ${l}`}),!0;let d=me(i,"card_id","cardId"),m=ut(i,"file_idx","fileIdx"),p=ut(i,"head-lines","headLines"),h=ut(i,"tail-lines","tailLines"),w=ut(i,"head-bytes","headBytes"),O=ut(i,"tail-bytes","tailBytes");if(!d)return r(S,400,{error:"inspect.file-contents requires card_id"}),!0;if(m===void 0||!Number.isInteger(m)||m<0)return r(S,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([p,h,w,O].filter(B=>B!==void 0).length>1)return r(S,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[B,x]of [["head-lines",p],["tail-lines",h],["head-bytes",w],["tail-bytes",O]])if(x!==void 0&&(!Number.isInteger(x)||x<0))return r(S,400,{error:`inspect.file-contents requires ${B} to be a non-negative integer`}),!0;let U=await a().inspectFileContents({cardId:d,fileIdx:m}),J=typeof U?.stored_name=="string"?U.stored_name:null,{fileRecord:ae,bytes:Q}=await u(d,m,J),te=String(ae.name||ae.stored_name||"download.bin"),ue=String(ae.mime_type||"application/octet-stream"),G=(I.searchParams.get("resp")||"").trim().toLowerCase();if(G&&G!=="json-b64")return r(S,400,{error:`unsupported resp mode: ${G}`}),!0;let Z=G==="json-b64",re;if(p!==void 0||h!==void 0){if(!f(ue))return r(S,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let B=new TextDecoder().decode(Q),x=p!==void 0?k(B,"head",p):k(B,"tail",h);re=typeof Buffer<"u"?Buffer.from(x,"utf8"):new TextEncoder().encode(x);}else if(w!==void 0||O!==void 0){let B=w??O;re=w!==void 0?Q.slice(0,B):Q.slice(Math.max(0,Q.length-B));}else re=Q;if(Z){let B=typeof Buffer<"u"?Buffer.from(re).toString("base64"):btoa(String.fromCharCode(...re));return r(S,200,{bodyBase64:B,mimeType:ue,filename:te,byteLength:re.length}),!0}return S.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${te}"`,"Content-Length":re.length}),S.end(re),!0}return !1}catch(g){let l=g?.statusCode||500;return r(S,l,{error:String(g?.message||g)}),true}}return {handleAgentfaceApi:R}}function ko(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:a}=e;async function c(u,f,k){let R=u.method||"GET",b=k.pathname;try{if(R==="POST"&&b===`${t}/mcp-webhooks`){await o();let S=await n(u),_=typeof S.tool=="string"?S.tool.trim():"",T=S.args&&typeof S.args=="object"&&!Array.isArray(S.args)?S.args:{};if(!_)return r(f,400,{error:"tool is required"}),!0;try{let I=await gt(_,T,a());if(I&&typeof I=="object"&&!Array.isArray(I)){let A=I;if(A.status==="fail")return r(f,400,{error:nt(I,"Request failed")}),!0;if(A.status==="error")return r(f,500,{error:nt(I,"Internal error")}),!0}r(f,200,I);}catch(I){let A=typeof I?.statusCode=="number"?Number(I.statusCode):500,g=I instanceof Error?I.message:String(I);r(f,A,{error:g});}return !0}return !1}catch(S){let _=S?.statusCode||500;return r(f,_,{error:String(S?.message||S)}),true}}return {handleWebhooksApi:c}}function en(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:a,onChannelSubscribed:c,onChannelUnsubscribed:u}=e;function f(R,b,S,_,T){if(!t.has(b)){n(R,404,{error:`SSE client not connected: ${b}`});return}T?(t.subscribeChannel(b,S,_.cardId),c?.(b,S,_)):(t.unsubscribeChannel(b,S,_.cardId),u?.(b,S,_)),n(R,200,{ok:true,clientId:b,channelName:S,..._.cardId?{cardId:_.cardId}:{},subscribed:T});}async function k(R,b,S,_){let T=_?.oneShot===true,I=_?.bootstrapPayload!==false,A=!T&&S?t.get(S):null,g=A?new Set(A.subscribedChatCardIds):new Set,l=A?new Set(A.subscribedChannelNames):new Set,i=A?new Map(Array.from(A.subscribedCardChannels.entries(),([m,p])=>[m,new Set(p)])):new Map;if(b.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(b),I){let m=await o(),p=t.buildFrame(m);b.write(p);}if(T){b.end();return}if(!S)throw new Error("clientId is required for streaming SSE");t.register(S,b,{subscribedChatCardIds:g,subscribedChannelNames:l,subscribedCardChannels:i});try{a?.(S,m=>{t.writeFrame(S,m);});}catch{}let d=setInterval(()=>{try{b.write(`: keepalive
|
|
5
5
|
|
|
6
|
-
`);}catch{}},15e3);k.on("close",()=>{clearInterval(d),t.disconnect(b,S);});}return {handleChannelSubscription:f,handleSse:g}}function ko(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,boardContexts:c,publishPersistedStateSnapshot:u,upsertCardsFromSource:f,sseHub:g,queueSseHub:k}=e,{handleSse:S,handleChannelSubscription:b}=Yr(e),{handleSse:O}=Yr({...e,sseHub:k,buildPublishedRuntimePayload:async()=>null});async function P(_,v,y){let l=_.method||"GET",i=y,d=i.pathname;try{if(l==="GET"&&d===`${t}/sse`){let B=i.searchParams.has("one-shot");await o();let j=String(i.searchParams.get("clientId")||"").trim();if(!B&&!j)return r(v,400,{error:"clientId query param is required for SSE"}),!0;if(await S(_,v,j||void 0,{oneShot:B}),B)return !0;for(let U=0;U<c.length;U++)await u(c[U]),await f(c[U],U),await u(c[U]);return !0}if(l==="GET"&&d===`${t}/sse-q`){let B=String(i.searchParams.get("clientId")||"").trim();return B?(await O(_,v,B,{bootstrapPayload:!1}),!0):(r(v,400,{error:"clientId query param is required for SSE"}),!0)}let m=d.match(new RegExp(`^${at(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(l==="POST"&&m){await s();let B=decodeURIComponent(m[1]),j=await n(_),U=typeof j?.clientId=="string"?j.clientId.trim():"";return U?await g.subscribeChat(U,B)?(r(v,200,{ok:!0,clientId:U,cardId:B,subscribed:!0}),!0):(r(v,404,{error:`SSE client not connected: ${U}`}),!0):(r(v,400,{error:"clientId is required"}),!0)}let p=d.match(new RegExp(`^${at(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(l==="POST"&&p){await s();let B=decodeURIComponent(p[1]),j=await n(_),U=typeof j?.clientId=="string"?j.clientId.trim():"";return U?g.unsubscribeChat(U,B)?(r(v,200,{ok:!0,clientId:U,cardId:B,subscribed:!1}),!0):(r(v,404,{error:`SSE client not connected: ${U}`}),!0):(r(v,400,{error:"clientId is required"}),!0)}let R=d.match(new RegExp(`^${at(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&R){await s();let B=decodeURIComponent(R[1]),j=R[2]==="subscribe",U=await n(_),Q=typeof U?.clientId=="string"?U.clientId.trim():"";return Q?(b(v,Q,B,{},j),!0):(r(v,400,{error:"clientId is required"}),!0)}let w=d.match(new RegExp(`^${at(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&w){await s();let B=decodeURIComponent(w[1]),j=decodeURIComponent(w[2]),U=w[3]==="subscribe",Q=await n(_),ne=typeof Q?.clientId=="string"?Q.clientId.trim():"";return ne?(b(v,ne,j,{cardId:B},U),!0):(r(v,400,{error:"clientId is required"}),!0)}return !1}catch(m){let p=m?.statusCode||500;return r(v,p,{error:String(m?.message||m)}),true}}return {handleWatchersRoutes:P,handleSse:S,handleChannelSubscription:b}}var xa=3e4;function Ta(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function Co(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,s=`${t}/notify-q`;async function c(u,f,g){if(g.pathname!==s)return false;if((u.method??"").toUpperCase()!=="POST")return o(f,405,{status:"error",error:"Method not allowed"}),true;if(!Ta(u))return o(f,403,{status:"error",error:"Forbidden"}),true;let k;try{k=await n(u);}catch{return o(f,400,{status:"error",error:"Invalid JSON body"}),true}if(!k||typeof k!="object"||!Array.isArray(k.notifications))return o(f,400,{status:"error",error:"body.notifications must be an array"}),true;let S=k.notifications,{accepted:b,rejected:O}=ro(S,Date.now(),xa);return b.length>0&&r(b),o(f,200,{status:"success",data:{accepted:b.length,rejected:O}}),true}return {handleNotifyRoute:c}}var So={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},bo="chat-handler-flow-queue",Vt="__probe__echo__probe__";function Ia(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...So,...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,f=e.notificationTransport||null,g=e.serverUrl||null,k=e.executionExtra||{},S=e.onSseClientConnected,b=e.onSseClientDisconnected,O=e.onChannelSubscribed,P=e.onChannelUnsubscribed,_=Kr({buildChatOneShotBatch:async(a,C)=>await ce.buildSseOneShotBatch({params:{cardId:a},body:{receiving:C}}),onSseClientDisconnected:b}),v=Kr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function y(a){function C(ee){return {...ee,queueStorageForRef(me,Be){return Wn(ee.queueStorageForRef(me,Be),{lane:Be,emitNotification:se})}}}function x(ee){return {...ee,queueStorageForRef(me,Be){return Gn(ee.queueStorageForRef(me,Be),{lane:Be,emitNotification:se})}}}function H(ee){return {async get(me){return ee.get(me)},async set(me){return ee.set(me)},async del(me){return ee.del(me)},async patch(me){return ee.patch(me)},async appendFiles(me){return ee.appendFiles(me)}}}function D(ee){return {async get(me){return await ee.get(me)},async set(me){return await ee.set(me)},async del(me){return await ee.del(me)},async patch(me){return await ee.patch(me)},async appendFiles(me){return await ee.appendFiles(me)}}}let Z=null;function se(ee){if(ee.kind==="notification-batch"){J(ee.notifications,Z??void 0);return}J([ee],Z??void 0);}let re=Ze(a.boardAdapter)?x(a.boardAdapter):C(a.boardAdapter),$e=a.nonCoreAdapter??(!Ze(re)&&R(re)?re:null),be=Ze(re)?Qn(a.baseRef,re,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:se}):Ln(a.baseRef,re,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:se}),Je=a.nonCore??($e?Mn(a.baseRef,$e,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,taskExecutorRef:a.taskExecutorRef}):null),Jt=re.chatStorageForRef(a.chatStoreRef),Ft,vo=Ze(re)?(()=>{let ee=Cr(kr(Rr(re.kvStorageForRef(a.cardStoreRef)),re.hashFn),s.warn),me=gr(ee,{emitNotification:se}),Be=D(me);return Ft={get(Se){return Be.get(Se)},set(Se){return Be.set(Se)}},Be})():(()=>{let ee=re.kvStorageForRef(a.cardStoreRef),Be=mr(Dt({readIndex:()=>ee.read("_index"),writeIndex:Se=>ee.write("_index",Se),readCard:Se=>ee.read(Se),writeCard:(Se,Ar)=>(ee.write(Se,Ar),Se),removeCard:Se=>{ee.delete(Se);},cardExists:Se=>ee.read(Se)!==null,defaultCardKey:Se=>Se},s.warn),{emitNotification:se});return Ft=Be,H(Be)})(),vr;if(Ze(re)){let ee=re.blobStorageForRef(a.artifactsStoreRef);vr={async putBytes(me,Be){if(ee.writeBytes){await ee.writeBytes(me,Be);return}let Se=JSON.stringify({__kind:"bytes-array",data:[...Be]});await ee.write(me,Se);},async getBytes(me){if(ee.readBytes){let Se=await ee.readBytes(me);if(Se!==null)return Se}let Be=await ee.read(me);if(Be===null)return null;try{let Se=JSON.parse(Be);if(Se&&Se.__kind==="bytes-array"&&Array.isArray(Se.data))return new Uint8Array(Se.data)}catch{}return new TextEncoder().encode(Be)},async listKeys(me){return await ee.listKeys(me)}};}else {let ee=re.blobStorageForRef(a.artifactsStoreRef),me=Xn(ee);vr={putBytes(Be,Se,Ar){me.putBytes(Be,Se,Ar);},getBytes(Be){return me.getBytes(Be)},listKeys(Be){return me.list(Be).map(Se=>Se.key)}};}let Ao={async init(ee){return be.init(ee)},async status(ee){return be.status(ee)},async getConfig(ee){return be.getConfig(ee)},async getAllOutputsDataObjects(ee){return be.getAllOutputsDataObjects(ee)},async getAllOutputsComputedValues(ee){return be.getAllOutputsComputedValues(ee)},async getOutputsFetchedSources(ee){return be.getOutputsFetchedSources(ee)},async buildSseOneShotPayload(ee){return be.buildSseOneShotPayload(ee)},async upsertCard(ee){return be.upsertCard(ee)},async removeCard(ee){return be.removeCard(ee)},async sourceDataFetched(ee){return be.sourceDataFetched(ee)},async sourceDataFetchFailure(ee){return be.sourceDataFetchFailure(ee)}};return Z={label:a.label,board:be,nonCore:Je,publicCardStore:Ft,boardOps:Ao,cardStoreOps:vo,get filesArtifacts(){return vr},get chatStorage(){return Jt},boardAdapter:re,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:oo(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},Z}let l=e.boards.map(y),i=new Map;function d(a){return i.get(a)??0}function m(a){return a.queueStoreRef}function p(a,C){if(Ze(a.boardAdapter)){let H=a.boardAdapter.queueStorageForRef(m(a),C);return Dr(H)}let x=a.boardAdapter.queueStorageForRef(m(a),C);return Ur(x)}function R(a){let C=a;return typeof C.invokeExecutor=="function"&&typeof C.validateSchema=="function"}function w(a){let C=l[d(a)];return {files:C?C.filesArtifacts:null}}function B(){return Zn()}function j(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function U(a){return "cardId"in a&&typeof a.cardId=="string"?$(a.cardId)??void 0:l[0]??void 0}function Q(a){for(let C of a){let x=U(C);if(x)return x}return l[0]??void 0}function ne(a,C={}){if(!a||a.length===0)return;let x=Le(a),H={kind:"notification-batch",notifications:x},D=C.ctx??Q(x);if(C.appendState!==false&&D&&ao(D.notification,H),C.broadcastSse!==false){let Z=x.filter(re=>re.kind==="message_enqueued"),se=x.filter(re=>re.kind!=="message_enqueued");se.length>0&&_.broadcastNotificationBatch(se),Z.length>0&&v.broadcastNotificationBatch(Z);}if(!(C.mirrorExternal===false||!D?.boardAdapter.publishBoardChangeNotifications))try{let Z=x.filter(se=>se.category==="board-output"||se.category==="card-store");Z.length>0&&D.boardAdapter.publishBoardChangeNotifications(Z);}catch{}}function J(a,C){ne(a,{ctx:C,appendState:true,broadcastSse:true,mirrorExternal:true});}async function ae(a){if(!a||a.notificationTeardown||!f||!a.notifyRef)return;let C=await f.subscribe(a.notifyRef,x=>{let H=to(x);ne(H,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});});a.notificationTeardown=C;}async function ue(a){if(!a||a.initialized)return;let C={boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,artifactsStoreRef:a.artifactsStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef},x={};a.taskExecutorRef&&(x["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(x["chat-handler-flow"]=a.chatHandlerFlow);let H=await a.boardOps.init({params:C,body:x});if(H.status!=="success")throw Object.assign(new Error(H.error||`init failed for ${a.label}`),{statusCode:500});if(await ae(a),!a.chatHandlerFlow&&a.chatHandlerRef&&c.describe)try{let D=await c.describe(a.chatHandlerRef);D&&D.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${D.kind}", expected "chat-handler" for ${a.label}`):D&&s.info(`[init] chat-handler validated: ${D.name} (protocol ${D.protocolVersion}) for ${a.label}`);}catch(D){s.warn(`[init] chat-handler describe failed for ${a.label}: ${D?.message||String(D)}`);}a.initialized=true;}async function G(a){let C=[],x=await a.boardOps.status({});x.status==="success"&&x.data!=null&&Vr(x.data)&&C.push({kind:"status",status:x.data});let H=await a.boardOps.getAllOutputsDataObjects({});if(H.status==="success"&&H.data!=null)for(let[Z,se]of Object.entries(H.data))Z&&C.push({kind:"data_object",key:Z,payload:se});let D=await a.boardOps.getAllOutputsComputedValues({});if(D.status==="success"&&D.data!=null)for(let[Z,se]of Object.entries(D.data))Z&&se&&typeof se=="object"&&!Array.isArray(se)&&C.push({kind:"computed_values",cardId:Z,values:se});C.length>0&&ne(C,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});}async function X(a,C){if(!a||a.cardsBootstrapped)return;let x=await a.cardStoreOps.get({}),H=x.status==="success"&&Array.isArray(x.data?.cards)?x.data.cards:[];for(let D of H)typeof D.id=="string"&&(i.set(D.id,C),await a.boardOps.upsertCard({params:{cardId:D.id}}));a.cardsBootstrapped=true;}async function Y(){for(let a of l)await ue(a);}async function E(){await Y();for(let a=0;a<l.length;a++)await G(l[a]),await X(l[a],a),await G(l[a]);}async function T(a=false){a||await Y();for(let C of l){let x=await C.board.processAccumulatedEvents({});if(x.status!=="success")return x}return {status:"success"}}function $(a){return l[d(a)]??null}async function h(a){let C=$(a);if(!C)return null;let x=await C.cardStoreOps.get({params:{id:a}});if(x.status!=="success")return null;let H=Array.isArray(x.data?.cards)?x.data.cards:[];return H.length>0?H[0]:null}async function I(){let a=async x=>{if(!x)return [];let H=await x.cardStoreOps.get({});return H.status!=="success"||!Array.isArray(H.data?.cards)?[]:H.data.cards},C=[];for(let x of l)C.push(...await a(x));return C}function F(){return l[0]??null}function M(a){return $(a)??F()}function N(a){let C=M(a);if(!C)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${a}`),{statusCode:404});return C.chatStorage}async function K(a){return await N(a).isProcessing(a)}async function te(a,C){let x=await ce.setProcessing({params:{cardId:a},body:{active:C}});if(x.status!=="success")throw Object.assign(new Error(x.error||`Failed to set chat processing for card: ${a}`),{statusCode:500})}let ce=eo({append(a,C,x,H,D){return N(a).append(a,C,x,H,D)},readAll(a){return N(a).readAll(a)},readAfter(a,C){return N(a).readAfter(a,C)},clear(a){return N(a).clear(a)},setProcessing(a,C){return N(a).setProcessing(a,C)},isProcessing(a){return N(a).isProcessing(a)},getConfig(a){return N(a).getConfig(a)},setConfig(a,C){return N(a).setConfig(a,C)}},{emitNotification(a){if(a.kind==="notification-batch"){J(a.notifications);return}J([a]);}}),Ae=yo({boardContexts:l,cardOwnerIndex:i,cardContextForCard:a=>$(a),readStatusSnapshot:()=>Ve(),readDataObjectsByToken:()=>Ye(),readCardRuntimeArtifacts:()=>ge(),readCardFromStore:a=>h(a),readCardDefinitions:()=>I(),processAccumulatedLaneInternal:a=>T(a),reportSourceFetched:(a,C)=>At(a,{ref:C}),reportSourceFetchFailure:(a,C)=>Bt(a,{reason:C}),uploadCardFile:(a,C,x,H,D)=>de(a,C,x,H,D),chatStorePublic:ce,serverUrl:g,apiBasePath:t}),Ie=Ae.mcpCardStoreFacade,ve=Ae.createMcpFacade,ye=so({boardId:o,bootstrapBoard:()=>E(),sseHub:_,onChannelSubscribed:O,onChannelUnsubscribed:P,getMcpFacade:()=>ve(),getMcpCardStoreFacade:()=>Ie()});function he(a){return co(a)}function Ue(){return lo(ve())}function Ce(){return fo({boardId:o,uploadCardFile:de,getMcpFacade:()=>ve(),controlplane:ye})}let De=io({boardId:o,boardContexts:l,readChatRecords:a=>V(a),getChatProcessing:a=>K(a)}),Ve=De.readStatusSnapshot,ge=De.readCardRuntimeArtifacts,Ye=De.readDataObjectsByToken,Ke=De.buildPublishedRuntimePayload;async function nt(a,C,x){let H=x?.syncBoard!==false,D=x?.restartOnlyIfChanged===true,Z=$(a);if(!Z)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let se=await h(a);if(!se)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let re=D?JSON.stringify(se):null,$e=C(se)||se;if(D&&JSON.stringify($e)===re)return;let be=await Z.cardStoreOps.set({body:$e});if(be.status!=="success")throw Object.assign(new Error(be.error||`Failed to persist card: ${a}`),{statusCode:500});if(H){let Je=await Z.boardOps.upsertCard({params:{cardId:a,restart:true}});if(Je.status!=="success")throw Object.assign(new Error(Je.error||`Failed to upsert card: ${a}`),{statusCode:500})}}async function St(a,C){await nt(a,C,{syncBoard:true});}async function L(a,C){await nt(a,C,{syncBoard:false});}async function A(a){let C=$(a);if(!C)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});if(!await h(a))throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let H=await C.boardOps.upsertCard({params:{cardId:a,restart:true}});if(H.status!=="success")throw Object.assign(new Error(H.error||`Failed to retrigger card: ${a}`),{statusCode:500})}async function W(a){let C=await ce.clear({params:{cardId:a}});if(C.status!=="success")throw Object.assign(new Error(C.error||`Failed to clear chat records for card: ${a}`),{statusCode:500});try{await te(a,!1);}catch{}}async function q(a,C,x,H,D=""){let Z=typeof x=="string"?x.trim():"",se=await ce.append({params:{cardId:a},body:{role:C||"system",text:Z,files:H,turn:D}});if(se.status!=="success")throw Object.assign(new Error(se.error||`Failed to append chat record for card: ${a}`),{statusCode:500});return String(se.data?.id||"")}async function V(a){return await N(a).readAll(a)}let de=uo({safeCardId:a=>j(a),artifactsStores:a=>w(a),cardFileMetadataStore:()=>B(),readCardFromStore:a=>h(a),updateCardLocalOnly:(a,C)=>L(a,C),writeChatRecord:(a,C,x,H,D)=>q(a,C,x,H,D)}).uploadCardFile;async function ie(a){let C=$(a);if(!C)return null;let x=await C.boardOps.getConfig({params:{key:"chat-handler-flow"}}),D=(x.status==="success"?x.data?.value:null)??C.chatHandlerFlow??null,Z=C.chatHandlerRef;return D==null&&(!Z||typeof Z!="object")?null:{ctx:C,handlerFlow:D,handlerRef:Z}}function Re(a){let C=typeof a=="string"?a.trim():"";if(C.length<Vt.length*2||!C.startsWith(Vt)||!C.endsWith(Vt))return null;let x=C.slice(Vt.length,C.length-Vt.length).trim(),H=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(x);return H?{assistant:H[1].trim().toLowerCase(),text:H[2].trim()}:{assistant:"echo",text:x}}async function Ee(a,C,x=false,H="",D=""){try{let Z=await ie(a);if(!Z){try{await te(a,!1);}catch{}return}let{ctx:se,handlerFlow:re,handlerRef:$e}=Z;if(!x)try{await te(a,!0);}catch{}let be={boardId:o,cardId:String(a),lastChatEntryId:C,...H?{turnId:H}:{},...typeof D=="string"&&D.trim()?{probe:D.trim()}:{},...k,...g?{serverUrl:g}:{}},Je=re!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:bo}}:$e;Ze(se.boardAdapter)?await p(se,"chat-agent").enqueueRequest({boardId:o,ref:Je,args:re!=null?{...be,__chatHandlerFlow:re}:be}):p(se,"chat-agent").enqueueRequest({boardId:o,ref:Je,args:re!=null?{...be,__chatHandlerFlow:re}:be}),await Promise.resolve(se.boardAdapter.requestProcessAccumulated?.());}catch(Z){try{await te(a,!1);}catch{}s.warn(`[chat-handler] queue failed for card "${a}": ${Z instanceof Error?Z.message:String(Z)}`);}}async function qe(a,C,x){if(C.howToRun==="built-in"&&nn(C)===bo){let H=u,D=x.__chatHandlerFlow,Z={...x};return delete Z.__chatHandlerFlow,H?H.run(D,Z,{boardId:o,cardId:String(Z.cardId||""),label:a.label,logger:s,serverUrl:g,executionExtra:k}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return c.invoke(C,x)}async function Ne(a,C=false){C||await Y();let x=typeof a.args?.cardId=="string"?a.args.cardId:"",H=x?$(x):F();if(!H)throw new Error(x?`Board context is unavailable for chat-agent request: ${x}`:"Board context is unavailable for chat-agent request");let D=await qe(H,a.ref,a.args);if(!D.dispatched){if(x)try{await te(x,!1);}catch{}throw new Error(D.error||`chat-agent dispatch failed for card "${x||"unknown"}"`)}}async function je(a,C,x){if(C==="chat-send"){let D=x&&typeof x["turn-id"]=="string"?x["turn-id"]:x&&typeof x.turnId=="string"?x.turnId:x&&typeof x.turn=="string"?x.turn:"";if(x&&"files"in x&&x.files!==void 0&&x.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 Z=Ce(),se=Re(x?.text),re=se?se.text:x?.text,$e=await pt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:a,role:"user",text:re,turn_id:D,files:[]},Z);if($e?.status!=="success")throw new Error(et($e,`chat-send append failed for card ${a}`));let be=$e?.data?.id;if(typeof be!="string"||!be)throw new Error(`chat-send did not return an append id for card ${a}`);let Je=await pt("setstate.chat-processing-started",{board_id:o,card_id:a},Z);if(Je?.status!=="success")throw new Error(et(Je,`chat-send processing update failed for card ${a}`));Ee(a,be,true,D,se?.assistant||"");return}await St(a,D=>{let Z=new Date().toISOString(),se=D.card_data&&typeof D.card_data=="object"?D.card_data:{};if(D.card_data=se,C==="file-upload"){let re=B().normalizeIncoming(x?.files,Z);return re.length>0&&B().merge(se,re),D}if(C==="action"){let re=x&&typeof x.buttonId=="string"?x.buttonId:"";if(!re)return D;se.lastAction={buttonId:re,at:Z},se.lastActionText=`${re} @ ${Z}`;}return D});}function He(a,C,x){let H=JSON.stringify(x),D=typeof Buffer<"u"?Buffer.byteLength(H):new TextEncoder().encode(H).length;a.writeHead(C,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":D}),a.end(H);}async function ot(a,C,x){let H=await h(a);if(!H)throw Object.assign(new Error("Card not found"),{statusCode:404});let D=B().resolve(H.card_data,C,x);if(!D.ok&&D.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!D.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let Z=D.file,se=j(a),re=w(a),$e=String(Z.stored_name||""),be=`${se}/${$e}`,Je=re.files?await re.files.getBytes(be):null;if(!Je)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:Z,bytes:Je}}async function Xe(a,C,x,H){let{fileRecord:D,bytes:Z}=await ot(C,x,H),se=String(D.name||D.stored_name||"download.bin"),re=String(D.mime_type||"application/octet-stream");a.writeHead(200,{"Content-Type":re,"Content-Disposition":`attachment; filename="${se}"`,"Content-Length":Z.length}),a.end(Z);}function lt(a){let C=String(a||"").toLowerCase();return C.startsWith("text/")||C.includes("json")||C.includes("xml")||C.includes("javascript")||C.includes("typescript")||C.includes("yaml")||C.includes("csv")}function Et(a,C,x){let H=a.split(/\r?\n/);return (C==="head"?H.slice(0,x):H.slice(-x)).join(`
|
|
7
|
-
`)}async function
|
|
6
|
+
`);}catch{}},15e3);R.on("close",()=>{clearInterval(d),t.disconnect(S,b);});}return {handleChannelSubscription:f,handleSse:k}}function Co(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:a,boardContexts:c,publishPersistedStateSnapshot:u,upsertCardsFromSource:f,sseHub:k,queueSseHub:R}=e,{handleSse:b,handleChannelSubscription:S}=en(e),{handleSse:_}=en({...e,sseHub:R,buildPublishedRuntimePayload:async()=>null});async function T(I,A,g){let l=I.method||"GET",i=g,d=i.pathname;try{if(l==="GET"&&d===`${t}/sse`){let O=i.searchParams.has("one-shot");await o();let N=String(i.searchParams.get("clientId")||"").trim();if(!O&&!N)return r(A,400,{error:"clientId query param is required for SSE"}),!0;if(await b(I,A,N||void 0,{oneShot:O}),O)return !0;for(let U=0;U<c.length;U++)await u(c[U]),await f(c[U],U),await u(c[U]);return !0}if(l==="GET"&&d===`${t}/sse-q`){let O=String(i.searchParams.get("clientId")||"").trim();return O?(await _(I,A,O,{bootstrapPayload:!1}),!0):(r(A,400,{error:"clientId query param is required for SSE"}),!0)}let m=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(l==="POST"&&m){await a();let O=decodeURIComponent(m[1]),N=await n(I),U=typeof N?.clientId=="string"?N.clientId.trim():"";return U?await k.subscribeChat(U,O)?(r(A,200,{ok:!0,clientId:U,cardId:O,subscribed:!0}),!0):(r(A,404,{error:`SSE client not connected: ${U}`}),!0):(r(A,400,{error:"clientId is required"}),!0)}let p=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(l==="POST"&&p){await a();let O=decodeURIComponent(p[1]),N=await n(I),U=typeof N?.clientId=="string"?N.clientId.trim():"";return U?k.unsubscribeChat(U,O)?(r(A,200,{ok:!0,clientId:U,cardId:O,subscribed:!1}),!0):(r(A,404,{error:`SSE client not connected: ${U}`}),!0):(r(A,400,{error:"clientId is required"}),!0)}let h=d.match(new RegExp(`^${st(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&h){await a();let O=decodeURIComponent(h[1]),N=h[2]==="subscribe",U=await n(I),J=typeof U?.clientId=="string"?U.clientId.trim():"";return J?(S(A,J,O,{},N),!0):(r(A,400,{error:"clientId is required"}),!0)}let w=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&w){await a();let O=decodeURIComponent(w[1]),N=decodeURIComponent(w[2]),U=w[3]==="subscribe",J=await n(I),ae=typeof J?.clientId=="string"?J.clientId.trim():"";return ae?(S(A,ae,N,{cardId:O},U),!0):(r(A,400,{error:"clientId is required"}),!0)}return !1}catch(m){let p=m?.statusCode||500;return r(A,p,{error:String(m?.message||m)}),true}}return {handleWatchersRoutes:T,handleSse:b,handleChannelSubscription:S}}var Ta=3e4;function Ia(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function bo(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,a=`${t}/notify-q`;async function c(u,f,k){if(k.pathname!==a)return false;if((u.method??"").toUpperCase()!=="POST")return o(f,405,{status:"error",error:"Method not allowed"}),true;if(!Ia(u))return o(f,403,{status:"error",error:"Forbidden"}),true;let R;try{R=await n(u);}catch{return o(f,400,{status:"error",error:"Invalid JSON body"}),true}if(!R||typeof R!="object"||!Array.isArray(R.notifications))return o(f,400,{status:"error",error:"body.notifications must be an array"}),true;let b=R.notifications,{accepted:S,rejected:_}=no(b,Date.now(),Ta);return S.length>0&&r(S),o(f,200,{status:"success",data:{accepted:S.length,rejected:_}}),true}return {handleNotifyRoute:c}}var wo={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},So="chat-handler-flow-queue",Ut="__probe__echo__probe__";function Pa(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...wo,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1,c=e.logger||{info:console.log,warn:console.warn,error:console.error},u=e.invocationAdapter,f=e.chatFlowRunner||null,k=e.notificationTransport||null,R=e.serverUrl||null,b=e.executionExtra||{},S=e.onSseClientConnected,_=e.onSseClientDisconnected,T=e.onChannelSubscribed,I=e.onChannelUnsubscribed,A=Qr({buildChatOneShotBatch:async(s,C)=>await be.buildSseOneShotBatch({params:{cardId:s},body:{receiving:C}}),onSseClientDisconnected:_}),g=Qr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function l(s){function C(ee){return {...ee,queueStorageForRef(ge,Oe){return zn(ee.queueStorageForRef(ge,Oe),{lane:Oe,emitNotification:X})}}}function E(ee){return {...ee,queueStorageForRef(ge,Oe){return Wn(ee.queueStorageForRef(ge,Oe),{lane:Oe,emitNotification:X})}}}function L(ee){return {async get(ge){return ee.get(ge)},async set(ge){return ee.set(ge)},async del(ge){return ee.del(ge)},async patch(ge){return ee.patch(ge)},async appendFiles(ge){return ee.appendFiles(ge)}}}function H(ee){return {async get(ge){return await ee.get(ge)},async set(ge){return await ee.set(ge)},async del(ge){return await ee.del(ge)},async patch(ge){return await ee.patch(ge)},async appendFiles(ge){return await ee.appendFiles(ge)}}}let ne=null;function X(ee){if(ee.kind==="notification-batch"){te(ee.notifications,ne??void 0);return}te([ee],ne??void 0);}let le=rt(s.boardAdapter)?E(s.boardAdapter):C(s.boardAdapter),Ue=s.nonCoreAdapter??(!rt(le)&&w(le)?le:null),xe=rt(le)?Gn(s.baseRef,le,{boardRuntimeStoreRef:s.boardRuntimeStoreRef,scratchStoreRef:s.scratchStoreRef,taskExecutorRef:s.taskExecutorRef,chatHandlerFlow:s.chatHandlerFlow,emitNotification:X}):Mn(s.baseRef,le,{boardRuntimeStoreRef:s.boardRuntimeStoreRef,scratchStoreRef:s.scratchStoreRef,taskExecutorRef:s.taskExecutorRef,chatHandlerFlow:s.chatHandlerFlow,emitNotification:X}),He=s.nonCore??(Ue?Dn(s.baseRef,Ue,{boardRuntimeStoreRef:s.boardRuntimeStoreRef,taskExecutorRef:s.taskExecutorRef}):null),Ar=le.chatStorageForRef(s.chatStoreRef),xr,Ao=rt(le)?(()=>{let ee=kr(Rr(hr(le.kvStorageForRef(s.cardStoreRef)),le.hashFn),c.warn),ge=pr(ee,{emitNotification:X}),Oe=H(ge);return xr={get(we){return Oe.get(we)},set(we){return Oe.set(we)}},Oe})():(()=>{let ee=le.kvStorageForRef(s.cardStoreRef),Oe=fr(Mt({readIndex:()=>ee.read("_index"),writeIndex:we=>ee.write("_index",we),readCard:we=>ee.read(we),writeCard:(we,Ir)=>(ee.write(we,Ir),we),removeCard:we=>{ee.delete(we);},cardExists:we=>ee.read(we)!==null,defaultCardKey:we=>we},c.warn),{emitNotification:X});return xr=Oe,L(Oe)})(),Tr;if(rt(le)){let ee=le.blobStorageForRef(s.artifactsStoreRef);Tr={async putBytes(ge,Oe){if(ee.writeBytes){await ee.writeBytes(ge,Oe);return}let we=JSON.stringify({__kind:"bytes-array",data:[...Oe]});await ee.write(ge,we);},async getBytes(ge){if(ee.readBytes){let we=await ee.readBytes(ge);if(we!==null)return we}let Oe=await ee.read(ge);if(Oe===null)return null;try{let we=JSON.parse(Oe);if(we&&we.__kind==="bytes-array"&&Array.isArray(we.data))return new Uint8Array(we.data)}catch{}return new TextEncoder().encode(Oe)},async listKeys(ge){return await ee.listKeys(ge)}};}else {let ee=le.blobStorageForRef(s.artifactsStoreRef),ge=Zn(ee);Tr={putBytes(Oe,we,Ir){ge.putBytes(Oe,we,Ir);},getBytes(Oe){return ge.getBytes(Oe)},listKeys(Oe){return ge.list(Oe).map(we=>we.key)}};}let xo={async init(ee){return xe.init(ee)},async status(ee){return xe.status(ee)},async getConfig(ee){return xe.getConfig(ee)},async getAllOutputsDataObjects(ee){return xe.getAllOutputsDataObjects(ee)},async getAllOutputsComputedValues(ee){return xe.getAllOutputsComputedValues(ee)},async getOutputsFetchedSources(ee){return xe.getOutputsFetchedSources(ee)},async buildSseOneShotPayload(ee){return xe.buildSseOneShotPayload(ee)},async upsertCard(ee){return xe.upsertCard(ee)},async removeCard(ee){return xe.removeCard(ee)},async sourceDataFetched(ee){return xe.sourceDataFetched(ee)},async sourceDataFetchFailure(ee){return xe.sourceDataFetchFailure(ee)}};return ne={label:s.label,board:xe,nonCore:He,publicCardStore:xr,boardOps:xo,cardStoreOps:Ao,get filesArtifacts(){return Tr},get chatStorage(){return Ar},boardAdapter:le,boardRuntimeStoreRef:s.boardRuntimeStoreRef,cardStoreRef:s.cardStoreRef,outputsStoreRef:s.outputsStoreRef,artifactsStoreRef:s.artifactsStoreRef,fetchedSourcesStoreRef:s.fetchedSourcesStoreRef,queueStoreRef:s.queueStoreRef,chatStoreRef:s.chatStoreRef,scratchStoreRef:s.scratchStoreRef,notifyRef:s.notifyRef,taskExecutorRef:s.taskExecutorRef,chatHandlerRef:s.chatHandlerRef,chatHandlerFlow:s.chatHandlerFlow,inferenceAdapterRef:s.inferenceAdapterRef,notification:ao(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},ne}let i=e.boards.map(l),d=new Map;function m(s){return d.get(s)??0}function p(s){return s.queueStoreRef}function h(s,C){if(rt(s.boardAdapter)){let L=s.boardAdapter.queueStorageForRef(p(s),C);return Vr(L)}let E=s.boardAdapter.queueStorageForRef(p(s),C);return Hr(E)}function w(s){let C=s;return typeof C.invokeExecutor=="function"&&typeof C.validateSchema=="function"}function O(s){let C=i[m(s)];return {files:C?C.filesArtifacts:null}}function N(){return eo()}function U(s){return String(s||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function J(s){return "cardId"in s&&typeof s.cardId=="string"?y(s.cardId)??void 0:i[0]??void 0}function ae(s){for(let C of s){let E=J(C);if(E)return E}return i[0]??void 0}function Q(s,C={}){if(!s||s.length===0)return;let E=De(s),L={kind:"notification-batch",notifications:E},H=C.ctx??ae(E);if(C.appendState!==false&&H&&so(H.notification,L),C.broadcastSse!==false){let ne=E.filter(le=>le.kind==="message_enqueued"),X=E.filter(le=>le.kind!=="message_enqueued");X.length>0&&A.broadcastNotificationBatch(X),ne.length>0&&g.broadcastNotificationBatch(ne);}if(!(C.mirrorExternal===false||!H?.boardAdapter.publishBoardChangeNotifications))try{let ne=E.filter(X=>X.category==="board-output"||X.category==="card-store");ne.length>0&&H.boardAdapter.publishBoardChangeNotifications(ne);}catch{}}function te(s,C){Q(s,{ctx:C,appendState:true,broadcastSse:true,mirrorExternal:true});}async function ue(s){if(!s||s.notificationTeardown||!k||!s.notifyRef)return;let C=await k.subscribe(s.notifyRef,E=>{let L=ro(E);Q(L,{ctx:s,appendState:true,broadcastSse:true,mirrorExternal:false});});s.notificationTeardown=C;}async function G(s){if(!s||s.initialized)return;let C={boardRuntimeStoreRef:s.boardRuntimeStoreRef,cardStoreRef:s.cardStoreRef,outputsStoreRef:s.outputsStoreRef,fetchedSourcesStoreRef:s.fetchedSourcesStoreRef,artifactsStoreRef:s.artifactsStoreRef,queueStoreRef:s.queueStoreRef,chatStoreRef:s.chatStoreRef,scratchStoreRef:s.scratchStoreRef},E={};s.taskExecutorRef&&(E["task-executor-ref"]=s.taskExecutorRef),s.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=s.chatHandlerFlow);let L=await s.boardOps.init({params:C,body:E});if(L.status!=="success")throw Object.assign(new Error(L.error||`init failed for ${s.label}`),{statusCode:500});if(await ue(s),!s.chatHandlerFlow&&s.chatHandlerRef&&u.describe)try{let H=await u.describe(s.chatHandlerRef);H&&H.kind!=="chat-handler"?c.warn(`[init] chat-handler describe returned kind="${H.kind}", expected "chat-handler" for ${s.label}`):H&&c.info(`[init] chat-handler validated: ${H.name} (protocol ${H.protocolVersion}) for ${s.label}`);}catch(H){c.warn(`[init] chat-handler describe failed for ${s.label}: ${H?.message||String(H)}`);}s.initialized=true;}async function Z(s){let C=[],E=await s.boardOps.status({});E.status==="success"&&E.data!=null&&Jr(E.data)&&C.push({kind:"status",status:E.data});let L=await s.boardOps.getAllOutputsDataObjects({});if(L.status==="success"&&L.data!=null)for(let[ne,X]of Object.entries(L.data))ne&&C.push({kind:"data_object",key:ne,payload:X});let H=await s.boardOps.getAllOutputsComputedValues({});if(H.status==="success"&&H.data!=null)for(let[ne,X]of Object.entries(H.data))ne&&X&&typeof X=="object"&&!Array.isArray(X)&&C.push({kind:"computed_values",cardId:ne,values:X});C.length>0&&Q(C,{ctx:s,appendState:true,broadcastSse:true,mirrorExternal:false});}async function re(s,C){if(!s||s.cardsBootstrapped)return;let E=await s.cardStoreOps.get({}),L=E.status==="success"&&Array.isArray(E.data?.cards)?E.data.cards:[];for(let H of L)typeof H.id=="string"&&(d.set(H.id,C),await s.boardOps.upsertCard({params:{cardId:H.id}}));s.cardsBootstrapped=true;}async function B(){for(let s of i)await G(s);}async function x(){await B();for(let s=0;s<i.length;s++)await Z(i[s]),await re(i[s],s),await Z(i[s]);}async function K(s=false){s||await B();for(let C of i){let E=await C.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}function y(s){return i[m(s)]??null}async function P(s){let C=y(s);if(!C)return null;let E=await C.cardStoreOps.get({params:{id:s}});if(E.status!=="success")return null;let L=Array.isArray(E.data?.cards)?E.data.cards:[];return L.length>0?L[0]:null}async function q(){let s=async E=>{if(!E)return [];let L=await E.cardStoreOps.get({});return L.status!=="success"||!Array.isArray(L.data?.cards)?[]:L.data.cards},C=[];for(let E of i)C.push(...await s(E));return C}function D(){return i[0]??null}function M(s){return y(s)??D()}function $(s){let C=M(s);if(!C)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${s}`),{statusCode:404});return C.chatStorage}async function se(s){return await $(s).isProcessing(s)}async function ce(s,C){let E=await be.setProcessing({params:{cardId:s},body:{active:C}});if(E.status!=="success")throw Object.assign(new Error(E.error||`Failed to set chat processing for card: ${s}`),{statusCode:500})}let be=to({append(s,C,E,L,H){return $(s).append(s,C,E,L,H)},readAll(s){return $(s).readAll(s)},readAfter(s,C){return $(s).readAfter(s,C)},clear(s){return $(s).clear(s)},setProcessing(s,C){return $(s).setProcessing(s,C)},isProcessing(s){return $(s).isProcessing(s)},getConfig(s){return $(s).getConfig(s)},setConfig(s,C){return $(s).setConfig(s,C)}},{emitNotification(s){if(s.kind==="notification-batch"){te(s.notifications);return}te([s]);}}),Te=ho({boardContexts:i,cardOwnerIndex:d,cardContextForCard:s=>y(s),readStatusSnapshot:()=>he(),readDataObjectsByToken:()=>Je(),readCardRuntimeArtifacts:()=>et(),readCardFromStore:s=>P(s),readCardDefinitions:()=>q(),processAccumulatedLaneInternal:s=>K(s),reportSourceFetched:(s,C)=>Bt(s,{ref:C}),reportSourceFetchFailure:(s,C)=>Vt(s,{reason:C}),uploadCardFile:(s,C,E,L,H)=>ie(s,C,E,L,H),chatStorePublic:be,serverUrl:R,apiBasePath:t}),_e=Te.mcpCardStoreFacade,pe=Te.createMcpFacade,ke=io({boardId:o,bootstrapBoard:()=>x(),sseHub:A,onChannelSubscribed:T,onChannelUnsubscribed:I,getMcpFacade:()=>pe(),getMcpCardStoreFacade:()=>_e()});function Ve(s){return lo(s)}function Se(){return fo(pe())}function Ke(){return mo({boardId:o,uploadCardFile:ie,getMcpFacade:()=>pe(),controlplane:ke})}let qe=uo({boardId:o,boardContexts:i,readChatRecords:(s,C)=>oe(s,C),getChatProcessing:s=>se(s),chatBootstrapTailTurns:a}),he=qe.readStatusSnapshot,et=qe.readCardRuntimeArtifacts,Je=qe.readDataObjectsByToken,tt=qe.buildPublishedRuntimePayload;async function yt(s,C,E){let L=E?.syncBoard!==false,H=E?.restartOnlyIfChanged===true,ne=y(s);if(!ne)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let X=await P(s);if(!X)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let le=H?JSON.stringify(X):null,Ue=C(X)||X;if(H&&JSON.stringify(Ue)===le)return;let xe=await ne.cardStoreOps.set({body:Ue});if(xe.status!=="success")throw Object.assign(new Error(xe.error||`Failed to persist card: ${s}`),{statusCode:500});if(L){let He=await ne.boardOps.upsertCard({params:{cardId:s,restart:true}});if(He.status!=="success")throw Object.assign(new Error(He.error||`Failed to upsert card: ${s}`),{statusCode:500})}}async function j(s,C){await yt(s,C,{syncBoard:true});}async function v(s,C){await yt(s,C,{syncBoard:false});}async function W(s){let C=y(s);if(!C)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});if(!await P(s))throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let L=await C.boardOps.upsertCard({params:{cardId:s,restart:true}});if(L.status!=="success")throw Object.assign(new Error(L.error||`Failed to retrigger card: ${s}`),{statusCode:500})}async function F(s){let C=await be.clear({params:{cardId:s}});if(C.status!=="success")throw Object.assign(new Error(C.error||`Failed to clear chat records for card: ${s}`),{statusCode:500});try{await ce(s,!1);}catch{}}async function V(s,C,E,L,H=""){let ne=typeof E=="string"?E.trim():"",X=await be.append({params:{cardId:s},body:{role:C||"system",text:ne,files:L,turn:H}});if(X.status!=="success")throw Object.assign(new Error(X.error||`Failed to append chat record for card: ${s}`),{statusCode:500});return String(X.data?.id||"")}async function oe(s,C){let E=Number.isInteger(C?.tailTurns)&&C?.tailTurns>0?C?.tailTurns:void 0,L=await be.readAll({params:{cardId:s},...E===void 0?{}:{body:{tailTurns:E}}});if(L.status!=="success")throw Object.assign(new Error(L.error||`Failed to read chat records for card: ${s}`),{statusCode:500});return Array.isArray(L.data?.records)?L.data.records:[]}let ie=co({safeCardId:s=>U(s),artifactsStores:s=>O(s),cardFileMetadataStore:()=>N(),readCardFromStore:s=>P(s),updateCardLocalOnly:(s,C)=>v(s,C),writeChatRecord:(s,C,E,L,H)=>V(s,C,E,L,H)}).uploadCardFile;async function Re(s){let C=y(s);if(!C)return null;let E=await C.boardOps.getConfig({params:{key:"chat-handler-flow"}}),H=(E.status==="success"?E.data?.value:null)??C.chatHandlerFlow??null,ne=C.chatHandlerRef;return H==null&&(!ne||typeof ne!="object")?null:{ctx:C,handlerFlow:H,handlerRef:ne}}function Be(s){let C=typeof s=="string"?s.trim():"";if(C.length<Ut.length*2||!C.startsWith(Ut)||!C.endsWith(Ut))return null;let E=C.slice(Ut.length,C.length-Ut.length).trim(),L=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(E);return L?{assistant:L[1].trim().toLowerCase(),text:L[2].trim()}:{assistant:"echo",text:E}}async function je(s,C,E=false,L="",H=""){try{let ne=await Re(s);if(!ne){try{await ce(s,!1);}catch{}return}let{ctx:X,handlerFlow:le,handlerRef:Ue}=ne;if(!E)try{await ce(s,!0);}catch{}let xe={boardId:o,cardId:String(s),lastChatEntryId:C,...L?{turnId:L}:{},...typeof H=="string"&&H.trim()?{probe:H.trim()}:{},...b,...R?{serverUrl:R}:{}},He=le!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:So}}:Ue;rt(X.boardAdapter)?await h(X,"chat-agent").enqueueRequest({boardId:o,ref:He,args:le!=null?{...xe,__chatHandlerFlow:le}:xe}):h(X,"chat-agent").enqueueRequest({boardId:o,ref:He,args:le!=null?{...xe,__chatHandlerFlow:le}:xe}),await Promise.resolve(X.boardAdapter.requestProcessAccumulated?.());}catch(ne){try{await ce(s,!1);}catch{}c.warn(`[chat-handler] queue failed for card "${s}": ${ne instanceof Error?ne.message:String(ne)}`);}}async function Le(s,C,E){if(C.howToRun==="built-in"&&on(C)===So){let L=f,H=E.__chatHandlerFlow,ne={...E};return delete ne.__chatHandlerFlow,L?L.run(H,ne,{boardId:o,cardId:String(ne.cardId||""),label:s.label,logger:c,serverUrl:R,executionExtra:b}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return u.invoke(C,E)}async function Me(s,C=false){C||await B();let E=typeof s.args?.cardId=="string"?s.args.cardId:"",L=E?y(E):D();if(!L)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let H=await Le(L,s.ref,s.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 Ye(s,C,E){if(C==="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 ne=Ke(),X=Be(E?.text),le=X?X.text:E?.text,Ue=await gt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:s,role:"user",text:le,turn_id:H,files:[]},ne);if(Ue?.status!=="success")throw new Error(nt(Ue,`chat-send append failed for card ${s}`));let xe=Ue?.data?.id;if(typeof xe!="string"||!xe)throw new Error(`chat-send did not return an append id for card ${s}`);let He=await gt("setstate.chat-processing-started",{board_id:o,card_id:s},ne);if(He?.status!=="success")throw new Error(nt(He,`chat-send processing update failed for card ${s}`));je(s,xe,true,H,X?.assistant||"");return}await j(s,H=>{let ne=new Date().toISOString(),X=H.card_data&&typeof H.card_data=="object"?H.card_data:{};if(H.card_data=X,C==="file-upload"){let le=N().normalizeIncoming(E?.files,ne);return le.length>0&&N().merge(X,le),H}if(C==="action"){let le=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!le)return H;X.lastAction={buttonId:le,at:ne},X.lastActionText=`${le} @ ${ne}`;}return H});}function Ge(s,C,E){let L=JSON.stringify(E),H=typeof Buffer<"u"?Buffer.byteLength(L):new TextEncoder().encode(L).length;s.writeHead(C,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":H}),s.end(L);}async function Xe(s,C,E){let L=await P(s);if(!L)throw Object.assign(new Error("Card not found"),{statusCode:404});let H=N().resolve(L.card_data,C,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 ne=H.file,X=U(s),le=O(s),Ue=String(ne.stored_name||""),xe=`${X}/${Ue}`,He=le.files?await le.files.getBytes(xe):null;if(!He)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:ne,bytes:He}}async function ft(s,C,E,L){let{fileRecord:H,bytes:ne}=await Xe(C,E,L),X=String(H.name||H.stored_name||"download.bin"),le=String(H.mime_type||"application/octet-stream");s.writeHead(200,{"Content-Type":le,"Content-Disposition":`attachment; filename="${X}"`,"Content-Length":ne.length}),s.end(ne);}function _t(s){let C=String(s||"").toLowerCase();return C.startsWith("text/")||C.includes("json")||C.includes("xml")||C.includes("javascript")||C.includes("typescript")||C.includes("yaml")||C.includes("csv")}function Et(s,C,E){let L=s.split(/\r?\n/);return (C==="head"?L.slice(0,E):L.slice(-E)).join(`
|
|
7
|
+
`)}async function mt(s){let C=[];for await(let L of s)C.push(L);let E=typeof Buffer<"u"?Buffer.concat(C).toString("utf-8").trim():new TextDecoder().decode(Pr(C)).trim();return E?JSON.parse(E):{}}async function Bt(s,C){let E=typeof C.ref=="string"?C.ref.trim():"";if(!E)return {status:"fail",error:"board-worker success callback requires body.ref"};let L=i[0];return L?L.boardOps.sourceDataFetched({params:{token:s,ref:E}}):{status:"fail",error:"no board context"}}async function Vt(s,C){let E=typeof C.reason=="string"&&C.reason.trim()?C.reason:"unknown",L=i[0];return L?L.boardOps.sourceDataFetchFailure({params:{token:s,reason:E}}):{status:"fail",error:"no board context"}}let tn=Co({sseHub:A,queueSseHub:g,corsHeaders:r,json:Ge,buildPublishedRuntimePayload:()=>tt(),onSseClientConnected:S,onChannelSubscribed:T,onChannelUnsubscribed:I,apiBasePath:t,readJsonBody:s=>mt(s),initBoardAndSetup:()=>B(),bootstrapBoard:()=>x(),boardContexts:i,publishPersistedStateSnapshot:s=>Z(s),upsertCardsFromSource:(s,C)=>re(s,C)}).handleWatchersRoutes,vt=Ro({apiBasePath:t,json:Ge,readJsonBody:s=>mt(s),bootstrapBoard:()=>x(),createMcpFacade:()=>pe(),createMcpToolRegistry:s=>Ve(s),resolveCardFileDownloadPayload:(s,C,E)=>Xe(s,C,E),isLikelyTextMimeType:s=>_t(s),sliceTextByLines:(s,C,E)=>Et(s,C,E)}).handleAgentfaceApi,vr=ko({apiBasePath:t,json:Ge,readJsonBody:s=>mt(s),initBoardAndSetup:()=>B(),createMcpWebhookToolRegistry:()=>Se()}).handleWebhooksApi,ht=_r({apiBasePath:t,json:Ge,readJsonBody:s=>mt(s),bootstrapBoard:()=>x(),createMcpControlplaneToolRegistry:()=>Ke(),retriggerCard:s=>W(s),applyCardAction:(s,C,E)=>Ye(s,C,E),resolveChatHandlerTarget:s=>Re(s),sendCardFileDownloadResponse:(s,C,E,L)=>ft(s,C,E,L)}).handleRuntimeApi,Ht=bo({apiBasePath:t,emitNotifications:s=>te(s),readJsonBody:s=>mt(s),json:(s,C,E)=>Ge(s,C,E)}).handleNotifyRoute;async function Y(s,C,E){return !!(await vt(s,C,E)||await vr(s,C,E)||await tn(s,C,E)||await Ht(s,C,E)||await ht(s,C,E))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:Y,emitNotification(s){if(s.kind==="notification-batch"){te(s.notifications);return}te([s]);},buildPublishedRuntimePayload:tt,__drainProcessAccumulatedLane:K,handleChatAgentRequest:Me,clearChatRecords:F,reportSourceFetched(s,C){return Bt(s,{ref:C})},reportSourceFetchFailure(s,C){return Vt(s,{reason:C})},get cardStore(){return i[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function _a(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...wo,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,a=new Map,c="boards-config.json";function u(){let A=n.getText(c);if(!A)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(A)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function f(A){n.putText(c,JSON.stringify(A,null,2));}function k(A){let g=String(A||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return g.length>0&&g.length<=64?g:null}function R(A){if(a.has(A))return a.get(A);let l=u().boards.find(d=>d.id===A)||{},i=o(A,l);return a.set(A,i),i}function b(A,g,l){let i=JSON.stringify(l),d=typeof Buffer<"u"?Buffer.byteLength(i):new TextEncoder().encode(i).length;A.writeHead(g,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":d}),A.end(i);}async function S(A,g,l){let i=A.method||"GET",d=l.pathname;if(i==="GET"&&d===t)return b(g,200,{ok:true,boards:u().boards}),true;if(i==="POST"&&d===t){let m=[];for await(let J of A)m.push(J);let p=typeof Buffer<"u"?Buffer.concat(m).toString("utf-8").trim():new TextDecoder().decode(Pr(m)).trim(),h={};try{h=p?JSON.parse(p):{};}catch{h={};}let w=k(h.id);if(!w)return b(g,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let O=u();if(O.boards.some(J=>J.id===w))return b(g,409,{error:`Board "${w}" is already registered`}),true;let N=typeof h.label=="string"&&h.label.trim()?h.label.trim():w,U={id:w,label:N};for(let[J,ae]of Object.entries(h))J==="id"||J==="label"||ae!=null&&(U[J]=ae);return O.boards.push(U),f(O),b(g,200,{ok:true,board:U}),true}return false}async function _(A,g,l){let d=l.pathname.match(new RegExp(`^${st(t)}/([^/]+)(/|$)`));if(!d)return false;let m=k(decodeURIComponent(d[1]));return m?u().boards.some(w=>w.id===m)?!!await R(m).handleRuntimeApi(A,g,l):(b(g,404,{error:`Board "${m}" not registered. POST ${t} with {id} to register it first.`}),true):(b(g,400,{error:"Invalid board id"}),true)}async function T(A,g,l){return !!(await S(A,g,l)||await _(A,g,l))}function I(A){if(!u().boards.some(l=>l.id===A))throw Object.assign(new Error(`Board "${A}" not registered`),{statusCode:404});return {service:R(A)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:T,requireBoardService:I}}exports.createMultiBoardServerRuntime=_a;exports.createRoutesRuntimeApi=_r;exports.createSingleBoardServerRuntime=Pa;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
|
|
8
8
|
//# sourceMappingURL=server-runtime-controlface.js.map
|