yaml-flow 8.11.2 → 8.11.3

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