yaml-flow 8.11.1 → 8.11.2
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 +1 -1
- package/browser/adapters/localstorage-storage.js +1 -1
- package/browser/asset-integrity.json +5 -5
- package/browser/server-runtime-controlface.js +5 -5
- package/examples/board/test/server-http-test.js +9 -0
- package/lib/board-live-cards-node.cjs +2 -2
- package/lib/board-live-cards-node.js +1 -1
- 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.js +1 -1
- package/lib/{chunk-U6JMXOER.cjs → chunk-42ZOYXEV.cjs} +3 -3
- package/lib/chunk-AHW6EMUO.js +3 -0
- package/lib/chunk-EYBDAEVO.cjs +3 -0
- package/lib/chunk-HFI2NAZJ.js +3 -0
- package/lib/{chunk-4LHFO56U.js → chunk-LDVJPFIW.js} +3 -3
- package/lib/chunk-ZOZ7ZDGA.cjs +3 -0
- package/lib/cloud-storage.cjs +1 -1
- package/lib/cloud-storage.js +1 -1
- package/lib/firestore-storage/index.cjs +1 -1
- package/lib/firestore-storage/index.js +1 -1
- package/lib/localstorage-storage/index.cjs +1 -1
- package/lib/localstorage-storage/index.js +1 -1
- package/lib/server-runtime/index.cjs +1 -1
- package/lib/server-runtime/index.js +1 -1
- package/lib/server-runtime-controlface/index.cjs +1 -1
- package/lib/server-runtime-controlface/index.js +1 -1
- package/package.json +1 -1
- package/lib/chunk-5U5NMYGT.js +0 -3
- package/lib/chunk-H5FKNSCO.js +0 -3
- package/lib/chunk-VNLMJEIX.cjs +0 -3
- package/lib/chunk-X5CZE2L7.cjs +0 -3
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var ServerRuntimeControlface=(function(exports){'use strict';var Ro=Object.defineProperty;var Co=(e,t,r)=>t in e?Ro(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Gr=(e,t,r)=>Co(e,t+"",r);var Dt="b64:";function ko(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 bo(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 be(e){return `${Dt}${ko(JSON.stringify(e))}`}function at(e){if(!e.startsWith(Dt))throw new Error(`Invalid ref format (expected ${Dt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(bo(e.slice(Dt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Wr(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function tt(e){return typeof e.journalStorage=="function"}function zr(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?at(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function ot(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wr(e){let t=e.reduce((o,s)=>o+s.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}function le(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function st(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function it(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function ft(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function $t(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let s=Number(o);if(Number.isFinite(s))return s}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Yr(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function mt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,c=s.status;if(c==="success")return Object.prototype.hasOwnProperty.call(s,"data")?o:{status:"success",data:{}};if(c==="fail"||c==="error")return o}return {status:"success",data:o}}function rt(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let s=n.data;if(s&&typeof s=="object"&&!Array.isArray(s)){let c=s.issues;if(Array.isArray(c)){let m=c.find(g=>typeof g=="string"&&g.trim());if(typeof m=="string")return `Validation failed: ${m}`}let u=s.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function vr(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpControlplaneToolRegistry:s,retriggerCard:c,applyCardAction:u,resolveChatHandlerTarget:m,sendCardFileDownloadResponse:g}=e;async function C(b,k,B){let P=b.method||"GET",_=B,x=_.pathname;try{if(P==="POST"&&x===`${t}/mcp-actions`){await o();let d=Date.now(),f=new Date(d).toISOString(),p=await n(b),R=typeof p.tool=="string"?p.tool.trim():"",A=p.args&&typeof p.args=="object"&&!Array.isArray(p.args)?p.args:{};if(!R)return r(k,400,{error:"tool is required"}),!0;let F=le(A,"card_id");if(!F)return r(k,400,{error:"MCP action requires card_id"}),!0;if(R==="retrigger-card"||R==="retrigger"){await c(F);let Q=Date.now();return r(k,200,{status:"success",data:{ok:!0,cardId:F,actionType:R,requestReceivedAt:f,requestReceivedAtMs:d,responseSentAt:new Date(Q).toISOString(),responseSentAtMs:Q,responseStatus:200}}),!0}let j=it(A,"payload");if(R==="chat-send"&&!await m(F)){let Q=Date.now();return r(k,409,{error:`chat handler is not configured for card: ${F}`,requestReceivedAt:f,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 re=Date.now();return r(k,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${F}`,requestReceivedAt:f,requestReceivedAtMs:d,responseSentAt:new Date(re).toISOString(),responseSentAtMs:re,responseStatus:400}),!0}}await u(F,R,j);let V=Date.now();return r(k,200,{status:"success",data:{ok:!0,cardId:F,actionType:R,requestReceivedAt:f,requestReceivedAtMs:d,responseSentAt:new Date(V).toISOString(),responseSentAtMs:V,responseStatus:200}}),!0}if(P==="POST"&&x===`${t}/mcp-controlplane`){await o();let d=await n(b),f=typeof d.tool=="string"?d.tool.trim():"",p=d.args&&typeof d.args=="object"&&!Array.isArray(d.args)?d.args:{};if(!f)return r(k,400,{error:"tool is required"}),!0;try{let R=await mt(f,p,s());if(R&&typeof R=="object"&&!Array.isArray(R)){let A=R;if(A.status==="fail")return r(k,400,{error:rt(R,"Request failed")}),!0;if(A.status==="error")return r(k,500,{error:rt(R,"Internal error")}),!0}r(k,200,R);}catch(R){let A=typeof R?.statusCode=="number"?Number(R.statusCode):500,F=R instanceof Error?R.message:String(R);r(k,A,{error:F});}return !0}let y=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/retrigger$`));if(P==="POST"&&y){await o();let d=decodeURIComponent(y[1]);return await c(d),r(k,200,{ok:!0}),!0}let l=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/actions$`));if(P==="POST"&&l){await o();let d=decodeURIComponent(l[1]),f=Date.now(),p=new Date(f).toISOString(),R=await n(b),A=R?.actionType;if(A==="chat-send"&&!await m(d)){let j=Date.now();return r(k,409,{error:`chat handler is not configured for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:f,responseSentAt:new Date(j).toISOString(),responseSentAtMs:j,responseStatus:409}),!0}if(A==="chat-send"){let j=R?.payload??{},V=typeof j["turn-id"]=="string"?j["turn-id"]:typeof j.turnId=="string"?j.turnId:typeof j.turn=="string"?j.turn:"";if(!V||!String(V).trim()){let Q=Date.now();return r(k,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:f,responseSentAt:new Date(Q).toISOString(),responseSentAtMs:Q,responseStatus:400}),!0}}await u(d,A,R?.payload);let F=Date.now();return r(k,200,{ok:!0,requestReceivedAt:p,requestReceivedAtMs:f,responseSentAt:new Date(F).toISOString(),responseSentAtMs:F,responseStatus:200}),!0}let i=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/files/(\\d+)$`));if(P==="GET"&&i){let d=decodeURIComponent(i[1]),f=parseInt(i[2],10),p=_.searchParams.get("sn");return await g(k,d,f,p),!0}return !1}catch(y){let l=y?.statusCode||500;return r(k,l,{error:String(y?.message||y)}),true}}return {handleRuntimeApi:C}}function Vt(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 So(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 wo(e){return e.category?e:{...e,category:So(e.kind)}}function qe(e){return e.map(t=>wo(t))}function Ne(e){return {...e,category:e.category??"batch",notifications:qe(e.notifications)}}var gt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ye(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function yt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Xr(e){return e.tasks??{}}function Ar(e){return e?e.status===gt.FAILED||e.status===gt.INACTIVATED:false}function Zr(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function en(e){return e.maxExecutions}function tn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===gt.COMPLETED){let s=e.tasks[n];s&&Ye(s).forEach(u=>r.add(u));}return Array.from(r)}function rn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Ye(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function nn(e,t,r){let n=e.tasks[t]??Ut(),o={};if(r){let c=r.tasks[t],u=yt(c);for(let m of u)for(let[g,C]of Object.entries(r.tasks))if(Ye(C).includes(m)){let b=e.tasks[g];b?.lastDataHash&&(o[m]=b.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function on(e,t,r,n,o,s){let c=e.tasks[r]??Ut(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let m;n&&u.on&&u.on[n]?m=u.on[n]:m=Ye(u);let g=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let k=u.requires??[];for(let B of k)for(let[P,_]of Object.entries(t.tasks))if(Ye(_).includes(B)){let x=e.tasks[P];x?.lastDataHash&&(g[B]=x.lastDataHash);break}}let C={...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},b=[...new Set([...e.availableOutputs,...m])];return {...e,tasks:{...e.tasks,[r]:C},availableOutputs:b,lastUpdated:new Date().toISOString()}}function an(e,t,r,n){let o=e.tasks[r]??Ut(),s=t.tasks[r];if(s?.retry){let m=o.retryCount+1;if(m<=s.retry.max_attempts){let g={...o,status:"not-started",retryCount:m,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 m=s.circuit_breaker.on_break;u=[...new Set([...u,...m])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:u,lastUpdated:new Date().toISOString()}}function sn(e,t,r,n){let o=e.tasks[t]??Ut(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function un(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Ut(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function St(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=dn();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function vo(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:nn(n,t.taskName,r)};case "task-completed":return {config:r,state:on(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:an(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:sn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:un(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Eo(n,t.action)};case "task-upsert":return Ao(e,t.taskName,t.taskConfig);case "task-removal":return xo(e,t.taskName);case "node-requires-add":return Io(e,t.nodeName,t.tokens);case "node-requires-remove":return Po(e,t.nodeName,t.tokens);case "node-provides-add":return To(e,t.nodeName,t.tokens);case "node-provides-remove":return _o(e,t.nodeName,t.tokens);default:return e}}function cn(e,t){return t.reduce((r,n)=>vo(r,n),e)}function Ao(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:dn()},lastUpdated:new Date().toISOString()}}}function xo(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 Io(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=yt(n),s=r.filter(c=>!o.includes(c));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function Po(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=yt(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function To(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=r.filter(c=>!o.includes(c));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function _o(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function ht(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Rt(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function dn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Eo(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 Tt(e){let{config:t,state:r}=e,n=Xr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=Bo(n),c=tn(t,r.tasks),u=new Set([...c,...r.availableOutputs]),m=[],g=[],C=[],b=[];for(let[B,P]of Object.entries(n)){let _=r.tasks[B],x=Zr(P,t.settings),y=x!=="once";if(_?.status===gt.RUNNING||Ar(_))continue;let l=en(P);if(l!==void 0&&_&&_.executionCount>=l||P.circuit_breaker&&_&&_.executionCount>=P.circuit_breaker.max_executions||!y&&_?.status===gt.COMPLETED)continue;if(y&&_?.status===gt.COMPLETED){let R=yt(P),A=false;switch(x){case "data-changed":{R.length>0&&R.some(j=>{for(let[V,Q]of Object.entries(n))if(Ye(Q).includes(j)){let re=r.tasks[V];if(!re)continue;let J=_.lastConsumedHashes?.[j];return re.lastDataHash==null?re.executionCount>_.lastEpoch:re.lastDataHash!==J}return false})||(A=true);break}case "epoch-changed":{R.length>0&&R.some(j=>{for(let[V,Q]of Object.entries(n))if(Ye(Q).includes(j)){let re=r.tasks[V];if(re&&re.executionCount>_.lastEpoch)return true}return false})||(A=true);break}case "time-based":{let F=P.refreshInterval??0;if(F<=0){A=true;break}let j=_.completedAt;if(!j){A=true;break}(Date.now()-Date.parse(j))/1e3<F&&(A=true);break}case "manual":A=true;break}if(A)continue}let i=yt(P);if(i.length===0){m.push(B);continue}let d=[],f=[],p=[];for(let R of i){if(u.has(R))continue;let A=s[R]||[];A.length===0?d.push(R):A.every(j=>Ar(r.tasks[j]))?p.push({token:R,failedProducer:A[0]}):f.push(R);}d.length>0?C.push({taskName:B,missingTokens:d}):p.length>0?b.push({taskName:B,failedTokens:p.map(R=>R.token),failedProducers:[...new Set(p.map(R=>R.failedProducer))]}):f.length>0?g.push({taskName:B,waitingOn:f}):m.push(B);}let k={};if(m.length>1){let B=rn(m,n);for(let[P,_]of Object.entries(B))_.length>1&&(k[P]=_);}return {eligible:m,pending:g,unresolved:C,blocked:b,conflicts:k}}function Bo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of Ye(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var _t=class{constructor(){Gr(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function xr(e){let t=Ir(e);return Oo(t)}function Ir(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Ir).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Ir(t[n])).join(",")+"}"}function Oo(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Fo(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function qo(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ln(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Fo(t)}function No(e){try{let t=JSON.parse(qo(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Kt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:s}=t,c=new _t,u="state"in e&&"config"in e?e:St(e),m=false,g=new Set,C=new Map(Object.entries(n)),b=new _t,k=false,B=false;function P(){if(!m){if(k){B=true;return}k=true;try{do B=!1,_();while(B)}finally{k=false;}}}function _(){let i=b.drain(),d=c.drain(),f=[...i,...d];if(f.length>0&&(u=cn(u,f),o)){for(let R of f)if(R.type==="task-removal")try{o(R.taskName);}catch(A){console.warn("[reactive] onNodeRemoved failed:",A instanceof Error?A.message:String(A));}}let p=Tt(u);f.length>0&&s?.(f,u,p);for(let R of p.eligible)l(R);for(let R of f)if(R.type==="task-progress"){let{taskName:A,update:F}=R;if(!u.config.tasks[A])continue;let V=u.state.tasks[A];if(!V||V.status!=="running")continue;let Q=ln(A),re=y(A,Q,F).catch(J=>{m||(b.append({type:"task-failed",taskName:A,error:J.message??String(J),timestamp:new Date().toISOString()}),P());}).finally(()=>{g.delete(re);});g.add(re);}}function x(i){let f=u.config.tasks[i].requires??[],p=new Map;for(let[A,F]of Object.entries(u.config.tasks))for(let j of F.provides??[])p.set(j,A);let R={};for(let A of f){let F=p.get(A);F?R[A]=u.state.tasks[F]?.data:R[A]=void 0;}return R}async function y(i,d,f){let p=u.config.tasks[i],R=p.taskHandlers??[],A=x(i);for(let F of R){let j=C.get(F);if(!j)throw new Error(`Handler '${F}' not found in registry (task '${i}')`);let V={nodeId:i,state:A,taskState:u.state.tasks[i],config:p,callbackToken:d,update:f};if(await j(V)==="task-initiate-failure")throw new Error(`Handler '${F}' returned task-initiate-failure (task '${i}')`)}}function l(i){let f=u.config.tasks[i]?.taskHandlers;if(!f||f.length===0)return;b.append({type:"task-started",taskName:i,timestamp:new Date().toISOString()}),P();let p=ln(i),R=y(i,p).catch(A=>{m||(b.append({type:"task-failed",taskName:i,error:A.message??String(A),timestamp:new Date().toISOString()}),P());}).finally(()=>{g.delete(R);});g.add(R);}return {push(i){m||(i.type==="task-completed"&&i.data&&!i.dataHash&&(i={...i,dataHash:xr(i.data)}),c.append(i),P());},pushAll(i){if(!m){for(let d of i)d.type==="task-completed"&&d.data&&!d.dataHash?c.append({...d,dataHash:xr(d.data)}):c.append(d);P();}},resolveCallback(i,d,f){if(m)return;let p=No(i);if(!p)return;let{taskName:R}=p;if(u.config.tasks[R]){if(f&&f.length>0)c.append({type:"task-failed",taskName:R,error:f.join("; "),timestamp:new Date().toISOString()});else {let A=d&&Object.keys(d).length>0?xr(d):void 0;c.append({type:"task-completed",taskName:R,data:d,dataHash:A,timestamp:new Date().toISOString()});}P();}},addNode(i,d){m||(c.append({type:"task-upsert",taskName:i,taskConfig:d,timestamp:new Date().toISOString()}),P());},removeNode(i){m||(c.append({type:"task-removal",taskName:i,timestamp:new Date().toISOString()}),P());},addRequires(i,d){m||(c.append({type:"node-requires-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),P());},removeRequires(i,d){m||(c.append({type:"node-requires-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),P());},addProvides(i,d){m||(c.append({type:"node-provides-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),P());},removeProvides(i,d){m||(c.append({type:"node-provides-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),P());},registerHandler(i,d){C.set(i,d);},unregisterHandler(i){C.delete(i);},retrigger(i){m||u.config.tasks[i]&&(c.append({type:"task-restart",taskName:i,timestamp:new Date().toISOString()}),P());},retriggerAll(i){if(!m){for(let d of i)u.config.tasks[d]&&c.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});P();}},snapshot(){return ht(u)},getState(){return u},getSchedule(){return Tt(u)},async waitForHandlers(){g.size>0&&await Promise.allSettled([...g]);},async dispose(i){i?.wait&&g.size>0&&await Promise.allSettled([...g]),m=true;}}}function Ht(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var jo=Ht();jo("./jsonata-sync.cjs");var Lo=Ht(),Jt=Lo("./jsonata-sync.cjs"),pn=Jt;function fn(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function gn(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Mo(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await Jt(o.expr).evaluate(n);gn(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Do(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let c=pn(s.expr).evaluate(n);gn(e.computed_values,s.bindTo,c),n.computed_values=e.computed_values;}catch(c){let u=c instanceof Error?c.message:String(c);o.push({bindTo:s.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function $o(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Jt(e).evaluate(n)}function Vo(e,t){return t.startsWith("fetched_sources.")?fn(e._sourcesData??{},t.slice(16)):fn(e,t)}var mn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Uo=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Ko(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))Uo.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`):mn.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...mn].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);});}return {ok:t.length===0,errors:t}}async function Ho(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=await Jt(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Jo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=pn(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Qe={run:Mo,runSync:Do,eval:$o,resolve:Vo,validate:Ko,enrichSources:Ho,enrichSourcesSync:Jo};function Qt(e){return JSON.stringify(e)}function Gt(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function Wt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Pr(e,t){return Wt(e)?e.then(t):t(e)}function hn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Tr(e,t){return {readValues(n){let o=e(n);return Pr(o.listKeys(),s=>{let c=[...s].sort();if(c.length===0)return {version:null,values:{}};let u={},m=null;for(let g of c){let C=o.read(g);Wt(C)?m=(m??Promise.resolve()).then(async()=>{u[g]=await C;}):u[g]=C;}return m?m.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,s){let c=e(n),u=null;for(let m of s){let g=c.delete(m);Wt(g)&&(u=(u??Promise.resolve()).then(()=>g).then(()=>{}));}for(let[m,g]of Object.entries(o)){let C=c.write(m,g);Wt(C)&&(u=(u??Promise.resolve()).then(()=>C).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function zt(e,t){return {readSnapshot(r){return e.readValues(r)},commitSnapshot(r,n){if(n.schemaVersion!==t)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);return Pr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let s=hn(o.values,n);return Pr(e.writeValues(r,s,n.deleteKeys),c=>({ok:true,newVersion:c}))})}}}function yn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function Rn(e){return {readEntriesAfterCursor(t){let r=yn(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return yn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function Cn(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function Yt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ut(e,t){return Yt(e)?e.then(t):t(e)}function _r(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);Yt(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function Qo(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function Go(e,t){let r=e.match(t);return r?r[1]:null}function kn(e,t,r){let n={},o=_r(e,s=>{let c=r(s);if(c)return ut(t(s),u=>{n[c]=u;})});return Yt(o)?o.then(()=>n):n}function Xt(e,t){return {readSourceData(r,n){return ut(e.read(`${r}/${n}`),Qo)},ingestSourceDataStaged(r,n,o,s){return ut(t(o),c=>e.write(`${r}/.staged/${s}/${n}`,c))},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,c=`${r}/${n}`;return e.renameKey(s,c)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return ut(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function Er(e,t){let r=(n,o)=>{try{let s=o(n);return Yt(s)?s.catch(c=>t(n,c instanceof Error?c.message:String(c))):void 0}catch(s){try{return t(n,s instanceof Error?s.message:String(s))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return ut(e.read(n),s=>e.write(n,[...s??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ut(e.read(n),s=>{let c=s;if(!(!c||c.length===0))return ut(_r(c,u=>r(u,o)),()=>e.delete(n))})}}}function Br(e,t,r){return {readRuntime(n){return ut(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function Zt(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return ut(e.listKeys("cards/"),t=>kn(t,r=>e.read(r),r=>Go(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return _r(Object.entries(t),([r,n])=>{if(r)return n===void 0?e.delete(`data-objects/${r}`):e.write(`data-objects/${r}`,n)})},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){return ut(e.listKeys("data-objects/"),t=>kn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function Ft(e,t){function r(){return e.readIndex()??{}}function n(o,s,c){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let m={...o},g=m;for(let C=0;C<u.length-1;C++){let b=u[C],k=g[b],B=k&&typeof k=="object"&&!Array.isArray(k)?{...k}:{};g[b]=B,g=B;}return g[u[u.length-1]]=c,m}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,c]of Object.entries(r())){if(!e.cardExists(c.key))continue;let u=e.readCard(c.key);u?o.push(u):t?.(`[card-store] could not read card "${s}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,c]of Object.entries(r()))o[s]=c.checksum;return o},changedSince(o){let s=r(),c=[];for(let[u,m]of Object.entries(s))o[u]!==m.checksum&&c.push(u);for(let u of Object.keys(o))s[u]||c.push(u);return c},validateUpsert(o,s){let c=r(),u=c[o],m=Object.entries(c).find(([,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}"`}:m&&m[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${m[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,c){let u=r(),m=c??u[o]?.key??e.defaultCardKey(o),g=e.writeCard(m,s);u[o]={key:m,checksum:g,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,s,c){let u=r(),m=u[o];if(!m||!e.cardExists(m.key))throw new Error(`card "${o}" not found`);let g=e.readCard(m.key);if(!g||typeof g!="object"||Array.isArray(g))throw new Error(`card "${o}" is not patchable`);let C=n(g,s,c),b=e.writeCard(m.key,C);u[o]={key:m.key,checksum:b,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let s=r(),c=s[o];c&&(e.removeCard(c.key),delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function er(e,t){return Xt(e,t)}function bn(e){return Rn(e)}var tr="v1",ct="board/graph",Sn="board/lastJournalProcessedId";function wn(e){return `cards/${e}/runtime`}function vn(e){return zt(e,tr)}function rr(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Gt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Qt(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){e.write("board-runtime-store-ref",r);},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){e.write("queue-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){e.write("chat-store-ref",r);},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){e.write("artifacts-store-ref",r);},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){e.write("fetched-sources-store-ref",r);}}}function An(e){return Zt(e)}function Et(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Wo(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Bt(e,t){return e?.lastRequestedToken?Wo(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Or(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Ot(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function Ct(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=Tt(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 m=new Map;for(let[P,_]of Object.entries(n))for(let x of _.requires??[]){let y=m.get(x)??[];y.push(P),m.set(x,y);}let g=o.sort().map(P=>{let _=r[P],x=n[P]??{requires:[],provides:[]};_.status==="completed"?c.completed+=1:_.status==="failed"?c.failed+=1:_.status==="in-progress"&&(c.in_progress+=1);let y=x.requires??[],l=x.provides??[],i=Object.keys(_.data??{}).sort(),d=y.filter(j=>t.state.availableOutputs.includes(j)),f=y.filter(j=>!t.state.availableOutputs.includes(j)),p=u.get(P)??f,R=new Set;for(let j of l)for(let V of m.get(j)??[])V!==P&&R.add(V);let A=_.failedAt,F=_.error?{message:_.error,code:"TASK_FAILED",at:A,source:"task-runtime"}:void 0;return {name:P,status:_.status,error:F,requires:y,requires_satisfied:d,requires_missing:f,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 C=g.map(P=>({name:P.name,fanOut:P.unblocks.length})).sort((P,_)=>_.fanOut-P.fanOut||P.name.localeCompare(_.name)),b=C.length>0?C[0]:{name:null,fanOut:0},k=new Set;for(let P of Object.values(n))for(let _ of P.requires??[])k.add(_);let B=0;for(let[P,_]of Object.entries(n)){let x=(_.requires??[]).length===0,l=(_.provides??[]).some(i=>(m.get(i)??[]).some(d=>d!==P));x&&!l&&(B+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:c.completed,eligible:s.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:B,topology:{edge_count:Array.from(k).length,max_fan_out_card:b.name,max_fan_out:b.fanOut}},cards:g}}function zo(){return new Date().toISOString()}function xn(e,t,r,n,o,s,c){return async u=>{let m=[],g=r.cardStore.readCard(u.nodeId);if(!g)return "task-initiate-failure";let C=g.id,b=g.card_data??{},k=g.source_defs??[],B=k,P=r.cardRuntimeStore.readRuntime(C),_=false,x=()=>{_&&(r.cardRuntimeStore.writeRuntime(C,P),_=false);},y=G=>Et(P._sources[G]),l=(G,Y)=>{P._sources[G]=Et(Y),_=true;},i=u.taskState?.executionCount??0;if(P._lastExecutionCount!==i&&(P._sources={},P._lastExecutionCount=i,_=true),u.update){let G=u.update,Y=G.outputFile;if(Y){let T=y(Y);if(G.failure){let w=G.rqt??T.lastRequestedToken??T.queueRequestedToken;w&&l(Y,Ot(T,w));}else {let w=G.rqt;if(!T.lastCompletedToken||w>T.lastCompletedToken){let H=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,L=false;H&&(L=r.fetchedSourcesStore.commitSourceData(C,Y,H)),L?l(Y,Or(T,w)):l(Y,Ot(T,w));}}x();}}let f={};for(let G of k)if(G.outputFile){let Y=r.fetchedSourcesStore.readSourceData(C,G.outputFile);Y!==null&&(f[G.bindTo]=Y);}let p={};for(let[G,Y]of Object.entries(u.state??{}))if(Y!==null&&typeof Y=="object"&&!Array.isArray(Y)){let T=Y[G];p[G]=T!==void 0?T:Y;}else p[G]=Y;let R={id:C,card_data:{...b},requires:p,source_defs:k,compute:g.compute};R._sourcesData=f,g.compute&&Qe.runSync(R,{sourcesData:f}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(C,R.computed_values??{});let A={...g},F=Qe.enrichSourcesSync(Array.isArray(g.source_defs)?g.source_defs:void 0,{card_data:g.card_data,requires:p}),j=e.value;A.source_defs=Array.isArray(F)?F.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:j})):F;let V=zo(),Q=u.update?void 0:V,re=B.filter(G=>{let Y=G.outputFile;if(typeof Y!="string"||!Y)return true;let T=y(Y);Q&&(T={...T,queueRequestedToken:Q},l(Y,T));let w=T.queueRequestedToken??T.lastRequestedToken??V,H=Bt(T,w);return H==="in-flight"?false:H==="dispatch"});if(x(),re.length>0){let G=false,Y=V;for(let T of re){let w=T.outputFile;if(typeof w!="string"||!w)continue;let H=y(w),L=H.queueRequestedToken??V;l(w,{...H,lastRequestedToken:L}),Y=L,G=true;}return G&&x(),G&&(m.push({taskKind:"source-fetch",payload:{boardRef:be(e),enrichedCard:A,callbackToken:u.callbackToken,rqt:Y}}),r.executionRequestStore.appendEntries(t,m)),"task-initiated"}if(B.some(G=>{let Y=G.outputFile;if(typeof Y!="string"||!Y)return false;let T=y(Y),w=T.queueRequestedToken??T.lastRequestedToken??V;return Bt(T,w)==="in-flight"}))return "task-initiated";let se=g.provides??[],de={};for(let{bindTo:G,ref:Y}of se)de[G]=Qe.resolve(R,Y);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(de),n(u.nodeId,de),m.length>0&&r.executionRequestStore.appendEntries(t,m),"task-initiated"}}var qt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function nr(e){return {[ct]:e.graph,[Sn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function or(e){let t=e[ct],r=e[Sn],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ct}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function ar(e){let t=e.requires;return {provides:e.provides?.map(n=>n.bindTo)??[],taskHandlers:["card-handler"],description:e.meta?.title??e.id,...t&&t.length>0?{requires:t}:{}}}function sr(e,t={}){function r(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 C=t.emitNotification;if(!C||g.length===0)return;let b=qe(g);if(b.length===1){await C(b[0]);return}await C(Ne({kind:"notification-batch",notifications:b}));}function c(g){let C=g.params?.id;if(C){let b=e.readCard(C);if(!b)throw new Error(`card "${C}" not found`);return [b]}return e.readAllCards()}function u(g){return Ne({kind:"notification-batch",notifications:qe(g.map(C=>({kind:"card_refreshed",cardId:C.id,card:C})))})}function m(g){if(Array.isArray(g))return g;if(g&&typeof g=="object"){let C=g;return Array.isArray(C.files)?C.files:[g]}return null}return {get(g){try{return r({cards:c(g)})}catch(C){return o(C)}},buildNotificationBatch(g){try{return r(u(c(g)))}catch(C){return o(C)}},set(g){try{let C=g.body;if(C==null)return n("set requires a body (card object or array of cards)");let b=Array.isArray(C)?C:[C];for(let k of b){if(typeof k.id!="string")return n("each card must have a string `id` field");e.writeCard(k.id,k);}return s(b.map(k=>({kind:"card_refreshed",cardId:k.id,card:k}))),r({count:b.length})}catch(C){return o(C)}},del(g){try{let C=g.body?.ids??[],b=g.params?.id,k=b?[...C,b]:C;if(k.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of k)e.removeCard(B);return s(k.map(B=>({kind:"card_removed",cardId:B}))),r({count:k.length})}catch(C){return o(C)}},patch(g){try{let C=g.params?.id,b=g.params?.path;if(!C)return n("patch requires params.id");if(!b)return n("patch requires params.path");let k=g.body,B=k&&Object.prototype.hasOwnProperty.call(k,"value")?k.value:g.body;e.patchCard(C,b,B);let P=e.readCard(C);return P?(s([{kind:"card_refreshed",cardId:C,card:P}]),r({count:1})):n(`card "${C}" not found`)}catch(C){return o(C)}},appendFiles(g){try{let C=g.params?.id;if(!C)return n("appendFiles requires params.id");let b=e.readCard(C);if(!b)return n(`card "${C}" not found`);let k=m(g.body);if(!k||k.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},P=Array.isArray(B.files)?B.files:[],_=[...P,...k],x=k.map((l,i)=>({idx:P.length+i,entry:l})),y=this.patch({params:{id:C,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:x})}catch(C){return o(C)}}}}function ge(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ce(e){return {status:"fail",error:e}}function Re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Yo(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 Tn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function ir(e){try{let t=JSON.parse(Tn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function In(e){return Yo(JSON.stringify(e))}function Pn(e){try{let t=JSON.parse(Tn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Xe(){return new Date().toISOString()}function Xo(e){let t=new Map;return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.get(r)??[];t.set(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.get(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(c){try{e(s,c instanceof Error?c.message:String(c));}catch{}}t.delete(r);}}}}function _n(e,t,r={}){Vt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),s=be(e),c=r.boardRuntimeStoreRef,u=r.scratchStoreRef,m=r.taskExecutorRef,g=r.chatHandlerFlow,C=r.emitNotification??(M=>{if(!t.publishBoardChangeNotifications)return;let h=M.kind==="notification-batch"?M.notifications:[M];return t.publishBoardChangeNotifications(h)});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 k(M){if(M.length!==0)try{let h=qe(M),q=Ne({kind:"notification-batch",notifications:h}),U=C(q);U&&typeof U.catch=="function"&&U.catch(ae=>o(`[board-live-cards-public] emitNotification failed: ${ae instanceof Error?ae.message:String(ae)}`));}catch(h){o(`[board-live-cards-public] emitNotification failed: ${h instanceof Error?h.message:String(h)}`);}}function B(){let M=_().readCardStoreRef();if(!M)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let h=t.kvStorageForRef(M);return {readIndex(){return h.read("_index")},writeIndex(q){h.write("_index",q);},readCard(q){return h.read(q)},writeCard(q,U){return h.write(q,U),t.hashFn(U)},removeCard(q){h.delete(q);},cardExists(q){return h.read(q)!==null},defaultCardKey(q){return q}}}let P={readValues(M){let h=t.kvStorageForRef(b()),q=h.listKeys().sort();if(q.length===0)return {version:null,values:{}};let U={};for(let ae of q)U[ae]=h.read(ae);return {version:t.hashFn(U),values:U}},writeValues(M,h,q){let U=t.kvStorageForRef(b());for(let ae of q)U.delete(ae);for(let[ae,ne]of Object.entries(h))U.write(ae,ne);return t.hashFn(h)}},_=()=>rr(t.kvStorageForRef(b())),x=()=>vn(P),y=()=>bn(t.journalAdapterForRef(b())),l=()=>Ft(B(),o),i=()=>{let M=_().readOutputsStoreRef();if(!M)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return An(t.kvStorageForRef(M))};function d(){return m??_().readTaskExecutorRef()}function f(){return !!x().readSnapshot(e.value).values[ct]}function p(){let M=x().readSnapshot(e.value);if(!M.values[ct])throw new Error(`Board not initialized at ${e.value}`);return or(M.values)}function R(M,h){let q=x().commitSnapshot(e.value,{schemaVersion:tr,expectedVersion:h,commitId:t.genId(),committedAt:Xe(),deleteKeys:[],shallowMerge:nr(M)});if(!q.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${h??"null"} current=${q.currentVersion??"null"}`)}function A(M){y().appendEvent(M);}async function F(){let h=Xo((X,a)=>{let S=X.payload,D=(S?.enrichedCard??{}).id??S?.cardId??"unknown";A({type:"task-failed",taskName:D,error:a,timestamp:Xe()});}),q=p(),U=Rt(q.graph),{events:ae,newCursor:ne}=y().readEntriesAfterCursor(q.lastDrainedJournalId),he=L(),fe=er(he,X=>t.resolveBlob(X)),ke={...q.runtimeByCardId},Te=new Map,He={readRuntime(X){return Te.get(X)??ke[X]??{_sources:{}}},writeRuntime(X,a){Te.set(X,a),ke[X]=a;}},Je=[],De=new Map,We={readSourceData(X,a){let S=`${X}/${a}`;return De.has(S)?De.get(S):fe.readSourceData(X,a)},ingestSourceDataStaged(X,a,S,E){fe.ingestSourceDataStaged(X,a,S,E);},commitSourceData(X,a,S){let E=`${X}/.staged/${S}/${a}`,D=he.read(E);if(D==null){let Z=he.keyRef?.(E);Z&&(D=t.resolveBlob(Z));}if(D==null)return false;let K=`${X}/${a}`,te=D.trim();try{De.set(K,JSON.parse(te));}catch{De.set(K,te);}return Je.push({cardId:X,outputFile:a,deliveryToken:S}),true},hasSource(X,a){let S=`${X}/${a}`;return De.has(S)?true:fe.hasSource(X,a)},listSources(X){let a=fe.listSources(X),S=new Set;for(let D of De.keys())D.startsWith(`${X}/`)&&S.add(D.slice(`${X}/`.length));let E=new Set([...a,...S]);return Array.from(E)}},ze={cardStore:l(),cardRuntimeStore:He,fetchedSourcesStore:We,outputStore:i(),executionRequestStore:h},dt=[],At=[],xt=[],lt=new Map,It=new Set,jt=(X,a)=>{dt.push({type:"task-completed",taskName:X,data:a,timestamp:Xe()});},Lt=(X,a)=>{A({type:"task-failed",taskName:X,error:a,timestamp:Xe()});},bt=Kt(U,{handlers:{"card-handler":xn(e,ne,ze,jt,Lt,(X,a)=>{At.push({cardId:X,values:a});},X=>{xt.push(X);})},onNodeRemoved:X=>{lt.delete(X),Te.delete(X),delete ke[X],It.add(X);}});for(dt=ae;dt.length>0;){let X=dt;dt=[];for(let a of X)if(a.type==="task-restart"){let S=ze.cardStore.readCard(a.taskName);S&<.set(a.taskName,S);}bt.pushAll(X),await bt.waitForHandlers();}let hr=bt.getState();await bt.dispose({wait:true});let Rr=x().readSnapshot(e.value).version;R({lastDrainedJournalId:ne,graph:ht(hr),runtimeByCardId:ke},Rr);for(let{cardId:X,values:a}of At)ze.outputStore.writeComputedValues(X,a);for(let X of xt)ze.outputStore.writeDataObjects(X);for(let{cardId:X,outputFile:a,deliveryToken:S}of Je)fe.commitSourceData(X,a,S);let Pt;try{Pt=Ct(s,hr),ze.outputStore.writeStatusSnapshot(Pt);}catch(X){o(`[board-live-cards-public] status publish failed: ${X instanceof Error?X.message:String(X)}`);}let pt=[];for(let{cardId:X,values:a}of At)pt.push({kind:"computed_values",cardId:X,values:a});for(let X of xt)for(let[a,S]of Object.entries(X))a&&pt.push({kind:"data_object",key:a,payload:S});for(let[X,a]of lt)pt.push({kind:"card_refreshed",cardId:X,card:a});for(let X of It)pt.push({kind:"card_removed",cardId:X});Pt!==void 0&&pt.push({kind:"status",status:Pt}),k(pt);let kt=d()??{howToRun:"built-in",whatToRun:be({kind:"built-in",value:"source-cli-task-executor"})},Mt=t.supportsDirectSourceOutput?.(kt)===true;h.dispatchEntriesForJournalId(ne,X=>{if(X.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${X.taskKind}" \u2014 skipping`);return}let a=X.payload,S=a.enrichedCard?.id??"unknown",E=a.enrichedCard?.source_defs??[];if(kt.howToRun==="queue-storage"&&Mt){try{let D=t.queueStorageForRef(j(),"task-executor"),K=typeof kt.extra?.boardId=="string"?kt.extra.boardId:void 0,te=[];for(let Z of E){if(!Z.outputFile){o(`[dispatch] source "${Z.bindTo}" has no outputFile \u2014 skipping`);continue}let ue=t.genId(),Me=`${S}/.staged/${ue}/${Z.outputFile}`,Ae=he.keyRef?.(Me);if(!Ae)continue;let $e={ref:be(Ae),deliveryToken:ue,outputFile:Z.outputFile,cardId:S},Cr=In({cbk:a.callbackToken,rg:e.value,br:be(e),cid:S,b:Z.bindTo,d:Z.outputFile,cs:void 0,rqt:a.rqt,dt:$e.deliveryToken});te.push({...K?{boardId:K}:{},ref:kt,args:{source_def:Z,base_ref:be(e),callback:n.createCallback(Cr),output:$e}});}te.length>0&&D.enqueueMany(te);}catch(D){Lt(S,D instanceof Error?D.message:String(D));}return}for(let D of E){if(!D.outputFile){o(`[dispatch] source "${D.bindTo}" has no outputFile \u2014 skipping`);continue}let K;if(Mt){let Z=t.genId(),ue=`${S}/.staged/${Z}/${D.outputFile}`,Me=he.keyRef?.(ue);Me&&(K={ref:be(Me),deliveryToken:Z,outputFile:D.outputFile,cardId:S});}let te=In({cbk:a.callbackToken,rg:e.value,br:be(e),cid:S,b:D.bindTo,d:D.outputFile,cs:void 0,rqt:a.rqt,...K?{dt:K.deliveryToken}:{}});t.dispatchExecution(kt,{source_def:D,base_ref:be(e),callback:n.createCallback(te),...K?{output:K}:{}}).catch(Z=>Lt(S,Z instanceof Error?Z.message:String(Z)));}});}function j(){let M=_().readQueueStoreRef();if(!M)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);return M}function V(){let M=t.queueStorageForRef(j(),"process-accumulated");M.enqueueIfAbsent?M.enqueueIfAbsent({boardRef:be(e)},`process-accumulated:${be(e)}`):M.enqueue({boardRef:be(e)}),t.requestProcessAccumulated?.();}function Q(){let M=t.queueStorageForRef(j(),"process-accumulated");for(;;){let h=M.lease({max:64,visibilityMs:1e3});if(h.length<=0)return;for(let q of h)M.ack(q.id,q.leaseToken);if(h.length<64)return}}async function re(){try{let M=()=>{let q=p(),{events:U}=y().readEntriesAfterCursor(q.lastDrainedJournalId);U.length<=0||V();},h=await Wr(t.lock,F,M);return ge({ran:h!==!1})}catch(M){return Re(M)}}function J(){V();}function se(M){try{let h=M.params?.cardStoreRef;if(!h)return ce("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(c=M.params?.boardRuntimeStoreRef,!c)return ce("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!f()){let ke=St(qt);R({lastDrainedJournalId:"",graph:ht(ke),runtimeByCardId:{}},null);}let q=M.params?.outputsStoreRef;if(!q)return ce("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let U=M.params?.queueStoreRef;if(!U)return ce("init requires params.queueStoreRef \u2014 pass the queue store ref here");let ae=M.params?.fetchedSourcesStoreRef;if(!ae)return ce("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");u=M.params?.scratchStoreRef;let ne=M.params?.chatStoreRef;if(!ne)return ce("init requires params.chatStoreRef \u2014 pass the chat store ref here");let he=M.params?.artifactsStoreRef;if(!he)return ce("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let fe=_();fe.writeBoardRuntimeStoreRef(c),fe.writeCardStoreRef(h),fe.writeOutputsStoreRef(q),fe.writeQueueStoreRef(U),fe.writeFetchedSourcesStoreRef(ae),fe.writeChatStoreRef(ne),fe.writeArtifactsStoreRef(he);try{i().writeStatusSnapshot(Ct(s,Rt(p().graph)));}catch{}return ge()}catch(h){return Re(h)}}function de(M){try{let h=i().readStatusSnapshot();if(!h){h=Ct(s,Rt(p().graph));try{i().writeStatusSnapshot(h);}catch{}}return ge(h)}catch(h){return Re(h)}}function G(M){try{let h=M.params?.id;if(!h)return ce("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(h);}catch{}return A({type:"task-removal",taskName:h,timestamp:Xe()}),J(),ge()}catch(h){return Re(h)}}function Y(M){try{let h=M.params?.cardId;if(!h)return ce("addCardFiles requires params.cardId");let q=sr(l(),{emitNotification:C}).appendFiles({params:{id:h},body:M.body});return q.status!=="success"?q:ge({cardId:h,files_added:q.data.files_added,notified:!0})}catch(h){return Re(h)}}function T(M){try{let h=M.params?.id;return h?(A({type:"task-restart",taskName:h,timestamp:Xe()}),J(),ge()):ce("retrigger requires params.id")}catch(h){return Re(h)}}async function w(M){return Q(),re()}function H(){let M=_().readFetchedSourcesStoreRef();if(!M)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return M}function L(){return t.blobStorageForRef(H())}function v(M){try{let h=M.params?.cardId,q=M.params?.all,U=!!M.params?.restart;if(!h&&!q)return ce("upsertCard requires --card-id <id> or --all");let ae=q?l().readAllCards().map(ne=>ne.id):[h];for(let ne of ae)if(!l().readCard(ne))return ce(`Card "${ne}" not found in board at ${e.value}`);for(let ne of ae){let he=l().readCard(ne),fe=ar(he),ke=t.hashFn(fe),Te=t.kvStorage("card-upsert"),He=Te.read(ne),Je=He?.taskConfigHash!==ke;if(!(!Je&&!U)){if(Je){let De=He?.blobRef??l().readCardKey(ne)??ne;A({type:"task-upsert",taskName:ne,taskConfig:fe,timestamp:Xe()}),Te.write(ne,{blobRef:De,taskConfigHash:ke,updatedAt:Xe()});}U&&A({type:"task-restart",taskName:ne,timestamp:Xe()});}}return J(),ge()}catch(h){return Re(h)}}function I(M){try{let h=M.params?.token;if(!h)return ce("taskFailed requires params.token");let q=M.params?.error??"unknown error",U=ir(h);return U?(A({type:"task-failed",taskName:U.taskName,error:q,timestamp:Xe()}),J(),ge()):ce("Invalid callback token")}catch(h){return Re(h)}}function O(M){try{let h=M.params?.token;if(!h)return ce("taskProgress requires params.token");let U=(M.body??{}).update??{},ae=ir(h);return ae?(A({type:"task-progress",taskName:ae.taskName,update:U,timestamp:Xe()}),J(),ge()):ce("Invalid callback token")}catch(h){return Re(h)}}function N(M){try{let h=M.params?.token,q=M.params?.ref;if(!h)return ce("sourceDataFetched requires params.token");if(!q)return ce("sourceDataFetched requires params.ref");let U=Pn(h);if(!U)return ce("Invalid source token");let{cbk:ae,cid:ne,b:he,d:fe,cs:ke,rqt:Te,dt:He}=U,Je=er(L(),dt=>t.resolveBlob(dt)),De=He||t.genId();He||Je.ingestSourceDataStaged(ne,fe,at(q),De);let We=ir(ae);if(!We)return ce("Invalid callback token embedded in source token");let ze=Xe();return A({type:"task-progress",taskName:We.taskName,update:{bindTo:he,outputFile:fe,fetchedAt:ze,deliveryToken:De,sourceChecksum:ke,rqt:Te},timestamp:ze}),J(),ge()}catch(h){return Re(h)}}function $(M){try{let h=M.params?.token,q=M.params?.reason??"unknown";if(!h)return ce("sourceDataFetchFailure requires params.token");let U=Pn(h);if(!U)return ce("Invalid source token");let{cbk:ae,b:ne,d:he,cs:fe,rqt:ke}=U,Te=ir(ae);return Te?(A({type:"task-progress",taskName:Te.taskName,update:{bindTo:ne,outputFile:he,failure:!0,reason:q,sourceChecksum:fe,rqt:ke},timestamp:Xe()}),J(),ge()):ce("Invalid callback token embedded in source token")}catch(h){return Re(h)}}function z(M){try{let h=_().readCardStoreRef();return h?ge({storeRef:h}):ce(`Board at ${e.value} has no card store configured`)}catch(h){return Re(h)}}function oe(M){try{return ge({storeRef:c??null})}catch(h){return Re(h)}}function ie(M){try{let h=_().readOutputsStoreRef();return h?ge({storeRef:h}):ce(`Board at ${e.value} has no outputs store configured`)}catch(h){return Re(h)}}function Pe(M){try{return ge({storeRef:u??null})}catch(h){return Re(h)}}function Be(M){try{let h=_().readChatStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function Ee(M){try{let h=_().readArtifactsStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function ye(M){try{let h=_().readFetchedSourcesStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function Ce(M){try{let h=M.params?.key;if(!h)return ce("getConfig requires params.key");let q=_(),U;switch(h){case "task-executor":U=m??null;break;case "chat-handler-flow":U=g??null;break;case "board-runtime-store-ref":U=q.readBoardRuntimeStoreRef();break;case "card-store-ref":U=q.readCardStoreRef();break;case "outputs-store-ref":U=q.readOutputsStoreRef();break;case "scratch-store-ref":U=u??null;break;case "chat-store-ref":U=q.readChatStoreRef();break;case "artifacts-store-ref":U=q.readArtifactsStoreRef();break;case "fetched-sources-store-ref":U=q.readFetchedSourcesStoreRef();break;default:return ce(`getConfig: unknown key "${h}"`)}return ge({value:U})}catch(h){return Re(h)}}function je(M){try{let h=M.params?.key;if(!h)return ce("getOutputsDataObject requires params.key");let q=i().readDataObject(h);return ge(q)}catch(h){return Re(h)}}function Se(M){try{return ge(i().readAllDataObjects())}catch(h){return Re(h)}}function Fe(M){try{let h=M.params?.key;if(!h)return ce("getOutputsComputedValues requires params.key");let q=i().readComputedValues(h);return ge(q)}catch(h){return Re(h)}}function Le(M){try{return ge(i().readAllComputedValues())}catch(h){return Re(h)}}function pe(){return er(L(),M=>t.resolveBlob(M))}function Ze(M){let h=L().keyRef?.(M);if(!h)throw new Error("configured fetched-sources store does not support keyRef");return be(h)}function Ke(M){try{let h=M.params?.key;if(!h)return ce("getOutputsFetchedSources requires params.key");let q=pe().listSources(h),U={};for(let ae of q)U[ae]=Ze(`${h}/${ae}`);return ge(U)}catch(h){return Re(h)}}function Ve(M){try{let h=pe(),q=new Set;for(let ae of L().listKeys()){let ne=ae.indexOf("/");ne>0&&!ae.includes("/.staged/")&&q.add(ae.slice(0,ne));}let U={};for(let ae of q){let ne=h.listSources(ae);if(ne.length>0){U[ae]={};for(let he of ne)U[ae][he]=Ze(`${ae}/${he}`);}}return ge(U)}catch(h){return Re(h)}}function et(M){try{let h=l().readAllCards(),q=de({});if(q.status!=="success")return q;let U=Se({});if(U.status!=="success")return U;let ae=Le({});if(ae.status!=="success")return ae;let ne=ae.data,he={};for(let fe of h){let ke=typeof fe?.id=="string"?fe.id:null;if(!ke)continue;let Te=fe.card_data&&typeof fe.card_data=="object"&&!Array.isArray(fe.card_data)?fe.card_data:{};he[ke]={schema_version:"v1",card_id:ke,card_data:{...Te},computed_values:ne[ke]&&typeof ne[ke]=="object"?ne[ke]:{}};}return ge({cardDefinitions:h,statusSnapshot:q.data,dataObjectsByToken:U.data,cardRuntimeById:he})}catch(h){return Re(h)}}return {init:se,status:de,getBoardRuntimeStoreRef:oe,getCardStoreRef:z,getOutputsStoreRef:ie,getScratchStoreRef:Pe,getChatStoreRef:Be,getArtifactsStoreRef:Ee,getFetchedSourcesStoreRef:ye,getConfig:Ce,getOutputsDataObject:je,getAllOutputsDataObjects:Se,getOutputsComputedValues:Fe,getAllOutputsComputedValues:Le,getOutputsFetchedSources:Ke,getAllOutputsFetchedSources:Ve,buildSseOneShotPayload:et,removeCard:G,addCardFiles:Y,retrigger:T,processAccumulatedEvents:w,upsertCard:v,taskFailed:I,taskProgress:O,sourceDataFetched:N,sourceDataFetchFailure:$}}function En(e,t,r){let n=r?.taskExecutorRef,o=()=>{if(r){if(!r.boardRuntimeStoreRef)throw new Error(`Board at ${e.value} requires boardRuntimeStoreRef for non-core runtime operations.`);return rr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return rr(t.kvStorage("config"))};function s(){let 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,f){return i.write(d,f),t.hashFn(f)},removeCard(d){i.delete(d);},cardExists(d){return i.read(d)!==null},defaultCardKey(d){return d}}}let c=()=>Ft(s(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function m(l,i){let d=t.validateSchema(i),f=[],p=u();if(p&&Array.isArray(i.source_defs))for(let A of i.source_defs){let F=typeof A.bindTo=="string"?A.bindTo:"(unknown)";try{let j;try{j=await t.invokeExecutor(p,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(A)});}catch(Q){let re=Q;if(j=typeof re?.stdout=="string"?re.stdout:"",!j.trim()){f.push(`source "${F}": executor validate-source-def failed \u2014 ${Q instanceof Error?Q.message:String(Q)}`);continue}}let V=JSON.parse(j.trim());if(!V.ok&&Array.isArray(V.errors))for(let Q of V.errors)f.push(`source "${F}": ${Q}`);}catch(j){f.push(`source "${F}": executor validate-source-def failed \u2014 ${j instanceof Error?j.message:String(j)}`);}}let R=[...d.errors,...f];return ge({cardId:l,isValid:R.length===0,issues:R})}function g(l,i){let d=l.params?.sourceIdx,f=l.params?.outRef;if(d===void 0)return ce(`${i} requires params.sourceIdx`);if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return ce(`${i} requires card JSON object in body`);let p=l.body,R=p["card-content"]??p,A=p["mock-projections"]??{},F=R.source_defs??[];if(d<0||d>=F.length)return ce(`sourceIdx ${d} out of range (card has ${F.length} source(s))`);let j=F[d],V=typeof j.bindTo=="string"?j.bindTo:"source";return {src:j,bindTo:V,outRef:f,mockProjections:A}}async function C(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return ce("validateCardPreflight requires card JSON object in body");let i=l.body,d=i["card-content"]??i,f=typeof d.id=="string"?d.id:"(unknown)";return await m(f,d)}catch(i){return Re(i)}}async function b(l){try{let i=g(l,"probeSourcePreflight");if("status"in i)return i;let d=u();if(!d)return ce("No task-executor registered for this board");try{let f={...i.src,_projections:i.mockProjections},p=await t.invokeExecutor(d,"probe-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(f)}),R=JSON.parse(p.trim());return R.ok?ge({bindTo:i.bindTo,reachable:R.reachable,latencyMs:R.latencyMs,note:R.note}):ce(R.error??"Preflight probe failed")}catch{return ce("Executor does not support probe-source-preflight")}}catch(i){return Re(i)}}async function k(l){try{let i=g(l,"runSourcePreflight");if("status"in i)return i;let d=u();if(!d)return ce("No task-executor registered for this board");try{let f={...i.src,_projections:i.mockProjections},p=await t.invokeExecutor(d,"run-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(f)}),R=JSON.parse(p.trim());if(!R.ok)return ge({bindTo:i.bindTo,ok:!1,result:null,issues:[R.error??"Preflight run failed"]});if(i.outRef){let A=at(i.outRef);t.absoluteBlob.write(A.value,JSON.stringify(R.resultValue,null,2));}return ge({bindTo:typeof R.bindTo=="string"?R.bindTo:i.bindTo,ok:!0,result:R.resultValue??null,issues:[]})}catch(f){let p=f instanceof Error?f.message:String(f);return ge({bindTo:i.bindTo,ok:!1,result:null,issues:[p]})}}catch(i){return Re(i)}}async function B(l){try{let i=u();if(!i)return ce("No task-executor registered for this board");let d=await t.invokeExecutor(i,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return ge(JSON.parse(d.trim()))}catch(i){return Re(i)}}function P(l){try{let i=l.body;if(!i||!Array.isArray(i.ops))return ce("updatesInCardStore requires body.ops array");let d=i.ops,f=c();for(let p of d){let R=p.op,A=p.id;if(!A)return ce('op is missing "id"');if(R==="update"){let F=p["card-content"];if(!F)return ce(`update op for "${A}" is missing "card-content"`);f.writeCard(A,F);}else return ce(`Unknown op type: "${R??"(none)"}"`)}return ge()}catch(i){return Re(i)}}function _(l){try{let i=l.body;if(!i||!Array.isArray(i.ids))return ce("readFromCardStore requires body.ids array");let d=i.ids,f=c(),p=d.map(R=>({id:R,"card-content":f.readCard(R)}));return ge({cards:p})}catch(i){return Re(i)}}function x(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return ce("evalCardCompute requires a JSON object in body");let i=l.body,d=i["card-content"]??i,f=typeof d.id=="string"?d.id:"(unknown)",p=i["mock-fetched-sources"]??{},R=i["mock-requires"]??{},A=d.compute;if(!A||!Array.isArray(A)||A.length===0)return ge({cardId:f,ok:!0,computed_values:{},errors:[]});let F={id:f,card_data:d.card_data??{},requires:R,source_defs:d.source_defs,compute:A},j=Qe.runSync(F,{sourcesData:p}),V=j.node.computed_values??{},Q=j.errors??[];return ge({cardId:f,ok:Q.length===0,computed_values:V,errors:Q})}catch(i){return Re(i)}}async function y(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return ce("simulateCardCycle requires a JSON object in body");let i=l.body,d=i["card-content"]??i,f=typeof d.id=="string"?d.id:"(unknown)",p=i["mock-fetched-sources"]??{},R=i["mock-requires"]??{},A=await m(f,d),F=A.status==="success"?{isValid:A.data.isValid,issues:A.data.issues}:{isValid:!1,issues:[A.status==="fail"?A.error:"internal error"]},j=d.source_defs??[],V=d.card_data??{},Q=[],re=[];if(j.length>0){Q=Qe.enrichSourcesSync(j,{card_data:V,requires:R});for(let L of Q){let v=L.projections,I=L._projections;if(v&&I){for(let O of Object.keys(v))if(I[O]===void 0){let N=typeof L.bindTo=="string"?L.bindTo:"(unknown)";re.push({bindTo:N,key:O,error:`Projection "${O}" resolved to undefined`});}}}}let J=[],se={...p},de=i["task-executor-ref"],G=(de?.howToRun&&de?.whatToRun?de:void 0)??u();for(let L=0;L<Q.length;L++){let v=Q[L],I=typeof v.bindTo=="string"?v.bindTo:`source_${L}`;if(!G){J.push({bindTo:I,skipped:!0,error:"No task executor configured"});continue}try{let O={...v},N=await t.invokeExecutor(G,"run-source-preflight",{timeout:v.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(O)}),$=JSON.parse(N.trim());$.ok&&!Object.prototype.hasOwnProperty.call(p,I)&&Object.prototype.hasOwnProperty.call($,"resultValue")&&(se[I]=$.resultValue),J.push({bindTo:I,reachable:$.reachable,latencyMs:$.latencyMs,error:$.ok?void 0:$.error});}catch{J.push({bindTo:I,skipped:!0,error:"Executor does not support run-source-preflight"});}}let Y=d.compute,T={},w=[];if(Y&&Array.isArray(Y)&&Y.length>0){let L={id:f,card_data:V,requires:R,source_defs:d.source_defs,compute:Y},v=Qe.runSync(L,{sourcesData:se});T=v.node.computed_values??{},w=v.errors??[];}let H=F.isValid&&re.length===0&&w.length===0&&J.every(L=>L.reachable!==!1);return ge({cardId:f,ok:H,validation:F,source_probes:J,projection_errors:re,fetched_sources:se,computed_values:T,compute_errors:w})}catch(i){return Re(i)}}return {validateCardPreflight:C,probeSourcePreflight:b,runSourcePreflight:k,evalCardCompute:x,simulateCardCycle:y,describeTaskExecutorCapabilities:B,updatesInCardStore:P,readFromCardStore:_}}function ur(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 C=t.emitNotification;if(!C||g.length===0)return;let b=qe(g);if(b.length===1){await C(b[0]);return}await C(Ne({kind:"notification-batch",notifications:b}));}async function c(g){let C=g.params?.id;if(C){let b=await e.readCard(C);if(!b)throw new Error(`card "${C}" not found`);return [b]}return await e.readAllCards()}function u(g){return Ne({kind:"notification-batch",notifications:qe(g.map(C=>({kind:"card_refreshed",cardId:C.id,card:C})))})}function m(g){if(Array.isArray(g))return g;if(g&&typeof g=="object"){let C=g;return Array.isArray(C.files)?C.files:[g]}return null}return {async get(g){try{return r({cards:await c(g)})}catch(C){return o(C)}},async buildNotificationBatch(g){try{return r(u(await c(g)))}catch(C){return o(C)}},async set(g){try{let C=g.body;if(C==null)return n("set requires a body (card object or array of cards)");let b=Array.isArray(C)?C:[C];for(let k of b){if(typeof k.id!="string")return n("each card must have a string `id` field");await e.writeCard(k.id,k);}return await s(b.map(k=>({kind:"card_refreshed",cardId:k.id,card:k}))),r({count:b.length})}catch(C){return o(C)}},async del(g){try{let C=g.body?.ids??[],b=g.params?.id,k=b?[...C,b]:C;if(k.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of k)await e.removeCard(B);return await s(k.map(B=>({kind:"card_removed",cardId:B}))),r({count:k.length})}catch(C){return o(C)}},async patch(g){try{let C=g.params?.id,b=g.params?.path;if(!C)return n("patch requires params.id");if(!b)return n("patch requires params.path");let k=g.body,B=k&&Object.prototype.hasOwnProperty.call(k,"value")?k.value:g.body;await e.patchCard(C,b,B);let P=await e.readCard(C);return P?(await s([{kind:"card_refreshed",cardId:C,card:P}]),r({count:1})):n(`card "${C}" not found`)}catch(C){return o(C)}},async appendFiles(g){try{let C=g.params?.id;if(!C)return n("appendFiles requires params.id");let b=await e.readCard(C);if(!b)return n(`card "${C}" not found`);let k=m(g.body);if(!k||k.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},P=Array.isArray(B.files)?B.files:[],_=[...P,...k],x=k.map((l,i)=>({idx:P.length+i,entry:l})),y=await this.patch({params:{id:C,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:x})}catch(C){return o(C)}}}}async function Bn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Fr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function qr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Fr(r),leaseToken:r.leaseToken,leaseExpiresAt:r.leaseExpiresAt}))},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},async peekActive(){return (await e.peekActive()).map(Fr)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Fr(t),reason:t.reason}))}}}function On(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return Gt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Qt(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},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 Zo(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function cr(e,t){return Zo(e)?e.then(t):t(e)}function Fn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=Fn(r[n],o):r[n]=o;return r}function dr(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let s=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:dr(s,o,r)}}function qn(e){return {read:r=>e.read(r),get(r,n){return cr(e.read(r),o=>{if(o===null)return null;let s=o;for(let c of n.split(".").filter(Boolean)){if(s===null||typeof s!="object"||Array.isArray(s))return null;s=s[c]??null;}return s??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return cr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return cr(e.read(r),o=>e.write(r,Fn(o??{},n)))},patch(r,n,o){return cr(e.read(r),s=>{let c=n.split(".").filter(Boolean);return e.write(r,dr(s??{},c,o))})}}}function lr(e){return qn(e)}function fr(e,t){return {async readIndex(){return await e.read("_index")},writeIndex(r){return e.write("_index",r)},async readCard(r){return await e.read(r)},async writeCard(r,n){return await e.write(r,n),t(n)},removeCard(r){return e.delete(r)},async cardExists(r){return await e.read(r)!==null},defaultCardKey(r){return r}}}function mr(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,s]of Object.entries(await r())){if(!await e.cardExists(s.key))continue;let c=await e.readCard(s.key);c?n.push(c):t?.(`[card-store] could not read card "${o}" at key "${s.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,s]of Object.entries(await r()))n[o]=s.checksum;return n},async changedSince(n){let o=await r(),s=[];for(let[c,u]of Object.entries(o))n[c]!==u.checksum&&s.push(c);for(let c of Object.keys(n))o[c]||s.push(c);return s},async validateUpsert(n,o){let s=await r(),c=s[n],u=Object.entries(s).find(([,m])=>m.key===o);return c&&c.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${c.key}", cannot remap to "${o}"`}:u&&u[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,s){let c=await r(),u=s??c[n]?.key??e.defaultCardKey(n),m=await e.writeCard(u,o);c[n]={key:u,checksum:m,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async patchCard(n,o,s){let c=await r(),u=c[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let m=await e.readCard(u.key);if(!m||typeof m!="object"||Array.isArray(m))throw new Error(`card "${n}" is not patchable`);let g=String(o||"").split(".").filter(Boolean),C=dr(m,g,s),b=await e.writeCard(u.key,C);c[n]={key:u.key,checksum:b,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 xe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ve(e){return {status:"fail",error:e}}function Ie(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Ue(){return new Date().toISOString()}function ea(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Ln(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function pr(e){try{let t=JSON.parse(Ln(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Nn(e){return ea(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 ta(e){return Br(e,wn,()=>({_sources:{}}))}function ra(e,t){return Xt(e,t)}function na(e){return Zt(e)}function oa(e,t){return Er(e,t)}function aa(e,t,r,n,o,s){return async c=>{let u=[],m=await r.cardStore.readCard(c.nodeId);if(!m)return "task-initiate-failure";let g=m.id,C=m.card_data??{},b=m.source_defs??[],k=b,B=await r.cardRuntimeStore.readRuntime(g),P=false,_=async()=>{P&&(await r.cardRuntimeStore.writeRuntime(g,B),P=false);},x=J=>Et(B._sources[J]),y=(J,se)=>{B._sources[J]=Et(se),P=true;},l=c.taskState?.executionCount??0;if(B._lastExecutionCount!==l&&(B._sources={},B._lastExecutionCount=l,P=true),c.update){let J=c.update.outputFile;if(J){let se=x(J);if(c.update.failure){let de=c.update.rqt??se.lastRequestedToken??se.queueRequestedToken;de&&y(J,Ot(se,de));}else {let de=c.update.rqt;if(!se.lastCompletedToken||de>se.lastCompletedToken){let G=typeof c.update.deliveryToken=="string"?c.update.deliveryToken:void 0,Y=G?await r.fetchedSourcesStore.commitSourceData(g,J,G):false;y(J,Y?Or(se,de):Ot(se,de));}}await _();}}let i={};for(let J of b){if(!J.outputFile)continue;let se=await r.fetchedSourcesStore.readSourceData(g,J.outputFile);se!==null&&(i[J.bindTo]=se);}let d={};for(let[J,se]of Object.entries(c.state??{}))if(se!==null&&typeof se=="object"&&!Array.isArray(se)){let de=se[J];d[J]=de!==void 0?de:se;}else d[J]=se;let f={id:g,card_data:{...C},requires:d,source_defs:b,compute:m.compute};f._sourcesData=i,m.compute&&Qe.runSync(f,{sourcesData:i}),(o??(()=>{}))(g,f.computed_values??{});let p=Qe.enrichSourcesSync(Array.isArray(m.source_defs)?m.source_defs:void 0,{card_data:m.card_data,requires:d}),R={...m,source_defs:Array.isArray(p)?p.map(J=>({...J,boardDir:typeof J.boardDir=="string"&&J.boardDir?J.boardDir:e.value})):p},A=Ue(),F=c.update?void 0:A,j=k.filter(J=>{let se=J.outputFile;if(typeof se!="string"||!se)return true;let de=x(se);F&&(de={...de,queueRequestedToken:F},y(se,de));let G=de.queueRequestedToken??de.lastRequestedToken??A;return Bt(de,G)==="dispatch"});if(await _(),j.length>0){let J=false,se=A;for(let de of j){let G=de.outputFile;if(typeof G!="string"||!G)continue;let Y=x(G),T=Y.queueRequestedToken??A;y(G,{...Y,lastRequestedToken:T}),se=T,J=true;}return J&&await _(),J&&(u.push({taskKind:"source-fetch",payload:{boardRef:be(e),enrichedCard:R,callbackToken:c.callbackToken,rqt:se}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(k.some(J=>{let se=J.outputFile;if(typeof se!="string"||!se)return false;let de=x(se),G=de.queueRequestedToken??de.lastRequestedToken??A;return Bt(de,G)==="in-flight"}))return "task-initiated";let Q=m.provides??[],re={};for(let{bindTo:J,ref:se}of Q)re[J]=Qe.resolve(f,se);return (s??(()=>{}))(re),n(c.nodeId,re),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Mn(e,t,r={}){Vt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),s=be(e),c=r.emitNotification??(T=>{if(!t.publishBoardChangeNotifications)return;let w=T.kind==="notification-batch"?T.notifications:[T];return t.publishBoardChangeNotifications(w)}),u=null,m=r.boardRuntimeStoreRef,g=r.scratchStoreRef,C=r.taskExecutorRef,b=r.chatHandlerFlow;function k(){if(!m)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return m}function B(T){if(T.length!==0)try{let w=qe(T),H=Ne({kind:"notification-batch",notifications:w});return Promise.resolve(c(H)).catch(L=>{o(`[async-board-live-cards-public] emitNotification failed: ${L instanceof Error?L.message:String(L)}`);})}catch(w){o(`[async-board-live-cards-public] emitNotification failed: ${w instanceof Error?w.message:String(w)}`);return}}let P=()=>On(t.kvStorageForRef(k())),_=e.value,x=()=>zt(Tr(()=>t.kvStorageForRef(k()),t.hashFn),"v1"),y=async()=>{let T=await P().readOutputsStoreRef();if(!T)throw new Error(`Board at ${e.value} has no outputs store configured.`);return na(t.kvStorageForRef(T))},l=async()=>{let T=await P().readCardStoreRef();if(!T)throw new Error(`Board at ${e.value} has no card store configured.`);let w=t.kvStorageForRef(T);return mr(fr(lr(w),t.hashFn),o)};async function i(){return !!(await x().readSnapshot(_)).values[ct]}async function d(){let T=await x().readSnapshot(_);if(!T.values[ct])throw new Error(`Board not initialized at ${e.value}`);return or(T.values)}async function f(T,w){let H=await x().commitSnapshot(_,{schemaVersion:"v1",expectedVersion:w,deleteKeys:[],shallowMerge:nr(T)});if(!H.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${w??"null"} current=${H.currentVersion??"null"}`)}let p=()=>Cn(t.journalStorageForRef(k()));async function R(){return C??await P().readTaskExecutorRef()}async function A(T){await p().appendEvent(T);}async function F(){let T=await P().readFetchedSourcesStoreRef();if(!T)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return T}async function j(){return t.blobStorageForRef(await F())}async function V(){return ra(await j(),T=>t.resolveBlob(T))}async function Q(T){let w=(await j()).keyRef?.(T);if(!w)throw new Error("configured fetched-sources store does not support keyRef");let H=await Promise.resolve(w);return be(H)}async function re(){let T=oa(t.kvStorageForRef(k()),async(h,q)=>{let U=h.payload,ne=(U.enrichedCard??{}).id??U.cardId??"unknown";await A({type:"task-failed",taskName:ne,error:q,timestamp:Ue()});}),w=ta(t.kvStorageForRef(k())),H=await j(),L=await V(),v=await l(),I=await y(),O=new Map,N=new Map,$=[],z=[],oe=[],ie=new Map,Pe=new Set,Be={async readRuntime(h){return O.get(h)??await w.readRuntime(h)},async writeRuntime(h,q){O.set(h,q),je[h]=q;}},Ee={async readSourceData(h,q){let U=`${h}/${q}`;return N.has(U)?N.get(U):await L.readSourceData(h,q)},ingestSourceDataStaged(h,q,U,ae){return L.ingestSourceDataStaged(h,q,U,ae)},async commitSourceData(h,q,U){let ae=`${h}/.staged/${U}/${q}`,ne=await H.read(ae);if(ne==null){let ke=await Promise.resolve(H.keyRef?.(ae));ke&&(ne=await t.resolveBlob(ke));}if(ne==null)return false;let he=`${h}/${q}`,fe=ne.trim();try{N.set(he,JSON.parse(fe));}catch{N.set(he,fe);}return $.push({cardId:h,outputFile:q,deliveryToken:U}),true},async hasSource(h,q){let U=`${h}/${q}`;return N.has(U)||await L.hasSource(h,q)},async listSources(h){let q=await L.listSources(h),U=[...N.keys()].filter(ae=>ae.startsWith(`${h}/`)).map(ae=>ae.slice(`${h}/`.length));return [...new Set([...q,...U])]}},ye=await d(),Ce=Rt(ye.graph),je={...ye.runtimeByCardId},{events:Se,newCursor:Fe}=await p().readEntriesAfterCursor(ye.lastDrainedJournalId),Le=Se,pe=Kt(Ce,{handlers:{"card-handler":aa(e,Fe,{cardStore:v,cardRuntimeStore:Be,fetchedSourcesStore:Ee,executionRequestStore:T},(h,q)=>{Le.push({type:"task-completed",taskName:h,data:q,timestamp:Ue()});},(h,q)=>{z.push({cardId:h,values:q});},h=>{oe.push(h);})},onNodeRemoved:h=>{ie.delete(h),O.delete(h),delete je[h],Pe.add(h);}});for(;Le.length>0;){let h=Le;Le=[];for(let q of h)if(q.type==="task-restart"){let U=await v.readCard(q.taskName);U&&ie.set(q.taskName,U);}pe.pushAll(h),await pe.waitForHandlers();}let Ze=pe.getState();await pe.dispose({wait:true}),await f({lastDrainedJournalId:Fe,graph:ht(Ze),runtimeByCardId:je},(await x().readSnapshot(_)).version);for(let{cardId:h,values:q}of z)await I.writeComputedValues(h,q);for(let h of oe)await I.writeDataObjects(h);for(let[h,q]of O)await w.writeRuntime(h,q);for(let h of $)await L.commitSourceData(h.cardId,h.outputFile,h.deliveryToken);let Ke=Ct(s,Ze);await I.writeStatusSnapshot(Ke);let Ve=[];for(let{cardId:h,values:q}of z)Ve.push({kind:"computed_values",cardId:h,values:q});for(let h of oe)for(let[q,U]of Object.entries(h))Ve.push({kind:"data_object",key:q,payload:U});for(let[h,q]of ie)Ve.push({kind:"card_refreshed",cardId:h,card:q});for(let h of Pe)Ve.push({kind:"card_removed",cardId:h});Ve.push({kind:"status",status:Ke}),await B(Ve);let et=await R();if(!et)return;let M=t.supportsDirectSourceOutput?.(et)===true;await T.dispatchEntriesForJournalId(Fe,async h=>{if(h.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${h.taskKind}" \u2014 skipping`);return}let q=h.payload,U=q.enrichedCard?.id??"unknown",ae=q.enrichedCard?.source_defs??[];if(et.howToRun==="queue-storage"&&M){try{let ne=await P().readQueueStoreRef();if(!ne)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let he=t.queueStorageForRef(ne,"task-executor"),fe=typeof et.extra?.boardId=="string"?et.extra.boardId:void 0,ke=[];for(let Te of ae){if(!Te.outputFile)continue;let He=t.genId(),Je=`${U}/.staged/${He}/${Te.outputFile}`,De=await Promise.resolve(H.keyRef?.(Je));if(!De)continue;let We={ref:be(De),deliveryToken:He,outputFile:Te.outputFile,cardId:U},ze=Nn({cbk:q.callbackToken,rg:e.value,br:be(e),cid:U,b:Te.bindTo,d:Te.outputFile,cs:void 0,rqt:q.rqt,dt:We.deliveryToken});ke.push({...fe?{boardId:fe}:{},ref:et,args:{source_def:Te,base_ref:be(e),callback:n.createCallback(ze),output:We}});}ke.length>0&&await he.enqueueMany(ke);}catch(ne){await A({type:"task-failed",taskName:U,error:ne instanceof Error?ne.message:String(ne),timestamp:Ue()});}return}for(let ne of ae){if(!ne.outputFile)continue;let he;if(M){let Te=t.genId(),He=`${U}/.staged/${Te}/${ne.outputFile}`,Je=await Promise.resolve(H.keyRef?.(He));Je&&(he={ref:be(Je),deliveryToken:Te,outputFile:ne.outputFile,cardId:U});}let fe=Nn({cbk:q.callbackToken,rg:e.value,br:be(e),cid:U,b:ne.bindTo,d:ne.outputFile,cs:void 0,rqt:q.rqt,...he?{dt:he.deliveryToken}:{}}),ke=await t.dispatchExecution(et,{source_def:ne,base_ref:be(e),callback:n.createCallback(fe),...he?{output:he}:{}});ke.dispatched||await A({type:"task-failed",taskName:U,error:ke.error??"dispatch failed",timestamp:Ue()});}});}async function J(){try{let T=async()=>{let H=await d(),{events:L}=await p().readEntriesAfterCursor(H.lastDrainedJournalId);L.length>0&&await de();},w=await Bn(t.lock,re,T);return xe({ran:w!==!1})}catch(T){return Ie(T)}}async function se(){return u||(u=J().finally(()=>{u=null;}),u)}async function de(){let T=await P().readQueueStoreRef();if(!T)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let w=t.queueStorageForRef(T,"process-accumulated");w.enqueueIfAbsent?await w.enqueueIfAbsent({boardRef:be(e)},`process-accumulated:${be(e)}`):await w.enqueue({boardRef:be(e)}),await t.requestProcessAccumulated?.();}async function G(){let T=await P().readQueueStoreRef();if(!T)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let w=t.queueStorageForRef(T,"process-accumulated");for(;;){let H=await w.lease({max:64,visibilityMs:1e3});if(H.length<=0)return;for(let L of H)await w.ack(L.id,L.leaseToken);if(H.length<64)return}}function Y(){de();}return {async init(T){try{let w=T.params?.cardStoreRef;if(!w)return ve("init requires params.cardStoreRef");if(m=T.params?.boardRuntimeStoreRef,!m)return ve("init requires params.boardRuntimeStoreRef");let H=T.params?.outputsStoreRef;if(!H)return ve("init requires params.outputsStoreRef");let L=T.params?.queueStoreRef;if(!L)return ve("init requires params.queueStoreRef");let v=T.params?.fetchedSourcesStoreRef;if(!v)return ve("init requires params.fetchedSourcesStoreRef");g=T.params?.scratchStoreRef;let I=T.params?.chatStoreRef;if(!I)return ve("init requires params.chatStoreRef");let O=T.params?.artifactsStoreRef;if(!O)return ve("init requires params.artifactsStoreRef");await i()||await f({lastDrainedJournalId:"",graph:ht(St(qt)),runtimeByCardId:{}},null);let N=P();return await N.writeBoardRuntimeStoreRef(m),await N.writeCardStoreRef(w),await N.writeOutputsStoreRef(H),await N.writeQueueStoreRef(L),await N.writeFetchedSourcesStoreRef(v),await N.writeChatStoreRef(I),await N.writeArtifactsStoreRef(O),await(await y()).writeStatusSnapshot(Ct(s,Rt((await d()).graph))),xe()}catch(w){return Ie(w)}},async status(T){try{let w=await y(),H=await w.readStatusSnapshot();return H||(H=Ct(s,Rt((await d()).graph)),await w.writeStatusSnapshot(H)),xe(H)}catch(w){return Ie(w)}},async getCardStoreRef(T){try{let w=await P().readCardStoreRef();return w?xe({storeRef:w}):ve(`Board at ${e.value} has no card store configured`)}catch(w){return Ie(w)}},async getBoardRuntimeStoreRef(T){try{return xe({storeRef:m??null})}catch(w){return Ie(w)}},async getOutputsStoreRef(T){try{let w=await P().readOutputsStoreRef();return w?xe({storeRef:w}):ve(`Board at ${e.value} has no outputs store configured`)}catch(w){return Ie(w)}},async getScratchStoreRef(T){try{return xe({storeRef:g??null})}catch(w){return Ie(w)}},async getChatStoreRef(T){try{return xe({storeRef:await P().readChatStoreRef()})}catch(w){return Ie(w)}},async getArtifactsStoreRef(T){try{return xe({storeRef:await P().readArtifactsStoreRef()})}catch(w){return Ie(w)}},async getFetchedSourcesStoreRef(T){try{return xe({storeRef:await P().readFetchedSourcesStoreRef()})}catch(w){return Ie(w)}},async getConfig(T){try{let w=T.params?.key;if(!w)return ve("getConfig requires params.key");let H=P(),L;switch(w){case "task-executor":L=C??null;break;case "chat-handler-flow":L=b??null;break;case "board-runtime-store-ref":L=await H.readBoardRuntimeStoreRef();break;case "card-store-ref":L=await H.readCardStoreRef();break;case "outputs-store-ref":L=await H.readOutputsStoreRef();break;case "scratch-store-ref":L=g??null;break;case "chat-store-ref":L=await H.readChatStoreRef();break;case "artifacts-store-ref":L=await H.readArtifactsStoreRef();break;case "fetched-sources-store-ref":L=await H.readFetchedSourcesStoreRef();break;default:return ve(`getConfig: unknown key "${w}"`)}return xe({value:L})}catch(w){return Ie(w)}},async getOutputsDataObject(T){try{let w=T.params?.key;return w?xe(await(await y()).readDataObject(w)):ve("getOutputsDataObject requires params.key")}catch(w){return Ie(w)}},async getAllOutputsDataObjects(T){try{return xe(await(await y()).readAllDataObjects())}catch(w){return Ie(w)}},async getOutputsComputedValues(T){try{let w=T.params?.key;return w?xe(await(await y()).readComputedValues(w)):ve("getOutputsComputedValues requires params.key")}catch(w){return Ie(w)}},async getAllOutputsComputedValues(T){try{return xe(await(await y()).readAllComputedValues())}catch(w){return Ie(w)}},async getOutputsFetchedSources(T){try{let w=T.params?.key;if(!w)return ve("getOutputsFetchedSources requires params.key");let H=await(await V()).listSources(w),L={};for(let v of H)L[v]=await Q(`${w}/${v}`);return xe(L)}catch(w){return Ie(w)}},async getAllOutputsFetchedSources(T){try{let w=await V(),H=await(await j()).listKeys(),L=new Set;for(let I of H){let O=I.indexOf("/");O>0&&!I.includes("/.staged/")&&L.add(I.slice(0,O));}let v={};for(let I of L){let O=await w.listSources(I);if(O.length!==0){v[I]={};for(let N of O)v[I][N]=await Q(`${I}/${N}`);}}return xe(v)}catch(w){return Ie(w)}},async buildSseOneShotPayload(T){try{let w=await(await l()).readAllCards(),H=await this.status({});if(H.status!=="success")return H;let L=await this.getAllOutputsDataObjects({});if(L.status!=="success")return L;let v=await this.getAllOutputsComputedValues({});if(v.status!=="success")return v;let I=v.data,O={};for(let N of w){let $=typeof N?.id=="string"?N.id:null;if(!$)continue;let z=N.card_data&&typeof N.card_data=="object"&&!Array.isArray(N.card_data)?N.card_data:{};O[$]={schema_version:"v1",card_id:$,card_data:{...z},computed_values:I[$]&&typeof I[$]=="object"?I[$]:{}};}return xe({cardDefinitions:w,statusSnapshot:H.data,dataObjectsByToken:L.data,cardRuntimeById:O})}catch(w){return Ie(w)}},async addCardFiles(T){try{let w=T.params?.cardId;if(!w)return ve("addCardFiles requires params.cardId");let L=await ur(await l(),{emitNotification:c}).appendFiles({params:{id:w},body:T.body});return L.status!=="success"?L:xe({cardId:w,files_added:L.data.files_added,notified:!0})}catch(w){return Ie(w)}},async removeCard(T){try{let w=T.params?.id;if(!w)return ve("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(w);}catch{}return await A({type:"task-removal",taskName:w,timestamp:Ue()}),Y(),xe()}catch(w){return Ie(w)}},async retrigger(T){try{let w=T.params?.id;return w?(await A({type:"task-restart",taskName:w,timestamp:Ue()}),Y(),xe()):ve("retrigger requires params.id")}catch(w){return Ie(w)}},async processAccumulatedEvents(T){return await G(),se()},async upsertCard(T){try{let w=T.params?.cardId,H=T.params?.all,L=!!T.params?.restart;if(!w&&!H)return ve("upsertCard requires --card-id <id> or --all");let v=await l(),I=H?(await v.readAllCards()).map(N=>N.id):[w];for(let N of I)if(!await v.readCard(N))return ve(`Card "${N}" not found in board at ${e.value}`);let O=t.kvStorage("card-upsert");for(let N of I){let $=await v.readCard(N);if(!$)continue;let z=ar($),oe=t.hashFn(z),ie=await O.read(N),Pe=ie?.taskConfigHash!==oe;if(!(!Pe&&!L)){if(Pe){let Be=ie?.blobRef??await v.readCardKey(N)??N;await A({type:"task-upsert",taskName:N,taskConfig:z,timestamp:Ue()}),await O.write(N,{blobRef:Be,taskConfigHash:oe,updatedAt:Ue()});}L&&await A({type:"task-restart",taskName:N,timestamp:Ue()});}}return Y(),xe()}catch(w){return Ie(w)}},async taskFailed(T){try{let w=T.params?.token;if(!w)return ve("taskFailed requires params.token");let H=T.params?.error??"unknown error",L=pr(w);return L?(await A({type:"task-failed",taskName:L.taskName,error:H,timestamp:Ue()}),Y(),xe()):ve("Invalid callback token")}catch(w){return Ie(w)}},async taskProgress(T){try{let w=T.params?.token;if(!w)return ve("taskProgress requires params.token");let H=(T.body??{}).update??{},L=pr(w);return L?(await A({type:"task-progress",taskName:L.taskName,update:H,timestamp:Ue()}),Y(),xe()):ve("Invalid callback token")}catch(w){return Ie(w)}},async sourceDataFetched(T){try{let w=T.params?.token,H=T.params?.ref;if(!w)return ve("sourceDataFetched requires params.token");if(!H)return ve("sourceDataFetched requires params.ref");let L=jn(w);if(!L)return ve("Invalid source token");let v=await V(),I=L.dt||t.genId();L.dt||await v.ingestSourceDataStaged(L.cid,L.d,at(H),I);let O=pr(L.cbk);return O?(await A({type:"task-progress",taskName:O.taskName,update:{bindTo:L.b,outputFile:L.d,fetchedAt:Ue(),deliveryToken:I,sourceChecksum:L.cs,rqt:L.rqt},timestamp:Ue()}),Y(),xe()):ve("Invalid callback token embedded in source token")}catch(w){return Ie(w)}},async sourceDataFetchFailure(T){try{let w=T.params?.token,H=T.params?.reason??"unknown";if(!w)return ve("sourceDataFetchFailure requires params.token");let L=jn(w);if(!L)return ve("Invalid source token");let v=pr(L.cbk);return v?(await A({type:"task-progress",taskName:v.taskName,update:{bindTo:L.b,outputFile:L.d,failure:!0,reason:H,sourceChecksum:L.cs,rqt:L.rqt},timestamp:Ue()}),Y(),xe()):ve("Invalid callback token embedded in source token")}catch(w){return Ie(w)}}}}async function sa(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Dn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=qe(n);if(s.length===1){await o(s[0]);return}await o(Ne({kind:"notification-batch",notifications:s}));}return {async enqueue(n){let o=await e.enqueue(n);return await r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},async enqueueMany(n){let o=await e.enqueueMany(n);return await r(o.map(s=>({kind:"message_enqueued",lane:t.lane,message:s}))),o},enqueueIfAbsent:e.enqueueIfAbsent?async(n,o)=>{let s=await e.enqueueIfAbsent(n,o);return s&&await r([{kind:"message_enqueued",lane:t.lane,message:s}]),s}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,s){return e.nack(n,o,s)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},async stage(n,o){return e.stage(n,o)},async commitStaged(n){let o=await e.commitStaged(n);if(o){let s=await sa(e,n);s&&await r([{kind:"message_enqueued",lane:t.lane,message:s}]);}return o},async discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Nr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ia(e){return {...Nr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function ua(e){return {...Nr(e),reason:e.reason}}function jr(e){return {enqueueRequest(t){return e.enqueue(t).id},enqueueRequestIfAbsent:e.enqueueIfAbsent?(t,r)=>{let n=e.enqueueIfAbsent(t,r);return n?n.id:null}:void 0,leaseRequests(t){return e.lease(t).map(ia)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(Nr)},peekDeadLetter(){return e.peekDeadLetter().map(ua)}}}function ca(e,t){return e.peekActive().find(r=>r.id===t)}function $n(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=qe(n);if(s.length===1){await o(s[0]);return}await o(Ne({kind:"notification-batch",notifications:s}));}return {enqueue(n){let o=e.enqueue(n);return r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},enqueueMany(n){let o=e.enqueueMany(n);return r(o.map(s=>({kind:"message_enqueued",lane:t.lane,message:s}))),o},enqueueIfAbsent:e.enqueueIfAbsent?(n,o)=>{let s=e.enqueueIfAbsent(n,o);return s&&r([{kind:"message_enqueued",lane:t.lane,message:s}]),s}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,s){return e.nack(n,o,s)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},stage(n,o){return e.stage(n,o)},commitStaged(n){let o=e.commitStaged(n);if(o){let s=ca(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 Vn(){return new Date().toISOString()}function Un(e){return new TextEncoder().encode(e).byteLength}function da(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Kn(e){function t(r){let n=e.stat?da(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:Un(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??Vn(),s.size=s.size??Un(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??Vn(),s.size=s.size??n.byteLength,s},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function Hn(){function e(o,s){if(!Array.isArray(o))return [];let c=[];for(let u of o){if(!u||typeof u!="object")continue;let m=u;typeof m.stored_name=="string"&&c.push({name:typeof m.name=="string"?m.name:m.stored_name,stored_name:m.stored_name,size:typeof m.size=="number"&&Number.isFinite(m.size)?m.size:null,mime_type:typeof m.mime_type=="string"?m.mime_type:null,uploaded_at:typeof m.uploaded_at=="string"?m.uploaded_at:s||null,chat:m.chat===true});}return c}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let c=t(o);if(s.length===0)return o.files=c,c;let u=new Set(c.map(m=>m.stored_name));for(let m of s)u.has(m.stored_name)||(c.push(m),u.add(m.stored_name));return o.files=c,c}function n(o,s,c){let u=t(o);if(!Number.isInteger(s)||s<0||s>=u.length)return {ok:false,reason:"index_out_of_range"};let m=u[s];return !m||!m.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==m.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:m}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function Jn(e,t={}){let r=t.emitNotification;function n(y){let 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 m(y){return {status:"fail",error:y}}function g(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}function C(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 b(y){if(!r||y.length===0)return;let l=qe(y);if(l.length===1){await r(l[0]);return}await r(Ne({kind:"notification-batch",notifications:l}));}async function k(y){let l=await e.readAll(y);return c(l,1).map(C)}async function B(y){let l=Date.now();return {kind:"card_chats",cardId:y,sentAt:new Date(l).toISOString(),sentAtMs:l,messages:await k(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 m(`chat-store: ${l} missing "command"`);if(!i)return m(`chat-store: ${l} missing "cardId"`);if(y.command==="append")return await x.append({params:{cardId:i},body:{role:y.role,text:y.text,files:y.files,turn:y.turn}});if(y.command==="read-all")return await x.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 x.readAfter({params:{cardId:i},body:{cursor:y.cursor??null}});if(y.command==="clear")return await x.clear({params:{cardId:i}});if(y.command==="set-processing")return await x.setProcessing({params:{cardId:i},body:{active:y.active}});if(y.command==="is-processing")return await x.isProcessing({params:{cardId:i}});if(y.command==="get-config")return await x.getConfig({params:{cardId:i}});if(y.command==="set-config"){let{command:d,cardId:f,...p}=y;return await x.setConfig({params:{cardId:i},body:p})}return m(`chat-store: unknown command "${String(y.command)}"`)}async function _(y){if(!Array.isArray(y.commands)||y.commands.length===0)return m('chat-store: command envelope must include a non-empty "commands" array');let 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 m(`chat-store: command envelope entry ${i} must be an object`);let f={cardId:y.cardId,...d},p=await P(f,`command envelope entry ${i}`);if(p.status!=="success")return p;l.push({index:i,command:String(f.command),data:p.data});}return u({results:l})}let x={async append(y){try{let l=y.params?.cardId;if(!l)return m("append requires params.cardId");let i=y.body??{},d=typeof i.role=="string"?i.role:"",f=typeof i.text=="string"?i.text:"",p=Array.isArray(i.files)?i.files:[],R=typeof i.turn=="string"?i.turn:"";if(!d)return m("append requires body.role");let A=await e.append(l,d,f,p,R);return await b([{kind:"chat_messages",cardId:l,messages:await k(l)}]),u({id:A})}catch(l){return g(l)}},async readAll(y){try{let l=y.params?.cardId;if(!l)return m("readAll requires params.cardId");let i=y.body??{},d=typeof i.turnId=="string"?i.turnId:"",f=i.allTurns===!0,p=typeof i.tailTurnsBeforeId=="string"?i.tailTurnsBeforeId:"",R=i.tailTurns===void 0?i.lastUserTurns:i.tailTurns,A=R===void 0?f||d?void 0:1:n(R);if(R!==void 0&&A===null)return m("readAll requires body.tailTurns (positive integer)");let F=await e.readAll(l),j=F.filter(V=>!d||String(V.turn||"")===d);if(p){let V=A;if(typeof V!="number"||!Number.isInteger(V)||V<=0)return m("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let Q=new Map,re=[];for(let G of F){let Y=String(G.turn||"");Q.has(Y)||(Q.set(Y,[]),re.push(Y)),Q.get(Y).push(G);}let J=re.findIndex(G=>G===p),se=Math.max(0,J-V);return j=(J===-1?[]:re.slice(se,J)).flatMap(G=>Q.get(G)??[]),u({records:j})}return u(typeof A=="number"?{records:c(j,A)}:{records:j})}catch(l){return g(l)}},async buildSseOneShotBatch(y){try{let l=y.params?.cardId;if(!l)return m("buildSseOneShotBatch requires params.cardId");let i=y.body??{},d=typeof i.receiving=="boolean"?i.receiving:!0,f=await B(l);return u(Ne({kind:"notification-batch",notifications:[{...f,receiving:d}]}))}catch(l){return g(l)}},async readAfter(y){try{let l=y.params?.cardId;if(!l)return m("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})):m("clear requires params.cardId")}catch(l){return g(l)}},async setProcessing(y){try{let l=y.params?.cardId;if(!l)return m("setProcessing requires params.cardId");let i=y.body??{};return typeof i.active!="boolean"?m("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 g(l)}},async isProcessing(y){try{let l=y.params?.cardId;return l?u({active:await e.isProcessing(l)}):m("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)}):m("getConfig requires params.cardId")}catch(l){return g(l)}},async setConfig(y){try{let l=y.params?.cardId;if(!l)return m("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 x}function wt(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function Qn(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(wt):[]:wt(e)?[e]:[]}function Gn(e,t,r){let n=0;return {accepted:e.filter(s=>{if(!wt(s))return n++,false;let c=s;return typeof c.sentAtMs=="number"&&t-c.sentAtMs>r?(n++,false):true}),rejected:n}}function zn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Lr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function la(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function Wn(e,t){if(t.kind==="status"){Lr(t.status)&&(e.status=t.status);return}if(t.kind==="computed_values"){e.computedValues[t.cardId]=t.values;return}if(t.kind==="data_object"){e.dataObjects[t.key]=t.payload;return}if(t.kind==="card_refreshed"){e.cards[t.cardId]=t.card;return}t.kind==="card_removed"&&(delete e.cards[t.cardId],delete e.computedValues[t.cardId]);}function Yn(e,t){if(la(t)){for(let r of t.notifications)wt(r)&&Wn(e,r);return}wt(t)&&Wn(e,t);}function Mr(e){let t=new Map,r=0;function n(l){let i=JSON.stringify(l);return r++,`id: ${r}
|
|
2
|
-
data: ${
|
|
1
|
+
var ServerRuntimeControlface=(function(exports){'use strict';var Co=Object.defineProperty;var bo=(e,t,r)=>t in e?Co(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Wr=(e,t,r)=>bo(e,t+"",r);var Kt="b64:";function So(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 wo(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 Se(e){return `${Kt}${So(JSON.stringify(e))}`}function st(e){if(!e.startsWith(Kt))throw new Error(`Invalid ref format (expected ${Kt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(wo(e.slice(Kt.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 zr(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 Yr(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?st(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function ot(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Sr(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 ce(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function it(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function ut(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function ft(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Ht(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 Xr(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function mt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o,d=a.status;if(d==="success")return Object.prototype.hasOwnProperty.call(a,"data")?o:{status:"success",data:{}};if(d==="fail"||d==="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 a=n.data;if(a&&typeof a=="object"&&!Array.isArray(a)){let d=a.issues;if(Array.isArray(d)){let p=d.find(y=>typeof y=="string"&&y.trim());if(typeof p=="string")return `Validation failed: ${p}`}let u=a.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function wr(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpControlplaneToolRegistry:a,retriggerCard:d,applyCardAction:u,resolveChatHandlerTarget:p,sendCardFileDownloadResponse:y}=e;async function C(v,S,B){let T=v.method||"GET",_=B,x=_.pathname;try{if(T==="POST"&&x===`${t}/mcp-actions`){await o();let l=Date.now(),m=new Date(l).toISOString(),g=await n(v),k=typeof g.tool=="string"?g.tool.trim():"",I=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!k)return r(S,400,{error:"tool is required"}),!0;let q=ce(I,"card_id");if(!q)return r(S,400,{error:"MCP action requires card_id"}),!0;if(k==="retrigger-card"||k==="retrigger"){await d(q);let J=Date.now();return r(S,200,{status:"success",data:{ok:!0,cardId:q,actionType:k,requestReceivedAt:m,requestReceivedAtMs:l,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:200}}),!0}let L=ut(I,"payload");if(k==="chat-send"&&!await p(q)){let J=Date.now();return r(S,409,{error:`chat handler is not configured for card: ${q}`,requestReceivedAt:m,requestReceivedAtMs:l,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:409}),!0}if(k==="chat-send"){let J=typeof L["turn-id"]=="string"?L["turn-id"]:typeof L.turnId=="string"?L.turnId:typeof L.turn=="string"?L.turn:"";if(!J||!String(J).trim()){let X=Date.now();return r(S,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${q}`,requestReceivedAt:m,requestReceivedAtMs:l,responseSentAt:new Date(X).toISOString(),responseSentAtMs:X,responseStatus:400}),!0}}await u(q,k,L);let V=Date.now();return r(S,200,{status:"success",data:{ok:!0,cardId:q,actionType:k,requestReceivedAt:m,requestReceivedAtMs:l,responseSentAt:new Date(V).toISOString(),responseSentAtMs:V,responseStatus:200}}),!0}if(T==="POST"&&x===`${t}/mcp-controlplane`){await o();let l=await n(v),m=typeof l.tool=="string"?l.tool.trim():"",g=l.args&&typeof l.args=="object"&&!Array.isArray(l.args)?l.args:{};if(!m)return r(S,400,{error:"tool is required"}),!0;try{let k=await mt(m,g,a());if(k&&typeof k=="object"&&!Array.isArray(k)){let I=k;if(I.status==="fail")return r(S,400,{error:et(k,"Request failed")}),!0;if(I.status==="error")return r(S,500,{error:et(k,"Internal error")}),!0}r(S,200,k);}catch(k){let I=typeof k?.statusCode=="number"?Number(k.statusCode):500,q=k instanceof Error?k.message:String(k);r(S,I,{error:q});}return !0}let h=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/retrigger$`));if(T==="POST"&&h){await o();let l=decodeURIComponent(h[1]);return await d(l),r(S,200,{ok:!0}),!0}let f=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/actions$`));if(T==="POST"&&f){await o();let l=decodeURIComponent(f[1]),m=Date.now(),g=new Date(m).toISOString(),k=await n(v),I=k?.actionType;if(I==="chat-send"&&!await p(l)){let L=Date.now();return r(S,409,{error:`chat handler is not configured for card: ${l}`,requestReceivedAt:g,requestReceivedAtMs:m,responseSentAt:new Date(L).toISOString(),responseSentAtMs:L,responseStatus:409}),!0}if(I==="chat-send"){let L=k?.payload??{},V=typeof L["turn-id"]=="string"?L["turn-id"]:typeof L.turnId=="string"?L.turnId:typeof L.turn=="string"?L.turn:"";if(!V||!String(V).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: ${l}`,requestReceivedAt:g,requestReceivedAtMs:m,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:400}),!0}}await u(l,I,k?.payload);let q=Date.now();return r(S,200,{ok:!0,requestReceivedAt:g,requestReceivedAtMs:m,responseSentAt:new Date(q).toISOString(),responseSentAtMs:q,responseStatus:200}),!0}let s=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/files/(\\d+)$`));if(T==="GET"&&s){let l=decodeURIComponent(s[1]),m=parseInt(s[2],10),g=_.searchParams.get("sn");return await y(S,l,m,g),!0}return !1}catch(h){let f=h?.statusCode||500;return r(S,f,{error:String(h?.message||h)}),true}}return {handleRuntimeApi:C}}function Jt(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 vo(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 Ao(e){return e.category?e:{...e,category:vo(e.kind)}}function Fe(e){return e.map(t=>Ao(t))}function qe(e){return {...e,category:e.category??"batch",notifications:Fe(e.notifications)}}var yt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function We(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function ht(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Zr(e){return e.tasks??{}}function vr(e){return e?e.status===yt.FAILED||e.status===yt.INACTIVATED:false}function en(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function tn(e){return e.maxExecutions}function rn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===yt.COMPLETED){let a=e.tasks[n];a&&We(a).forEach(u=>r.add(u));}return Array.from(r)}function nn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;We(o).forEach(d=>{r[d]||(r[d]=[]),r[d].push(n);});}),r}function on(e,t,r){let n=e.tasks[t]??Qt(),o={};if(r){let d=r.tasks[t],u=ht(d);for(let p of u)for(let[y,C]of Object.entries(r.tasks))if(We(C).includes(p)){let v=e.tasks[y];v?.lastDataHash&&(o[p]=v.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 an(e,t,r,n,o,a){let d=e.tasks[r]??Qt(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let p;n&&u.on&&u.on[n]?p=u.on[n]:p=We(u);let y=d.startConsumedHashes?{...d.startConsumedHashes}:{...d.lastConsumedHashes};if(!d.startConsumedHashes){let S=u.requires??[];for(let B of S)for(let[T,_]of Object.entries(t.tasks))if(We(_).includes(B)){let x=e.tasks[T];x?.lastDataHash&&(y[B]=x.lastDataHash);break}}let C={...d,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:d.executionCount+1,lastEpoch:d.executionCount+1,lastDataHash:o,data:a,lastConsumedHashes:y,error:void 0},v=[...new Set([...e.availableOutputs,...p])];return {...e,tasks:{...e.tasks,[r]:C},availableOutputs:v,lastUpdated:new Date().toISOString()}}function sn(e,t,r,n){let o=e.tasks[r]??Qt(),a=t.tasks[r];if(a?.retry){let p=o.retryCount+1;if(p<=a.retry.max_attempts){let y={...o,status:"not-started",retryCount:p,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:y},lastUpdated:new Date().toISOString()}}}let d={...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&&d.executionCount>=a.circuit_breaker.max_executions){let p=a.circuit_breaker.on_break;u=[...new Set([...u,...p])];}return {...e,tasks:{...e.tasks,[r]:d},availableOutputs:u,lastUpdated:new Date().toISOString()}}function un(e,t,r,n){let o=e.tasks[t]??Qt(),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 cn(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 Qt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function xt(e,t){let r=`live-${Date.now()}`,n={};for(let a of Object.keys(e.tasks))n[a]=ln();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 xo(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:on(n,t.taskName,r)};case "task-completed":return {config:r,state:an(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:sn(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:un(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:cn(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:Oo(n,t.action)};case "task-upsert":return Io(e,t.taskName,t.taskConfig);case "task-removal":return Po(e,t.taskName);case "node-requires-add":return To(e,t.nodeName,t.tokens);case "node-requires-remove":return _o(e,t.nodeName,t.tokens);case "node-provides-add":return Eo(e,t.nodeName,t.tokens);case "node-provides-remove":return Bo(e,t.nodeName,t.tokens);default:return e}}function dn(e,t){return t.reduce((r,n)=>xo(r,n),e)}function Io(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]:ln()},lastUpdated:new Date().toISOString()}}}function Po(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 To(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ht(n),a=r.filter(d=>!o.includes(d));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...a]}}},state:e.state}}function _o(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ht(n),a=o.filter(d=>!r.includes(d));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:a}}},state:e.state}}function Eo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=We(n),a=r.filter(d=>!o.includes(d));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...a]}}},state:e.state}}function Bo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=We(n),a=o.filter(d=>!r.includes(d));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:a}}},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 ln(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Oo(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 Bt(e){let{config:t,state:r}=e,n=Zr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=Fo(n),d=rn(t,r.tasks),u=new Set([...d,...r.availableOutputs]),p=[],y=[],C=[],v=[];for(let[B,T]of Object.entries(n)){let _=r.tasks[B],x=en(T,t.settings),h=x!=="once";if(_?.status===yt.RUNNING||vr(_))continue;let f=tn(T);if(f!==void 0&&_&&_.executionCount>=f||T.circuit_breaker&&_&&_.executionCount>=T.circuit_breaker.max_executions||!h&&_?.status===yt.COMPLETED)continue;if(h&&_?.status===yt.COMPLETED){let k=ht(T),I=false;switch(x){case "data-changed":{k.length>0&&k.some(L=>{for(let[V,J]of Object.entries(n))if(We(J).includes(L)){let X=r.tasks[V];if(!X)continue;let H=_.lastConsumedHashes?.[L];return X.lastDataHash==null?X.executionCount>_.lastEpoch:X.lastDataHash!==H}return false})||(I=true);break}case "epoch-changed":{k.length>0&&k.some(L=>{for(let[V,J]of Object.entries(n))if(We(J).includes(L)){let X=r.tasks[V];if(X&&X.executionCount>_.lastEpoch)return true}return false})||(I=true);break}case "time-based":{let q=T.refreshInterval??0;if(q<=0){I=true;break}let L=_.completedAt;if(!L){I=true;break}(Date.now()-Date.parse(L))/1e3<q&&(I=true);break}case "manual":I=true;break}if(I)continue}let s=ht(T);if(s.length===0){p.push(B);continue}let l=[],m=[],g=[];for(let k of s){if(u.has(k))continue;let I=a[k]||[];I.length===0?l.push(k):I.every(L=>vr(r.tasks[L]))?g.push({token:k,failedProducer:I[0]}):m.push(k);}l.length>0?C.push({taskName:B,missingTokens:l}):g.length>0?v.push({taskName:B,failedTokens:g.map(k=>k.token),failedProducers:[...new Set(g.map(k=>k.failedProducer))]}):m.length>0?y.push({taskName:B,waitingOn:m}):p.push(B);}let S={};if(p.length>1){let B=nn(p,n);for(let[T,_]of Object.entries(B))_.length>1&&(S[T]=_);}return {eligible:p,pending:y,unresolved:C,blocked:v,conflicts:S}}function Fo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of We(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 Ot=class{constructor(){Wr(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Ar(e){let t=xr(e);return qo(t)}function xr(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(xr).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+xr(t[n])).join(",")+"}"}function qo(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 No(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 jo(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 fn(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return No(t)}function Lo(e){try{let t=JSON.parse(jo(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Gt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:a}=t,d=new Ot,u="state"in e&&"config"in e?e:xt(e),p=false,y=new Set,C=new Map(Object.entries(n)),v=new Ot,S=false,B=false;function T(){if(!p){if(S){B=true;return}S=true;try{do B=!1,_();while(B)}finally{S=false;}}}function _(){let s=v.drain(),l=d.drain(),m=[...s,...l];if(m.length>0&&(u=dn(u,m),o)){for(let k of m)if(k.type==="task-removal")try{o(k.taskName);}catch(I){console.warn("[reactive] onNodeRemoved failed:",I instanceof Error?I.message:String(I));}}let g=Bt(u);m.length>0&&a?.(m,u,g);for(let k of g.eligible)f(k);for(let k of m)if(k.type==="task-progress"){let{taskName:I,update:q}=k;if(!u.config.tasks[I])continue;let V=u.state.tasks[I];if(!V||V.status!=="running")continue;let J=fn(I),X=h(I,J,q).catch(H=>{p||(v.append({type:"task-failed",taskName:I,error:H.message??String(H),timestamp:new Date().toISOString()}),T());}).finally(()=>{y.delete(X);});y.add(X);}}function x(s){let m=u.config.tasks[s].requires??[],g=new Map;for(let[I,q]of Object.entries(u.config.tasks))for(let L of q.provides??[])g.set(L,I);let k={};for(let I of m){let q=g.get(I);q?k[I]=u.state.tasks[q]?.data:k[I]=void 0;}return k}async function h(s,l,m){let g=u.config.tasks[s],k=g.taskHandlers??[],I=x(s);for(let q of k){let L=C.get(q);if(!L)throw new Error(`Handler '${q}' not found in registry (task '${s}')`);let V={nodeId:s,state:I,taskState:u.state.tasks[s],config:g,callbackToken:l,update:m};if(await L(V)==="task-initiate-failure")throw new Error(`Handler '${q}' returned task-initiate-failure (task '${s}')`)}}function f(s){let m=u.config.tasks[s]?.taskHandlers;if(!m||m.length===0)return;v.append({type:"task-started",taskName:s,timestamp:new Date().toISOString()}),T();let g=fn(s),k=h(s,g).catch(I=>{p||(v.append({type:"task-failed",taskName:s,error:I.message??String(I),timestamp:new Date().toISOString()}),T());}).finally(()=>{y.delete(k);});y.add(k);}return {push(s){p||(s.type==="task-completed"&&s.data&&!s.dataHash&&(s={...s,dataHash:Ar(s.data)}),d.append(s),T());},pushAll(s){if(!p){for(let l of s)l.type==="task-completed"&&l.data&&!l.dataHash?d.append({...l,dataHash:Ar(l.data)}):d.append(l);T();}},resolveCallback(s,l,m){if(p)return;let g=Lo(s);if(!g)return;let{taskName:k}=g;if(u.config.tasks[k]){if(m&&m.length>0)d.append({type:"task-failed",taskName:k,error:m.join("; "),timestamp:new Date().toISOString()});else {let I=l&&Object.keys(l).length>0?Ar(l):void 0;d.append({type:"task-completed",taskName:k,data:l,dataHash:I,timestamp:new Date().toISOString()});}T();}},addNode(s,l){p||(d.append({type:"task-upsert",taskName:s,taskConfig:l,timestamp:new Date().toISOString()}),T());},removeNode(s){p||(d.append({type:"task-removal",taskName:s,timestamp:new Date().toISOString()}),T());},addRequires(s,l){p||(d.append({type:"node-requires-add",nodeName:s,tokens:l,timestamp:new Date().toISOString()}),T());},removeRequires(s,l){p||(d.append({type:"node-requires-remove",nodeName:s,tokens:l,timestamp:new Date().toISOString()}),T());},addProvides(s,l){p||(d.append({type:"node-provides-add",nodeName:s,tokens:l,timestamp:new Date().toISOString()}),T());},removeProvides(s,l){p||(d.append({type:"node-provides-remove",nodeName:s,tokens:l,timestamp:new Date().toISOString()}),T());},registerHandler(s,l){C.set(s,l);},unregisterHandler(s){C.delete(s);},retrigger(s){p||u.config.tasks[s]&&(d.append({type:"task-restart",taskName:s,timestamp:new Date().toISOString()}),T());},retriggerAll(s){if(!p){for(let l of s)u.config.tasks[l]&&d.append({type:"task-restart",taskName:l,timestamp:new Date().toISOString()});T();}},snapshot(){return Rt(u)},getState(){return u},getSchedule(){return Bt(u)},async waitForHandlers(){y.size>0&&await Promise.allSettled([...y]);},async dispose(s){s?.wait&&y.size>0&&await Promise.allSettled([...y]),p=true;}}}function Wt(){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 Mo=Wt();Mo("./jsonata-sync.cjs");var Do=Wt(),zt=Do("./jsonata-sync.cjs"),gn=zt;function mn(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 yn(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 $o(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 zt(o.expr).evaluate(n);yn(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch{}return e}function Vo(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 d=gn(a.expr).evaluate(n);yn(e.computed_values,a.bindTo,d),n.computed_values=e.computed_values;}catch(d){let u=d instanceof Error?d.message:String(d);o.push({bindTo:a.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Uo(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return zt(e).evaluate(n)}function Ko(e,t){return t.startsWith("fetched_sources.")?mn(e._sourcesData??{},t.slice(16)):mn(e,t)}var pn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Ho=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Jo(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))Ho.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,d)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`source_defs[${d}]: must be an object`);else {let u=a;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${d}]: missing required "bindTo" property`):(n.has(u.bindTo)&&t.push(`source_defs[${d}]: bindTo "${u.bindTo}" is not unique across source_defs`),n.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${d}]: missing required "outputFile" property`):(o.has(u.outputFile)&&t.push(`source_defs[${d}]: 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`):pn.has(o.kind)||t.push(`view.elements[${a}].kind: unknown kind "${o.kind}". Valid: ${[...pn].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 Qo(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,d]of Object.entries(n.projections))if(typeof d=="string"&&d.trim().length>0)try{o[a]=await zt(d).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}}))}function Go(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[a,d]of Object.entries(n.projections))if(typeof d=="string"&&d.trim().length>0)try{o[a]=gn(d).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}})}var Je={run:$o,runSync:Vo,eval:Uo,resolve:Ko,validate:Jo,enrichSources:Qo,enrichSourcesSync:Go};function Yt(e){return JSON.stringify(e)}function Xt(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 Zt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Ir(e,t){return Zt(e)?e.then(t):t(e)}function Rn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Pr(e,t){return {readValues(n){let o=e(n);return Ir(o.listKeys(),a=>{let d=[...a].sort();if(d.length===0)return {version:null,values:{}};let u={},p=null;for(let y of d){let C=o.read(y);Zt(C)?p=(p??Promise.resolve()).then(async()=>{u[y]=await C;}):u[y]=C;}return p?p.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,a){let d=e(n),u=null;for(let p of a){let y=d.delete(p);Zt(y)&&(u=(u??Promise.resolve()).then(()=>y).then(()=>{}));}for(let[p,y]of Object.entries(o)){let C=d.write(p,y);Zt(C)&&(u=(u??Promise.resolve()).then(()=>C).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function er(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 Ir(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let a=Rn(o.values,n);return Ir(e.writeValues(r,a,n.deleteKeys),d=>({ok:true,newVersion:d}))})}}}function hn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function kn(e){return {readEntriesAfterCursor(t){let r=hn(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 hn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function Cn(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 tr(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ct(e,t){return tr(e)?e.then(t):t(e)}function Tr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);tr(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function Wo(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function zo(e,t){let r=e.match(t);return r?r[1]:null}function bn(e,t,r){let n={},o=Tr(e,a=>{let d=r(a);if(d)return ct(t(a),u=>{n[d]=u;})});return tr(o)?o.then(()=>n):n}function rr(e,t){return {readSourceData(r,n){return ct(e.read(`${r}/${n}`),Wo)},ingestSourceDataStaged(r,n,o,a){return ct(t(o),d=>e.write(`${r}/.staged/${a}/${n}`,d))},commitSourceData(r,n,o){let a=`${r}/.staged/${o}/${n}`,d=`${r}/${n}`;return e.renameKey(a,d)},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 _r(e,t){let r=(n,o)=>{try{let a=o(n);return tr(a)?a.catch(d=>t(n,d instanceof Error?d.message:String(d))):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 ct(e.read(n),a=>e.write(n,[...a??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ct(e.read(n),a=>{let d=a;if(!(!d||d.length===0))return ct(Tr(d,u=>r(u,o)),()=>e.delete(n))})}}}function Er(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 nr(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=>bn(t,r=>e.read(r),r=>zo(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return Tr(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=>bn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function jt(e,t){function r(){return e.readIndex()??{}}function n(o,a,d){let u=String(a||"").split(".").filter(Boolean);if(u.length===0)return d&&typeof d=="object"&&!Array.isArray(d)?d:{value:d};let p={...o},y=p;for(let C=0;C<u.length-1;C++){let v=u[C],S=y[v],B=S&&typeof S=="object"&&!Array.isArray(S)?{...S}:{};y[v]=B,y=B;}return y[u[u.length-1]]=d,p}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,d]of Object.entries(r())){if(!e.cardExists(d.key))continue;let u=e.readCard(d.key);u?o.push(u):t?.(`[card-store] could not read card "${a}" at key "${d.key}"`);}return o},readChecksumIndex(){let o={};for(let[a,d]of Object.entries(r()))o[a]=d.checksum;return o},changedSince(o){let a=r(),d=[];for(let[u,p]of Object.entries(a))o[u]!==p.checksum&&d.push(u);for(let u of Object.keys(o))a[u]||d.push(u);return d},validateUpsert(o,a){let d=r(),u=d[o],p=Object.entries(d).find(([,y])=>y.key===a);return u&&u.key!==a?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${a}"`}:p&&p[0]!==o?{ok:false,error:`Key "${a}" is already mapped to card id "${p[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,a,d){let u=r(),p=d??u[o]?.key??e.defaultCardKey(o),y=e.writeCard(p,a);u[o]={key:p,checksum:y,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,a,d){let u=r(),p=u[o];if(!p||!e.cardExists(p.key))throw new Error(`card "${o}" not found`);let y=e.readCard(p.key);if(!y||typeof y!="object"||Array.isArray(y))throw new Error(`card "${o}" is not patchable`);let C=n(y,a,d),v=e.writeCard(p.key,C);u[o]={key:p.key,checksum:v,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let a=r(),d=a[o];d&&(e.removeCard(d.key),delete a[o],e.writeIndex(a));},readIndex(){return r()}}}function or(e,t){return rr(e,t)}function Sn(e){return kn(e)}var ar="v1",dt="board/graph",wn="board/lastJournalProcessedId";function vn(e){return `cards/${e}/runtime`}function An(e){return er(e,ar)}function sr(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 Xt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Yt(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 xn(e){return nr(e)}function Ft(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Yo(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function qt(e,t){return e?.lastRequestedToken?Yo(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Br(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Nt(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function Ct(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),a=Bt(t),d={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 p=new Map;for(let[T,_]of Object.entries(n))for(let x of _.requires??[]){let h=p.get(x)??[];h.push(T),p.set(x,h);}let y=o.sort().map(T=>{let _=r[T],x=n[T]??{requires:[],provides:[]};_.status==="completed"?d.completed+=1:_.status==="failed"?d.failed+=1:_.status==="in-progress"&&(d.in_progress+=1);let h=x.requires??[],f=x.provides??[],s=Object.keys(_.data??{}).sort(),l=h.filter(L=>t.state.availableOutputs.includes(L)),m=h.filter(L=>!t.state.availableOutputs.includes(L)),g=u.get(T)??m,k=new Set;for(let L of f)for(let V of p.get(L)??[])V!==T&&k.add(V);let I=_.failedAt,q=_.error?{message:_.error,code:"TASK_FAILED",at:I,source:"task-runtime"}:void 0;return {name:T,status:_.status,error:q,requires:h,requires_satisfied:l,requires_missing:m,provides_declared:f,provides_runtime:s,blocked_by:g,unblocks:Array.from(k).sort(),runtime:{attempt_count:_.executionCount??0,restart_count:_.retryCount??0,in_progress_since:_.status==="in-progress"?_.startedAt??null:null,last_transition_at:_.lastUpdated??null,last_completed_at:_.completedAt??null,last_restarted_at:_.startedAt??null,status_age_ms:_.lastUpdated?0:null}}});d.pending=a.pending.length,d.blocked=a.blocked.length,d.unresolved=a.unresolved.length;let C=y.map(T=>({name:T.name,fanOut:T.unblocks.length})).sort((T,_)=>_.fanOut-T.fanOut||T.name.localeCompare(_.name)),v=C.length>0?C[0]:{name:null,fanOut:0},S=new Set;for(let T of Object.values(n))for(let _ of T.requires??[])S.add(_);let B=0;for(let[T,_]of Object.entries(n)){let x=(_.requires??[]).length===0,f=(_.provides??[]).some(s=>(p.get(s)??[]).some(l=>l!==T));x&&!f&&(B+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:d.completed,eligible:a.eligible.length,pending:d.pending,blocked:d.blocked,unresolved:d.unresolved,failed:d.failed,in_progress:d.in_progress,orphan_cards:B,topology:{edge_count:Array.from(S).length,max_fan_out_card:v.name,max_fan_out:v.fanOut}},cards:y}}function Xo(){return new Date().toISOString()}function In(e,t,r,n,o,a,d){return async u=>{let p=[],y=r.cardStore.readCard(u.nodeId);if(!y)return "task-initiate-failure";let C=y.id,v=y.card_data??{},S=y.source_defs??[],B=S,T=r.cardRuntimeStore.readRuntime(C),_=false,x=()=>{_&&(r.cardRuntimeStore.writeRuntime(C,T),_=false);},h=Q=>Ft(T._sources[Q]),f=(Q,Z)=>{T._sources[Q]=Ft(Z),_=true;},s=u.taskState?.executionCount??0;if(T._lastExecutionCount!==s&&(T._sources={},T._lastExecutionCount=s,_=true),u.update){let Q=u.update,Z=Q.outputFile;if(Z){let ae=h(Z);if(Q.failure){let de=Q.rqt??ae.lastRequestedToken??ae.queueRequestedToken;de&&f(Z,Nt(ae,de));}else {let de=Q.rqt;if(!ae.lastCompletedToken||de>ae.lastCompletedToken){let ke=typeof Q.deliveryToken=="string"?Q.deliveryToken:void 0,E=false;ke&&(E=r.fetchedSourcesStore.commitSourceData(C,Z,ke)),E?f(Z,Br(ae,de)):f(Z,Nt(ae,de));}}x();}}let m={};for(let Q of S)if(Q.outputFile){let Z=r.fetchedSourcesStore.readSourceData(C,Q.outputFile);Z!==null&&(m[Q.bindTo]=Z);}let g={};for(let[Q,Z]of Object.entries(u.state??{}))if(Z!==null&&typeof Z=="object"&&!Array.isArray(Z)){let ae=Z[Q];g[Q]=ae!==void 0?ae:Z;}else g[Q]=Z;let k={id:C,card_data:{...v},requires:g,source_defs:S,compute:y.compute};k._sourcesData=m,y.compute&&Je.runSync(k,{sourcesData:m}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(C,k.computed_values??{});let I={...y},q=Je.enrichSourcesSync(Array.isArray(y.source_defs)?y.source_defs:void 0,{card_data:y.card_data,requires:g}),L=e.value;I.source_defs=Array.isArray(q)?q.map(Q=>({...Q,boardDir:typeof Q.boardDir=="string"&&Q.boardDir?Q.boardDir:L})):q;let V=Xo(),J=u.update?void 0:V,X=B.filter(Q=>{let Z=Q.outputFile;if(typeof Z!="string"||!Z)return true;let ae=h(Z);J&&(ae={...ae,queueRequestedToken:J},f(Z,ae));let de=ae.queueRequestedToken??ae.lastRequestedToken??V,ke=qt(ae,de);return ke==="in-flight"?false:ke==="dispatch"});if(x(),X.length>0){let Q=false,Z=V;for(let ae of X){let de=ae.outputFile;if(typeof de!="string"||!de)continue;let ke=h(de),E=ke.queueRequestedToken??V;f(de,{...ke,lastRequestedToken:E}),Z=E,Q=true;}return Q&&x(),Q&&(p.push({taskKind:"source-fetch",payload:{boardRef:Se(e),enrichedCard:I,callbackToken:u.callbackToken,rqt:Z}}),r.executionRequestStore.appendEntries(t,p)),"task-initiated"}if(B.some(Q=>{let Z=Q.outputFile;if(typeof Z!="string"||!Z)return false;let ae=h(Z),de=ae.queueRequestedToken??ae.lastRequestedToken??V;return qt(ae,de)==="in-flight"}))return "task-initiated";let re=y.provides??[],ie={};for(let{bindTo:Q,ref:Z}of re)ie[Q]=Je.resolve(k,Z);return (d??r.outputStore.writeDataObjects.bind(r.outputStore))(ie),n(u.nodeId,ie),p.length>0&&r.executionRequestStore.appendEntries(t,p),"task-initiated"}}var Lt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function ir(e){return {[dt]:e.graph,[wn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function ur(e){let t=e[dt],r=e[wn],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 cr(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 dr(e,t={}){function r(y){return {status:"success",data:y}}function n(y){return {status:"fail",error:y}}function o(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}async function a(y){let C=t.emitNotification;if(!C||y.length===0)return;let v=Fe(y);if(v.length===1){await C(v[0]);return}await C(qe({kind:"notification-batch",notifications:v}));}function d(y){let C=y.params?.id;if(C){let v=e.readCard(C);if(!v)throw new Error(`card "${C}" not found`);return [v]}return e.readAllCards()}function u(y){return qe({kind:"notification-batch",notifications:Fe(y.map(C=>({kind:"card_refreshed",cardId:C.id,card:C})))})}function p(y){if(Array.isArray(y))return y;if(y&&typeof y=="object"){let C=y;return Array.isArray(C.files)?C.files:[y]}return null}return {get(y){try{return r({cards:d(y)})}catch(C){return o(C)}},buildNotificationBatch(y){try{return r(u(d(y)))}catch(C){return o(C)}},set(y){try{let C=y.body;if(C==null)return n("set requires a body (card object or array of cards)");let v=Array.isArray(C)?C:[C];for(let S of v){if(typeof S.id!="string")return n("each card must have a string `id` field");e.writeCard(S.id,S);}return a(v.map(S=>({kind:"card_refreshed",cardId:S.id,card:S}))),r({count:v.length})}catch(C){return o(C)}},del(y){try{let C=y.body?.ids??[],v=y.params?.id,S=v?[...C,v]:C;if(S.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of S)e.removeCard(B);return a(S.map(B=>({kind:"card_removed",cardId:B}))),r({count:S.length})}catch(C){return o(C)}},patch(y){try{let C=y.params?.id,v=y.params?.path;if(!C)return n("patch requires params.id");if(!v)return n("patch requires params.path");let S=y.body,B=S&&Object.prototype.hasOwnProperty.call(S,"value")?S.value:y.body;e.patchCard(C,v,B);let T=e.readCard(C);return T?(a([{kind:"card_refreshed",cardId:C,card:T}]),r({count:1})):n(`card "${C}" not found`)}catch(C){return o(C)}},appendFiles(y){try{let C=y.params?.id;if(!C)return n("appendFiles requires params.id");let v=e.readCard(C);if(!v)return n(`card "${C}" not found`);let S=p(y.body);if(!S||S.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=v.card_data&&typeof v.card_data=="object"&&!Array.isArray(v.card_data)?v.card_data:{},T=Array.isArray(B.files)?B.files:[],_=[...T,...S],x=S.map((f,s)=>({idx:T.length+s,entry:f})),h=this.patch({params:{id:C,path:"card_data.files"},body:{value:_}});return h.status!=="success"?h:r({files_added:x})}catch(C){return o(C)}}}}function pe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function se(e){return {status:"fail",error:e}}function he(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}var Pn="sys_keys_board_state";function Zo(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 En(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 lr(e){try{let t=JSON.parse(En(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Tn(e){return Zo(JSON.stringify(e))}function _n(e){try{let t=JSON.parse(En(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ze(){return new Date().toISOString()}function ea(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(d){try{e(a,d instanceof Error?d.message:String(d));}catch{}}t.delete(r);}}}}function Bn(e,t,r={}){Jt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),a=Se(e),d=r.boardRuntimeStoreRef,u=r.scratchStoreRef,p=r.taskExecutorRef,y=r.chatHandlerFlow,C=r.emitNotification??(j=>{if(!t.publishBoardChangeNotifications)return;let R=j.kind==="notification-batch"?j.notifications:[j];return t.publishBoardChangeNotifications(R)});function v(){if(!d)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return d}function S(j){if(j.length!==0)try{let R=Fe(j),F=qe({kind:"notification-batch",notifications:R}),$=C(F);$&&typeof $.catch=="function"&&$.catch(te=>o(`[board-live-cards-public] emitNotification failed: ${te instanceof Error?te.message:String(te)}`));}catch(R){o(`[board-live-cards-public] emitNotification failed: ${R instanceof Error?R.message:String(R)}`);}}function B(){let j=_().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 R=t.kvStorageForRef(j);return {readIndex(){return R.read("_index")},writeIndex(F){R.write("_index",F);},readCard(F){return R.read(F)},writeCard(F,$){return R.write(F,$),t.hashFn($)},removeCard(F){R.delete(F);},cardExists(F){return R.read(F)!==null},defaultCardKey(F){return F}}}let T={readValues(j){let R=t.kvStorageForRef(v()),F=R.listKeys().sort();if(F.length===0)return {version:null,values:{}};let $={};for(let te of F)$[te]=R.read(te);return {version:t.hashFn($),values:$}},writeValues(j,R,F){let $=t.kvStorageForRef(v());for(let te of F)$.delete(te);for(let[te,ee]of Object.entries(R))$.write(te,ee);return t.hashFn(R)}},_=()=>sr(t.kvStorageForRef(v())),x=()=>An(T),h=()=>Sn(t.journalAdapterForRef(v())),f=()=>jt(B(),o),s=()=>{let j=_().readOutputsStoreRef();if(!j)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return xn(t.kvStorageForRef(j))};function l(){return p??_().readTaskExecutorRef()}function m(){return !!x().readSnapshot(e.value).values[dt]}function g(){let j=x().readSnapshot(e.value);if(!j.values[dt])throw new Error(`Board not initialized at ${e.value}`);return ur(j.values)}function k(j,R){let F=x().commitSnapshot(e.value,{schemaVersion:ar,expectedVersion:R,commitId:t.genId(),committedAt:ze(),deleteKeys:[],shallowMerge:ir(j)});if(!F.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${R??"null"} current=${F.currentVersion??"null"}`)}function I(j){h().appendEvent(j);}async function q(){let R=ea((b,O)=>{let D=b.payload,G=(D?.enrichedCard??{}).id??D?.cardId??"unknown";I({type:"task-failed",taskName:G,error:O,timestamp:ze()});}),F=g(),$=kt(F.graph),{events:te,newCursor:ee}=h().readEntriesAfterCursor(F.lastDrainedJournalId),Re=E(),fe=or(Re,b=>t.resolveBlob(b)),Ce={...F.runtimeByCardId},_e=new Map,je={readRuntime(b){return _e.get(b)??Ce[b]??{_sources:{}}},writeRuntime(b,O){_e.set(b,O),Ce[b]=O;}},Ue=[],Ve=new Map,lt={readSourceData(b,O){let D=`${b}/${O}`;return Ve.has(D)?Ve.get(D):fe.readSourceData(b,O)},ingestSourceDataStaged(b,O,D,Y){fe.ingestSourceDataStaged(b,O,D,Y);},commitSourceData(b,O,D){let Y=`${b}/.staged/${D}/${O}`,G=Re.read(Y);if(G==null){let ue=Re.keyRef?.(Y);ue&&(G=t.resolveBlob(ue));}if(G==null)return false;let oe=`${b}/${O}`,Be=G.trim();try{Ve.set(oe,JSON.parse(Be));}catch{Ve.set(oe,Be);}return Ue.push({cardId:b,outputFile:O,deliveryToken:D}),true},hasSource(b,O){let D=`${b}/${O}`;return Ve.has(D)?true:fe.hasSource(b,O)},listSources(b){let O=fe.listSources(b),D=new Set;for(let G of Ve.keys())G.startsWith(`${b}/`)&&D.add(G.slice(`${b}/`.length));let Y=new Set([...O,...D]);return Array.from(Y)}},Xe={cardStore:f(),cardRuntimeStore:je,fetchedSourcesStore:lt,outputStore:s(),executionRequestStore:R},Ge=[],bt=[],St=[],Dt=new Map,$t=new Set,Jr=(b,O)=>{Ge.push({type:"task-completed",taskName:b,data:O,timestamp:ze()});},Tt=(b,O)=>{I({type:"task-failed",taskName:b,error:O,timestamp:ze()});},_t=Gt($,{handlers:{"card-handler":In(e,ee,Xe,Jr,Tt,(b,O)=>{bt.push({cardId:b,values:O});},b=>{St.push(b);})},onNodeRemoved:b=>{Dt.delete(b),_e.delete(b),delete Ce[b],$t.add(b);}});for(Ge=te;Ge.length>0;){let b=Ge;Ge=[];for(let O of b)if(O.type==="task-restart"){let D=Xe.cardStore.readCard(O.taskName);D&&Dt.set(O.taskName,D);}_t.pushAll(b),await _t.waitForHandlers();}let Vt=_t.getState();await _t.dispose({wait:true});let Gr=x().readSnapshot(e.value).version;k({lastDrainedJournalId:ee,graph:Rt(Vt),runtimeByCardId:Ce},Gr);for(let{cardId:b,values:O}of bt)Xe.outputStore.writeComputedValues(b,O);for(let b of St)Xe.outputStore.writeDataObjects(b);for(let{cardId:b,outputFile:O,deliveryToken:D}of Ue)fe.commitSourceData(b,O,D);let wt;try{wt=Ct(a,Vt),Xe.outputStore.writeStatusSnapshot(wt);}catch(b){o(`[board-live-cards-public] status publish failed: ${b instanceof Error?b.message:String(b)}`);}let gt=[];for(let{cardId:b,values:O}of bt)gt.push({kind:"computed_values",cardId:b,values:O});for(let b of St)for(let[O,D]of Object.entries(b))O&>.push({kind:"data_object",key:O,payload:D});for(let[b,O]of Dt)gt.push({kind:"card_refreshed",cardId:b,card:O});for(let b of $t)gt.push({kind:"card_removed",cardId:b});wt!==void 0&>.push({kind:"status",status:wt}),S(gt);let i=l()??{howToRun:"built-in",whatToRun:Se({kind:"built-in",value:"source-cli-task-executor"})},P=t.supportsDirectSourceOutput?.(i)===true;R.dispatchEntriesForJournalId(ee,b=>{if(b.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${b.taskKind}" \u2014 skipping`);return}let O=b.payload,D=O.enrichedCard?.id??"unknown",Y=O.enrichedCard?.source_defs??[];if(i.howToRun==="queue-storage"&&P){try{let G=t.queueStorageForRef(L(),"task-executor"),oe=typeof i.extra?.boardId=="string"?i.extra.boardId:void 0,Be=[];for(let ue of Y){if(!ue.outputFile){o(`[dispatch] source "${ue.bindTo}" has no outputFile \u2014 skipping`);continue}let Le=t.genId(),vt=`${D}/.staged/${Le}/${ue.outputFile}`,At=Re.keyRef?.(vt);if(!At)continue;let Ut={ref:Se(At),deliveryToken:Le,outputFile:ue.outputFile,cardId:D},Et=Tn({cbk:O.callbackToken,rg:e.value,br:Se(e),cid:D,b:ue.bindTo,d:ue.outputFile,cs:void 0,rqt:O.rqt,dt:Ut.deliveryToken});Be.push({...oe?{boardId:oe}:{},ref:i,args:{source_def:ue,base_ref:Se(e),callback:n.createCallback(Et),output:Ut}});}Be.length>0&&G.enqueueMany(Be);}catch(G){Tt(D,G instanceof Error?G.message:String(G));}return}for(let G of Y){if(!G.outputFile){o(`[dispatch] source "${G.bindTo}" has no outputFile \u2014 skipping`);continue}let oe;if(P){let ue=t.genId(),Le=`${D}/.staged/${ue}/${G.outputFile}`,vt=Re.keyRef?.(Le);vt&&(oe={ref:Se(vt),deliveryToken:ue,outputFile:G.outputFile,cardId:D});}let Be=Tn({cbk:O.callbackToken,rg:e.value,br:Se(e),cid:D,b:G.bindTo,d:G.outputFile,cs:void 0,rqt:O.rqt,...oe?{dt:oe.deliveryToken}:{}});t.dispatchExecution(i,{source_def:G,base_ref:Se(e),callback:n.createCallback(Be),...oe?{output:oe}:{}}).catch(ue=>Tt(D,ue instanceof Error?ue.message:String(ue)));}});}function L(){let j=_().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 V(){let j=t.queueStorageForRef(L(),"process-accumulated");j.enqueueIfAbsent?j.enqueueIfAbsent({boardRef:Se(e)},`process-accumulated:${Se(e)}`):j.enqueue({boardRef:Se(e)}),t.requestProcessAccumulated?.();}function J(){let j=t.queueStorageForRef(L(),"process-accumulated");for(;;){let R=j.lease({max:64,visibilityMs:1e3});if(R.length<=0)return;for(let F of R)j.ack(F.id,F.leaseToken);if(R.length<64)return}}async function X(){try{let j=()=>{let F=g(),{events:$}=h().readEntriesAfterCursor(F.lastDrainedJournalId);$.length<=0||V();},R=await zr(t.lock,q,j);return pe({ran:R!==!1})}catch(j){return he(j)}}function H(){V();}function re(j){try{let R=j.params?.cardStoreRef;if(!R)return se("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(d=j.params?.boardRuntimeStoreRef,!d)return se("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!m()){let Ce=xt(Lt);k({lastDrainedJournalId:"",graph:Rt(Ce),runtimeByCardId:{}},null);}let F=j.params?.outputsStoreRef;if(!F)return se("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let $=j.params?.queueStoreRef;if(!$)return se("init requires params.queueStoreRef \u2014 pass the queue store ref here");let te=j.params?.fetchedSourcesStoreRef;if(!te)return se("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");u=j.params?.scratchStoreRef;let ee=j.params?.chatStoreRef;if(!ee)return se("init requires params.chatStoreRef \u2014 pass the chat store ref here");let Re=j.params?.artifactsStoreRef;if(!Re)return se("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let fe=_();fe.writeBoardRuntimeStoreRef(d),fe.writeCardStoreRef(R),fe.writeOutputsStoreRef(F),fe.writeQueueStoreRef($),fe.writeFetchedSourcesStoreRef(te),fe.writeChatStoreRef(ee),fe.writeArtifactsStoreRef(Re);try{s().writeStatusSnapshot(Ct(a,kt(g().graph)));}catch{}return pe()}catch(R){return he(R)}}function ie(j){try{let R=s().readStatusSnapshot();if(!R){R=Ct(a,kt(g().graph));try{s().writeStatusSnapshot(R);}catch{}}return pe(R)}catch(R){return he(R)}}function Q(j){try{let R=j.params?.id;if(!R)return se("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(R);}catch{}return I({type:"task-removal",taskName:R,timestamp:ze()}),H(),pe()}catch(R){return he(R)}}function Z(j){try{let R=j.params?.cardId;if(!R)return se("addCardFiles requires params.cardId");let F=dr(f(),{emitNotification:C}).appendFiles({params:{id:R},body:j.body});return F.status!=="success"?F:pe({cardId:R,files_added:F.data.files_added,notified:!0})}catch(R){return he(R)}}function ae(j){try{let R=j.params?.id;return R?(I({type:"task-restart",taskName:R,timestamp:ze()}),H(),pe()):se("retrigger requires params.id")}catch(R){return he(R)}}async function de(j){return J(),X()}function ke(){let j=_().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 E(){return t.blobStorageForRef(ke())}function c(j){try{let R=j.params?.cardId,F=j.params?.all,$=!!j.params?.restart;if(!R&&!F)return se("upsertCard requires --card-id <id> or --all");let te=F?f().readAllCards().map(ee=>ee.id):[R];for(let ee of te)if(!f().readCard(ee))return se(`Card "${ee}" not found in board at ${e.value}`);for(let ee of te){let Re=f().readCard(ee),fe=cr(Re),Ce=t.hashFn(fe),_e=t.kvStorage("card-upsert"),je=_e.read(ee),Ue=je?.taskConfigHash!==Ce;if(!(!Ue&&!$)){if(Ue){let Ve=je?.blobRef??f().readCardKey(ee)??ee;I({type:"task-upsert",taskName:ee,taskConfig:fe,timestamp:ze()}),_e.write(ee,{blobRef:Ve,taskConfigHash:Ce,updatedAt:ze()});}$&&I({type:"task-restart",taskName:ee,timestamp:ze()});}}return H(),pe()}catch(R){return he(R)}}function w(j){try{let R=j.params?.token;if(!R)return se("taskFailed requires params.token");let F=j.params?.error??"unknown error",$=lr(R);return $?(I({type:"task-failed",taskName:$.taskName,error:F,timestamp:ze()}),H(),pe()):se("Invalid callback token")}catch(R){return he(R)}}function A(j){try{let R=j.params?.token;if(!R)return se("taskProgress requires params.token");let $=(j.body??{}).update??{},te=lr(R);return te?(I({type:"task-progress",taskName:te.taskName,update:$,timestamp:ze()}),H(),pe()):se("Invalid callback token")}catch(R){return he(R)}}function N(j){try{let R=j.params?.token,F=j.params?.ref;if(!R)return se("sourceDataFetched requires params.token");if(!F)return se("sourceDataFetched requires params.ref");let $=_n(R);if(!$)return se("Invalid source token");let{cbk:te,cid:ee,b:Re,d:fe,cs:Ce,rqt:_e,dt:je}=$,Ue=or(E(),Ge=>t.resolveBlob(Ge)),Ve=je||t.genId();je||Ue.ingestSourceDataStaged(ee,fe,st(F),Ve);let lt=lr(te);if(!lt)return se("Invalid callback token embedded in source token");let Xe=ze();return I({type:"task-progress",taskName:lt.taskName,update:{bindTo:Re,outputFile:fe,fetchedAt:Xe,deliveryToken:Ve,sourceChecksum:Ce,rqt:_e},timestamp:Xe}),H(),pe()}catch(R){return he(R)}}function M(j){try{let R=j.params?.token,F=j.params?.reason??"unknown";if(!R)return se("sourceDataFetchFailure requires params.token");let $=_n(R);if(!$)return se("Invalid source token");let{cbk:te,b:ee,d:Re,cs:fe,rqt:Ce}=$,_e=lr(te);return _e?(I({type:"task-progress",taskName:_e.taskName,update:{bindTo:ee,outputFile:Re,failure:!0,reason:F,sourceChecksum:fe,rqt:Ce},timestamp:ze()}),H(),pe()):se("Invalid callback token embedded in source token")}catch(R){return he(R)}}function K(j){try{let R=_().readCardStoreRef();return R?pe({storeRef:R}):se(`Board at ${e.value} has no card store configured`)}catch(R){return he(R)}}function U(j){try{return pe({storeRef:d??null})}catch(R){return he(R)}}function ne(j){try{let R=_().readOutputsStoreRef();return R?pe({storeRef:R}):se(`Board at ${e.value} has no outputs store configured`)}catch(R){return he(R)}}function xe(j){try{return pe({storeRef:u??null})}catch(R){return he(R)}}function Ie(j){try{let R=_().readChatStoreRef();return pe({storeRef:R})}catch(R){return he(R)}}function Ae(j){try{let R=_().readArtifactsStoreRef();return pe({storeRef:R})}catch(R){return he(R)}}function le(j){try{let R=_().readFetchedSourcesStoreRef();return pe({storeRef:R})}catch(R){return he(R)}}function ge(j){try{let R=j.params?.key;if(!R)return se("getConfig requires params.key");let F=_(),$;switch(R){case "task-executor":$=p??null;break;case "chat-handler-flow":$=y??null;break;case "board-runtime-store-ref":$=F.readBoardRuntimeStoreRef();break;case "card-store-ref":$=F.readCardStoreRef();break;case "outputs-store-ref":$=F.readOutputsStoreRef();break;case "scratch-store-ref":$=u??null;break;case "chat-store-ref":$=F.readChatStoreRef();break;case "artifacts-store-ref":$=F.readArtifactsStoreRef();break;case "fetched-sources-store-ref":$=F.readFetchedSourcesStoreRef();break;default:return se(`getConfig: unknown key "${R}"`)}return pe({value:$})}catch(R){return he(R)}}function $e(j){try{let R=j.params?.key;if(!R)return se("getOutputsDataObject requires params.key");let F=Me()[R]??null;return pe(F)}catch(R){return he(R)}}function be(j){if(!j||typeof j!="object"||Array.isArray(j))return false;let R=j.__private;return !!R&&typeof R=="object"&&!Array.isArray(R)&&R.visible_controlplane_only===true}function Ne(j){let R=[...new Set(f().readAllCards().filter($=>!be($)).map($=>$.id).filter($=>typeof $=="string"&&$.length>0))].sort(),F=[...new Set(Object.keys(j).filter($=>$&&$!==Pn))].sort();return {card_ids:R,data_object_keys:F}}function Me(){let j=s().readAllDataObjects();return {...j,[Pn]:Ne(j)}}function ye(j){try{return pe(Me())}catch(R){return he(R)}}function Ye(j){try{let R=j.params?.key;if(!R)return se("getOutputsComputedValues requires params.key");let F=s().readComputedValues(R);return pe(F)}catch(R){return he(R)}}function De(j){try{return pe(s().readAllComputedValues())}catch(R){return he(R)}}function He(){return or(E(),j=>t.resolveBlob(j))}function pt(j){let R=E().keyRef?.(j);if(!R)throw new Error("configured fetched-sources store does not support keyRef");return Se(R)}function rt(j){try{let R=j.params?.key;if(!R)return se("getOutputsFetchedSources requires params.key");let F=He().listSources(R),$={};for(let te of F)$[te]=pt(`${R}/${te}`);return pe($)}catch(R){return he(R)}}function at(j){try{let R=He(),F=new Set;for(let te of E().listKeys()){let ee=te.indexOf("/");ee>0&&!te.includes("/.staged/")&&F.add(te.slice(0,ee));}let $={};for(let te of F){let ee=R.listSources(te);if(ee.length>0){$[te]={};for(let Re of ee)$[te][Re]=pt(`${te}/${Re}`);}}return pe($)}catch(R){return he(R)}}function nt(j){try{let R=f().readAllCards(),F=ie({});if(F.status!=="success")return F;let $=ye({});if($.status!=="success")return $;let te=De({});if(te.status!=="success")return te;let ee=te.data,Re={};for(let fe of R){let Ce=typeof fe?.id=="string"?fe.id:null;if(!Ce)continue;let _e=fe.card_data&&typeof fe.card_data=="object"&&!Array.isArray(fe.card_data)?fe.card_data:{};Re[Ce]={schema_version:"v1",card_id:Ce,card_data:{..._e},computed_values:ee[Ce]&&typeof ee[Ce]=="object"?ee[Ce]:{}};}return pe({cardDefinitions:R,statusSnapshot:F.data,dataObjectsByToken:$.data,cardRuntimeById:Re})}catch(R){return he(R)}}return {init:re,status:ie,getBoardRuntimeStoreRef:U,getCardStoreRef:K,getOutputsStoreRef:ne,getScratchStoreRef:xe,getChatStoreRef:Ie,getArtifactsStoreRef:Ae,getFetchedSourcesStoreRef:le,getConfig:ge,getOutputsDataObject:$e,getAllOutputsDataObjects:ye,getOutputsComputedValues:Ye,getAllOutputsComputedValues:De,getOutputsFetchedSources:rt,getAllOutputsFetchedSources:at,buildSseOneShotPayload:nt,removeCard:Q,addCardFiles:Z,retrigger:ae,processAccumulatedEvents:de,upsertCard:c,taskFailed:w,taskProgress:A,sourceDataFetched:N,sourceDataFetchFailure:M}}function On(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 sr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return sr(t.kvStorage("config"))};function a(){let f=o().readCardStoreRef();if(!f)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let s=t.kvStorageForRef(f);return {readIndex(){return s.read("_index")},writeIndex(l){s.write("_index",l);},readCard(l){return s.read(l)},writeCard(l,m){return s.write(l,m),t.hashFn(m)},removeCard(l){s.delete(l);},cardExists(l){return s.read(l)!==null},defaultCardKey(l){return l}}}let d=()=>jt(a(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function p(f,s){let l=t.validateSchema(s),m=[],g=u();if(g&&Array.isArray(s.source_defs))for(let I of s.source_defs){let q=typeof I.bindTo=="string"?I.bindTo:"(unknown)";try{let L;try{L=await t.invokeExecutor(g,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(I)});}catch(J){let X=J;if(L=typeof X?.stdout=="string"?X.stdout:"",!L.trim()){m.push(`source "${q}": executor validate-source-def failed \u2014 ${J instanceof Error?J.message:String(J)}`);continue}}let V=JSON.parse(L.trim());if(!V.ok&&Array.isArray(V.errors))for(let J of V.errors)m.push(`source "${q}": ${J}`);}catch(L){m.push(`source "${q}": executor validate-source-def failed \u2014 ${L instanceof Error?L.message:String(L)}`);}}let k=[...l.errors,...m];return pe({cardId:f,isValid:k.length===0,issues:k})}function y(f,s){let l=f.params?.sourceIdx,m=f.params?.outRef;if(l===void 0)return se(`${s} requires params.sourceIdx`);if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return se(`${s} requires card JSON object in body`);let g=f.body,k=g["card-content"]??g,I=g["mock-projections"]??{},q=k.source_defs??[];if(l<0||l>=q.length)return se(`sourceIdx ${l} out of range (card has ${q.length} source(s))`);let L=q[l],V=typeof L.bindTo=="string"?L.bindTo:"source";return {src:L,bindTo:V,outRef:m,mockProjections:I}}async function C(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return se("validateCardPreflight requires card JSON object in body");let s=f.body,l=s["card-content"]??s,m=typeof l.id=="string"?l.id:"(unknown)";return await p(m,l)}catch(s){return he(s)}}async function v(f){try{let s=y(f,"probeSourcePreflight");if("status"in s)return s;let l=u();if(!l)return se("No task-executor registered for this board");try{let m={...s.src,_projections:s.mockProjections},g=await t.invokeExecutor(l,"probe-source-preflight",{timeout:s.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(m)}),k=JSON.parse(g.trim());return k.ok?pe({bindTo:s.bindTo,reachable:k.reachable,latencyMs:k.latencyMs,note:k.note}):se(k.error??"Preflight probe failed")}catch{return se("Executor does not support probe-source-preflight")}}catch(s){return he(s)}}async function S(f){try{let s=y(f,"runSourcePreflight");if("status"in s)return s;let l=u();if(!l)return se("No task-executor registered for this board");try{let m={...s.src,_projections:s.mockProjections},g=await t.invokeExecutor(l,"run-source-preflight",{timeout:s.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(m)}),k=JSON.parse(g.trim());if(!k.ok)return pe({bindTo:s.bindTo,ok:!1,result:null,issues:[k.error??"Preflight run failed"]});if(s.outRef){let I=st(s.outRef);t.absoluteBlob.write(I.value,JSON.stringify(k.resultValue,null,2));}return pe({bindTo:typeof k.bindTo=="string"?k.bindTo:s.bindTo,ok:!0,result:k.resultValue??null,issues:[]})}catch(m){let g=m instanceof Error?m.message:String(m);return pe({bindTo:s.bindTo,ok:!1,result:null,issues:[g]})}}catch(s){return he(s)}}async function B(f){try{let s=u();if(!s)return se("No task-executor registered for this board");let l=await t.invokeExecutor(s,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return pe(JSON.parse(l.trim()))}catch(s){return he(s)}}function T(f){try{let s=f.body;if(!s||!Array.isArray(s.ops))return se("updatesInCardStore requires body.ops array");let l=s.ops,m=d();for(let g of l){let k=g.op,I=g.id;if(!I)return se('op is missing "id"');if(k==="update"){let q=g["card-content"];if(!q)return se(`update op for "${I}" is missing "card-content"`);m.writeCard(I,q);}else return se(`Unknown op type: "${k??"(none)"}"`)}return pe()}catch(s){return he(s)}}function _(f){try{let s=f.body;if(!s||!Array.isArray(s.ids))return se("readFromCardStore requires body.ids array");let l=s.ids,m=d(),g=l.map(k=>({id:k,"card-content":m.readCard(k)}));return pe({cards:g})}catch(s){return he(s)}}function x(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return se("evalCardCompute requires a JSON object in body");let s=f.body,l=s["card-content"]??s,m=typeof l.id=="string"?l.id:"(unknown)",g=s["mock-fetched-sources"]??{},k=s["mock-requires"]??{},I=l.compute;if(!I||!Array.isArray(I)||I.length===0)return pe({cardId:m,ok:!0,computed_values:{},errors:[]});let q={id:m,card_data:l.card_data??{},requires:k,source_defs:l.source_defs,compute:I},L=Je.runSync(q,{sourcesData:g}),V=L.node.computed_values??{},J=L.errors??[];return pe({cardId:m,ok:J.length===0,computed_values:V,errors:J})}catch(s){return he(s)}}async function h(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return se("simulateCardCycle requires a JSON object in body");let s=f.body,l=s["card-content"]??s,m=typeof l.id=="string"?l.id:"(unknown)",g=s["mock-fetched-sources"]??{},k=s["mock-requires"]??{},I=await p(m,l),q=I.status==="success"?{isValid:I.data.isValid,issues:I.data.issues}:{isValid:!1,issues:[I.status==="fail"?I.error:"internal error"]},L=l.source_defs??[],V=l.card_data??{},J=[],X=[];if(L.length>0){J=Je.enrichSourcesSync(L,{card_data:V,requires:k});for(let E of J){let c=E.projections,w=E._projections;if(c&&w){for(let A of Object.keys(c))if(w[A]===void 0){let N=typeof E.bindTo=="string"?E.bindTo:"(unknown)";X.push({bindTo:N,key:A,error:`Projection "${A}" resolved to undefined`});}}}}let H=[],re={...g},ie=s["task-executor-ref"],Q=(ie?.howToRun&&ie?.whatToRun?ie:void 0)??u();for(let E=0;E<J.length;E++){let c=J[E],w=typeof c.bindTo=="string"?c.bindTo:`source_${E}`;if(!Q){H.push({bindTo:w,skipped:!0,error:"No task executor configured"});continue}try{let A={...c},N=await t.invokeExecutor(Q,"run-source-preflight",{timeout:c.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(A)}),M=JSON.parse(N.trim());M.ok&&!Object.prototype.hasOwnProperty.call(g,w)&&Object.prototype.hasOwnProperty.call(M,"resultValue")&&(re[w]=M.resultValue),H.push({bindTo:w,reachable:M.reachable,latencyMs:M.latencyMs,error:M.ok?void 0:M.error});}catch{H.push({bindTo:w,skipped:!0,error:"Executor does not support run-source-preflight"});}}let Z=l.compute,ae={},de=[];if(Z&&Array.isArray(Z)&&Z.length>0){let E={id:m,card_data:V,requires:k,source_defs:l.source_defs,compute:Z},c=Je.runSync(E,{sourcesData:re});ae=c.node.computed_values??{},de=c.errors??[];}let ke=q.isValid&&X.length===0&&de.length===0&&H.every(E=>E.reachable!==!1);return pe({cardId:m,ok:ke,validation:q,source_probes:H,projection_errors:X,fetched_sources:re,computed_values:ae,compute_errors:de})}catch(s){return he(s)}}return {validateCardPreflight:C,probeSourcePreflight:v,runSourcePreflight:S,evalCardCompute:x,simulateCardCycle:h,describeTaskExecutorCapabilities:B,updatesInCardStore:T,readFromCardStore:_}}function fr(e,t={}){function r(y){return {status:"success",data:y}}function n(y){return {status:"fail",error:y}}function o(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}async function a(y){let C=t.emitNotification;if(!C||y.length===0)return;let v=Fe(y);if(v.length===1){await C(v[0]);return}await C(qe({kind:"notification-batch",notifications:v}));}async function d(y){let C=y.params?.id;if(C){let v=await e.readCard(C);if(!v)throw new Error(`card "${C}" not found`);return [v]}return await e.readAllCards()}function u(y){return qe({kind:"notification-batch",notifications:Fe(y.map(C=>({kind:"card_refreshed",cardId:C.id,card:C})))})}function p(y){if(Array.isArray(y))return y;if(y&&typeof y=="object"){let C=y;return Array.isArray(C.files)?C.files:[y]}return null}return {async get(y){try{return r({cards:await d(y)})}catch(C){return o(C)}},async buildNotificationBatch(y){try{return r(u(await d(y)))}catch(C){return o(C)}},async set(y){try{let C=y.body;if(C==null)return n("set requires a body (card object or array of cards)");let v=Array.isArray(C)?C:[C];for(let S of v){if(typeof S.id!="string")return n("each card must have a string `id` field");await e.writeCard(S.id,S);}return await a(v.map(S=>({kind:"card_refreshed",cardId:S.id,card:S}))),r({count:v.length})}catch(C){return o(C)}},async del(y){try{let C=y.body?.ids??[],v=y.params?.id,S=v?[...C,v]:C;if(S.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of S)await e.removeCard(B);return await a(S.map(B=>({kind:"card_removed",cardId:B}))),r({count:S.length})}catch(C){return o(C)}},async patch(y){try{let C=y.params?.id,v=y.params?.path;if(!C)return n("patch requires params.id");if(!v)return n("patch requires params.path");let S=y.body,B=S&&Object.prototype.hasOwnProperty.call(S,"value")?S.value:y.body;await e.patchCard(C,v,B);let T=await e.readCard(C);return T?(await a([{kind:"card_refreshed",cardId:C,card:T}]),r({count:1})):n(`card "${C}" not found`)}catch(C){return o(C)}},async appendFiles(y){try{let C=y.params?.id;if(!C)return n("appendFiles requires params.id");let v=await e.readCard(C);if(!v)return n(`card "${C}" not found`);let S=p(y.body);if(!S||S.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=v.card_data&&typeof v.card_data=="object"&&!Array.isArray(v.card_data)?v.card_data:{},T=Array.isArray(B.files)?B.files:[],_=[...T,...S],x=S.map((f,s)=>({idx:T.length+s,entry:f})),h=await this.patch({params:{id:C,path:"card_data.files"},body:{value:_}});return h.status!=="success"?h:r({files_added:x})}catch(C){return o(C)}}}}async function Fn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Or(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Fr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Or(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(Or)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Or(t),reason:t.reason}))}}}function qn(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 Xt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Yt(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 ta(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function mr(e,t){return ta(e)?e.then(t):t(e)}function Nn(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]=Nn(r[n],o):r[n]=o;return r}function pr(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]:pr(a,o,r)}}function jn(e){return {read:r=>e.read(r),get(r,n){return mr(e.read(r),o=>{if(o===null)return null;let a=o;for(let d of n.split(".").filter(Boolean)){if(a===null||typeof a!="object"||Array.isArray(a))return null;a=a[d]??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 mr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return mr(e.read(r),o=>e.write(r,Nn(o??{},n)))},patch(r,n,o){return mr(e.read(r),a=>{let d=n.split(".").filter(Boolean);return e.write(r,pr(a??{},d,o))})}}}function gr(e){return jn(e)}function yr(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 hr(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 d=await e.readCard(a.key);d?n.push(d):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[d,u]of Object.entries(o))n[d]!==u.checksum&&a.push(d);for(let d of Object.keys(n))o[d]||a.push(d);return a},async validateUpsert(n,o){let a=await r(),d=a[n],u=Object.entries(a).find(([,p])=>p.key===o);return d&&d.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${d.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 d=await r(),u=a??d[n]?.key??e.defaultCardKey(n),p=await e.writeCard(u,o);d[n]={key:u,checksum:p,updatedAt:new Date().toISOString()},await e.writeIndex(d);},async patchCard(n,o,a){let d=await r(),u=d[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let p=await e.readCard(u.key);if(!p||typeof p!="object"||Array.isArray(p))throw new Error(`card "${n}" is not patchable`);let y=String(o||"").split(".").filter(Boolean),C=pr(p,y,a),v=await e.writeCard(u.key,C);d[n]={key:u.key,checksum:v,updatedAt:new Date().toISOString()},await e.writeIndex(d);},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 ve(e){return {status:"fail",error:e}}function Te(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}var Ln="sys_keys_board_state";function Ke(){return new Date().toISOString()}function ra(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function $n(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function Rr(e){try{let t=JSON.parse($n(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Mn(e){return ra(JSON.stringify(e))}function Dn(e){try{let t=JSON.parse($n(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function na(e){return Er(e,vn,()=>({_sources:{}}))}function oa(e,t){return rr(e,t)}function aa(e){return nr(e)}function sa(e,t){return _r(e,t)}function ia(e,t,r,n,o,a){return async d=>{let u=[],p=await r.cardStore.readCard(d.nodeId);if(!p)return "task-initiate-failure";let y=p.id,C=p.card_data??{},v=p.source_defs??[],S=v,B=await r.cardRuntimeStore.readRuntime(y),T=false,_=async()=>{T&&(await r.cardRuntimeStore.writeRuntime(y,B),T=false);},x=H=>Ft(B._sources[H]),h=(H,re)=>{B._sources[H]=Ft(re),T=true;},f=d.taskState?.executionCount??0;if(B._lastExecutionCount!==f&&(B._sources={},B._lastExecutionCount=f,T=true),d.update){let H=d.update.outputFile;if(H){let re=x(H);if(d.update.failure){let ie=d.update.rqt??re.lastRequestedToken??re.queueRequestedToken;ie&&h(H,Nt(re,ie));}else {let ie=d.update.rqt;if(!re.lastCompletedToken||ie>re.lastCompletedToken){let Q=typeof d.update.deliveryToken=="string"?d.update.deliveryToken:void 0,Z=Q?await r.fetchedSourcesStore.commitSourceData(y,H,Q):false;h(H,Z?Br(re,ie):Nt(re,ie));}}await _();}}let s={};for(let H of v){if(!H.outputFile)continue;let re=await r.fetchedSourcesStore.readSourceData(y,H.outputFile);re!==null&&(s[H.bindTo]=re);}let l={};for(let[H,re]of Object.entries(d.state??{}))if(re!==null&&typeof re=="object"&&!Array.isArray(re)){let ie=re[H];l[H]=ie!==void 0?ie:re;}else l[H]=re;let m={id:y,card_data:{...C},requires:l,source_defs:v,compute:p.compute};m._sourcesData=s,p.compute&&Je.runSync(m,{sourcesData:s}),(o??(()=>{}))(y,m.computed_values??{});let g=Je.enrichSourcesSync(Array.isArray(p.source_defs)?p.source_defs:void 0,{card_data:p.card_data,requires:l}),k={...p,source_defs:Array.isArray(g)?g.map(H=>({...H,boardDir:typeof H.boardDir=="string"&&H.boardDir?H.boardDir:e.value})):g},I=Ke(),q=d.update?void 0:I,L=S.filter(H=>{let re=H.outputFile;if(typeof re!="string"||!re)return true;let ie=x(re);q&&(ie={...ie,queueRequestedToken:q},h(re,ie));let Q=ie.queueRequestedToken??ie.lastRequestedToken??I;return qt(ie,Q)==="dispatch"});if(await _(),L.length>0){let H=false,re=I;for(let ie of L){let Q=ie.outputFile;if(typeof Q!="string"||!Q)continue;let Z=x(Q),ae=Z.queueRequestedToken??I;h(Q,{...Z,lastRequestedToken:ae}),re=ae,H=true;}return H&&await _(),H&&(u.push({taskKind:"source-fetch",payload:{boardRef:Se(e),enrichedCard:k,callbackToken:d.callbackToken,rqt:re}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(S.some(H=>{let re=H.outputFile;if(typeof re!="string"||!re)return false;let ie=x(re),Q=ie.queueRequestedToken??ie.lastRequestedToken??I;return qt(ie,Q)==="in-flight"}))return "task-initiated";let J=p.provides??[],X={};for(let{bindTo:H,ref:re}of J)X[H]=Je.resolve(m,re);return (a??(()=>{}))(X),n(d.nodeId,X),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Vn(e,t,r={}){Jt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),a=Se(e),d=r.emitNotification??(E=>{if(!t.publishBoardChangeNotifications)return;let c=E.kind==="notification-batch"?E.notifications:[E];return t.publishBoardChangeNotifications(c)}),u=null,p=r.boardRuntimeStoreRef,y=r.scratchStoreRef,C=r.taskExecutorRef,v=r.chatHandlerFlow;function S(){if(!p)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return p}function B(E){if(E.length!==0)try{let c=Fe(E),w=qe({kind:"notification-batch",notifications:c});return Promise.resolve(d(w)).catch(A=>{o(`[async-board-live-cards-public] emitNotification failed: ${A instanceof Error?A.message:String(A)}`);})}catch(c){o(`[async-board-live-cards-public] emitNotification failed: ${c instanceof Error?c.message:String(c)}`);return}}let T=()=>qn(t.kvStorageForRef(S())),_=e.value,x=()=>er(Pr(()=>t.kvStorageForRef(S()),t.hashFn),"v1"),h=async()=>{let E=await T().readOutputsStoreRef();if(!E)throw new Error(`Board at ${e.value} has no outputs store configured.`);return aa(t.kvStorageForRef(E))},f=async()=>{let E=await T().readCardStoreRef();if(!E)throw new Error(`Board at ${e.value} has no card store configured.`);let c=t.kvStorageForRef(E);return hr(yr(gr(c),t.hashFn),o)};async function s(){return !!(await x().readSnapshot(_)).values[dt]}async function l(){let E=await x().readSnapshot(_);if(!E.values[dt])throw new Error(`Board not initialized at ${e.value}`);return ur(E.values)}async function m(E,c){let w=await x().commitSnapshot(_,{schemaVersion:"v1",expectedVersion:c,deleteKeys:[],shallowMerge:ir(E)});if(!w.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${c??"null"} current=${w.currentVersion??"null"}`)}let g=()=>Cn(t.journalStorageForRef(S()));async function k(){return C??await T().readTaskExecutorRef()}function I(E){if(!E||typeof E!="object"||Array.isArray(E))return false;let c=E.__private;return !!c&&typeof c=="object"&&!Array.isArray(c)&&c.visible_controlplane_only===true}async function q(E){let c=await(await f()).readAllCards(),w=[...new Set(c.filter(N=>!I(N)).map(N=>N.id).filter(N=>typeof N=="string"&&N.length>0))].sort(),A=[...new Set(Object.keys(E).filter(N=>N&&N!==Ln))].sort();return {card_ids:w,data_object_keys:A}}async function L(){let E=await(await h()).readAllDataObjects();return {...E,[Ln]:await q(E)}}async function V(E){await g().appendEvent(E);}async function J(){let E=await T().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 X(){return t.blobStorageForRef(await J())}async function H(){return oa(await X(),E=>t.resolveBlob(E))}async function re(E){let c=(await X()).keyRef?.(E);if(!c)throw new Error("configured fetched-sources store does not support keyRef");let w=await Promise.resolve(c);return Se(w)}async function ie(){let E=sa(t.kvStorageForRef(S()),async(R,F)=>{let $=R.payload,ee=($.enrichedCard??{}).id??$.cardId??"unknown";await V({type:"task-failed",taskName:ee,error:F,timestamp:Ke()});}),c=na(t.kvStorageForRef(S())),w=await X(),A=await H(),N=await f(),M=await h(),K=new Map,U=new Map,ne=[],xe=[],Ie=[],Ae=new Map,le=new Set,ge={async readRuntime(R){return K.get(R)??await c.readRuntime(R)},async writeRuntime(R,F){K.set(R,F),Me[R]=F;}},$e={async readSourceData(R,F){let $=`${R}/${F}`;return U.has($)?U.get($):await A.readSourceData(R,F)},ingestSourceDataStaged(R,F,$,te){return A.ingestSourceDataStaged(R,F,$,te)},async commitSourceData(R,F,$){let te=`${R}/.staged/${$}/${F}`,ee=await w.read(te);if(ee==null){let Ce=await Promise.resolve(w.keyRef?.(te));Ce&&(ee=await t.resolveBlob(Ce));}if(ee==null)return false;let Re=`${R}/${F}`,fe=ee.trim();try{U.set(Re,JSON.parse(fe));}catch{U.set(Re,fe);}return ne.push({cardId:R,outputFile:F,deliveryToken:$}),true},async hasSource(R,F){let $=`${R}/${F}`;return U.has($)||await A.hasSource(R,F)},async listSources(R){let F=await A.listSources(R),$=[...U.keys()].filter(te=>te.startsWith(`${R}/`)).map(te=>te.slice(`${R}/`.length));return [...new Set([...F,...$])]}},be=await l(),Ne=kt(be.graph),Me={...be.runtimeByCardId},{events:ye,newCursor:Ye}=await g().readEntriesAfterCursor(be.lastDrainedJournalId),De=ye,He=Gt(Ne,{handlers:{"card-handler":ia(e,Ye,{cardStore:N,cardRuntimeStore:ge,fetchedSourcesStore:$e,executionRequestStore:E},(R,F)=>{De.push({type:"task-completed",taskName:R,data:F,timestamp:Ke()});},(R,F)=>{xe.push({cardId:R,values:F});},R=>{Ie.push(R);})},onNodeRemoved:R=>{Ae.delete(R),K.delete(R),delete Me[R],le.add(R);}});for(;De.length>0;){let R=De;De=[];for(let F of R)if(F.type==="task-restart"){let $=await N.readCard(F.taskName);$&&Ae.set(F.taskName,$);}He.pushAll(R),await He.waitForHandlers();}let pt=He.getState();await He.dispose({wait:true}),await m({lastDrainedJournalId:Ye,graph:Rt(pt),runtimeByCardId:Me},(await x().readSnapshot(_)).version);for(let{cardId:R,values:F}of xe)await M.writeComputedValues(R,F);for(let R of Ie)await M.writeDataObjects(R);for(let[R,F]of K)await c.writeRuntime(R,F);for(let R of ne)await A.commitSourceData(R.cardId,R.outputFile,R.deliveryToken);let rt=Ct(a,pt);await M.writeStatusSnapshot(rt);let at=[];for(let{cardId:R,values:F}of xe)at.push({kind:"computed_values",cardId:R,values:F});for(let R of Ie)for(let[F,$]of Object.entries(R))at.push({kind:"data_object",key:F,payload:$});for(let[R,F]of Ae)at.push({kind:"card_refreshed",cardId:R,card:F});for(let R of le)at.push({kind:"card_removed",cardId:R});at.push({kind:"status",status:rt}),await B(at);let nt=await k();if(!nt)return;let j=t.supportsDirectSourceOutput?.(nt)===true;await E.dispatchEntriesForJournalId(Ye,async R=>{if(R.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${R.taskKind}" \u2014 skipping`);return}let F=R.payload,$=F.enrichedCard?.id??"unknown",te=F.enrichedCard?.source_defs??[];if(nt.howToRun==="queue-storage"&&j){try{let ee=await T().readQueueStoreRef();if(!ee)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let Re=t.queueStorageForRef(ee,"task-executor"),fe=typeof nt.extra?.boardId=="string"?nt.extra.boardId:void 0,Ce=[];for(let _e of te){if(!_e.outputFile)continue;let je=t.genId(),Ue=`${$}/.staged/${je}/${_e.outputFile}`,Ve=await Promise.resolve(w.keyRef?.(Ue));if(!Ve)continue;let lt={ref:Se(Ve),deliveryToken:je,outputFile:_e.outputFile,cardId:$},Xe=Mn({cbk:F.callbackToken,rg:e.value,br:Se(e),cid:$,b:_e.bindTo,d:_e.outputFile,cs:void 0,rqt:F.rqt,dt:lt.deliveryToken});Ce.push({...fe?{boardId:fe}:{},ref:nt,args:{source_def:_e,base_ref:Se(e),callback:n.createCallback(Xe),output:lt}});}Ce.length>0&&await Re.enqueueMany(Ce);}catch(ee){await V({type:"task-failed",taskName:$,error:ee instanceof Error?ee.message:String(ee),timestamp:Ke()});}return}for(let ee of te){if(!ee.outputFile)continue;let Re;if(j){let _e=t.genId(),je=`${$}/.staged/${_e}/${ee.outputFile}`,Ue=await Promise.resolve(w.keyRef?.(je));Ue&&(Re={ref:Se(Ue),deliveryToken:_e,outputFile:ee.outputFile,cardId:$});}let fe=Mn({cbk:F.callbackToken,rg:e.value,br:Se(e),cid:$,b:ee.bindTo,d:ee.outputFile,cs:void 0,rqt:F.rqt,...Re?{dt:Re.deliveryToken}:{}}),Ce=await t.dispatchExecution(nt,{source_def:ee,base_ref:Se(e),callback:n.createCallback(fe),...Re?{output:Re}:{}});Ce.dispatched||await V({type:"task-failed",taskName:$,error:Ce.error??"dispatch failed",timestamp:Ke()});}});}async function Q(){try{let E=async()=>{let w=await l(),{events:A}=await g().readEntriesAfterCursor(w.lastDrainedJournalId);A.length>0&&await ae();},c=await Fn(t.lock,ie,E);return Pe({ran:c!==!1})}catch(E){return Te(E)}}async function Z(){return u||(u=Q().finally(()=>{u=null;}),u)}async function ae(){let E=await T().readQueueStoreRef();if(!E)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let c=t.queueStorageForRef(E,"process-accumulated");c.enqueueIfAbsent?await c.enqueueIfAbsent({boardRef:Se(e)},`process-accumulated:${Se(e)}`):await c.enqueue({boardRef:Se(e)}),await t.requestProcessAccumulated?.();}async function de(){let E=await T().readQueueStoreRef();if(!E)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let c=t.queueStorageForRef(E,"process-accumulated");for(;;){let w=await c.lease({max:64,visibilityMs:1e3});if(w.length<=0)return;for(let A of w)await c.ack(A.id,A.leaseToken);if(w.length<64)return}}function ke(){ae();}return {async init(E){try{let c=E.params?.cardStoreRef;if(!c)return ve("init requires params.cardStoreRef");if(p=E.params?.boardRuntimeStoreRef,!p)return ve("init requires params.boardRuntimeStoreRef");let w=E.params?.outputsStoreRef;if(!w)return ve("init requires params.outputsStoreRef");let A=E.params?.queueStoreRef;if(!A)return ve("init requires params.queueStoreRef");let N=E.params?.fetchedSourcesStoreRef;if(!N)return ve("init requires params.fetchedSourcesStoreRef");y=E.params?.scratchStoreRef;let M=E.params?.chatStoreRef;if(!M)return ve("init requires params.chatStoreRef");let K=E.params?.artifactsStoreRef;if(!K)return ve("init requires params.artifactsStoreRef");await s()||await m({lastDrainedJournalId:"",graph:Rt(xt(Lt)),runtimeByCardId:{}},null);let U=T();return await U.writeBoardRuntimeStoreRef(p),await U.writeCardStoreRef(c),await U.writeOutputsStoreRef(w),await U.writeQueueStoreRef(A),await U.writeFetchedSourcesStoreRef(N),await U.writeChatStoreRef(M),await U.writeArtifactsStoreRef(K),await(await h()).writeStatusSnapshot(Ct(a,kt((await l()).graph))),Pe()}catch(c){return Te(c)}},async status(E){try{let c=await h(),w=await c.readStatusSnapshot();return w||(w=Ct(a,kt((await l()).graph)),await c.writeStatusSnapshot(w)),Pe(w)}catch(c){return Te(c)}},async getCardStoreRef(E){try{let c=await T().readCardStoreRef();return c?Pe({storeRef:c}):ve(`Board at ${e.value} has no card store configured`)}catch(c){return Te(c)}},async getBoardRuntimeStoreRef(E){try{return Pe({storeRef:p??null})}catch(c){return Te(c)}},async getOutputsStoreRef(E){try{let c=await T().readOutputsStoreRef();return c?Pe({storeRef:c}):ve(`Board at ${e.value} has no outputs store configured`)}catch(c){return Te(c)}},async getScratchStoreRef(E){try{return Pe({storeRef:y??null})}catch(c){return Te(c)}},async getChatStoreRef(E){try{return Pe({storeRef:await T().readChatStoreRef()})}catch(c){return Te(c)}},async getArtifactsStoreRef(E){try{return Pe({storeRef:await T().readArtifactsStoreRef()})}catch(c){return Te(c)}},async getFetchedSourcesStoreRef(E){try{return Pe({storeRef:await T().readFetchedSourcesStoreRef()})}catch(c){return Te(c)}},async getConfig(E){try{let c=E.params?.key;if(!c)return ve("getConfig requires params.key");let w=T(),A;switch(c){case "task-executor":A=C??null;break;case "chat-handler-flow":A=v??null;break;case "board-runtime-store-ref":A=await w.readBoardRuntimeStoreRef();break;case "card-store-ref":A=await w.readCardStoreRef();break;case "outputs-store-ref":A=await w.readOutputsStoreRef();break;case "scratch-store-ref":A=y??null;break;case "chat-store-ref":A=await w.readChatStoreRef();break;case "artifacts-store-ref":A=await w.readArtifactsStoreRef();break;case "fetched-sources-store-ref":A=await w.readFetchedSourcesStoreRef();break;default:return ve(`getConfig: unknown key "${c}"`)}return Pe({value:A})}catch(c){return Te(c)}},async getOutputsDataObject(E){try{let c=E.params?.key;if(!c)return ve("getOutputsDataObject requires params.key");let w=await L();return Pe(w[c]??null)}catch(c){return Te(c)}},async getAllOutputsDataObjects(E){try{return Pe(await L())}catch(c){return Te(c)}},async getOutputsComputedValues(E){try{let c=E.params?.key;return c?Pe(await(await h()).readComputedValues(c)):ve("getOutputsComputedValues requires params.key")}catch(c){return Te(c)}},async getAllOutputsComputedValues(E){try{return Pe(await(await h()).readAllComputedValues())}catch(c){return Te(c)}},async getOutputsFetchedSources(E){try{let c=E.params?.key;if(!c)return ve("getOutputsFetchedSources requires params.key");let w=await(await H()).listSources(c),A={};for(let N of w)A[N]=await re(`${c}/${N}`);return Pe(A)}catch(c){return Te(c)}},async getAllOutputsFetchedSources(E){try{let c=await H(),w=await(await X()).listKeys(),A=new Set;for(let M of w){let K=M.indexOf("/");K>0&&!M.includes("/.staged/")&&A.add(M.slice(0,K));}let N={};for(let M of A){let K=await c.listSources(M);if(K.length!==0){N[M]={};for(let U of K)N[M][U]=await re(`${M}/${U}`);}}return Pe(N)}catch(c){return Te(c)}},async buildSseOneShotPayload(E){try{let c=await(await f()).readAllCards(),w=await this.status({});if(w.status!=="success")return w;let A=await this.getAllOutputsDataObjects({});if(A.status!=="success")return A;let N=await this.getAllOutputsComputedValues({});if(N.status!=="success")return N;let M=N.data,K={};for(let U of c){let ne=typeof U?.id=="string"?U.id:null;if(!ne)continue;let xe=U.card_data&&typeof U.card_data=="object"&&!Array.isArray(U.card_data)?U.card_data:{};K[ne]={schema_version:"v1",card_id:ne,card_data:{...xe},computed_values:M[ne]&&typeof M[ne]=="object"?M[ne]:{}};}return Pe({cardDefinitions:c,statusSnapshot:w.data,dataObjectsByToken:A.data,cardRuntimeById:K})}catch(c){return Te(c)}},async addCardFiles(E){try{let c=E.params?.cardId;if(!c)return ve("addCardFiles requires params.cardId");let A=await fr(await f(),{emitNotification:d}).appendFiles({params:{id:c},body:E.body});return A.status!=="success"?A:Pe({cardId:c,files_added:A.data.files_added,notified:!0})}catch(c){return Te(c)}},async removeCard(E){try{let c=E.params?.id;if(!c)return ve("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(c);}catch{}return await V({type:"task-removal",taskName:c,timestamp:Ke()}),ke(),Pe()}catch(c){return Te(c)}},async retrigger(E){try{let c=E.params?.id;return c?(await V({type:"task-restart",taskName:c,timestamp:Ke()}),ke(),Pe()):ve("retrigger requires params.id")}catch(c){return Te(c)}},async processAccumulatedEvents(E){return await de(),Z()},async upsertCard(E){try{let c=E.params?.cardId,w=E.params?.all,A=!!E.params?.restart;if(!c&&!w)return ve("upsertCard requires --card-id <id> or --all");let N=await f(),M=w?(await N.readAllCards()).map(U=>U.id):[c];for(let U of M)if(!await N.readCard(U))return ve(`Card "${U}" not found in board at ${e.value}`);let K=t.kvStorage("card-upsert");for(let U of M){let ne=await N.readCard(U);if(!ne)continue;let xe=cr(ne),Ie=t.hashFn(xe),Ae=await K.read(U),le=Ae?.taskConfigHash!==Ie;if(!(!le&&!A)){if(le){let ge=Ae?.blobRef??await N.readCardKey(U)??U;await V({type:"task-upsert",taskName:U,taskConfig:xe,timestamp:Ke()}),await K.write(U,{blobRef:ge,taskConfigHash:Ie,updatedAt:Ke()});}A&&await V({type:"task-restart",taskName:U,timestamp:Ke()});}}return ke(),Pe()}catch(c){return Te(c)}},async taskFailed(E){try{let c=E.params?.token;if(!c)return ve("taskFailed requires params.token");let w=E.params?.error??"unknown error",A=Rr(c);return A?(await V({type:"task-failed",taskName:A.taskName,error:w,timestamp:Ke()}),ke(),Pe()):ve("Invalid callback token")}catch(c){return Te(c)}},async taskProgress(E){try{let c=E.params?.token;if(!c)return ve("taskProgress requires params.token");let w=(E.body??{}).update??{},A=Rr(c);return A?(await V({type:"task-progress",taskName:A.taskName,update:w,timestamp:Ke()}),ke(),Pe()):ve("Invalid callback token")}catch(c){return Te(c)}},async sourceDataFetched(E){try{let c=E.params?.token,w=E.params?.ref;if(!c)return ve("sourceDataFetched requires params.token");if(!w)return ve("sourceDataFetched requires params.ref");let A=Dn(c);if(!A)return ve("Invalid source token");let N=await H(),M=A.dt||t.genId();A.dt||await N.ingestSourceDataStaged(A.cid,A.d,st(w),M);let K=Rr(A.cbk);return K?(await V({type:"task-progress",taskName:K.taskName,update:{bindTo:A.b,outputFile:A.d,fetchedAt:Ke(),deliveryToken:M,sourceChecksum:A.cs,rqt:A.rqt},timestamp:Ke()}),ke(),Pe()):ve("Invalid callback token embedded in source token")}catch(c){return Te(c)}},async sourceDataFetchFailure(E){try{let c=E.params?.token,w=E.params?.reason??"unknown";if(!c)return ve("sourceDataFetchFailure requires params.token");let A=Dn(c);if(!A)return ve("Invalid source token");let N=Rr(A.cbk);return N?(await V({type:"task-progress",taskName:N.taskName,update:{bindTo:A.b,outputFile:A.d,failure:!0,reason:w,sourceChecksum:A.cs,rqt:A.rqt},timestamp:Ke()}),ke(),Pe()):ve("Invalid callback token embedded in source token")}catch(c){return Te(c)}}}}async function ua(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Un(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=Fe(n);if(a.length===1){await o(a[0]);return}await o(qe({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 ua(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 qr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ca(e){return {...qr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function da(e){return {...qr(e),reason:e.reason}}function Nr(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(ca)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(qr)},peekDeadLetter(){return e.peekDeadLetter().map(da)}}}function la(e,t){return e.peekActive().find(r=>r.id===t)}function Kn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=Fe(n);if(a.length===1){await o(a[0]);return}await o(qe({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=la(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 Hn(){return new Date().toISOString()}function Jn(e){return new TextEncoder().encode(e).byteLength}function fa(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Qn(e){function t(r){let n=e.stat?fa(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:Jn(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??Hn(),a.size=a.size??Jn(n),a},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let d=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,d);}let a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Hn(),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 Gn(){function e(o,a){if(!Array.isArray(o))return [];let d=[];for(let u of o){if(!u||typeof u!="object")continue;let p=u;typeof p.stored_name=="string"&&d.push({name:typeof p.name=="string"?p.name:p.stored_name,stored_name:p.stored_name,size:typeof p.size=="number"&&Number.isFinite(p.size)?p.size:null,mime_type:typeof p.mime_type=="string"?p.mime_type:null,uploaded_at:typeof p.uploaded_at=="string"?p.uploaded_at:a||null,chat:p.chat===true});}return d}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,a){let d=t(o);if(a.length===0)return o.files=d,d;let u=new Set(d.map(p=>p.stored_name));for(let p of a)u.has(p.stored_name)||(d.push(p),u.add(p.stored_name));return o.files=d,d}function n(o,a,d){let u=t(o);if(!Number.isInteger(a)||a<0||a>=u.length)return {ok:false,reason:"index_out_of_range"};let p=u[a];return !p||!p.stored_name?{ok:false,reason:"missing_stored_name"}:d&&d!==p.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:p}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function Wn(e,t={}){let r=t.emitNotification;function n(h){let f=typeof h=="number"?h:Number(h);return Number.isInteger(f)&&f>0?f:null}function o(h,f){let s=f;for(let l=h.length-1;l>=0;l-=1)if(h[l]?.role==="user"&&(s-=1,s===0))return h.slice(l);return h}function a(h){return h.some(f=>typeof f?.turn=="string"&&f.turn!=="")}function d(h,f){if(f<=0)return [];if(!a(h))return o(h,f);let s=new Map,l=[];for(let g of h){let k=typeof g?.turn=="string"?g.turn:"";s.has(k)||(s.set(k,[]),l.push(k)),s.get(k).push(g);}return l.slice(Math.max(0,l.length-f)).flatMap(g=>s.get(g)??[])}function u(h){return {status:"success",data:h}}function p(h){return {status:"fail",error:h}}function y(h){return {status:"error",error:h instanceof Error?h.message:String(h)}}function C(h){return {role:String(h.role||"system"),text:String(h.text||""),files:Array.isArray(h.files)?h.files:[],...typeof h.turn=="string"&&h.turn?{turn:h.turn}:{}}}async function v(h){if(!r||h.length===0)return;let f=Fe(h);if(f.length===1){await r(f[0]);return}await r(qe({kind:"notification-batch",notifications:f}));}async function S(h){let f=await e.readAll(h);return d(f,1).map(C)}async function B(h){let f=Date.now();return {kind:"card_chats",cardId:h,sentAt:new Date(f).toISOString(),sentAtMs:f,messages:await S(h),receiving:true,processing:await e.isProcessing(h)}}async function T(h,f="command envelope"){let s=typeof h.cardId=="string"?h.cardId:void 0;if(!h.command)return p(`chat-store: ${f} missing "command"`);if(!s)return p(`chat-store: ${f} missing "cardId"`);if(h.command==="append")return await x.append({params:{cardId:s},body:{role:h.role,text:h.text,files:h.files,turn:h.turn}});if(h.command==="read-all")return await x.readAll({params:{cardId:s},body:{lastUserTurns:h.lastUserTurns,tailTurns:h.tailTurns,turnId:h.turnId,allTurns:h.allTurns,tailTurnsBeforeId:h.tailTurnsBeforeId}});if(h.command==="read-after")return await x.readAfter({params:{cardId:s},body:{cursor:h.cursor??null}});if(h.command==="clear")return await x.clear({params:{cardId:s}});if(h.command==="set-processing")return await x.setProcessing({params:{cardId:s},body:{active:h.active}});if(h.command==="is-processing")return await x.isProcessing({params:{cardId:s}});if(h.command==="get-config")return await x.getConfig({params:{cardId:s}});if(h.command==="set-config"){let{command:l,cardId:m,...g}=h;return await x.setConfig({params:{cardId:s},body:g})}return p(`chat-store: unknown command "${String(h.command)}"`)}async function _(h){if(!Array.isArray(h.commands)||h.commands.length===0)return p('chat-store: command envelope must include a non-empty "commands" array');let f=[];for(let s=0;s<h.commands.length;s+=1){let l=h.commands[s];if(!l||typeof l!="object"||Array.isArray(l))return p(`chat-store: command envelope entry ${s} must be an object`);let m={cardId:h.cardId,...l},g=await T(m,`command envelope entry ${s}`);if(g.status!=="success")return g;f.push({index:s,command:String(m.command),data:g.data});}return u({results:f})}let x={async append(h){try{let f=h.params?.cardId;if(!f)return p("append requires params.cardId");let s=h.body??{},l=typeof s.role=="string"?s.role:"",m=typeof s.text=="string"?s.text:"",g=Array.isArray(s.files)?s.files:[],k=typeof s.turn=="string"?s.turn:"";if(!l)return p("append requires body.role");let I=await e.append(f,l,m,g,k);return await v([{kind:"chat_messages",cardId:f,messages:await S(f)}]),u({id:I})}catch(f){return y(f)}},async readAll(h){try{let f=h.params?.cardId;if(!f)return p("readAll requires params.cardId");let s=h.body??{},l=typeof s.turnId=="string"?s.turnId:"",m=s.allTurns===!0,g=typeof s.tailTurnsBeforeId=="string"?s.tailTurnsBeforeId:"",k=s.tailTurns===void 0?s.lastUserTurns:s.tailTurns,I=k===void 0?m||l?void 0:1:n(k);if(k!==void 0&&I===null)return p("readAll requires body.tailTurns (positive integer)");let q=await e.readAll(f),L=q.filter(V=>!l||String(V.turn||"")===l);if(g){let V=I;if(typeof V!="number"||!Number.isInteger(V)||V<=0)return p("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let J=new Map,X=[];for(let Q of q){let Z=String(Q.turn||"");J.has(Z)||(J.set(Z,[]),X.push(Z)),J.get(Z).push(Q);}let H=X.findIndex(Q=>Q===g),re=Math.max(0,H-V);return L=(H===-1?[]:X.slice(re,H)).flatMap(Q=>J.get(Q)??[]),u({records:L})}return u(typeof I=="number"?{records:d(L,I)}:{records:L})}catch(f){return y(f)}},async buildSseOneShotBatch(h){try{let f=h.params?.cardId;if(!f)return p("buildSseOneShotBatch requires params.cardId");let s=h.body??{},l=typeof s.receiving=="boolean"?s.receiving:!0,m=await B(f);return u(qe({kind:"notification-batch",notifications:[{...m,receiving:l}]}))}catch(f){return y(f)}},async readAfter(h){try{let f=h.params?.cardId;if(!f)return p("readAfter requires params.cardId");let l=(h.body??{}).cursor??null;return u(await e.readAfter(f,l))}catch(f){return y(f)}},async clear(h){try{let f=h.params?.cardId;return f?(await e.clear(f),u({ok:!0})):p("clear requires params.cardId")}catch(f){return y(f)}},async setProcessing(h){try{let f=h.params?.cardId;if(!f)return p("setProcessing requires params.cardId");let s=h.body??{};return typeof s.active!="boolean"?p("setProcessing requires body.active (boolean)"):(await e.setProcessing(f,s.active),await v([{kind:"chat_processing",cardId:f,active:s.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(f){return y(f)}},async isProcessing(h){try{let f=h.params?.cardId;return f?u({active:await e.isProcessing(f)}):p("isProcessing requires params.cardId")}catch(f){return y(f)}},async getConfig(h){try{let f=h.params?.cardId;return f?u({config:await e.getConfig(f)}):p("getConfig requires params.cardId")}catch(f){return y(f)}},async setConfig(h){try{let f=h.params?.cardId;if(!f)return p("setConfig requires params.cardId");let s=h.body??{};return await e.setConfig(f,s),u({ok:!0})}catch(f){return y(f)}},run:T,runBatch:_};return x}function It(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function zn(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 Yn(e,t,r){let n=0;return {accepted:e.filter(a=>{if(!It(a))return n++,false;let d=a;return typeof d.sentAtMs=="number"&&t-d.sentAtMs>r?(n++,false):true}),rejected:n}}function Zn(){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 ma(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function Xn(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 eo(e,t){if(ma(t)){for(let r of t.notifications)It(r)&&Xn(e,r);return}It(t)&&Xn(e,t);}function Lr(e){let t=new Map,r=0;function n(f){let s=JSON.stringify(f);return r++,`id: ${r}
|
|
2
|
+
data: ${s}
|
|
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 f=t.get(l);f&&s(l,f.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 f=n(i);try{d.res.write(f),o(d.res);}catch{s(l,d.res);}}function m(l){return Ne({kind:"notification-batch",notifications:l})}async function g(l,i){let d=await e.buildChatOneShotBatch(l,i);return d.status==="success"?d.data:m([])}async function C(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.add(i),u(l,await g(i,true)),true):false}function b(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.delete(i),true):false}function k(l,i,d){let f=t.get(l);if(!f)return false;if(d){let p=f.subscribedCardChannels.get(d)??new Set;return p.add(i),f.subscribedCardChannels.set(d,p),true}return f.subscribedChannelNames.add(i),true}function B(l,i,d){let f=t.get(l);if(!f)return false;if(d){let p=f.subscribedCardChannels.get(d);return p&&(p.delete(i),p.size===0&&f.subscribedCardChannels.delete(d)),true}return f.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 x(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,f=new Map;for(let p of l)if(_(p)){let R=`${p.cardId}\0${p.channel}`,A=f.get(R)??[];A.push(p),f.set(R,A);}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=m(i);for(let R of t.keys())u(R,p);}for(let[p,R]of d.entries()){let A=m(R);for(let[F,j]of t.entries())j.subscribedChatCardIds.has(p)&&u(F,A);}for(let[p,R]of f.entries()){let A=p.indexOf("\0"),F=A>=0?p.slice(0,A):"",j=A>=0?p.slice(A+1):p,V=m(R);for(let[Q,re]of t.entries())!F||!j||x(re,j,F)&&u(Q,V);}}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:C,unsubscribeChat:b,subscribeChannel:k,unsubscribeChannel:B,broadcastNotificationBatch:y}}function Dr(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?Object.assign(new Error(e.error||`${t} failed`),{statusCode:400}):Object.assign(new Error(`${t} returned an unexpected response`),{statusCode:500})}async function $r(e,t){return Dr(await e,t)}function Vr(e){let t=le(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 Ur(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function Xn(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:s,getMcpFacade:c,getMcpCardStoreFacade:u}=e;function m(i){let d=le(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=le(i,"client_id");if(!d)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return d}function C(i){m(i);let d=g(i),f=le(i,"channel_name"),p=le(i,"card_id")||void 0;if(!f)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:d,channelName:f,...p?{cardId:p}:{}}}function b(i){m(i);let d=le(i,"card_id");if(!d)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:d}}async function k(i){await r();let{cardId:d}=b(i),f=g(i);if(!await n.subscribeChat(f,d))throw Object.assign(new Error(`SSE client not connected: ${f}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:d,clientId:f,subscribed:true}}}async function B(i){await r();let{cardId:d}=b(i),f=g(i);if(!n.unsubscribeChat(f,d))throw Object.assign(new Error(`SSE client not connected: ${f}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:d,clientId:f,subscribed:false}}}async function P(i,d){await r();let{clientId:f,channelName:p,cardId:R}=C(i);if(!n.has(f))throw Object.assign(new Error(`SSE client not connected: ${f}`),{statusCode:404});return d?(n.subscribeChannel(f,p,R),o?.(f,p,R?{cardId:R}:{})):(n.unsubscribeChannel(f,p,R),s?.(f,p,R?{cardId:R}:{})),{status:"success",data:{boardId:t,clientId:f,channelName:p,subscribed:d,...R?{cardId:R}:{}}}}async function _(i,d){let{cardId:f}=b(i);return await c().setChatProcessing({cardId:f,active:d}),{status:"success",data:{boardId:t,cardId:f,active:d}}}async function x(i){let{cardId:d}=b(i),f=await c().getChatProcessing({cardId:d});return {status:"success",data:{boardId:t,cardId:d,active:f.active}}}async function y(i){let{cardId:d}=b(i),f=Vr(i);if(!Object.prototype.hasOwnProperty.call(i,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(f.split(".").includes("visible_controlplane_only")){let p=await $r(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,A=R?Ur(R,"visible_controlplane_only").value:void 0;if(i.value!==A)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:f}}}return Dr(await u().patch({params:{id:d,path:`__private.${f}`},body:{value:i.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:d,key:f}}}async function l(i){let{cardId:d}=b(i),f=Vr(i),p=await $r(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 A=Ur(R,f);return {status:"success",data:{boardId:t,cardId:d,key:f,exists:A.exists,value:A.value}}}return {requireCardArgs:b,subscribeChat:k,unsubscribeChat:B,watchChannel:P,setChatProcessing:_,getChatProcessing:x,setCardMeta:y,getCardMeta:l}}function Zn(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e;function s(b){if(b.length===0)return null;if(b.length===1)return b[0];let k=[],B=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],P={};for(let x of B)P[x]=0;for(let x of b){let y=x,l=Array.isArray(y.cards)?y.cards:[];k.push(...l);for(let i of B)P[i]+=Number(y?.summary?.[i]||0);}let _=b[0];return {..._,cards:k,summary:{..._.summary||{},card_count:k.length,...P}}}async function c(){let b=[];for(let k of r)try{let B=await k.boardOps.buildSseOneShotPayload({});B.status==="success"&&B.data&&b.push(B.data);}catch{}return b}async function u(){let k=(await c()).map(B=>B.statusSnapshot).filter(Boolean);if(k.length===0){let B=r.map(P=>P.notification.status).filter(Boolean);return s(B)}return s(k)}async function m(){let b={},k=await c();for(let B of k)Object.assign(b,B.cardRuntimeById||{});if(Object.keys(b).length>0)return b;for(let B of r)for(let[P,_]of Object.entries(B.notification.computedValues)){let x=B.notification.cards[P];b[P]={schema_version:"v1",card_id:P,card_data:x?.card_data??{},computed_values:_??{}};}return b}async function g(){let b={},k=await c();for(let B of k)Object.assign(b,B.dataObjectsByToken||{});if(Object.keys(b).length===0)for(let B of r)Object.assign(b,B.notification.dataObjects||{});return b}async function C(){let b=await c(),k=b.flatMap(x=>Array.isArray(x.cardDefinitions)?x.cardDefinitions:[]),B={},P={};for(let x of b)Object.assign(B,x.dataObjectsByToken||{}),Object.assign(P,x.cardRuntimeById||{});let _={};for(let x of k){if(!x?.id)continue;let y=x.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:k,statusSnapshot:await u(),dataObjectsByToken:B,cardRuntimeById:P,cardChatsByCardId:_}}return {readStatusSnapshot:u,readCardRuntimeArtifacts:m,readDataObjectsByToken:g,buildPublishedRuntimePayload:C}}function fa(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function eo(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:s,writeChatRecord:c}=e;async function u(C){let b=[];try{let k=await o(C);if(!k)return b;let B=n().read(k.card_data&&typeof k.card_data=="object"?k.card_data:null);for(let P of B)b.push(String(P.stored_name??""));}catch{}return b}async function m(C,b,k,B){let P=t(C),_=r(C),x=fa(b),y=await u(C),i=`${String(y.length+1).padStart(3,"0")}-${x}`.slice(-36);if(!_.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${C}`),{statusCode:500});return await _.files.putBytes(`${P}/${i}`,new Uint8Array(B),k||"application/octet-stream"),{name:x,stored_name:i,size:B.length,mime_type:k||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function g(C,b,k,B,P){if(!B.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let _=P?.inChat===true,x=await m(C,b,k,B),y=null;if(await s(C,l=>{let i=new Date().toISOString(),d=l.card_data&&typeof l.card_data=="object"?l.card_data:{};l.card_data=d;let f=n().normalizeIncoming([{name:x.name,stored_name:x.stored_name,size:x.size,mime_type:x.mime_type,uploaded_at:x.uploaded_at||i,chat:_}],i);return y=n().merge(d,f).findIndex(R=>R.stored_name===x.stored_name),l}),_&&P?.suppressChatRecordWrite!==true){let l=typeof y=="number"&&y>=0?` #${y}`:"";await c(C,"system",`file uploaded: ${x.name} as ${x.stored_name}${l}`,[],P?.turnId??"");}return {ok:true,file:{...x,...typeof y=="number"&&y>=0?{file_idx:y}:{},chat:_},...typeof y=="number"&&y>=0?{file_idx:y}:{}}}return {uploadCardFile:g,readCardStoredFileNames:u}}function to(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:le(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=st(t,"tail_turns"),n=st(t,"tail"),o=le(t,"turn_id"),s=t.all_turns===true,c=le(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:le(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:le(t,"card_id"),fileIdx:Number(st(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ft(t,"mock_requires","mock_requires"),mockFetchedSources:ft(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:it(t,"mock_projections"),sourceIdx:$t(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:it(t,"mock_projections"),sourceIdx:$t(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:le(t,"card_id"),sourceIdx:$t(t,"source_idx","source_idx"),mockRequires:ft(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:it(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:le(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=le(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:le(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=le(t,"turn_id"),n=le(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:le(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:le(t,"card_id"),candidateCardContent:it(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:le(t,"card_id")})}}function ro(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:le(t,"token"),ref:le(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:le(t,"token"),reason:le(t,"reason")})}}function no(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(u,m){let g=le(u,"board_id");if(!g)throw Object.assign(new Error(`${m} requires board_id`),{statusCode:400});if(g!==t)throw Object.assign(new Error(`Unknown board_id: ${g}`),{statusCode:400})}function c(u,m){let{cardId:g}=o.requireCardArgs(u),C=le(u,"turn_id");return s(u,m),n().manageAddChatAttachment({cardId:g,role:le(u,"role")||"user",...C?{turn:C}:{},files:[{file_name:le(u,"file_name"),content_type:le(u,"content_type")||"application/octet-stream",...typeof u.text=="string"?{text:u.text}:{},...typeof u.base64=="string"?{base64:u.base64}:{},...Array.isArray(u.bytes)?{bytes:u.bytes}:{}}]})}return {"list-runtime-cards":u=>(s(u,"list-runtime-cards"),n().listRuntimeCards()),"sse.subscribe-chat":u=>o.subscribeChat(u),"sse.unsubscribe-chat":u=>o.unsubscribeChat(u),"sse.watch-channel":u=>o.watchChannel(u,true),"sse.unwatch-channel":u=>o.watchChannel(u,false),"getstate.is-chat-processing":u=>o.getChatProcessing(u),"setstate.chat-processing-started":u=>o.setChatProcessing(u,true),"setstate.chat-processing-done":u=>o.setChatProcessing(u,false),"getstate.card-private":u=>o.getCardMeta(u),"setstate.card-private":u=>o.setCardMeta(u),"manage.upload-card-file":u=>{let m=le(u,"card_id"),g=le(u,"file_name"),C=le(u,"content_type")||"application/octet-stream",b=Yr(u);if(s(u,"manage.upload-card-file"),!m)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!g)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(m,g,C,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:m}=o.requireCardArgs(u),g=le(u,"role")||"user",C=le(u,"turn_id");return s(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:m,role:g,...typeof u.text=="string"?{text:u.text}:{},...C?{turn:C}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.patch-card"),n().managePatchCard({cardId:m,patch:it(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.upsert-card"),n().manageUpsertCard({cardId:m,candidateCardContent:it(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.remove-card"),n().manageRemoveCard({cardId:m},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:m}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:m})}}},"manage.admin-upsert-card":u=>{let m=le(u,"board_id"),g=le(u,"card_id");if(!m)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(m!==t)throw Object.assign(new Error(`Unknown board_id: ${m}`),{statusCode:400});return n().adminUpsertCard({cardId:g,candidateCardContent:it(u,"candidate_card_content")})}}}function nt(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function oo(e,t){if(e?.status==="success"&&Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw e?.status==="success"?new Error(`${t} returned success without data`):e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function W(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Oe(e){return Array.isArray(e)?e:[]}function Hr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=W(e).fetched_sources,n=n.slice(16));for(let o of n.split(".")){if(r==null||typeof r!="object")return;r=r[o];}return r}function Kr(e,t){let r=W(e.view);return {elements:Oe(r.elements).map((o,s)=>{let c=W(o),u=W(c.data),m=typeof c.visible=="string"?!!Hr(t,c.visible):true,g=typeof u.bind=="string"?u.bind:void 0,C=typeof u.maxRows=="number"?u.maxRows:void 0,b=g?Hr(t,g):void 0,k={id:typeof c.id=="string"&&c.id?c.id:`element-${s}`,kind:c.kind,label:c.label,visible:m};return b!==void 0&&(k.resolved=Array.isArray(b)&&typeof C=="number"?b.slice(0,C):b),k})}}function ao(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Oe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],s={};for(let c of o){let u=W(c),m=typeof u.bindTo=="string"?u.bindTo:"",g=typeof u.ref=="string"?u.ref:"";if(!m||!g)continue;let C=Hr(t,g);C!==void 0&&(s[m]=C);}return s}function ma(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 pa(e){return {"card-content":e}}function gr(e){let t={...e};return delete t.__private,t}function ga(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function ya(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function ha(e,t){let r=ya(e);if(!t||Object.keys(t).length===0)return r;function n(o,s,c){let u=String(s||"").split(".").filter(Boolean);if(!u.length)return;let m=o;for(let g=0;g<u.length-1;g+=1){let C=u[g];(!m[C]||typeof m[C]!="object")&&(m[C]={}),m=m[C];}m[u[u.length-1]]=c;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=W(r.view),c=Oe(s.elements);for(let u of c){let m=W(W(u).data);if(typeof m.writeTo=="string"&&m.writeTo){o=m.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...W(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 yr(e){return W(e.__private).visible_controlplane_only===true}async function vt(e,t){let r=await Ge(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function so(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:s,sourceFetchDone:c,sourceFetchFailed:u,uploadCardFile:m,buildFileDownloadUrl:g,readFetchedSourceJsonByRef:C}=e;function b(v,I){if(typeof v=="function")return v;throw new Error(`${I} is not configured for this MCP facade`)}async function k(){let v=await Ge(n.get({}),"cardStore.get");return Array.isArray(v.cards)?v.cards.map(I=>W(I)).filter(I=>!yr(I)):[]}function B(v){if(Array.isArray(v.bytes))return new Uint8Array(v.bytes.map(I=>Math.max(0,Math.min(255,Number(I)||0))));if(typeof v.text=="string")return new TextEncoder().encode(v.text);if(typeof v.base64=="string"){let I=String(v.base64).replace(/-/g,"+").replace(/_/g,"/"),O=I+"=".repeat((4-I.length%4)%4),N=atob(O);return Uint8Array.from(N,$=>$.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function P(){let v=W(await Ge(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:v.version,commonSourceFields:W(v.commonSourceDefFields),sourceKinds:W(v.sourceKinds)}}async function _(){let v=W(await Ge(t.status({}),"status")),I=W(v.summary),O=Oe(v.cards),N=await Ge(n.get({}),"cardStore.get"),$=new Set((Array.isArray(N.cards)?N.cards.map(W):[]).filter(yr).map(oe=>typeof oe.id=="string"?oe.id:"").filter(Boolean)),z=O.filter(oe=>!$.has(String(W(oe).name??"")));return {meta:W(v.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:z.map(oe=>{let ie=W(oe);return {"card-id":typeof ie.name=="string"?ie.name:null,status:ie.status??null,error:ie.error??null,requires:Oe(ie.requires),requires_satisfied:Oe(ie.requires_satisfied),requires_missing:Oe(ie.requires_missing),provides_declared:Oe(ie.provides_declared),provides_runtime:Oe(ie.provides_runtime)}})}}async function x(v){let I=String(v.cardId||"").trim();if(!I)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let O=W(await Ge(t.status({}),"status")),$=Oe(O.cards).map(W).find(pe=>pe.name===I);if(!$)throw new Error(`card "${I}" not found in board status`);let z=W(await vt(n,I)),oe=gr(z),ie=Oe($.requires_satisfied).filter(pe=>typeof pe=="string"&&!!pe),Pe=Oe($.provides_runtime).filter(pe=>typeof pe=="string"&&!!pe),Be=Object.fromEntries(await Promise.all(ie.map(async pe=>[pe,await Ge(t.getOutputsDataObject({params:{key:pe}}),`getOutputsDataObject(${pe})`)]))),Ee=Object.fromEntries(await Promise.all(Pe.map(async pe=>[pe,await Ge(t.getOutputsDataObject({params:{key:pe}}),`getOutputsDataObject(${pe})`)]))),ye=W(await Ge(t.getOutputsComputedValues({params:{key:I}}),"getOutputsComputedValues")),Ce=await Ge(t.getOutputsFetchedSources({params:{key:I}}),"getOutputsFetchedSources"),je=Oe(z.source_defs).map(W),Se={};for(let pe of je)typeof pe.bindTo=="string"&&typeof pe.outputFile=="string"&&(Se[pe.outputFile]=pe.bindTo);let Fe={};for(let[pe,Ze]of Object.entries(Ce)){let Ke=Se[pe]??pe;if(!C||typeof Ze!="string"){Fe[Ke]=null;continue}try{Fe[Ke]=C({cardId:I,ref:Ze});}catch{Fe[Ke]=null;}}let Le={card_data:W(z.card_data),requires:Be,fetched_sources:Fe,computed_values:ye};return {cardId:I,card_status_in_board:$,card_definition_and_static_data:oe,refs_for_fetched_source_files:Ce,runtime_data:{requires:Be,provides:Ee,computed_values:ye,rendered_view:Kr(z,Le)}}}async function y(v){let I=String(v.cardId||"").trim();if(!I)throw new Error("inspectChatMessagesOnCards requires cardId");let O=typeof v.turnId=="string"?v.turnId:"",N=v.allTurns===true,$=typeof v.tailTurnsBeforeId=="string"?v.tailTurnsBeforeId:"",z=N?void 0:v.lastUserTurns??(O?void 0:1),oe=v.tail,ie={...z===void 0?{}:{tailTurns:z},...O?{turnId:O}:{},...N?{allTurns:true}:{},...$?{tailTurnsBeforeId:$}:{}},Pe=Object.keys(ie).length>0?{params:{cardId:I},body:ie}:{params:{cardId:I}},Be=nt(await o.readAll(Pe),"chatStore.readAll"),Ee=W(await vt(n,I)),ye=Oe(W(Ee.card_data).files).map((Se,Fe)=>({idx:Fe,stored_name:W(Se).stored_name})).filter(Se=>typeof Se.stored_name=="string"&&Se.stored_name.length>0),je=(Array.isArray(Be.records)?Be.records:[]).map(Se=>{let Le=W(Se.payload),pe={...Se},Ze=typeof Se?.role=="string"?Se.role:typeof Le.role=="string"?String(Le.role):"",Ke=typeof Se?.text=="string"?Se.text:typeof Le.text=="string"?String(Le.text):"";if(Ze==="system"){let Ve=ma(Ke);if(Ve!==null&&ye.some(M=>M.idx===Ve)){let M=`Retrieve using inspect-file-contents --card-id ${I} --file-idx ${Ve}`;pe.retrieval_hint=M,Object.keys(Le).length>0&&typeof Se.role!="string"&&(pe.payload={...Le,retrieval_hint:M});}}return pe});return {cardId:I,messages:typeof oe=="number"&&oe>=0?je.slice(-oe):je}}async function l(v){let I=String(v.cardId||"").trim(),O=Number(v.fileIdx);if(!I)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(O)||O<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let N=W(await vt(n,I)),$=Oe(W(N.card_data).files).map(W);if(O>=$.length)throw new Error(`attachment index ${O} is out of range for card "${I}"`);let z=$[O],oe=typeof z.stored_name=="string"?z.stored_name:null;return {cardId:I,fileIdx:O,downloadUrl:g({cardId:I,fileIdx:O,storedName:oe}),...typeof z.name=="string"?{name:z.name}:{},...typeof z.stored_name=="string"?{stored_name:z.stored_name}:{},...typeof z.mime_type=="string"?{mime_type:z.mime_type}:{},...typeof z.size=="number"?{size:z.size}:{},...typeof z.uploaded_at=="string"?{uploaded_at:z.uploaded_at}:{}}}async function i(v){return await r.validateCardPreflight({body:pa(v.candidateCardContent)})}function d(v){if(!v.mockRequires||typeof v.mockRequires!="object"||Array.isArray(v.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!v.mockFetchedSources||typeof v.mockFetchedSources!="object"||Array.isArray(v.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let I=r.evalCardCompute({body:{"card-content":v.candidateCardContent,"mock-requires":v.mockRequires,"mock-fetched-sources":v.mockFetchedSources}});if(I.status!=="success")return I;let O=W(oo(I,"evalCardCompute")),N=W(v.candidateCardContent),$={card_data:W(N.card_data),requires:W(v.mockRequires),fetched_sources:W(v.mockFetchedSources),computed_values:W(O.computed_values)};return {status:"success",data:{cardId:typeof O.cardId=="string"?O.cardId:typeof N.id=="string"?N.id:"(unknown)",ok:O.ok===true,computed_values:W(O.computed_values),errors:Oe(O.errors).map(z=>{let oe=W(z);return {bindTo:typeof oe.bindTo=="string"?oe.bindTo:"",error:typeof oe.error=="string"?oe.error:""}}),provides_outputs:ao(N,$),rendered_view:Kr(N,$)}}}async function f(v){return await r.probeSourcePreflight({params:{sourceIdx:v.sourceIdx},body:{"card-content":v.candidateCardContent,"mock-projections":v.mockProjections}})}async function p(v){return await r.runSourcePreflight({params:{sourceIdx:v.sourceIdx},body:{"card-content":v.candidateCardContent,"mock-projections":v.mockProjections}})}async function R(v){let I=String(v.cardId||"").trim();if(!I)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!v.mockRequires||typeof v.mockRequires!="object"||Array.isArray(v.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let O=W(await vt(n,I)),N=Oe(O.source_defs).filter(z=>!!z&&typeof z=="object"&&!Array.isArray(z)),$={};if(v.sourceIdx>=0&&v.sourceIdx<N.length){let z=N[v.sourceIdx],oe=Qe.enrichSourcesSync([z],{card_data:W(O.card_data),requires:v.mockRequires});Array.isArray(oe)&&oe.length>0&&($=W(oe[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:v.sourceIdx},body:{"card-content":O,"mock-requires":v.mockRequires,"mock-projections":$}})}async function A(v){let I=W(await Ge(r.simulateCardCycle({body:{"card-content":v.candidateCardContent,"mock-requires":v.mockRequires}}),"simulateCardCycle")),O=W(v.candidateCardContent),N=W(I.validation),$=Oe(I.source_probes),z=Oe(I.projection_errors),oe=W(I.fetched_sources),ie=Oe(I.compute_errors),Pe=W(I.computed_values),Be={card_data:W(O.card_data),requires:v.mockRequires,fetched_sources:oe,computed_values:Pe},Ee=[];for(let ye of Oe(N.issues))typeof ye=="string"&&ye&&Ee.push(ye);for(let ye of $){let Ce=W(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"source",Se=typeof Ce.error=="string"?Ce.error:"";Se&&Ee.push(`${je}: ${Se}`);}for(let ye of z){let Ce=W(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"source",Se=typeof Ce.key=="string"?Ce.key:"projection",Fe=typeof Ce.error=="string"?Ce.error:"projection failed";Ee.push(`${je}.${Se}: ${Fe}`);}for(let ye of ie){let Ce=W(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"compute",Se=typeof Ce.error=="string"?Ce.error:"compute failed";Ee.push(`${je}: ${Se}`);}return {status:"success",data:{cardId:typeof I.cardId=="string"?I.cardId:"(unknown)",ok:I.ok===true,issues:Ee,provides_outputs:ao(O,Be),rendered_view:Kr(O,Be)}}}async function F(v){let I=String(v.cardId||"").trim();if(!I)throw new Error("manageReadCard requires cardId");let O=await Ge(n.get({params:{id:I}}),"cardStore.get");return (Array.isArray(O.cards)?O.cards.map(W):[]).map($=>gr($))}async function j(v){let I=await Promise.all(Oe(v.files).map(async O=>{let N=W(O),$=String(N.file_name??N.fileName??N.name??"").trim(),z=String(N.content_type??N.contentType??"application/octet-stream");if(!$)throw new Error("file entry requires file_name");return await m({cardId:v.cardId,fileName:$,contentType:z,bytes:B(N),suppressChatRecordWrite:true})}));for(let[O,N]of I.entries()){let $=W(N.file),z=typeof N.file_idx=="number"&&Number.isInteger(N.file_idx)&&N.file_idx>=0?N.file_idx:O,oe=v.role==="assistant"?`AI generated: ${String($.name||"")} as ${String($.stored_name||"")} #${z}`:`file uploaded: ${String($.name||"")} as ${String($.stored_name||"")} #${z}`;nt(await o.append({params:{cardId:v.cardId},body:{role:"system",text:oe,files:[],turn:v.turn}}),"chatStore.append(system attachment message)");}return I.map(O=>O.file)}async function V(v){let I=String(v.cardId||"").trim(),O=String(v.role||"user").trim()||"user",N=typeof v.turn=="string"?v.turn:"";if(!I)throw new Error("manageAddChatAttachment requires cardId");let $=await j({cardId:I,role:O,turn:N,files:v.files});return {status:"success",data:{cardId:I,turn:N,files:$}}}async function Q(v){let I=String(v.cardId||"").trim(),O=String(v.role||"").trim(),N=typeof v.text=="string"?v.text:"",$=typeof v.turn=="string"?v.turn:"";if(!I)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!O)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(O==="assistant"&&$){let ie=nt(await o.readAll({params:{cardId:I},body:{turnId:$}}),"chatStore.readAll(existing turn messages)"),Pe=Array.isArray(ie.records)?ie.records.find(Be=>Be.role==="assistant"&&String(Be.turn||"")===$):void 0;if(Pe)return {status:"success",data:{cardId:I,id:String(Pe.id),role:O,turn:$,files:Array.isArray(Pe.files)?Pe.files:[]}}}let z=await j({cardId:I,role:O,turn:$,files:v.files}),oe=nt(await o.append({params:{cardId:I},body:{role:O,text:N,files:z,turn:$}}),"chatStore.append");return {status:"success",data:{cardId:I,id:String(oe.id),role:O,turn:$,files:z}}}async function re(v,I={}){let O=String(v.cardId||"").trim(),N=W(v.patch);if(!O)throw new Error("managePatchCard requires cardId");let $=await F({cardId:O}),z=W($[0]),oe=ha(z,N);return J({cardId:O,candidateCardContent:oe},I)}async function J(v,I={}){let O=String(v.cardId||"").trim(),N=W(v.candidateCardContent),$=gr(N);if(!O)throw new Error("manageUpsertCard requires cardId");if(typeof $.id!="string"||!$.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if($.id!==O)throw new Error(`candidateCardContent.id must match cardId (${O})`);let z=null;try{z=await i({candidateCardContent:$});}catch(ye){let Ce=ye instanceof Error?ye.message:String(ye);if(!/non-core adapter is not configured/i.test(Ce))throw ye;z=null;}if(z!==null){let ye=W(z),Ce=W(ye.data);if(ye.status!=="success"||Ce.isValid!==true)return {status:"fail",step:"validate",validation:z}}let oe=null;try{oe=await vt(n,O);}catch{oe=null;}let ie=oe?W(oe):null;if(ie&&yr(ie)&&!I.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${O}" not found`),{statusCode:404});let Pe={...$,...ie&&ga(ie,"__private")?{__private:ie.__private}:{}},Be=await n.set({body:Pe});nt(Be,"cardStore.set");let Ee;try{Ee=await t.upsertCard({params:{cardId:O,restart:!0}}),nt(Ee,"upsertCard");}catch(ye){try{oe&&await n.set({body:oe});}catch{}throw ye}return {status:"success",data:{validation:z,card_saved:null,board_result:Ee}}}async function se(v,I={}){let O=String(v.cardId||"").trim();if(!O)throw new Error("manageRemoveCard requires cardId");if(!I.allowControlplaneOnlyCards){let z=await Ge(n.get({params:{id:O}}),"cardStore.get");if((Array.isArray(z.cards)?z.cards.map(W):[]).some(yr))throw Object.assign(new Error(`Card "${O}" not found`),{statusCode:404})}let N=await t.removeCard({params:{id:O}});nt(N,"removeCard");let $=await n.del({params:{id:O}});return nt($,"cardStore.del"),{status:"success",data:{board_result:N,store_result:$}}}async function de(v){let I=String(v.cardId||"").trim();if(!I)throw new Error("adminReadCard requires cardId");let O=await Ge(n.get({params:{id:I}}),"cardStore.get");return Array.isArray(O.cards)?O.cards.map(N=>W(N)):[]}async function G(v){let I=String(v.cardId||"").trim(),O=W(v.candidateCardContent),N=gr(O);if(!I)throw new Error("adminUpsertCard requires cardId");if(typeof N.id!="string"||!N.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(N.id!==I)throw new Error(`candidateCardContent.id must match cardId (${I})`);let $=await i({candidateCardContent:N}),z=W($),oe=W(z.data);if(z.status!=="success"||oe.isValid!==true)return {status:"fail",step:"validate",validation:$};let ie=null;try{ie=await vt(n,I);}catch{ie=null;}let Pe=ie?W(W(ie).__private):{},Be={...N,__private:{...Pe,visible_controlplane_only:true}},Ee=await n.set({body:Be});nt(Ee,"cardStore.set");let ye;try{ye=await t.upsertCard({params:{cardId:I,restart:!0}}),nt(ye,"upsertCard");}catch(Ce){try{ie&&await n.set({body:ie});}catch{}throw Ce}return {status:"success",data:{validation:$,card_saved:null,board_result:ye}}}async function Y(v){let I=String(v.cardId||"").trim();if(!I)throw new Error("getChatProcessing requires cardId");let O=oo(await o.isProcessing({params:{cardId:I}}),"chatStore.isProcessing");return {cardId:I,active:!!O.active}}async function T(v){let I=String(v.cardId||"").trim();if(!I)throw new Error("setChatProcessing requires cardId");if(typeof v.active!="boolean")throw new Error("setChatProcessing requires boolean active");return nt(await o.setProcessing({params:{cardId:I},body:{active:v.active}}),"chatStore.setProcessing"),{cardId:I,active:v.active}}async function w(){let v=await b(s,"webhook.process-accumulated")();return v?.status==="fail"||v?.status==="error"?v:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(v??{},"data")?v.data??null:null}}}async function H(v){let I=String(v.token||"").trim(),O=String(v.ref||"").trim();if(!I)throw new Error("webhookSourceFetchDone requires token");if(!O)throw new Error("webhookSourceFetchDone requires ref");let N=await b(c,"webhook.source-fetch-done")({token:I,ref:O});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:I,ref:O,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}async function L(v){let I=String(v.token||"").trim(),O=String(v.reason||"").trim();if(!I)throw new Error("webhookSourceFetchFailed requires token");if(!O)throw new Error("webhookSourceFetchFailed requires reason");let N=await b(u,"webhook.source-fetch-failed")({token:I,reason:O});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:I,reason:O,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}return {listRuntimeCards:k,discoverSourceKinds:P,inspectBoardRuntimeStatus:_,inspectCardDefinitionAndRuntime:x,inspectChatMessagesOnCards:y,inspectFileContents:l,preflightValidateCandidateCardDefinition:i,preflightMaterializeCandidateCard:d,preflightProbeSingleSourceInCandidateCard:f,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:R,preflightRunOneCycleWithCandidateCard:A,manageReadCard:F,manageAddChatAttachment:V,manageAddChatEntryAndAnyAttachments:Q,managePatchCard:re,manageUpsertCard:J,manageRemoveCard:se,adminReadCard:de,adminUpsertCard:G,getChatProcessing:Y,setChatProcessing:T,webhookProcessAccumulated:w,webhookSourceFetchDone:H,webhookSourceFetchFailed:L}}async function Ge(e,t){return nt(await e,t)}function io(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:s,readCardRuntimeArtifacts:c,readCardFromStore:u,readCardDefinitions:m,processAccumulatedLaneInternal:g,reportSourceFetched:C,reportSourceFetchFailure:b,uploadCardFile:k,chatStorePublic:B,serverUrl:P,apiBasePath:_}=e;function x(){return t[0]??null}function y(){return {async status(){let f=await o();return f==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:f}},async getOutputsDataObject(f){let p=f?.params?.key;return p?{status:"success",data:(await s())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(f){let p=f?.params?.key;return p?{status:"success",data:(await c())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(f){let p=f?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let R=n(p)??x();return R?R.boardOps.getOutputsFetchedSources({params:{key:p}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(f){let p=f?.params?.id;if(!p)return {status:"fail",error:"removeCard requires params.id"};let R=n(p)??x();return R?R.boardOps.removeCard({params:{id:p}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(f){let p=f?.params?.cardId;if(!p)return {status:"fail",error:"upsertCard requires params.cardId"};let R=n(p)??x();if(!R)return {status:"fail",error:"Board context is unavailable"};let A=await R.boardOps.upsertCard({params:{cardId:p,restart:f.params.restart===true}});if(A.status!=="success")return A;if(tt(R.boardAdapter)){let F=await g(true);if(F.status!=="success")return F}return A}}}function l(){let f=()=>{let p=x();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 f().describeTaskExecutorCapabilities(p)},validateCardPreflight(p){return f().validateCardPreflight(p)},evalCardCompute(p){return f().evalCardCompute(p)},probeSourcePreflight(p){return f().probeSourcePreflight(p)},runSourcePreflight(p){return f().runSourcePreflight(p)},simulateCardCycle(p){return f().simulateCardCycle(p)}}}function i(){return {async get(f){let p=typeof f.params?.id=="string"?f.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 m()}}},async set(f){let p=f.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 A of R){let F=A,j=typeof F.id=="string"?F.id:"";if(!j)return {status:"fail",error:"each card must have a string `id` field"};let V=r.get(j)??0,Q=t[V]??x();if(!Q)return {status:"fail",error:"Board context is unavailable"};let re=await Q.cardStoreOps.set({body:F});if(re.status!=="success")return re;r.set(j,V);}return {status:"success",data:{count:R.length}}},async del(f){let p=[f.params?.id,...f.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 A=n(R)??x();if(!A)return {status:"fail",error:"Board context is unavailable"};let F=await A.cardStoreOps.del({params:{id:R}});if(F.status!=="success")return F;r.delete(R);}return {status:"success",data:{count:p.length}}},async patch(f){let p=typeof f.params?.id=="string"?f.params.id:void 0,R=typeof f.params?.path=="string"?f.params.path:void 0;if(!p||!R)return {status:"fail",error:"patch requires params.id and params.path"};let A=n(p)??x();return A?A.cardStoreOps.patch(f):{status:"fail",error:"Board context is unavailable"}},async appendFiles(f){let p=typeof f.params?.id=="string"?f.params.id:void 0;if(!p)return {status:"fail",error:"appendFiles requires params.id"};let R=n(p)??x();return R?R.cardStoreOps.appendFiles(f):{status:"fail",error:"Board context is unavailable"}}}}function d(){return so({board:y(),nonCore:l(),cardStore:i(),chatStore:B,processAccumulated:()=>g(true),sourceFetchDone:({token:f,ref:p})=>C(f,p),sourceFetchFailed:({token:f,reason:p})=>b(f,p),uploadCardFile({cardId:f,fileName:p,contentType:R,bytes:A,suppressChatRecordWrite:F}){return k(f,p,R,A,{inChat:true,...F===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:f,fileIdx:p,storedName:R}){let A=`${P||""}${_}/cards/${encodeURIComponent(f)}/files/${p}`;return R?`${A}?sn=${encodeURIComponent(R)}`:A},readFetchedSourceJsonByRef({cardId:f,ref:p}){let R=n(f)??x();if(!R||tt(R.boardAdapter))return null;let j=R.boardAdapter.resolveBlob(at(p)).trim();return j?JSON.parse(j):null}})}return {mcpBoardFacade:y,mcpNonCoreFacade:l,mcpCardStoreFacade:i,createMcpFacade:d}}function uo(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:s,createMcpToolRegistry:c,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:m,sliceTextByLines:g}=e;async function C(b,k,B){let P=b.method||"GET",_=B,x=_.pathname;try{if(P==="POST"&&x===`${t}/mcp`){await o();let y=await n(b),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(k,400,{error:"tool is required"}),!0;if(l==="inspect.file-contents")return r(k,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let d=await mt(l,i,c(s()));if(d&&typeof d=="object"&&!Array.isArray(d)){let f=d;if(f.status==="fail")return r(k,400,{error:rt(d,"Request failed")}),!0;if(f.status==="error")return r(k,500,{error:rt(d,"Internal error")}),!0}r(k,200,d);}catch(d){let f=typeof d?.statusCode=="number"?Number(d.statusCode):500,p=d instanceof Error?d.message:String(d);r(k,f,{error:p});}return !0}if(P==="POST"&&x===`${t}/mcp-raw`){await o();let y=await n(b),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(k,400,{error:"tool is required"}),!0;if(l!=="inspect.file-contents")return r(k,400,{error:`Tool does not support raw response: ${l}`}),!0;let d=le(i,"card_id","cardId"),f=st(i,"file_idx","fileIdx"),p=st(i,"head-lines","headLines"),R=st(i,"tail-lines","tailLines"),A=st(i,"head-bytes","headBytes"),F=st(i,"tail-bytes","tailBytes");if(!d)return r(k,400,{error:"inspect.file-contents requires card_id"}),!0;if(f===void 0||!Number.isInteger(f)||f<0)return r(k,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([p,R,A,F].filter(w=>w!==void 0).length>1)return r(k,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[w,H]of [["head-lines",p],["tail-lines",R],["head-bytes",A],["tail-bytes",F]])if(H!==void 0&&(!Number.isInteger(H)||H<0))return r(k,400,{error:`inspect.file-contents requires ${w} to be a non-negative integer`}),!0;let V=await s().inspectFileContents({cardId:d,fileIdx:f}),Q=typeof V?.stored_name=="string"?V.stored_name:null,{fileRecord:re,bytes:J}=await u(d,f,Q),se=String(re.name||re.stored_name||"download.bin"),de=String(re.mime_type||"application/octet-stream"),G=(_.searchParams.get("resp")||"").trim().toLowerCase();if(G&&G!=="json-b64")return r(k,400,{error:`unsupported resp mode: ${G}`}),!0;let Y=G==="json-b64",T;if(p!==void 0||R!==void 0){if(!m(de))return r(k,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let w=new TextDecoder().decode(J),H=p!==void 0?g(w,"head",p):g(w,"tail",R);T=typeof Buffer<"u"?Buffer.from(H,"utf8"):new TextEncoder().encode(H);}else if(A!==void 0||F!==void 0){let w=A??F;T=A!==void 0?J.slice(0,w):J.slice(Math.max(0,J.length-w));}else T=J;if(Y){let w=typeof Buffer<"u"?Buffer.from(T).toString("base64"):btoa(String.fromCharCode(...T));return r(k,200,{bodyBase64:w,mimeType:de,filename:se,byteLength:T.length}),!0}return k.writeHead(200,{"Content-Type":de,"Content-Disposition":`attachment; filename="${se}"`,"Content-Length":T.length}),k.end(T),!0}return !1}catch(y){let l=y?.statusCode||500;return r(k,l,{error:String(y?.message||y)}),true}}return {handleAgentfaceApi:C}}function co(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function c(u,m,g){let C=u.method||"GET",b=g.pathname;try{if(C==="POST"&&b===`${t}/mcp-webhooks`){await o();let k=await n(u),B=typeof k.tool=="string"?k.tool.trim():"",P=k.args&&typeof k.args=="object"&&!Array.isArray(k.args)?k.args:{};if(!B)return r(m,400,{error:"tool is required"}),!0;try{let _=await mt(B,P,s());if(_&&typeof _=="object"&&!Array.isArray(_)){let x=_;if(x.status==="fail")return r(m,400,{error:rt(_,"Request failed")}),!0;if(x.status==="error")return r(m,500,{error:rt(_,"Internal error")}),!0}r(m,200,_);}catch(_){let x=typeof _?.statusCode=="number"?Number(_.statusCode):500,y=_ instanceof Error?_.message:String(_);r(m,x,{error:y});}return !0}return !1}catch(k){let B=k?.statusCode||500;return r(m,B,{error:String(k?.message||k)}),true}}return {handleWebhooksApi:c}}function Jr(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:s,onChannelSubscribed:c,onChannelUnsubscribed:u}=e;function m(C,b,k,B,P){if(!t.has(b)){n(C,404,{error:`SSE client not connected: ${b}`});return}P?(t.subscribeChannel(b,k,B.cardId),c?.(b,k,B)):(t.unsubscribeChannel(b,k,B.cardId),u?.(b,k,B)),n(C,200,{ok:true,clientId:b,channelName:k,...B.cardId?{cardId:B.cardId}:{},subscribed:P});}async function g(C,b,k,B){let P=B?.oneShot===true,_=B?.bootstrapPayload!==false,x=!P&&k?t.get(k):null,y=x?new Set(x.subscribedChatCardIds):new Set,l=x?new Set(x.subscribedChannelNames):new Set,i=x?new Map(Array.from(x.subscribedCardChannels.entries(),([f,p])=>[f,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),_){let f=await o(),p=t.buildFrame(f);b.write(p);}if(P){b.end();return}if(!k)throw new Error("clientId is required for streaming SSE");t.register(k,b,{subscribedChatCardIds:y,subscribedChannelNames:l,subscribedCardChannels:i});try{s?.(k,f=>{t.writeFrame(k,f);});}catch{}let d=setInterval(()=>{try{b.write(`: keepalive
|
|
4
|
+
`}function o(f){let s=f;try{s.flushHeaders?.();}catch{}try{s.flush?.();}catch{}try{s.socket?.setNoDelay?.(!0);}catch{}try{s.socket?.uncork?.();}catch{}}function a(f,s){let l=t.get(f);if(l&&!(s&&l.res!==s)){t.delete(f);try{e.onSseClientDisconnected?.(f);}catch{}try{l.res.end();}catch{}}}function d(f,s,l){let m=t.get(f);m&&a(f,m.res),t.set(f,{res:s,subscribedChatCardIds:l?.subscribedChatCardIds??new Set,subscribedChannelNames:l?.subscribedChannelNames??new Set,subscribedCardChannels:l?.subscribedCardChannels??new Map});}function u(f,s){let l=t.get(f);if(!l)return;let m=n(s);try{l.res.write(m),o(l.res);}catch{a(f,l.res);}}function p(f){return qe({kind:"notification-batch",notifications:f})}async function y(f,s){let l=await e.buildChatOneShotBatch(f,s);return l.status==="success"?l.data:p([])}async function C(f,s){let l=t.get(f);return l?(l.subscribedChatCardIds.add(s),u(f,await y(s,true)),true):false}function v(f,s){let l=t.get(f);return l?(l.subscribedChatCardIds.delete(s),true):false}function S(f,s,l){let m=t.get(f);if(!m)return false;if(l){let g=m.subscribedCardChannels.get(l)??new Set;return g.add(s),m.subscribedCardChannels.set(l,g),true}return m.subscribedChannelNames.add(s),true}function B(f,s,l){let m=t.get(f);if(!m)return false;if(l){let g=m.subscribedCardChannels.get(l);return g&&(g.delete(s),g.size===0&&m.subscribedCardChannels.delete(l)),true}return m.subscribedChannelNames.delete(s),true}function T(f){return f.kind==="card_chats"||f.kind==="chat_messages"||f.kind==="chat_processing"}function _(f){return f.kind==="card_watchparty"}function x(f,s,l){return f.subscribedChannelNames.has(s)?true:!!f.subscribedCardChannels.get(l)?.has(s)}function h(f){if(!f||f.length===0)return;let s=[],l=new Map,m=new Map;for(let g of f)if(_(g)){let k=`${g.cardId}\0${g.channel}`,I=m.get(k)??[];I.push(g),m.set(k,I);}else if(T(g)){let k=l.get(g.cardId)??[];k.push(g),l.set(g.cardId,k);}else s.push(g);if(s.length>0){let g=p(s);for(let k of t.keys())u(k,g);}for(let[g,k]of l.entries()){let I=p(k);for(let[q,L]of t.entries())L.subscribedChatCardIds.has(g)&&u(q,I);}for(let[g,k]of m.entries()){let I=g.indexOf("\0"),q=I>=0?g.slice(0,I):"",L=I>=0?g.slice(I+1):g,V=p(k);for(let[J,X]of t.entries())!q||!L||x(X,L,q)&&u(J,V);}}return {size:()=>t.size,has:f=>t.has(f),get:f=>t.get(f),buildFrame:n,flushTransport:o,register:d,disconnect:a,writeFrame:u,subscribeChat:C,unsubscribeChat:v,subscribeChannel:S,unsubscribeChannel:B,broadcastNotificationBatch:h}}function Mr(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 Dr(e,t){return Mr(await e,t)}function $r(e){let t=ce(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 Vr(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function to(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:a,getMcpFacade:d,getMcpCardStoreFacade:u}=e;function p(s){let l=ce(s,"board_id");if(!l)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(l!==t)throw Object.assign(new Error(`Unknown board_id: ${l}`),{statusCode:400})}function y(s){let l=ce(s,"client_id");if(!l)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return l}function C(s){p(s);let l=y(s),m=ce(s,"channel_name"),g=ce(s,"card_id")||void 0;if(!m)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:l,channelName:m,...g?{cardId:g}:{}}}function v(s){p(s);let l=ce(s,"card_id");if(!l)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:l}}async function S(s){await r();let{cardId:l}=v(s),m=y(s);if(!await n.subscribeChat(m,l))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:m,subscribed:true}}}async function B(s){await r();let{cardId:l}=v(s),m=y(s);if(!n.unsubscribeChat(m,l))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:m,subscribed:false}}}async function T(s,l){await r();let{clientId:m,channelName:g,cardId:k}=C(s);if(!n.has(m))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return l?(n.subscribeChannel(m,g,k),o?.(m,g,k?{cardId:k}:{})):(n.unsubscribeChannel(m,g,k),a?.(m,g,k?{cardId:k}:{})),{status:"success",data:{boardId:t,clientId:m,channelName:g,subscribed:l,...k?{cardId:k}:{}}}}async function _(s,l){let{cardId:m}=v(s);return await d().setChatProcessing({cardId:m,active:l}),{status:"success",data:{boardId:t,cardId:m,active:l}}}async function x(s){let{cardId:l}=v(s),m=await d().getChatProcessing({cardId:l});return {status:"success",data:{boardId:t,cardId:l,active:m.active}}}async function h(s){let{cardId:l}=v(s),m=$r(s);if(!Object.prototype.hasOwnProperty.call(s,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(m.split(".").includes("visible_controlplane_only")){let g=await Dr(u().get({params:{id:l}}),"cardStore.get"),k=Array.isArray(g.cards)&&g.cards.length>0&&typeof g.cards[0]=="object"&&!Array.isArray(g.cards[0])?g.cards[0]:null,I=k?Vr(k,"visible_controlplane_only").value:void 0;if(s.value!==I)throw Object.assign(new Error("MCP tool cannot change the reserved private flag visible_controlplane_only"),{statusCode:403});return {status:"success",data:{boardId:t,cardId:l,key:m}}}return Mr(await u().patch({params:{id:l,path:`__private.${m}`},body:{value:s.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:l,key:m}}}async function f(s){let{cardId:l}=v(s),m=$r(s),g=await Dr(u().get({params:{id:l}}),"cardStore.get"),k=Array.isArray(g.cards)&&g.cards.length>0&&g.cards[0]&&typeof g.cards[0]=="object"&&!Array.isArray(g.cards[0])?g.cards[0]:null;if(!k)throw Object.assign(new Error(`Card "${l}" not found`),{statusCode:404});let I=Vr(k,m);return {status:"success",data:{boardId:t,cardId:l,key:m,exists:I.exists,value:I.value}}}return {requireCardArgs:v,subscribeChat:S,unsubscribeChat:B,watchChannel:T,setChatProcessing:_,getChatProcessing:x,setCardMeta:h,getCardMeta:f}}function ro(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e;function a(v){if(v.length===0)return null;if(v.length===1)return v[0];let S=[],B=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],T={};for(let x of B)T[x]=0;for(let x of v){let h=x,f=Array.isArray(h.cards)?h.cards:[];S.push(...f);for(let s of B)T[s]+=Number(h?.summary?.[s]||0);}let _=v[0];return {..._,cards:S,summary:{..._.summary||{},card_count:S.length,...T}}}async function d(){let v=[];for(let S of r)try{let B=await S.boardOps.buildSseOneShotPayload({});B.status==="success"&&B.data&&v.push(B.data);}catch{}return v}async function u(){let S=(await d()).map(B=>B.statusSnapshot).filter(Boolean);if(S.length===0){let B=r.map(T=>T.notification.status).filter(Boolean);return a(B)}return a(S)}async function p(){let v={},S=await d();for(let B of S)Object.assign(v,B.cardRuntimeById||{});if(Object.keys(v).length>0)return v;for(let B of r)for(let[T,_]of Object.entries(B.notification.computedValues)){let x=B.notification.cards[T];v[T]={schema_version:"v1",card_id:T,card_data:x?.card_data??{},computed_values:_??{}};}return v}async function y(){let v={},S=await d();for(let B of S)Object.assign(v,B.dataObjectsByToken||{});if(Object.keys(v).length===0)for(let B of r)Object.assign(v,B.notification.dataObjects||{});return v}async function C(){let v=await d(),S=v.flatMap(x=>Array.isArray(x.cardDefinitions)?x.cardDefinitions:[]),B={},T={};for(let x of v)Object.assign(B,x.dataObjectsByToken||{}),Object.assign(T,x.cardRuntimeById||{});let _={};for(let x of S){if(!x?.id)continue;let h=x.id;try{let f=await n(h),s=await o(h);(f.length>0||s)&&(_[h]={messages:f.map(l=>({role:String(l.role||"system"),text:String(l.text||""),files:Array.isArray(l.files)?l.files:[]})),receiving:!1,processing:s});}catch{}}return {boardId:t,cardDefinitions:S,statusSnapshot:await u(),dataObjectsByToken:B,cardRuntimeById:T,cardChatsByCardId:_}}return {readStatusSnapshot:u,readCardRuntimeArtifacts:p,readDataObjectsByToken:y,buildPublishedRuntimePayload:C}}function pa(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 no(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:a,writeChatRecord:d}=e;async function u(C){let v=[];try{let S=await o(C);if(!S)return v;let B=n().read(S.card_data&&typeof S.card_data=="object"?S.card_data:null);for(let T of B)v.push(String(T.stored_name??""));}catch{}return v}async function p(C,v,S,B){let T=t(C),_=r(C),x=pa(v),h=await u(C),s=`${String(h.length+1).padStart(3,"0")}-${x}`.slice(-36);if(!_.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${C}`),{statusCode:500});return await _.files.putBytes(`${T}/${s}`,new Uint8Array(B),S||"application/octet-stream"),{name:x,stored_name:s,size:B.length,mime_type:S||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function y(C,v,S,B,T){if(!B.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let _=T?.inChat===true,x=await p(C,v,S,B),h=null;if(await a(C,f=>{let s=new Date().toISOString(),l=f.card_data&&typeof f.card_data=="object"?f.card_data:{};f.card_data=l;let m=n().normalizeIncoming([{name:x.name,stored_name:x.stored_name,size:x.size,mime_type:x.mime_type,uploaded_at:x.uploaded_at||s,chat:_}],s);return h=n().merge(l,m).findIndex(k=>k.stored_name===x.stored_name),f}),_&&T?.suppressChatRecordWrite!==true){let f=typeof h=="number"&&h>=0?` #${h}`:"";await d(C,"system",`file uploaded: ${x.name} as ${x.stored_name}${f}`,[],T?.turnId??"");}return {ok:true,file:{...x,...typeof h=="number"&&h>=0?{file_idx:h}:{},chat:_},...typeof h=="number"&&h>=0?{file_idx:h}:{}}}return {uploadCardFile:y,readCardStoredFileNames:u}}function oo(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:ce(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=it(t,"tail_turns"),n=it(t,"tail"),o=ce(t,"turn_id"),a=t.all_turns===true,d=ce(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:ce(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...a?{allTurns:true}:{},...d?{tailTurnsBeforeId:d}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:ce(t,"card_id"),fileIdx:Number(it(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ft(t,"mock_requires","mock_requires"),mockFetchedSources:ft(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:Ht(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:Ht(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:ce(t,"card_id"),sourceIdx:Ht(t,"source_idx","source_idx"),mockRequires:ft(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ut(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:ce(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=ce(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:ce(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=ce(t,"turn_id"),n=ce(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:ce(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:ce(t,"card_id"),candidateCardContent:ut(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:ce(t,"card_id")})}}function ao(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:ce(t,"token"),ref:ce(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:ce(t,"token"),reason:ce(t,"reason")})}}function so(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function a(u,p){let y=ce(u,"board_id");if(!y)throw Object.assign(new Error(`${p} requires board_id`),{statusCode:400});if(y!==t)throw Object.assign(new Error(`Unknown board_id: ${y}`),{statusCode:400})}function d(u,p){let{cardId:y}=o.requireCardArgs(u),C=ce(u,"turn_id");return a(u,p),n().manageAddChatAttachment({cardId:y,role:ce(u,"role")||"user",...C?{turn:C}:{},files:[{file_name:ce(u,"file_name"),content_type:ce(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 p=ce(u,"card_id"),y=ce(u,"file_name"),C=ce(u,"content_type")||"application/octet-stream",v=Xr(u);if(a(u,"manage.upload-card-file"),!p)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!y)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!v)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(p,y,C,v,{inChat:false})},"manage.add-chat-attachment":u=>d(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>d(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:p}=o.requireCardArgs(u),y=ce(u,"role")||"user",C=ce(u,"turn_id");return a(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:p,role:y,...typeof u.text=="string"?{text:u.text}:{},...C?{turn:C}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:p}=o.requireCardArgs(u);return a(u,"manage.patch-card"),n().managePatchCard({cardId:p,patch:ut(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:p}=o.requireCardArgs(u);return a(u,"manage.upsert-card"),n().manageUpsertCard({cardId:p,candidateCardContent:ut(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:p}=o.requireCardArgs(u);return a(u,"manage.remove-card"),n().manageRemoveCard({cardId:p},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:p}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:p})}}},"manage.admin-upsert-card":u=>{let p=ce(u,"board_id"),y=ce(u,"card_id");if(!p)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!y)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(p!==t)throw Object.assign(new Error(`Unknown board_id: ${p}`),{statusCode:400});return n().adminUpsertCard({cardId:y,candidateCardContent:ut(u,"candidate_card_content")})}}}function tt(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 io(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 W(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Oe(e){return Array.isArray(e)?e:[]}function Kr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=W(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 Ur(e,t){let r=W(e.view);return {elements:Oe(r.elements).map((o,a)=>{let d=W(o),u=W(d.data),p=typeof d.visible=="string"?!!Kr(t,d.visible):true,y=typeof u.bind=="string"?u.bind:void 0,C=typeof u.maxRows=="number"?u.maxRows:void 0,v=y?Kr(t,y):void 0,S={id:typeof d.id=="string"&&d.id?d.id:`element-${a}`,kind:d.kind,label:d.label,visible:p};return v!==void 0&&(S.resolved=Array.isArray(v)&&typeof C=="number"?v.slice(0,C):v),S})}}function uo(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"}],a={};for(let d of o){let u=W(d),p=typeof u.bindTo=="string"?u.bindTo:"",y=typeof u.ref=="string"?u.ref:"";if(!p||!y)continue;let C=Kr(t,y);C!==void 0&&(a[p]=C);}return a}function ga(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 ya(e){return {"card-content":e}}function kr(e){let t={...e};return delete t.__private,t}function ha(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Ra(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function ka(e,t){let r=Ra(e);if(!t||Object.keys(t).length===0)return r;function n(o,a,d){let u=String(a||"").split(".").filter(Boolean);if(!u.length)return;let p=o;for(let y=0;y<u.length-1;y+=1){let C=u[y];(!p[C]||typeof p[C]!="object")&&(p[C]={}),p=p[C];}p[u[u.length-1]]=d;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,a=W(r.view),d=Oe(a.elements);for(let u of d){let p=W(W(u).data);if(typeof p.writeTo=="string"&&p.writeTo){o=p.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...W(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 Cr(e){return W(e.__private).visible_controlplane_only===true}async function Pt(e,t){let r=await Qe(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 co(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:a,sourceFetchDone:d,sourceFetchFailed:u,uploadCardFile:p,buildFileDownloadUrl:y,readFetchedSourceJsonByRef:C}=e;function v(c,w){if(typeof c=="function")return c;throw new Error(`${w} is not configured for this MCP facade`)}async function S(){let c=await Qe(n.get({}),"cardStore.get");return Array.isArray(c.cards)?c.cards.map(w=>W(w)).filter(w=>!Cr(w)):[]}function B(c){if(Array.isArray(c.bytes))return new Uint8Array(c.bytes.map(w=>Math.max(0,Math.min(255,Number(w)||0))));if(typeof c.text=="string")return new TextEncoder().encode(c.text);if(typeof c.base64=="string"){let w=String(c.base64).replace(/-/g,"+").replace(/_/g,"/"),A=w+"=".repeat((4-w.length%4)%4),N=atob(A);return Uint8Array.from(N,M=>M.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function T(){let c=W(await Qe(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:c.version,commonSourceFields:W(c.commonSourceDefFields),sourceKinds:W(c.sourceKinds)}}async function _(){let c=W(await Qe(t.status({}),"status")),w=W(c.summary),A=Oe(c.cards),N=await Qe(n.get({}),"cardStore.get"),M=new Set((Array.isArray(N.cards)?N.cards.map(W):[]).filter(Cr).map(U=>typeof U.id=="string"?U.id:"").filter(Boolean)),K=A.filter(U=>!M.has(String(W(U).name??"")));return {meta:W(c.meta),summary:{card_count:typeof w.card_count=="number"?w.card_count:0,completed:typeof w.completed=="number"?w.completed:0,eligible:typeof w.eligible=="number"?w.eligible:0,pending:typeof w.pending=="number"?w.pending:0,blocked:typeof w.blocked=="number"?w.blocked:0,in_progress:typeof w.in_progress=="number"?w.in_progress:0,failed:typeof w.failed=="number"?w.failed:0,unresolved:typeof w.unresolved=="number"?w.unresolved:0},cards:K.map(U=>{let ne=W(U);return {"card-id":typeof ne.name=="string"?ne.name:null,status:ne.status??null,error:ne.error??null,requires:Oe(ne.requires),requires_satisfied:Oe(ne.requires_satisfied),requires_missing:Oe(ne.requires_missing),provides_declared:Oe(ne.provides_declared),provides_runtime:Oe(ne.provides_runtime)}})}}async function x(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let A=W(await Qe(t.status({}),"status")),M=Oe(A.cards).map(W).find(ye=>ye.name===w);if(!M)throw new Error(`card "${w}" not found in board status`);let K=W(await Pt(n,w)),U=kr(K),ne=Oe(M.requires_satisfied).filter(ye=>typeof ye=="string"&&!!ye),xe=Oe(M.provides_runtime).filter(ye=>typeof ye=="string"&&!!ye),Ie=Object.fromEntries(await Promise.all(ne.map(async ye=>[ye,await Qe(t.getOutputsDataObject({params:{key:ye}}),`getOutputsDataObject(${ye})`)]))),Ae=Object.fromEntries(await Promise.all(xe.map(async ye=>[ye,await Qe(t.getOutputsDataObject({params:{key:ye}}),`getOutputsDataObject(${ye})`)]))),le=W(await Qe(t.getOutputsComputedValues({params:{key:w}}),"getOutputsComputedValues")),ge=await Qe(t.getOutputsFetchedSources({params:{key:w}}),"getOutputsFetchedSources"),$e=Oe(K.source_defs).map(W),be={};for(let ye of $e)typeof ye.bindTo=="string"&&typeof ye.outputFile=="string"&&(be[ye.outputFile]=ye.bindTo);let Ne={};for(let[ye,Ye]of Object.entries(ge)){let De=be[ye]??ye;if(!C||typeof Ye!="string"){Ne[De]=null;continue}try{Ne[De]=C({cardId:w,ref:Ye});}catch{Ne[De]=null;}}let Me={card_data:W(K.card_data),requires:Ie,fetched_sources:Ne,computed_values:le};return {cardId:w,card_status_in_board:M,card_definition_and_static_data:U,refs_for_fetched_source_files:ge,runtime_data:{requires:Ie,provides:Ae,computed_values:le,rendered_view:Ur(K,Me)}}}async function h(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("inspectChatMessagesOnCards requires cardId");let A=typeof c.turnId=="string"?c.turnId:"",N=c.allTurns===true,M=typeof c.tailTurnsBeforeId=="string"?c.tailTurnsBeforeId:"",K=N?void 0:c.lastUserTurns??(A?void 0:1),U=c.tail,ne={...K===void 0?{}:{tailTurns:K},...A?{turnId:A}:{},...N?{allTurns:true}:{},...M?{tailTurnsBeforeId:M}:{}},xe=Object.keys(ne).length>0?{params:{cardId:w},body:ne}:{params:{cardId:w}},Ie=tt(await o.readAll(xe),"chatStore.readAll"),Ae=W(await Pt(n,w)),le=Oe(W(Ae.card_data).files).map((be,Ne)=>({idx:Ne,stored_name:W(be).stored_name})).filter(be=>typeof be.stored_name=="string"&&be.stored_name.length>0),$e=(Array.isArray(Ie.records)?Ie.records:[]).map(be=>{let Me=W(be.payload),ye={...be},Ye=typeof be?.role=="string"?be.role:typeof Me.role=="string"?String(Me.role):"",De=typeof be?.text=="string"?be.text:typeof Me.text=="string"?String(Me.text):"";if(Ye==="system"){let He=ga(De);if(He!==null&&le.some(rt=>rt.idx===He)){let rt=`Retrieve using inspect-file-contents --card-id ${w} --file-idx ${He}`;ye.retrieval_hint=rt,Object.keys(Me).length>0&&typeof be.role!="string"&&(ye.payload={...Me,retrieval_hint:rt});}}return ye});return {cardId:w,messages:typeof U=="number"&&U>=0?$e.slice(-U):$e}}async function f(c){let w=String(c.cardId||"").trim(),A=Number(c.fileIdx);if(!w)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(A)||A<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let N=W(await Pt(n,w)),M=Oe(W(N.card_data).files).map(W);if(A>=M.length)throw new Error(`attachment index ${A} is out of range for card "${w}"`);let K=M[A],U=typeof K.stored_name=="string"?K.stored_name:null;return {cardId:w,fileIdx:A,downloadUrl:y({cardId:w,fileIdx:A,storedName:U}),...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 s(c){return await r.validateCardPreflight({body:ya(c.candidateCardContent)})}function l(c){if(!c.mockRequires||typeof c.mockRequires!="object"||Array.isArray(c.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!c.mockFetchedSources||typeof c.mockFetchedSources!="object"||Array.isArray(c.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let w=r.evalCardCompute({body:{"card-content":c.candidateCardContent,"mock-requires":c.mockRequires,"mock-fetched-sources":c.mockFetchedSources}});if(w.status!=="success")return w;let A=W(io(w,"evalCardCompute")),N=W(c.candidateCardContent),M={card_data:W(N.card_data),requires:W(c.mockRequires),fetched_sources:W(c.mockFetchedSources),computed_values:W(A.computed_values)};return {status:"success",data:{cardId:typeof A.cardId=="string"?A.cardId:typeof N.id=="string"?N.id:"(unknown)",ok:A.ok===true,computed_values:W(A.computed_values),errors:Oe(A.errors).map(K=>{let U=W(K);return {bindTo:typeof U.bindTo=="string"?U.bindTo:"",error:typeof U.error=="string"?U.error:""}}),provides_outputs:uo(N,M),rendered_view:Ur(N,M)}}}async function m(c){return await r.probeSourcePreflight({params:{sourceIdx:c.sourceIdx},body:{"card-content":c.candidateCardContent,"mock-projections":c.mockProjections}})}async function g(c){return await r.runSourcePreflight({params:{sourceIdx:c.sourceIdx},body:{"card-content":c.candidateCardContent,"mock-projections":c.mockProjections}})}async function k(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!c.mockRequires||typeof c.mockRequires!="object"||Array.isArray(c.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let A=W(await Pt(n,w)),N=Oe(A.source_defs).filter(K=>!!K&&typeof K=="object"&&!Array.isArray(K)),M={};if(c.sourceIdx>=0&&c.sourceIdx<N.length){let K=N[c.sourceIdx],U=Je.enrichSourcesSync([K],{card_data:W(A.card_data),requires:c.mockRequires});Array.isArray(U)&&U.length>0&&(M=W(U[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:c.sourceIdx},body:{"card-content":A,"mock-requires":c.mockRequires,"mock-projections":M}})}async function I(c){let w=W(await Qe(r.simulateCardCycle({body:{"card-content":c.candidateCardContent,"mock-requires":c.mockRequires}}),"simulateCardCycle")),A=W(c.candidateCardContent),N=W(w.validation),M=Oe(w.source_probes),K=Oe(w.projection_errors),U=W(w.fetched_sources),ne=Oe(w.compute_errors),xe=W(w.computed_values),Ie={card_data:W(A.card_data),requires:c.mockRequires,fetched_sources:U,computed_values:xe},Ae=[];for(let le of Oe(N.issues))typeof le=="string"&&le&&Ae.push(le);for(let le of M){let ge=W(le),$e=typeof ge.bindTo=="string"?ge.bindTo:"source",be=typeof ge.error=="string"?ge.error:"";be&&Ae.push(`${$e}: ${be}`);}for(let le of K){let ge=W(le),$e=typeof ge.bindTo=="string"?ge.bindTo:"source",be=typeof ge.key=="string"?ge.key:"projection",Ne=typeof ge.error=="string"?ge.error:"projection failed";Ae.push(`${$e}.${be}: ${Ne}`);}for(let le of ne){let ge=W(le),$e=typeof ge.bindTo=="string"?ge.bindTo:"compute",be=typeof ge.error=="string"?ge.error:"compute failed";Ae.push(`${$e}: ${be}`);}return {status:"success",data:{cardId:typeof w.cardId=="string"?w.cardId:"(unknown)",ok:w.ok===true,issues:Ae,provides_outputs:uo(A,Ie),rendered_view:Ur(A,Ie)}}}async function q(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("manageReadCard requires cardId");let A=await Qe(n.get({params:{id:w}}),"cardStore.get");return (Array.isArray(A.cards)?A.cards.map(W):[]).map(M=>kr(M))}async function L(c){let w=await Promise.all(Oe(c.files).map(async A=>{let N=W(A),M=String(N.file_name??N.fileName??N.name??"").trim(),K=String(N.content_type??N.contentType??"application/octet-stream");if(!M)throw new Error("file entry requires file_name");return await p({cardId:c.cardId,fileName:M,contentType:K,bytes:B(N),suppressChatRecordWrite:true})}));for(let[A,N]of w.entries()){let M=W(N.file),K=typeof N.file_idx=="number"&&Number.isInteger(N.file_idx)&&N.file_idx>=0?N.file_idx:A,U=c.role==="assistant"?`AI generated: ${String(M.name||"")} as ${String(M.stored_name||"")} #${K}`:`file uploaded: ${String(M.name||"")} as ${String(M.stored_name||"")} #${K}`;tt(await o.append({params:{cardId:c.cardId},body:{role:"system",text:U,files:[],turn:c.turn}}),"chatStore.append(system attachment message)");}return w.map(A=>A.file)}async function V(c){let w=String(c.cardId||"").trim(),A=String(c.role||"user").trim()||"user",N=typeof c.turn=="string"?c.turn:"";if(!w)throw new Error("manageAddChatAttachment requires cardId");let M=await L({cardId:w,role:A,turn:N,files:c.files});return {status:"success",data:{cardId:w,turn:N,files:M}}}async function J(c){let w=String(c.cardId||"").trim(),A=String(c.role||"").trim(),N=typeof c.text=="string"?c.text:"",M=typeof c.turn=="string"?c.turn:"";if(!w)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!A)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(A==="assistant"&&M){let ne=tt(await o.readAll({params:{cardId:w},body:{turnId:M}}),"chatStore.readAll(existing turn messages)"),xe=Array.isArray(ne.records)?ne.records.find(Ie=>Ie.role==="assistant"&&String(Ie.turn||"")===M):void 0;if(xe)return {status:"success",data:{cardId:w,id:String(xe.id),role:A,turn:M,files:Array.isArray(xe.files)?xe.files:[]}}}let K=await L({cardId:w,role:A,turn:M,files:c.files}),U=tt(await o.append({params:{cardId:w},body:{role:A,text:N,files:K,turn:M}}),"chatStore.append");return {status:"success",data:{cardId:w,id:String(U.id),role:A,turn:M,files:K}}}async function X(c,w={}){let A=String(c.cardId||"").trim(),N=W(c.patch);if(!A)throw new Error("managePatchCard requires cardId");let M=await q({cardId:A}),K=W(M[0]),U=ka(K,N);return H({cardId:A,candidateCardContent:U},w)}async function H(c,w={}){let A=String(c.cardId||"").trim(),N=W(c.candidateCardContent),M=kr(N);if(!A)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!==A)throw new Error(`candidateCardContent.id must match cardId (${A})`);let K=null;try{K=await s({candidateCardContent:M});}catch(le){let ge=le instanceof Error?le.message:String(le);if(!/non-core adapter is not configured/i.test(ge))throw le;K=null;}if(K!==null){let le=W(K),ge=W(le.data);if(le.status!=="success"||ge.isValid!==true)return {status:"fail",step:"validate",validation:K}}let U=null;try{U=await Pt(n,A);}catch{U=null;}let ne=U?W(U):null;if(ne&&Cr(ne)&&!w.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${A}" not found`),{statusCode:404});let xe={...M,...ne&&ha(ne,"__private")?{__private:ne.__private}:{}},Ie=await n.set({body:xe});tt(Ie,"cardStore.set");let Ae;try{Ae=await t.upsertCard({params:{cardId:A,restart:!0}}),tt(Ae,"upsertCard");}catch(le){try{U&&await n.set({body:U});}catch{}throw le}return {status:"success",data:{validation:K,card_saved:null,board_result:Ae}}}async function re(c,w={}){let A=String(c.cardId||"").trim();if(!A)throw new Error("manageRemoveCard requires cardId");if(!w.allowControlplaneOnlyCards){let K=await Qe(n.get({params:{id:A}}),"cardStore.get");if((Array.isArray(K.cards)?K.cards.map(W):[]).some(Cr))throw Object.assign(new Error(`Card "${A}" not found`),{statusCode:404})}let N=await t.removeCard({params:{id:A}});tt(N,"removeCard");let M=await n.del({params:{id:A}});return tt(M,"cardStore.del"),{status:"success",data:{board_result:N,store_result:M}}}async function ie(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("adminReadCard requires cardId");let A=await Qe(n.get({params:{id:w}}),"cardStore.get");return Array.isArray(A.cards)?A.cards.map(N=>W(N)):[]}async function Q(c){let w=String(c.cardId||"").trim(),A=W(c.candidateCardContent),N=kr(A);if(!w)throw new Error("adminUpsertCard requires cardId");if(typeof N.id!="string"||!N.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(N.id!==w)throw new Error(`candidateCardContent.id must match cardId (${w})`);let M=await s({candidateCardContent:N}),K=W(M),U=W(K.data);if(K.status!=="success"||U.isValid!==true)return {status:"fail",step:"validate",validation:M};let ne=null;try{ne=await Pt(n,w);}catch{ne=null;}let xe=ne?W(W(ne).__private):{},Ie={...N,__private:{...xe,visible_controlplane_only:true}},Ae=await n.set({body:Ie});tt(Ae,"cardStore.set");let le;try{le=await t.upsertCard({params:{cardId:w,restart:!0}}),tt(le,"upsertCard");}catch(ge){try{ne&&await n.set({body:ne});}catch{}throw ge}return {status:"success",data:{validation:M,card_saved:null,board_result:le}}}async function Z(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("getChatProcessing requires cardId");let A=io(await o.isProcessing({params:{cardId:w}}),"chatStore.isProcessing");return {cardId:w,active:!!A.active}}async function ae(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("setChatProcessing requires cardId");if(typeof c.active!="boolean")throw new Error("setChatProcessing requires boolean active");return tt(await o.setProcessing({params:{cardId:w},body:{active:c.active}}),"chatStore.setProcessing"),{cardId:w,active:c.active}}async function de(){let c=await v(a,"webhook.process-accumulated")();return c?.status==="fail"||c?.status==="error"?c:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(c??{},"data")?c.data??null:null}}}async function ke(c){let w=String(c.token||"").trim(),A=String(c.ref||"").trim();if(!w)throw new Error("webhookSourceFetchDone requires token");if(!A)throw new Error("webhookSourceFetchDone requires ref");let N=await v(d,"webhook.source-fetch-done")({token:w,ref:A});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:w,ref:A,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}async function E(c){let w=String(c.token||"").trim(),A=String(c.reason||"").trim();if(!w)throw new Error("webhookSourceFetchFailed requires token");if(!A)throw new Error("webhookSourceFetchFailed requires reason");let N=await v(u,"webhook.source-fetch-failed")({token:w,reason:A});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:w,reason:A,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}return {listRuntimeCards:S,discoverSourceKinds:T,inspectBoardRuntimeStatus:_,inspectCardDefinitionAndRuntime:x,inspectChatMessagesOnCards:h,inspectFileContents:f,preflightValidateCandidateCardDefinition:s,preflightMaterializeCandidateCard:l,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:g,preflightRunSingleSourceInLiveCard:k,preflightRunOneCycleWithCandidateCard:I,manageReadCard:q,manageAddChatAttachment:V,manageAddChatEntryAndAnyAttachments:J,managePatchCard:X,manageUpsertCard:H,manageRemoveCard:re,adminReadCard:ie,adminUpsertCard:Q,getChatProcessing:Z,setChatProcessing:ae,webhookProcessAccumulated:de,webhookSourceFetchDone:ke,webhookSourceFetchFailed:E}}async function Qe(e,t){return tt(await e,t)}function lo(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:a,readCardRuntimeArtifacts:d,readCardFromStore:u,readCardDefinitions:p,processAccumulatedLaneInternal:y,reportSourceFetched:C,reportSourceFetchFailure:v,uploadCardFile:S,chatStorePublic:B,serverUrl:T,apiBasePath:_}=e;function x(){return t[0]??null}function h(){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 g=m?.params?.key;return g?{status:"success",data:(await a())[g]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let g=m?.params?.key;return g?{status:"success",data:(await d())[g]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let g=m?.params?.key;if(!g)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let k=n(g)??x();return k?k.boardOps.getOutputsFetchedSources({params:{key:g}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let g=m?.params?.id;if(!g)return {status:"fail",error:"removeCard requires params.id"};let k=n(g)??x();return k?k.boardOps.removeCard({params:{id:g}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let g=m?.params?.cardId;if(!g)return {status:"fail",error:"upsertCard requires params.cardId"};let k=n(g)??x();if(!k)return {status:"fail",error:"Board context is unavailable"};let I=await k.boardOps.upsertCard({params:{cardId:g,restart:m.params.restart===true}});if(I.status!=="success")return I;if(Ze(k.boardAdapter)){let q=await y(true);if(q.status!=="success")return q}return I}}}function f(){let m=()=>{let g=x();if(!g?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return g.nonCore};return {describeTaskExecutorCapabilities(g){return m().describeTaskExecutorCapabilities(g)},validateCardPreflight(g){return m().validateCardPreflight(g)},evalCardCompute(g){return m().evalCardCompute(g)},probeSourcePreflight(g){return m().probeSourcePreflight(g)},runSourcePreflight(g){return m().runSourcePreflight(g)},simulateCardCycle(g){return m().simulateCardCycle(g)}}}function s(){return {async get(m){let g=typeof m.params?.id=="string"?m.params.id:void 0;if(g){let k=await u(g);return k?{status:"success",data:{cards:[k]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await p()}}},async set(m){let g=m.body;if(g==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let k=Array.isArray(g)?g:[g];for(let I of k){let q=I,L=typeof q.id=="string"?q.id:"";if(!L)return {status:"fail",error:"each card must have a string `id` field"};let V=r.get(L)??0,J=t[V]??x();if(!J)return {status:"fail",error:"Board context is unavailable"};let X=await J.cardStoreOps.set({body:q});if(X.status!=="success")return X;r.set(L,V);}return {status:"success",data:{count:k.length}}},async del(m){let g=[m.params?.id,...m.body?.ids??[]].filter(k=>typeof k=="string"&&!!k);if(g.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let k of g){let I=n(k)??x();if(!I)return {status:"fail",error:"Board context is unavailable"};let q=await I.cardStoreOps.del({params:{id:k}});if(q.status!=="success")return q;r.delete(k);}return {status:"success",data:{count:g.length}}},async patch(m){let g=typeof m.params?.id=="string"?m.params.id:void 0,k=typeof m.params?.path=="string"?m.params.path:void 0;if(!g||!k)return {status:"fail",error:"patch requires params.id and params.path"};let I=n(g)??x();return I?I.cardStoreOps.patch(m):{status:"fail",error:"Board context is unavailable"}},async appendFiles(m){let g=typeof m.params?.id=="string"?m.params.id:void 0;if(!g)return {status:"fail",error:"appendFiles requires params.id"};let k=n(g)??x();return k?k.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function l(){return co({board:h(),nonCore:f(),cardStore:s(),chatStore:B,processAccumulated:()=>y(true),sourceFetchDone:({token:m,ref:g})=>C(m,g),sourceFetchFailed:({token:m,reason:g})=>v(m,g),uploadCardFile({cardId:m,fileName:g,contentType:k,bytes:I,suppressChatRecordWrite:q}){return S(m,g,k,I,{inChat:true,...q===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:g,storedName:k}){let I=`${T||""}${_}/cards/${encodeURIComponent(m)}/files/${g}`;return k?`${I}?sn=${encodeURIComponent(k)}`:I},readFetchedSourceJsonByRef({cardId:m,ref:g}){let k=n(m)??x();if(!k||Ze(k.boardAdapter))return null;let L=k.boardAdapter.resolveBlob(st(g)).trim();return L?JSON.parse(L):null}})}return {mcpBoardFacade:h,mcpNonCoreFacade:f,mcpCardStoreFacade:s,createMcpFacade:l}}function fo(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:a,createMcpToolRegistry:d,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:p,sliceTextByLines:y}=e;async function C(v,S,B){let T=v.method||"GET",_=B,x=_.pathname;try{if(T==="POST"&&x===`${t}/mcp`){await o();let h=await n(v),f=typeof h.tool=="string"?h.tool.trim():"",s=h.args&&typeof h.args=="object"&&!Array.isArray(h.args)?h.args:{};if(!f)return r(S,400,{error:"tool is required"}),!0;if(f==="inspect.file-contents")return r(S,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let l=await mt(f,s,d(a()));if(l&&typeof l=="object"&&!Array.isArray(l)){let m=l;if(m.status==="fail")return r(S,400,{error:et(l,"Request failed")}),!0;if(m.status==="error")return r(S,500,{error:et(l,"Internal error")}),!0}r(S,200,l);}catch(l){let m=typeof l?.statusCode=="number"?Number(l.statusCode):500,g=l instanceof Error?l.message:String(l);r(S,m,{error:g});}return !0}if(T==="POST"&&x===`${t}/mcp-raw`){await o();let h=await n(v),f=typeof h.tool=="string"?h.tool.trim():"",s=h.args&&typeof h.args=="object"&&!Array.isArray(h.args)?h.args:{};if(!f)return r(S,400,{error:"tool is required"}),!0;if(f!=="inspect.file-contents")return r(S,400,{error:`Tool does not support raw response: ${f}`}),!0;let l=ce(s,"card_id","cardId"),m=it(s,"file_idx","fileIdx"),g=it(s,"head-lines","headLines"),k=it(s,"tail-lines","tailLines"),I=it(s,"head-bytes","headBytes"),q=it(s,"tail-bytes","tailBytes");if(!l)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([g,k,I,q].filter(de=>de!==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[de,ke]of [["head-lines",g],["tail-lines",k],["head-bytes",I],["tail-bytes",q]])if(ke!==void 0&&(!Number.isInteger(ke)||ke<0))return r(S,400,{error:`inspect.file-contents requires ${de} to be a non-negative integer`}),!0;let V=await a().inspectFileContents({cardId:l,fileIdx:m}),J=typeof V?.stored_name=="string"?V.stored_name:null,{fileRecord:X,bytes:H}=await u(l,m,J),re=String(X.name||X.stored_name||"download.bin"),ie=String(X.mime_type||"application/octet-stream"),Q=(_.searchParams.get("resp")||"").trim().toLowerCase();if(Q&&Q!=="json-b64")return r(S,400,{error:`unsupported resp mode: ${Q}`}),!0;let Z=Q==="json-b64",ae;if(g!==void 0||k!==void 0){if(!p(ie))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 de=new TextDecoder().decode(H),ke=g!==void 0?y(de,"head",g):y(de,"tail",k);ae=typeof Buffer<"u"?Buffer.from(ke,"utf8"):new TextEncoder().encode(ke);}else if(I!==void 0||q!==void 0){let de=I??q;ae=I!==void 0?H.slice(0,de):H.slice(Math.max(0,H.length-de));}else ae=H;if(Z){let de=typeof Buffer<"u"?Buffer.from(ae).toString("base64"):btoa(String.fromCharCode(...ae));return r(S,200,{bodyBase64:de,mimeType:ie,filename:re,byteLength:ae.length}),!0}return S.writeHead(200,{"Content-Type":ie,"Content-Disposition":`attachment; filename="${re}"`,"Content-Length":ae.length}),S.end(ae),!0}return !1}catch(h){let f=h?.statusCode||500;return r(S,f,{error:String(h?.message||h)}),true}}return {handleAgentfaceApi:C}}function mo(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:a}=e;async function d(u,p,y){let C=u.method||"GET",v=y.pathname;try{if(C==="POST"&&v===`${t}/mcp-webhooks`){await o();let S=await n(u),B=typeof S.tool=="string"?S.tool.trim():"",T=S.args&&typeof S.args=="object"&&!Array.isArray(S.args)?S.args:{};if(!B)return r(p,400,{error:"tool is required"}),!0;try{let _=await mt(B,T,a());if(_&&typeof _=="object"&&!Array.isArray(_)){let x=_;if(x.status==="fail")return r(p,400,{error:et(_,"Request failed")}),!0;if(x.status==="error")return r(p,500,{error:et(_,"Internal error")}),!0}r(p,200,_);}catch(_){let x=typeof _?.statusCode=="number"?Number(_.statusCode):500,h=_ instanceof Error?_.message:String(_);r(p,x,{error:h});}return !0}return !1}catch(S){let B=S?.statusCode||500;return r(p,B,{error:String(S?.message||S)}),true}}return {handleWebhooksApi:d}}function Hr(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:a,onChannelSubscribed:d,onChannelUnsubscribed:u}=e;function p(C,v,S,B,T){if(!t.has(v)){n(C,404,{error:`SSE client not connected: ${v}`});return}T?(t.subscribeChannel(v,S,B.cardId),d?.(v,S,B)):(t.unsubscribeChannel(v,S,B.cardId),u?.(v,S,B)),n(C,200,{ok:true,clientId:v,channelName:S,...B.cardId?{cardId:B.cardId}:{},subscribed:T});}async function y(C,v,S,B){let T=B?.oneShot===true,_=B?.bootstrapPayload!==false,x=!T&&S?t.get(S):null,h=x?new Set(x.subscribedChatCardIds):new Set,f=x?new Set(x.subscribedChannelNames):new Set,s=x?new Map(Array.from(x.subscribedCardChannels.entries(),([m,g])=>[m,new Set(g)])):new Map;if(v.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(v),_){let m=await o(),g=t.buildFrame(m);v.write(g);}if(T){v.end();return}if(!S)throw new Error("clientId is required for streaming SSE");t.register(S,v,{subscribedChatCardIds:h,subscribedChannelNames:f,subscribedCardChannels:s});try{a?.(S,m=>{t.writeFrame(S,m);});}catch{}let l=setInterval(()=>{try{v.write(`: keepalive
|
|
5
5
|
|
|
6
|
-
`);}catch{}},15e3);C.on("close",()=>{clearInterval(d),t.disconnect(k,b);});}return {handleChannelSubscription:m,handleSse:g}}function lo(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,boardContexts:c,publishPersistedStateSnapshot:u,upsertCardsFromSource:m,sseHub:g,queueSseHub:C}=e,{handleSse:b,handleChannelSubscription:k}=Jr(e),{handleSse:B}=Jr({...e,sseHub:C,buildPublishedRuntimePayload:async()=>null});async function P(_,x,y){let l=_.method||"GET",i=y,d=i.pathname;try{if(l==="GET"&&d===`${t}/sse`){let F=i.searchParams.has("one-shot");await o();let j=String(i.searchParams.get("clientId")||"").trim();if(!F&&!j)return r(x,400,{error:"clientId query param is required for SSE"}),!0;if(await b(_,x,j||void 0,{oneShot:F}),F)return !0;for(let V=0;V<c.length;V++)await u(c[V]),await m(c[V],V),await u(c[V]);return !0}if(l==="GET"&&d===`${t}/sse-q`){let F=String(i.searchParams.get("clientId")||"").trim();return F?(await B(_,x,F,{bootstrapPayload:!1}),!0):(r(x,400,{error:"clientId query param is required for SSE"}),!0)}let f=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(l==="POST"&&f){await s();let F=decodeURIComponent(f[1]),j=await n(_),V=typeof j?.clientId=="string"?j.clientId.trim():"";return V?await g.subscribeChat(V,F)?(r(x,200,{ok:!0,clientId:V,cardId:F,subscribed:!0}),!0):(r(x,404,{error:`SSE client not connected: ${V}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let p=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(l==="POST"&&p){await s();let F=decodeURIComponent(p[1]),j=await n(_),V=typeof j?.clientId=="string"?j.clientId.trim():"";return V?g.unsubscribeChat(V,F)?(r(x,200,{ok:!0,clientId:V,cardId:F,subscribed:!1}),!0):(r(x,404,{error:`SSE client not connected: ${V}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let R=d.match(new RegExp(`^${ot(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&R){await s();let F=decodeURIComponent(R[1]),j=R[2]==="subscribe",V=await n(_),Q=typeof V?.clientId=="string"?V.clientId.trim():"";return Q?(k(x,Q,F,{},j),!0):(r(x,400,{error:"clientId is required"}),!0)}let A=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&A){await s();let F=decodeURIComponent(A[1]),j=decodeURIComponent(A[2]),V=A[3]==="subscribe",Q=await n(_),re=typeof Q?.clientId=="string"?Q.clientId.trim():"";return re?(k(x,re,j,{cardId:F},V),!0):(r(x,400,{error:"clientId is required"}),!0)}return !1}catch(f){let p=f?.statusCode||500;return r(x,p,{error:String(f?.message||f)}),true}}return {handleWatchersRoutes:P,handleSse:b,handleChannelSubscription:k}}var Ra=3e4;function Ca(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function fo(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,s=`${t}/notify-q`;async function c(u,m,g){if(g.pathname!==s)return false;if((u.method??"").toUpperCase()!=="POST")return o(m,405,{status:"error",error:"Method not allowed"}),true;if(!Ca(u))return o(m,403,{status:"error",error:"Forbidden"}),true;let C;try{C=await n(u);}catch{return o(m,400,{status:"error",error:"Invalid JSON body"}),true}if(!C||typeof C!="object"||!Array.isArray(C.notifications))return o(m,400,{status:"error",error:"body.notifications must be an array"}),true;let b=C.notifications,{accepted:k,rejected:B}=Gn(b,Date.now(),Ra);return k.length>0&&r(k),o(m,200,{status:"success",data:{accepted:k.length,rejected:B}}),true}return {handleNotifyRoute:c}}var po={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},mo="chat-handler-flow-queue",Nt="__probe__echo__probe__";function ka(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...po,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},c=e.invocationAdapter,u=e.chatFlowRunner||null,m=e.notificationTransport||null,g=e.serverUrl||null,C=e.executionExtra||{},b=e.onSseClientConnected,k=e.onSseClientDisconnected,B=e.onChannelSubscribed,P=e.onChannelUnsubscribed,_=Mr({buildChatOneShotBatch:async(a,S)=>await ie.buildSseOneShotBatch({params:{cardId:a},body:{receiving:S}}),onSseClientDisconnected:k}),x=Mr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function y(a){function S(ee){return {...ee,queueStorageForRef(me,_e){return $n(ee.queueStorageForRef(me,_e),{lane:_e,emitNotification:Z})}}}function E(ee){return {...ee,queueStorageForRef(me,_e){return Dn(ee.queueStorageForRef(me,_e),{lane:_e,emitNotification:Z})}}}function D(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 K(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 te=null;function Z(ee){if(ee.kind==="notification-batch"){J(ee.notifications,te??void 0);return}J([ee],te??void 0);}let ue=tt(a.boardAdapter)?E(a.boardAdapter):S(a.boardAdapter),Me=a.nonCoreAdapter??(!tt(ue)&&R(ue)?ue:null),Ae=tt(ue)?Mn(a.baseRef,ue,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:Z}):_n(a.baseRef,ue,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:Z}),$e=a.nonCore??(Me?En(a.baseRef,Me,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,taskExecutorRef:a.taskExecutorRef}):null),Cr=ue.chatStorageForRef(a.chatStoreRef),kr,yo=tt(ue)?(()=>{let ee=mr(fr(lr(ue.kvStorageForRef(a.cardStoreRef)),ue.hashFn),s.warn),me=ur(ee,{emitNotification:Z}),_e=K(me);return kr={get(we){return _e.get(we)},set(we){return _e.set(we)}},_e})():(()=>{let ee=ue.kvStorageForRef(a.cardStoreRef),_e=sr(Ft({readIndex:()=>ee.read("_index"),writeIndex:we=>ee.write("_index",we),readCard:we=>ee.read(we),writeCard:(we,Sr)=>(ee.write(we,Sr),we),removeCard:we=>{ee.delete(we);},cardExists:we=>ee.read(we)!==null,defaultCardKey:we=>we},s.warn),{emitNotification:Z});return kr=_e,D(_e)})(),br;if(tt(ue)){let ee=ue.blobStorageForRef(a.artifactsStoreRef);br={async putBytes(me,_e){if(ee.writeBytes){await ee.writeBytes(me,_e);return}let we=JSON.stringify({__kind:"bytes-array",data:[..._e]});await ee.write(me,we);},async getBytes(me){if(ee.readBytes){let we=await ee.readBytes(me);if(we!==null)return we}let _e=await ee.read(me);if(_e===null)return null;try{let we=JSON.parse(_e);if(we&&we.__kind==="bytes-array"&&Array.isArray(we.data))return new Uint8Array(we.data)}catch{}return new TextEncoder().encode(_e)},async listKeys(me){return await ee.listKeys(me)}};}else {let ee=ue.blobStorageForRef(a.artifactsStoreRef),me=Kn(ee);br={putBytes(_e,we,Sr){me.putBytes(_e,we,Sr);},getBytes(_e){return me.getBytes(_e)},listKeys(_e){return me.list(_e).map(we=>we.key)}};}let ho={async init(ee){return Ae.init(ee)},async status(ee){return Ae.status(ee)},async getConfig(ee){return Ae.getConfig(ee)},async getAllOutputsDataObjects(ee){return Ae.getAllOutputsDataObjects(ee)},async getAllOutputsComputedValues(ee){return Ae.getAllOutputsComputedValues(ee)},async getOutputsFetchedSources(ee){return Ae.getOutputsFetchedSources(ee)},async buildSseOneShotPayload(ee){return Ae.buildSseOneShotPayload(ee)},async upsertCard(ee){return Ae.upsertCard(ee)},async removeCard(ee){return Ae.removeCard(ee)},async sourceDataFetched(ee){return Ae.sourceDataFetched(ee)},async sourceDataFetchFailure(ee){return Ae.sourceDataFetchFailure(ee)}};return te={label:a.label,board:Ae,nonCore:$e,publicCardStore:kr,boardOps:ho,cardStoreOps:yo,get filesArtifacts(){return br},get chatStorage(){return Cr},boardAdapter:ue,boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,artifactsStoreRef:a.artifactsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:zn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},te}let l=e.boards.map(y),i=new Map;function d(a){return i.get(a)??0}function f(a){return a.queueStoreRef}function p(a,S){if(tt(a.boardAdapter)){let D=a.boardAdapter.queueStorageForRef(f(a),S);return qr(D)}let E=a.boardAdapter.queueStorageForRef(f(a),S);return jr(E)}function R(a){let S=a;return typeof S.invokeExecutor=="function"&&typeof S.validateSchema=="function"}function A(a){let S=l[d(a)];return {files:S?S.filesArtifacts:null}}function F(){return Hn()}function j(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function V(a){return "cardId"in a&&typeof a.cardId=="string"?L(a.cardId)??void 0:l[0]??void 0}function Q(a){for(let S of a){let E=V(S);if(E)return E}return l[0]??void 0}function re(a,S={}){if(!a||a.length===0)return;let E=qe(a),D={kind:"notification-batch",notifications:E},K=S.ctx??Q(E);if(S.appendState!==false&&K&&Yn(K.notification,D),S.broadcastSse!==false){let te=E.filter(ue=>ue.kind==="message_enqueued"),Z=E.filter(ue=>ue.kind!=="message_enqueued");Z.length>0&&_.broadcastNotificationBatch(Z),te.length>0&&x.broadcastNotificationBatch(te);}if(!(S.mirrorExternal===false||!K?.boardAdapter.publishBoardChangeNotifications))try{let te=E.filter(Z=>Z.category==="board-output"||Z.category==="card-store");te.length>0&&K.boardAdapter.publishBoardChangeNotifications(te);}catch{}}function J(a,S){re(a,{ctx:S,appendState:true,broadcastSse:true,mirrorExternal:true});}async function se(a){if(!a||a.notificationTeardown||!m||!a.notifyRef)return;let S=await m.subscribe(a.notifyRef,E=>{let D=Qn(E);re(D,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});});a.notificationTeardown=S;}async function de(a){if(!a||a.initialized)return;let S={boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,artifactsStoreRef:a.artifactsStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef},E={};a.taskExecutorRef&&(E["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=a.chatHandlerFlow);let D=await a.boardOps.init({params:S,body:E});if(D.status!=="success")throw Object.assign(new Error(D.error||`init failed for ${a.label}`),{statusCode:500});if(await se(a),!a.chatHandlerFlow&&a.chatHandlerRef&&c.describe)try{let K=await c.describe(a.chatHandlerRef);K&&K.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${K.kind}", expected "chat-handler" for ${a.label}`):K&&s.info(`[init] chat-handler validated: ${K.name} (protocol ${K.protocolVersion}) for ${a.label}`);}catch(K){s.warn(`[init] chat-handler describe failed for ${a.label}: ${K?.message||String(K)}`);}a.initialized=true;}async function G(a){let S=[],E=await a.boardOps.status({});E.status==="success"&&E.data!=null&&Lr(E.data)&&S.push({kind:"status",status:E.data});let D=await a.boardOps.getAllOutputsDataObjects({});if(D.status==="success"&&D.data!=null)for(let[te,Z]of Object.entries(D.data))te&&S.push({kind:"data_object",key:te,payload:Z});let K=await a.boardOps.getAllOutputsComputedValues({});if(K.status==="success"&&K.data!=null)for(let[te,Z]of Object.entries(K.data))te&&Z&&typeof Z=="object"&&!Array.isArray(Z)&&S.push({kind:"computed_values",cardId:te,values:Z});S.length>0&&re(S,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});}async function Y(a,S){if(!a||a.cardsBootstrapped)return;let E=await a.cardStoreOps.get({}),D=E.status==="success"&&Array.isArray(E.data?.cards)?E.data.cards:[];for(let K of D)typeof K.id=="string"&&(i.set(K.id,S),await a.boardOps.upsertCard({params:{cardId:K.id}}));a.cardsBootstrapped=true;}async function T(){for(let a of l)await de(a);}async function w(){await T();for(let a=0;a<l.length;a++)await G(l[a]),await Y(l[a],a),await G(l[a]);}async function H(a=false){a||await T();for(let S of l){let E=await S.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}function L(a){return l[d(a)]??null}async function v(a){let S=L(a);if(!S)return null;let E=await S.cardStoreOps.get({params:{id:a}});if(E.status!=="success")return null;let D=Array.isArray(E.data?.cards)?E.data.cards:[];return D.length>0?D[0]:null}async function I(){let a=async E=>{if(!E)return [];let D=await E.cardStoreOps.get({});return D.status!=="success"||!Array.isArray(D.data?.cards)?[]:D.data.cards},S=[];for(let E of l)S.push(...await a(E));return S}function O(){return l[0]??null}function N(a){return L(a)??O()}function $(a){let S=N(a);if(!S)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${a}`),{statusCode:404});return S.chatStorage}async function z(a){return await $(a).isProcessing(a)}async function oe(a,S){let E=await ie.setProcessing({params:{cardId:a},body:{active:S}});if(E.status!=="success")throw Object.assign(new Error(E.error||`Failed to set chat processing for card: ${a}`),{statusCode:500})}let ie=Jn({append(a,S,E,D,K){return $(a).append(a,S,E,D,K)},readAll(a){return $(a).readAll(a)},readAfter(a,S){return $(a).readAfter(a,S)},clear(a){return $(a).clear(a)},setProcessing(a,S){return $(a).setProcessing(a,S)},isProcessing(a){return $(a).isProcessing(a)},getConfig(a){return $(a).getConfig(a)},setConfig(a,S){return $(a).setConfig(a,S)}},{emitNotification(a){if(a.kind==="notification-batch"){J(a.notifications);return}J([a]);}}),Pe=io({boardContexts:l,cardOwnerIndex:i,cardContextForCard:a=>L(a),readStatusSnapshot:()=>Le(),readDataObjectsByToken:()=>Ze(),readCardRuntimeArtifacts:()=>pe(),readCardFromStore:a=>v(a),readCardDefinitions:()=>I(),processAccumulatedLaneInternal:a=>H(a),reportSourceFetched:(a,S)=>It(a,{ref:S}),reportSourceFetchFailure:(a,S)=>jt(a,{reason:S}),uploadCardFile:(a,S,E,D,K)=>he(a,S,E,D,K),chatStorePublic:ie,serverUrl:g,apiBasePath:t}),Be=Pe.mcpCardStoreFacade,Ee=Pe.createMcpFacade,ye=Xn({boardId:o,bootstrapBoard:()=>w(),sseHub:_,onChannelSubscribed:B,onChannelUnsubscribed:P,getMcpFacade:()=>Ee(),getMcpCardStoreFacade:()=>Be()});function Ce(a){return to(a)}function je(){return ro(Ee())}function Se(){return no({boardId:o,uploadCardFile:he,getMcpFacade:()=>Ee(),controlplane:ye})}let Fe=Zn({boardId:o,boardContexts:l,readChatRecords:a=>ae(a),getChatProcessing:a=>z(a)}),Le=Fe.readStatusSnapshot,pe=Fe.readCardRuntimeArtifacts,Ze=Fe.readDataObjectsByToken,Ke=Fe.buildPublishedRuntimePayload;async function Ve(a,S,E){let D=E?.syncBoard!==false,K=E?.restartOnlyIfChanged===true,te=L(a);if(!te)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let Z=await v(a);if(!Z)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let ue=K?JSON.stringify(Z):null,Me=S(Z)||Z;if(K&&JSON.stringify(Me)===ue)return;let Ae=await te.cardStoreOps.set({body:Me});if(Ae.status!=="success")throw Object.assign(new Error(Ae.error||`Failed to persist card: ${a}`),{statusCode:500});if(D){let $e=await te.boardOps.upsertCard({params:{cardId:a,restart:true}});if($e.status!=="success")throw Object.assign(new Error($e.error||`Failed to upsert card: ${a}`),{statusCode:500})}}async function et(a,S){await Ve(a,S,{syncBoard:true});}async function M(a,S){await Ve(a,S,{syncBoard:false});}async function h(a){let S=L(a);if(!S)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});if(!await v(a))throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let D=await S.boardOps.upsertCard({params:{cardId:a,restart:true}});if(D.status!=="success")throw Object.assign(new Error(D.error||`Failed to retrigger card: ${a}`),{statusCode:500})}async function q(a){let S=await ie.clear({params:{cardId:a}});if(S.status!=="success")throw Object.assign(new Error(S.error||`Failed to clear chat records for card: ${a}`),{statusCode:500});try{await oe(a,!1);}catch{}}async function U(a,S,E,D,K=""){let te=typeof E=="string"?E.trim():"",Z=await ie.append({params:{cardId:a},body:{role:S||"system",text:te,files:D,turn:K}});if(Z.status!=="success")throw Object.assign(new Error(Z.error||`Failed to append chat record for card: ${a}`),{statusCode:500});return String(Z.data?.id||"")}async function ae(a){return await $(a).readAll(a)}let he=eo({safeCardId:a=>j(a),artifactsStores:a=>A(a),cardFileMetadataStore:()=>F(),readCardFromStore:a=>v(a),updateCardLocalOnly:(a,S)=>M(a,S),writeChatRecord:(a,S,E,D,K)=>U(a,S,E,D,K)}).uploadCardFile;async function fe(a){let S=L(a);if(!S)return null;let E=await S.boardOps.getConfig({params:{key:"chat-handler-flow"}}),K=(E.status==="success"?E.data?.value:null)??S.chatHandlerFlow??null,te=S.chatHandlerRef;return K==null&&(!te||typeof te!="object")?null:{ctx:S,handlerFlow:K,handlerRef:te}}function ke(a){let S=typeof a=="string"?a.trim():"";if(S.length<Nt.length*2||!S.startsWith(Nt)||!S.endsWith(Nt))return null;let E=S.slice(Nt.length,S.length-Nt.length).trim(),D=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(E);return D?{assistant:D[1].trim().toLowerCase(),text:D[2].trim()}:{assistant:"echo",text:E}}async function Te(a,S,E=false,D="",K=""){try{let te=await fe(a);if(!te){try{await oe(a,!1);}catch{}return}let{ctx:Z,handlerFlow:ue,handlerRef:Me}=te;if(!E)try{await oe(a,!0);}catch{}let Ae={boardId:o,cardId:String(a),lastChatEntryId:S,...D?{turnId:D}:{},...typeof K=="string"&&K.trim()?{probe:K.trim()}:{},...C,...g?{serverUrl:g}:{}},$e=ue!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:mo}}:Me;tt(Z.boardAdapter)?await p(Z,"chat-agent").enqueueRequest({boardId:o,ref:$e,args:ue!=null?{...Ae,__chatHandlerFlow:ue}:Ae}):p(Z,"chat-agent").enqueueRequest({boardId:o,ref:$e,args:ue!=null?{...Ae,__chatHandlerFlow:ue}:Ae}),await Promise.resolve(Z.boardAdapter.requestProcessAccumulated?.());}catch(te){try{await oe(a,!1);}catch{}s.warn(`[chat-handler] queue failed for card "${a}": ${te instanceof Error?te.message:String(te)}`);}}async function He(a,S,E){if(S.howToRun==="built-in"&&zr(S)===mo){let D=u,K=E.__chatHandlerFlow,te={...E};return delete te.__chatHandlerFlow,D?D.run(K,te,{boardId:o,cardId:String(te.cardId||""),label:a.label,logger:s,serverUrl:g,executionExtra:C}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return c.invoke(S,E)}async function Je(a,S=false){S||await T();let E=typeof a.args?.cardId=="string"?a.args.cardId:"",D=E?L(E):O();if(!D)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let K=await He(D,a.ref,a.args);if(!K.dispatched){if(E)try{await oe(E,!1);}catch{}throw new Error(K.error||`chat-agent dispatch failed for card "${E||"unknown"}"`)}}async function De(a,S,E){if(S==="chat-send"){let K=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 te=Se(),Z=ke(E?.text),ue=Z?Z.text:E?.text,Me=await mt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:a,role:"user",text:ue,turn_id:K,files:[]},te);if(Me?.status!=="success")throw new Error(rt(Me,`chat-send append failed for card ${a}`));let Ae=Me?.data?.id;if(typeof Ae!="string"||!Ae)throw new Error(`chat-send did not return an append id for card ${a}`);let $e=await mt("setstate.chat-processing-started",{board_id:o,card_id:a},te);if($e?.status!=="success")throw new Error(rt($e,`chat-send processing update failed for card ${a}`));Te(a,Ae,true,K,Z?.assistant||"");return}await et(a,K=>{let te=new Date().toISOString(),Z=K.card_data&&typeof K.card_data=="object"?K.card_data:{};if(K.card_data=Z,S==="file-upload"){let ue=F().normalizeIncoming(E?.files,te);return ue.length>0&&F().merge(Z,ue),K}if(S==="action"){let ue=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!ue)return K;Z.lastAction={buttonId:ue,at:te},Z.lastActionText=`${ue} @ ${te}`;}return K});}function We(a,S,E){let D=JSON.stringify(E),K=typeof Buffer<"u"?Buffer.byteLength(D):new TextEncoder().encode(D).length;a.writeHead(S,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":K}),a.end(D);}async function ze(a,S,E){let D=await v(a);if(!D)throw Object.assign(new Error("Card not found"),{statusCode:404});let K=F().resolve(D.card_data,S,E);if(!K.ok&&K.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!K.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let te=K.file,Z=j(a),ue=A(a),Me=String(te.stored_name||""),Ae=`${Z}/${Me}`,$e=ue.files?await ue.files.getBytes(Ae):null;if(!$e)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:te,bytes:$e}}async function dt(a,S,E,D){let{fileRecord:K,bytes:te}=await ze(S,E,D),Z=String(K.name||K.stored_name||"download.bin"),ue=String(K.mime_type||"application/octet-stream");a.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${Z}"`,"Content-Length":te.length}),a.end(te);}function At(a){let S=String(a||"").toLowerCase();return S.startsWith("text/")||S.includes("json")||S.includes("xml")||S.includes("javascript")||S.includes("typescript")||S.includes("yaml")||S.includes("csv")}function xt(a,S,E){let D=a.split(/\r?\n/);return (S==="head"?D.slice(0,E):D.slice(-E)).join(`
|
|
7
|
-
`)}async function
|
|
6
|
+
`);}catch{}},15e3);C.on("close",()=>{clearInterval(l),t.disconnect(S,v);});}return {handleChannelSubscription:p,handleSse:y}}function po(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:a,boardContexts:d,publishPersistedStateSnapshot:u,upsertCardsFromSource:p,sseHub:y,queueSseHub:C}=e,{handleSse:v,handleChannelSubscription:S}=Hr(e),{handleSse:B}=Hr({...e,sseHub:C,buildPublishedRuntimePayload:async()=>null});async function T(_,x,h){let f=_.method||"GET",s=h,l=s.pathname;try{if(f==="GET"&&l===`${t}/sse`){let q=s.searchParams.has("one-shot");await o();let L=String(s.searchParams.get("clientId")||"").trim();if(!q&&!L)return r(x,400,{error:"clientId query param is required for SSE"}),!0;if(await v(_,x,L||void 0,{oneShot:q}),q)return !0;for(let V=0;V<d.length;V++)await u(d[V]),await p(d[V],V),await u(d[V]);return !0}if(f==="GET"&&l===`${t}/sse-q`){let q=String(s.searchParams.get("clientId")||"").trim();return q?(await B(_,x,q,{bootstrapPayload:!1}),!0):(r(x,400,{error:"clientId query param is required for SSE"}),!0)}let m=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(f==="POST"&&m){await a();let q=decodeURIComponent(m[1]),L=await n(_),V=typeof L?.clientId=="string"?L.clientId.trim():"";return V?await y.subscribeChat(V,q)?(r(x,200,{ok:!0,clientId:V,cardId:q,subscribed:!0}),!0):(r(x,404,{error:`SSE client not connected: ${V}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let g=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(f==="POST"&&g){await a();let q=decodeURIComponent(g[1]),L=await n(_),V=typeof L?.clientId=="string"?L.clientId.trim():"";return V?y.unsubscribeChat(V,q)?(r(x,200,{ok:!0,clientId:V,cardId:q,subscribed:!1}),!0):(r(x,404,{error:`SSE client not connected: ${V}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let k=l.match(new RegExp(`^${ot(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&k){await a();let q=decodeURIComponent(k[1]),L=k[2]==="subscribe",V=await n(_),J=typeof V?.clientId=="string"?V.clientId.trim():"";return J?(S(x,J,q,{},L),!0):(r(x,400,{error:"clientId is required"}),!0)}let I=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&I){await a();let q=decodeURIComponent(I[1]),L=decodeURIComponent(I[2]),V=I[3]==="subscribe",J=await n(_),X=typeof J?.clientId=="string"?J.clientId.trim():"";return X?(S(x,X,L,{cardId:q},V),!0):(r(x,400,{error:"clientId is required"}),!0)}return !1}catch(m){let g=m?.statusCode||500;return r(x,g,{error:String(m?.message||m)}),true}}return {handleWatchersRoutes:T,handleSse:v,handleChannelSubscription:S}}var Ca=3e4;function ba(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function go(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,a=`${t}/notify-q`;async function d(u,p,y){if(y.pathname!==a)return false;if((u.method??"").toUpperCase()!=="POST")return o(p,405,{status:"error",error:"Method not allowed"}),true;if(!ba(u))return o(p,403,{status:"error",error:"Forbidden"}),true;let C;try{C=await n(u);}catch{return o(p,400,{status:"error",error:"Invalid JSON body"}),true}if(!C||typeof C!="object"||!Array.isArray(C.notifications))return o(p,400,{status:"error",error:"body.notifications must be an array"}),true;let v=C.notifications,{accepted:S,rejected:B}=Yn(v,Date.now(),Ca);return S.length>0&&r(S),o(p,200,{status:"success",data:{accepted:S.length,rejected:B}}),true}return {handleNotifyRoute:d}}var ho={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},yo="chat-handler-flow-queue",Mt="__probe__echo__probe__";function Sa(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...ho,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",a=e.logger||{info:console.log,warn:console.warn,error:console.error},d=e.invocationAdapter,u=e.chatFlowRunner||null,p=e.notificationTransport||null,y=e.serverUrl||null,C=e.executionExtra||{},v=e.onSseClientConnected,S=e.onSseClientDisconnected,B=e.onChannelSubscribed,T=e.onChannelUnsubscribed,_=Lr({buildChatOneShotBatch:async(i,P)=>await ne.buildSseOneShotBatch({params:{cardId:i},body:{receiving:P}}),onSseClientDisconnected:S}),x=Lr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function h(i){function P(z){return {...z,queueStorageForRef(me,Ee){return Kn(z.queueStorageForRef(me,Ee),{lane:Ee,emitNotification:G})}}}function b(z){return {...z,queueStorageForRef(me,Ee){return Un(z.queueStorageForRef(me,Ee),{lane:Ee,emitNotification:G})}}}function O(z){return {async get(me){return z.get(me)},async set(me){return z.set(me)},async del(me){return z.del(me)},async patch(me){return z.patch(me)},async appendFiles(me){return z.appendFiles(me)}}}function D(z){return {async get(me){return await z.get(me)},async set(me){return await z.set(me)},async del(me){return await z.del(me)},async patch(me){return await z.patch(me)},async appendFiles(me){return await z.appendFiles(me)}}}let Y=null;function G(z){if(z.kind==="notification-batch"){H(z.notifications,Y??void 0);return}H([z],Y??void 0);}let oe=Ze(i.boardAdapter)?b(i.boardAdapter):P(i.boardAdapter),Be=i.nonCoreAdapter??(!Ze(oe)&&k(oe)?oe:null),ue=Ze(oe)?Vn(i.baseRef,oe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,scratchStoreRef:i.scratchStoreRef,taskExecutorRef:i.taskExecutorRef,chatHandlerFlow:i.chatHandlerFlow,emitNotification:G}):Bn(i.baseRef,oe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,scratchStoreRef:i.scratchStoreRef,taskExecutorRef:i.taskExecutorRef,chatHandlerFlow:i.chatHandlerFlow,emitNotification:G}),Le=i.nonCore??(Be?On(i.baseRef,Be,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,taskExecutorRef:i.taskExecutorRef}):null),vt=oe.chatStorageForRef(i.chatStoreRef),At,Ut=Ze(oe)?(()=>{let z=hr(yr(gr(oe.kvStorageForRef(i.cardStoreRef)),oe.hashFn),a.warn),me=fr(z,{emitNotification:G}),Ee=D(me);return At={get(we){return Ee.get(we)},set(we){return Ee.set(we)}},Ee})():(()=>{let z=oe.kvStorageForRef(i.cardStoreRef),Ee=dr(jt({readIndex:()=>z.read("_index"),writeIndex:we=>z.write("_index",we),readCard:we=>z.read(we),writeCard:(we,br)=>(z.write(we,br),we),removeCard:we=>{z.delete(we);},cardExists:we=>z.read(we)!==null,defaultCardKey:we=>we},a.warn),{emitNotification:G});return At=Ee,O(Ee)})(),Et;if(Ze(oe)){let z=oe.blobStorageForRef(i.artifactsStoreRef);Et={async putBytes(me,Ee){if(z.writeBytes){await z.writeBytes(me,Ee);return}let we=JSON.stringify({__kind:"bytes-array",data:[...Ee]});await z.write(me,we);},async getBytes(me){if(z.readBytes){let we=await z.readBytes(me);if(we!==null)return we}let Ee=await z.read(me);if(Ee===null)return null;try{let we=JSON.parse(Ee);if(we&&we.__kind==="bytes-array"&&Array.isArray(we.data))return new Uint8Array(we.data)}catch{}return new TextEncoder().encode(Ee)},async listKeys(me){return await z.listKeys(me)}};}else {let z=oe.blobStorageForRef(i.artifactsStoreRef),me=Qn(z);Et={putBytes(Ee,we,br){me.putBytes(Ee,we,br);},getBytes(Ee){return me.getBytes(Ee)},listKeys(Ee){return me.list(Ee).map(we=>we.key)}};}let ko={async init(z){return ue.init(z)},async status(z){return ue.status(z)},async getConfig(z){return ue.getConfig(z)},async getAllOutputsDataObjects(z){return ue.getAllOutputsDataObjects(z)},async getAllOutputsComputedValues(z){return ue.getAllOutputsComputedValues(z)},async getOutputsFetchedSources(z){return ue.getOutputsFetchedSources(z)},async buildSseOneShotPayload(z){return ue.buildSseOneShotPayload(z)},async upsertCard(z){return ue.upsertCard(z)},async removeCard(z){return ue.removeCard(z)},async sourceDataFetched(z){return ue.sourceDataFetched(z)},async sourceDataFetchFailure(z){return ue.sourceDataFetchFailure(z)}};return Y={label:i.label,board:ue,nonCore:Le,publicCardStore:At,boardOps:ko,cardStoreOps:Ut,get filesArtifacts(){return Et},get chatStorage(){return vt},boardAdapter:oe,boardRuntimeStoreRef:i.boardRuntimeStoreRef,cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef,artifactsStoreRef:i.artifactsStoreRef,fetchedSourcesStoreRef:i.fetchedSourcesStoreRef,queueStoreRef:i.queueStoreRef,chatStoreRef:i.chatStoreRef,scratchStoreRef:i.scratchStoreRef,notifyRef:i.notifyRef,taskExecutorRef:i.taskExecutorRef,chatHandlerRef:i.chatHandlerRef,chatHandlerFlow:i.chatHandlerFlow,inferenceAdapterRef:i.inferenceAdapterRef,notification:Zn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},Y}let f=e.boards.map(h),s=new Map;function l(i){return s.get(i)??0}function m(i){return i.queueStoreRef}function g(i,P){if(Ze(i.boardAdapter)){let O=i.boardAdapter.queueStorageForRef(m(i),P);return Fr(O)}let b=i.boardAdapter.queueStorageForRef(m(i),P);return Nr(b)}function k(i){let P=i;return typeof P.invokeExecutor=="function"&&typeof P.validateSchema=="function"}function I(i){let P=f[l(i)];return {files:P?P.filesArtifacts:null}}function q(){return Gn()}function L(i){return String(i||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function V(i){return "cardId"in i&&typeof i.cardId=="string"?E(i.cardId)??void 0:f[0]??void 0}function J(i){for(let P of i){let b=V(P);if(b)return b}return f[0]??void 0}function X(i,P={}){if(!i||i.length===0)return;let b=Fe(i),O={kind:"notification-batch",notifications:b},D=P.ctx??J(b);if(P.appendState!==false&&D&&eo(D.notification,O),P.broadcastSse!==false){let Y=b.filter(oe=>oe.kind==="message_enqueued"),G=b.filter(oe=>oe.kind!=="message_enqueued");G.length>0&&_.broadcastNotificationBatch(G),Y.length>0&&x.broadcastNotificationBatch(Y);}if(!(P.mirrorExternal===false||!D?.boardAdapter.publishBoardChangeNotifications))try{let Y=b.filter(G=>G.category==="board-output"||G.category==="card-store");Y.length>0&&D.boardAdapter.publishBoardChangeNotifications(Y);}catch{}}function H(i,P){X(i,{ctx:P,appendState:true,broadcastSse:true,mirrorExternal:true});}async function re(i){if(!i||i.notificationTeardown||!p||!i.notifyRef)return;let P=await p.subscribe(i.notifyRef,b=>{let O=zn(b);X(O,{ctx:i,appendState:true,broadcastSse:true,mirrorExternal:false});});i.notificationTeardown=P;}async function ie(i){if(!i||i.initialized)return;let P={boardRuntimeStoreRef:i.boardRuntimeStoreRef,cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef,fetchedSourcesStoreRef:i.fetchedSourcesStoreRef,artifactsStoreRef:i.artifactsStoreRef,queueStoreRef:i.queueStoreRef,chatStoreRef:i.chatStoreRef,scratchStoreRef:i.scratchStoreRef},b={};i.taskExecutorRef&&(b["task-executor-ref"]=i.taskExecutorRef),i.chatHandlerFlow!==void 0&&(b["chat-handler-flow"]=i.chatHandlerFlow);let O=await i.boardOps.init({params:P,body:b});if(O.status!=="success")throw Object.assign(new Error(O.error||`init failed for ${i.label}`),{statusCode:500});if(await re(i),!i.chatHandlerFlow&&i.chatHandlerRef&&d.describe)try{let D=await d.describe(i.chatHandlerRef);D&&D.kind!=="chat-handler"?a.warn(`[init] chat-handler describe returned kind="${D.kind}", expected "chat-handler" for ${i.label}`):D&&a.info(`[init] chat-handler validated: ${D.name} (protocol ${D.protocolVersion}) for ${i.label}`);}catch(D){a.warn(`[init] chat-handler describe failed for ${i.label}: ${D?.message||String(D)}`);}i.initialized=true;}async function Q(i){let P=[],b=await i.boardOps.status({});b.status==="success"&&b.data!=null&&jr(b.data)&&P.push({kind:"status",status:b.data});let O=await i.boardOps.getAllOutputsDataObjects({});if(O.status==="success"&&O.data!=null)for(let[Y,G]of Object.entries(O.data))Y&&P.push({kind:"data_object",key:Y,payload:G});let D=await i.boardOps.getAllOutputsComputedValues({});if(D.status==="success"&&D.data!=null)for(let[Y,G]of Object.entries(D.data))Y&&G&&typeof G=="object"&&!Array.isArray(G)&&P.push({kind:"computed_values",cardId:Y,values:G});P.length>0&&X(P,{ctx:i,appendState:true,broadcastSse:true,mirrorExternal:false});}async function Z(i,P){if(!i||i.cardsBootstrapped)return;let b=await i.cardStoreOps.get({}),O=b.status==="success"&&Array.isArray(b.data?.cards)?b.data.cards:[];for(let D of O)typeof D.id=="string"&&(s.set(D.id,P),await i.boardOps.upsertCard({params:{cardId:D.id}}));i.cardsBootstrapped=true;}async function ae(){for(let i of f)await ie(i);}async function de(){await ae();for(let i=0;i<f.length;i++)await Q(f[i]),await Z(f[i],i),await Q(f[i]);}async function ke(i=false){i||await ae();for(let P of f){let b=await P.board.processAccumulatedEvents({});if(b.status!=="success")return b}return {status:"success"}}function E(i){return f[l(i)]??null}async function c(i){let P=E(i);if(!P)return null;let b=await P.cardStoreOps.get({params:{id:i}});if(b.status!=="success")return null;let O=Array.isArray(b.data?.cards)?b.data.cards:[];return O.length>0?O[0]:null}async function w(){let i=async b=>{if(!b)return [];let O=await b.cardStoreOps.get({});return O.status!=="success"||!Array.isArray(O.data?.cards)?[]:O.data.cards},P=[];for(let b of f)P.push(...await i(b));return P}function A(){return f[0]??null}function N(i){return E(i)??A()}function M(i){let P=N(i);if(!P)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${i}`),{statusCode:404});return P.chatStorage}async function K(i){return await M(i).isProcessing(i)}async function U(i,P){let b=await ne.setProcessing({params:{cardId:i},body:{active:P}});if(b.status!=="success")throw Object.assign(new Error(b.error||`Failed to set chat processing for card: ${i}`),{statusCode:500})}let ne=Wn({append(i,P,b,O,D){return M(i).append(i,P,b,O,D)},readAll(i){return M(i).readAll(i)},readAfter(i,P){return M(i).readAfter(i,P)},clear(i){return M(i).clear(i)},setProcessing(i,P){return M(i).setProcessing(i,P)},isProcessing(i){return M(i).isProcessing(i)},getConfig(i){return M(i).getConfig(i)},setConfig(i,P){return M(i).setConfig(i,P)}},{emitNotification(i){if(i.kind==="notification-batch"){H(i.notifications);return}H([i]);}}),xe=lo({boardContexts:f,cardOwnerIndex:s,cardContextForCard:i=>E(i),readStatusSnapshot:()=>Me(),readDataObjectsByToken:()=>Ye(),readCardRuntimeArtifacts:()=>ye(),readCardFromStore:i=>c(i),readCardDefinitions:()=>w(),processAccumulatedLaneInternal:i=>ke(i),reportSourceFetched:(i,P)=>bt(i,{ref:P}),reportSourceFetchFailure:(i,P)=>St(i,{reason:P}),uploadCardFile:(i,P,b,O,D)=>$(i,P,b,O,D),chatStorePublic:ne,serverUrl:y,apiBasePath:t}),Ie=xe.mcpCardStoreFacade,Ae=xe.createMcpFacade,le=to({boardId:o,bootstrapBoard:()=>de(),sseHub:_,onChannelSubscribed:B,onChannelUnsubscribed:T,getMcpFacade:()=>Ae(),getMcpCardStoreFacade:()=>Ie()});function ge(i){return oo(i)}function $e(){return ao(Ae())}function be(){return so({boardId:o,uploadCardFile:$,getMcpFacade:()=>Ae(),controlplane:le})}let Ne=ro({boardId:o,boardContexts:f,readChatRecords:i=>R(i),getChatProcessing:i=>K(i)}),Me=Ne.readStatusSnapshot,ye=Ne.readCardRuntimeArtifacts,Ye=Ne.readDataObjectsByToken,De=Ne.buildPublishedRuntimePayload;async function He(i,P,b){let O=b?.syncBoard!==false,D=b?.restartOnlyIfChanged===true,Y=E(i);if(!Y)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let G=await c(i);if(!G)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let oe=D?JSON.stringify(G):null,Be=P(G)||G;if(D&&JSON.stringify(Be)===oe)return;let ue=await Y.cardStoreOps.set({body:Be});if(ue.status!=="success")throw Object.assign(new Error(ue.error||`Failed to persist card: ${i}`),{statusCode:500});if(O){let Le=await Y.boardOps.upsertCard({params:{cardId:i,restart:true}});if(Le.status!=="success")throw Object.assign(new Error(Le.error||`Failed to upsert card: ${i}`),{statusCode:500})}}async function pt(i,P){await He(i,P,{syncBoard:true});}async function rt(i,P){await He(i,P,{syncBoard:false});}async function at(i){let P=E(i);if(!P)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});if(!await c(i))throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let O=await P.boardOps.upsertCard({params:{cardId:i,restart:true}});if(O.status!=="success")throw Object.assign(new Error(O.error||`Failed to retrigger card: ${i}`),{statusCode:500})}async function nt(i){let P=await ne.clear({params:{cardId:i}});if(P.status!=="success")throw Object.assign(new Error(P.error||`Failed to clear chat records for card: ${i}`),{statusCode:500});try{await U(i,!1);}catch{}}async function j(i,P,b,O,D=""){let Y=typeof b=="string"?b.trim():"",G=await ne.append({params:{cardId:i},body:{role:P||"system",text:Y,files:O,turn:D}});if(G.status!=="success")throw Object.assign(new Error(G.error||`Failed to append chat record for card: ${i}`),{statusCode:500});return String(G.data?.id||"")}async function R(i){return await M(i).readAll(i)}let $=no({safeCardId:i=>L(i),artifactsStores:i=>I(i),cardFileMetadataStore:()=>q(),readCardFromStore:i=>c(i),updateCardLocalOnly:(i,P)=>rt(i,P),writeChatRecord:(i,P,b,O,D)=>j(i,P,b,O,D)}).uploadCardFile;async function te(i){let P=E(i);if(!P)return null;let b=await P.boardOps.getConfig({params:{key:"chat-handler-flow"}}),D=(b.status==="success"?b.data?.value:null)??P.chatHandlerFlow??null,Y=P.chatHandlerRef;return D==null&&(!Y||typeof Y!="object")?null:{ctx:P,handlerFlow:D,handlerRef:Y}}function ee(i){let P=typeof i=="string"?i.trim():"";if(P.length<Mt.length*2||!P.startsWith(Mt)||!P.endsWith(Mt))return null;let b=P.slice(Mt.length,P.length-Mt.length).trim(),O=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(b);return O?{assistant:O[1].trim().toLowerCase(),text:O[2].trim()}:{assistant:"echo",text:b}}async function Re(i,P,b=false,O="",D=""){try{let Y=await te(i);if(!Y){try{await U(i,!1);}catch{}return}let{ctx:G,handlerFlow:oe,handlerRef:Be}=Y;if(!b)try{await U(i,!0);}catch{}let ue={boardId:o,cardId:String(i),lastChatEntryId:P,...O?{turnId:O}:{},...typeof D=="string"&&D.trim()?{probe:D.trim()}:{},...C,...y?{serverUrl:y}:{}},Le=oe!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:yo}}:Be;Ze(G.boardAdapter)?await g(G,"chat-agent").enqueueRequest({boardId:o,ref:Le,args:oe!=null?{...ue,__chatHandlerFlow:oe}:ue}):g(G,"chat-agent").enqueueRequest({boardId:o,ref:Le,args:oe!=null?{...ue,__chatHandlerFlow:oe}:ue}),await Promise.resolve(G.boardAdapter.requestProcessAccumulated?.());}catch(Y){try{await U(i,!1);}catch{}a.warn(`[chat-handler] queue failed for card "${i}": ${Y instanceof Error?Y.message:String(Y)}`);}}async function fe(i,P,b){if(P.howToRun==="built-in"&&Yr(P)===yo){let O=u,D=b.__chatHandlerFlow,Y={...b};return delete Y.__chatHandlerFlow,O?O.run(D,Y,{boardId:o,cardId:String(Y.cardId||""),label:i.label,logger:a,serverUrl:y,executionExtra:C}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return d.invoke(P,b)}async function Ce(i,P=false){P||await ae();let b=typeof i.args?.cardId=="string"?i.args.cardId:"",O=b?E(b):A();if(!O)throw new Error(b?`Board context is unavailable for chat-agent request: ${b}`:"Board context is unavailable for chat-agent request");let D=await fe(O,i.ref,i.args);if(!D.dispatched){if(b)try{await U(b,!1);}catch{}throw new Error(D.error||`chat-agent dispatch failed for card "${b||"unknown"}"`)}}async function _e(i,P,b){if(P==="chat-send"){let D=b&&typeof b["turn-id"]=="string"?b["turn-id"]:b&&typeof b.turnId=="string"?b.turnId:b&&typeof b.turn=="string"?b.turn:"";if(b&&"files"in b&&b.files!==void 0&&b.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 Y=be(),G=ee(b?.text),oe=G?G.text:b?.text,Be=await mt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:i,role:"user",text:oe,turn_id:D,files:[]},Y);if(Be?.status!=="success")throw new Error(et(Be,`chat-send append failed for card ${i}`));let ue=Be?.data?.id;if(typeof ue!="string"||!ue)throw new Error(`chat-send did not return an append id for card ${i}`);let Le=await mt("setstate.chat-processing-started",{board_id:o,card_id:i},Y);if(Le?.status!=="success")throw new Error(et(Le,`chat-send processing update failed for card ${i}`));Re(i,ue,true,D,G?.assistant||"");return}await pt(i,D=>{let Y=new Date().toISOString(),G=D.card_data&&typeof D.card_data=="object"?D.card_data:{};if(D.card_data=G,P==="file-upload"){let oe=q().normalizeIncoming(b?.files,Y);return oe.length>0&&q().merge(G,oe),D}if(P==="action"){let oe=b&&typeof b.buttonId=="string"?b.buttonId:"";if(!oe)return D;G.lastAction={buttonId:oe,at:Y},G.lastActionText=`${oe} @ ${Y}`;}return D});}function je(i,P,b){let O=JSON.stringify(b),D=typeof Buffer<"u"?Buffer.byteLength(O):new TextEncoder().encode(O).length;i.writeHead(P,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":D}),i.end(O);}async function Ue(i,P,b){let O=await c(i);if(!O)throw Object.assign(new Error("Card not found"),{statusCode:404});let D=q().resolve(O.card_data,P,b);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 Y=D.file,G=L(i),oe=I(i),Be=String(Y.stored_name||""),ue=`${G}/${Be}`,Le=oe.files?await oe.files.getBytes(ue):null;if(!Le)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:Y,bytes:Le}}async function Ve(i,P,b,O){let{fileRecord:D,bytes:Y}=await Ue(P,b,O),G=String(D.name||D.stored_name||"download.bin"),oe=String(D.mime_type||"application/octet-stream");i.writeHead(200,{"Content-Type":oe,"Content-Disposition":`attachment; filename="${G}"`,"Content-Length":Y.length}),i.end(Y);}function lt(i){let P=String(i||"").toLowerCase();return P.startsWith("text/")||P.includes("json")||P.includes("xml")||P.includes("javascript")||P.includes("typescript")||P.includes("yaml")||P.includes("csv")}function Xe(i,P,b){let O=i.split(/\r?\n/);return (P==="head"?O.slice(0,b):O.slice(-b)).join(`
|
|
7
|
+
`)}async function Ge(i){let P=[];for await(let O of i)P.push(O);let b=typeof Buffer<"u"?Buffer.concat(P).toString("utf-8").trim():new TextDecoder().decode(Sr(P)).trim();return b?JSON.parse(b):{}}async function bt(i,P){let b=typeof P.ref=="string"?P.ref.trim():"";if(!b)return {status:"fail",error:"board-worker success callback requires body.ref"};let O=f[0];return O?O.boardOps.sourceDataFetched({params:{token:i,ref:b}}):{status:"fail",error:"no board context"}}async function St(i,P){let b=typeof P.reason=="string"&&P.reason.trim()?P.reason:"unknown",O=f[0];return O?O.boardOps.sourceDataFetchFailure({params:{token:i,reason:b}}):{status:"fail",error:"no board context"}}let $t=po({sseHub:_,queueSseHub:x,corsHeaders:r,json:je,buildPublishedRuntimePayload:()=>De(),onSseClientConnected:v,onChannelSubscribed:B,onChannelUnsubscribed:T,apiBasePath:t,readJsonBody:i=>Ge(i),initBoardAndSetup:()=>ae(),bootstrapBoard:()=>de(),boardContexts:f,publishPersistedStateSnapshot:i=>Q(i),upsertCardsFromSource:(i,P)=>Z(i,P)}).handleWatchersRoutes,Tt=fo({apiBasePath:t,json:je,readJsonBody:i=>Ge(i),bootstrapBoard:()=>de(),createMcpFacade:()=>Ae(),createMcpToolRegistry:i=>ge(i),resolveCardFileDownloadPayload:(i,P,b)=>Ue(i,P,b),isLikelyTextMimeType:i=>lt(i),sliceTextByLines:(i,P,b)=>Xe(i,P,b)}).handleAgentfaceApi,Qr=mo({apiBasePath:t,json:je,readJsonBody:i=>Ge(i),initBoardAndSetup:()=>ae(),createMcpWebhookToolRegistry:()=>$e()}).handleWebhooksApi,Vt=wr({apiBasePath:t,json:je,readJsonBody:i=>Ge(i),bootstrapBoard:()=>de(),createMcpControlplaneToolRegistry:()=>be(),retriggerCard:i=>at(i),applyCardAction:(i,P,b)=>_e(i,P,b),resolveChatHandlerTarget:i=>te(i),sendCardFileDownloadResponse:(i,P,b,O)=>Ve(i,P,b,O)}).handleRuntimeApi,wt=go({apiBasePath:t,emitNotifications:i=>H(i),readJsonBody:i=>Ge(i),json:(i,P,b)=>je(i,P,b)}).handleNotifyRoute;async function gt(i,P,b){return !!(await Tt(i,P,b)||await Qr(i,P,b)||await $t(i,P,b)||await wt(i,P,b)||await Vt(i,P,b))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:gt,emitNotification(i){if(i.kind==="notification-batch"){H(i.notifications);return}H([i]);},buildPublishedRuntimePayload:De,__drainProcessAccumulatedLane:ke,handleChatAgentRequest:Ce,clearChatRecords:nt,reportSourceFetched(i,P){return bt(i,{ref:P})},reportSourceFetchFailure(i,P){return St(i,{reason:P})},get cardStore(){return f[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function wa(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...ho,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,a=new Map,d="boards-config.json";function u(){let x=n.getText(d);if(!x)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(x)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function p(x){n.putText(d,JSON.stringify(x,null,2));}function y(x){let h=String(x||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return h.length>0&&h.length<=64?h:null}function C(x){if(a.has(x))return a.get(x);let f=u().boards.find(l=>l.id===x)||{},s=o(x,f);return a.set(x,s),s}function v(x,h,f){let s=JSON.stringify(f),l=typeof Buffer<"u"?Buffer.byteLength(s):new TextEncoder().encode(s).length;x.writeHead(h,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":l}),x.end(s);}async function S(x,h,f){let s=x.method||"GET",l=f.pathname;if(s==="GET"&&l===t)return v(h,200,{ok:true,boards:u().boards}),true;if(s==="POST"&&l===t){let m=[];for await(let J of x)m.push(J);let g=typeof Buffer<"u"?Buffer.concat(m).toString("utf-8").trim():new TextDecoder().decode(Sr(m)).trim(),k={};try{k=g?JSON.parse(g):{};}catch{k={};}let I=y(k.id);if(!I)return v(h,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let q=u();if(q.boards.some(J=>J.id===I))return v(h,409,{error:`Board "${I}" is already registered`}),true;let L=typeof k.label=="string"&&k.label.trim()?k.label.trim():I,V={id:I,label:L};for(let[J,X]of Object.entries(k))J==="id"||J==="label"||X!=null&&(V[J]=X);return q.boards.push(V),p(q),v(h,200,{ok:true,board:V}),true}return false}async function B(x,h,f){let l=f.pathname.match(new RegExp(`^${ot(t)}/([^/]+)(/|$)`));if(!l)return false;let m=y(decodeURIComponent(l[1]));return m?u().boards.some(I=>I.id===m)?!!await C(m).handleRuntimeApi(x,h,f):(v(h,404,{error:`Board "${m}" not registered. POST ${t} with {id} to register it first.`}),true):(v(h,400,{error:"Invalid board id"}),true)}async function T(x,h,f){return !!(await S(x,h,f)||await B(x,h,f))}function _(x){if(!u().boards.some(f=>f.id===x))throw Object.assign(new Error(`Board "${x}" not registered`),{statusCode:404});return {service:C(x)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:T,requireBoardService:_}}exports.createMultiBoardServerRuntime=wa;exports.createRoutesRuntimeApi=wr;exports.createSingleBoardServerRuntime=Sa;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
|
|
8
8
|
//# sourceMappingURL=server-runtime-controlface.js.map
|