yaml-flow 8.11.10 → 8.11.11
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.
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-06-
|
|
2
|
+
"generatedAt": "2026-06-28T09:18:32.212Z",
|
|
3
3
|
"algorithm": "sha256",
|
|
4
4
|
"files": {
|
|
5
5
|
"browser/server-runtime-controlface.js": {
|
|
6
|
-
"sha256": "sha256
|
|
7
|
-
"bytes":
|
|
6
|
+
"sha256": "sha256-z5ZV9WlXvXa9vnGbkEjehAhm0Ajd30CXmNPiZ+JzSDU=",
|
|
7
|
+
"bytes": 196760
|
|
8
8
|
},
|
|
9
9
|
"browser/adapters/firestore-storage.js": {
|
|
10
10
|
"sha256": "sha256-dAP2RFjTHpzcEpvcixRvM139mcUc9Lg1W6T9/CwaRvA=",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var ServerRuntimeControlface=(function(exports){'use strict';var Io=Object.defineProperty;var Po=(e,t,r)=>t in e?Io(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var on=(e,t,r)=>Po(e,t+"",r);var Gt="b64:";function _o(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 Eo(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let 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 Pe(e){return `${Gt}${_o(JSON.stringify(e))}`}function ct(e){if(!e.startsWith(Gt))throw new Error(`Invalid ref format (expected ${Gt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Eo(e.slice(Gt.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 an(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function rt(e){return typeof e.journalStorage=="function"}function sn(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?ct(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function st(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ir(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 le(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function dt(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function lt(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function pt(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Wt(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 Pr(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function gt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o,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 nt(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let a=n.data;if(a&&typeof a=="object"&&!Array.isArray(a)){let d=a.issues;if(Array.isArray(d)){let u=d.find(k=>typeof k=="string"&&k.trim());if(typeof u=="string")return `Validation failed: ${u}`}let f=a.errors;if(Array.isArray(f)&&f.length>0)return "Validation failed"}}return "Validation failed"}return t}function _r(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpControlplaneToolRegistry:a,retriggerCard:d,applyCardAction:f,resolveChatHandlerTarget:u,sendCardFileDownloadResponse:k}=e;async function R(C,b,P){let _=C.method||"GET",A=P,x=A.pathname;try{if(_==="POST"&&x===`${t}/mcp-actions`){await o();let c=Date.now(),m=new Date(c).toISOString(),p=await n(C),h=typeof p.tool=="string"?p.tool.trim():"",T=p.args&&typeof p.args=="object"&&!Array.isArray(p.args)?p.args:{};if(!h)return r(b,400,{error:"tool is required"}),!0;let O=le(T,"card_id");if(!O)return r(b,400,{error:"MCP action requires card_id"}),!0;if(h==="retrigger-card"||h==="retrigger"){await d(O);let J=Date.now();return r(b,200,{status:"success",data:{ok:!0,cardId:O,actionType:h,requestReceivedAt:m,requestReceivedAtMs:c,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:200}}),!0}let N=lt(T,"payload");if(h==="chat-send"&&!await u(O)){let J=Date.now();return r(b,409,{error:`chat handler is not configured for card: ${O}`,requestReceivedAt:m,requestReceivedAtMs:c,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:409}),!0}if(h==="chat-send"){let J=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!J||!String(J).trim()){let oe=Date.now();return r(b,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${O}`,requestReceivedAt:m,requestReceivedAtMs:c,responseSentAt:new Date(oe).toISOString(),responseSentAtMs:oe,responseStatus:400}),!0}}await f(O,h,N);let $=Date.now();return r(b,200,{status:"success",data:{ok:!0,cardId:O,actionType:h,requestReceivedAt:m,requestReceivedAtMs:c,responseSentAt:new Date($).toISOString(),responseSentAtMs:$,responseStatus:200}}),!0}if(_==="POST"&&x===`${t}/mcp-controlplane`){await o();let c=await n(C),m=typeof c.tool=="string"?c.tool.trim():"",p=c.args&&typeof c.args=="object"&&!Array.isArray(c.args)?c.args:{};if(!m)return r(b,400,{error:"tool is required"}),!0;try{let h=await gt(m,p,a());if(h&&typeof h=="object"&&!Array.isArray(h)){let T=h;if(T.status==="fail")return r(b,400,{error:nt(h,"Request failed")}),!0;if(T.status==="error")return r(b,500,{error:nt(h,"Internal error")}),!0}r(b,200,h);}catch(h){let T=typeof h?.statusCode=="number"?Number(h.statusCode):500,O=h instanceof Error?h.message:String(h);r(b,T,{error:O});}return !0}let g=x.match(new RegExp(`^${st(t)}/cards/([^/]+)/retrigger$`));if(_==="POST"&&g){await o();let c=decodeURIComponent(g[1]);return await d(c),r(b,200,{ok:!0}),!0}let l=x.match(new RegExp(`^${st(t)}/cards/([^/]+)/actions$`));if(_==="POST"&&l){await o();let c=decodeURIComponent(l[1]),m=Date.now(),p=new Date(m).toISOString(),h=await n(C),T=h?.actionType;if(T==="chat-send"&&!await u(c)){let N=Date.now();return r(b,409,{error:`chat handler is not configured for card: ${c}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(N).toISOString(),responseSentAtMs:N,responseStatus:409}),!0}if(T==="chat-send"){let N=h?.payload??{},$=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!$||!String($).trim()){let J=Date.now();return r(b,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${c}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:400}),!0}}await f(c,T,h?.payload);let O=Date.now();return r(b,200,{ok:!0,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(O).toISOString(),responseSentAtMs:O,responseStatus:200}),!0}let s=x.match(new RegExp(`^${st(t)}/cards/([^/]+)/files/(\\d+)$`));if(_==="GET"&&s){let c=decodeURIComponent(s[1]),m=parseInt(s[2],10),p=A.searchParams.get("sn");return await k(b,c,m,p),!0}return !1}catch(g){let l=g?.statusCode||500;return r(b,l,{error:String(g?.message||g)}),true}}return {handleRuntimeApi:R}}function zt(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 Bo(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 Oo(e){return e.category?e:{...e,category:Bo(e.kind)}}function $e(e){return e.map(t=>Oo(t))}function Ue(e){return {...e,category:e.category??"batch",notifications:$e(e.notifications)}}var kt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ze(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function Ct(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function un(e){return e.tasks??{}}function Er(e){return e?e.status===kt.FAILED||e.status===kt.INACTIVATED:false}function cn(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function dn(e){return e.maxExecutions}function ln(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===kt.COMPLETED){let a=e.tasks[n];a&&Ze(a).forEach(f=>r.add(f));}return Array.from(r)}function fn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Ze(o).forEach(d=>{r[d]||(r[d]=[]),r[d].push(n);});}),r}function mn(e,t,r){let n=e.tasks[t]??Yt(),o={};if(r){let d=r.tasks[t],f=Ct(d);for(let u of f)for(let[k,R]of Object.entries(r.tasks))if(Ze(R).includes(u)){let C=e.tasks[k];C?.lastDataHash&&(o[u]=C.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 pn(e,t,r,n,o,a){let d=e.tasks[r]??Yt(),f=t.tasks[r];if(!f)throw new Error(`Task "${r}" not found in graph`);let u;n&&f.on&&f.on[n]?u=f.on[n]:u=Ze(f);let k=d.startConsumedHashes?{...d.startConsumedHashes}:{...d.lastConsumedHashes};if(!d.startConsumedHashes){let b=f.requires??[];for(let P of b)for(let[_,A]of Object.entries(t.tasks))if(Ze(A).includes(P)){let x=e.tasks[_];x?.lastDataHash&&(k[P]=x.lastDataHash);break}}let R={...d,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:d.executionCount+1,lastEpoch:d.executionCount+1,lastDataHash:o,data:a,lastConsumedHashes:k,error:void 0},C=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:R},availableOutputs:C,lastUpdated:new Date().toISOString()}}function gn(e,t,r,n){let o=e.tasks[r]??Yt(),a=t.tasks[r];if(a?.retry){let u=o.retryCount+1;if(u<=a.retry.max_attempts){let k={...o,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:k},lastUpdated:new Date().toISOString()}}}let d={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},f=e.availableOutputs;if(a?.on_failure&&a.on_failure.length>0&&(f=[...new Set([...e.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&d.executionCount>=a.circuit_breaker.max_executions){let u=a.circuit_breaker.on_break;f=[...new Set([...f,...u])];}return {...e,tasks:{...e.tasks,[r]:d},availableOutputs:f,lastUpdated:new Date().toISOString()}}function yn(e,t,r,n){let o=e.tasks[t]??Yt(),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 hn(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 Yt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function _t(e,t){let r=`live-${Date.now()}`,n={};for(let a of Object.keys(e.tasks))n[a]=kn();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 Fo(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:mn(n,t.taskName,r)};case "task-completed":return {config:r,state:pn(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:gn(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:yn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:hn(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:$o(n,t.action)};case "task-upsert":return qo(e,t.taskName,t.taskConfig);case "task-removal":return No(e,t.taskName);case "node-requires-add":return jo(e,t.nodeName,t.tokens);case "node-requires-remove":return Mo(e,t.nodeName,t.tokens);case "node-provides-add":return Lo(e,t.nodeName,t.tokens);case "node-provides-remove":return Do(e,t.nodeName,t.tokens);default:return e}}function Rn(e,t){return t.reduce((r,n)=>Fo(r,n),e)}function qo(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]:kn()},lastUpdated:new Date().toISOString()}}}function No(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 jo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ct(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 Mo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ct(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 Lo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ze(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 Do(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ze(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 bt(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function St(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 kn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function $o(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 Nt(e){let{config:t,state:r}=e,n=un(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=Uo(n),d=ln(t,r.tasks),f=new Set([...d,...r.availableOutputs]),u=[],k=[],R=[],C=[];for(let[P,_]of Object.entries(n)){let A=r.tasks[P],x=cn(_,t.settings),g=x!=="once";if(A?.status===kt.RUNNING||Er(A))continue;let l=dn(_);if(l!==void 0&&A&&A.executionCount>=l||_.circuit_breaker&&A&&A.executionCount>=_.circuit_breaker.max_executions||!g&&A?.status===kt.COMPLETED)continue;if(g&&A?.status===kt.COMPLETED){let h=Ct(_),T=false;switch(x){case "data-changed":{h.length>0&&h.some(N=>{for(let[$,J]of Object.entries(n))if(Ze(J).includes(N)){let oe=r.tasks[$];if(!oe)continue;let pe=A.lastConsumedHashes?.[N];return oe.lastDataHash==null?oe.executionCount>A.lastEpoch:oe.lastDataHash!==pe}return false})||(T=true);break}case "epoch-changed":{h.length>0&&h.some(N=>{for(let[$,J]of Object.entries(n))if(Ze(J).includes(N)){let oe=r.tasks[$];if(oe&&oe.executionCount>A.lastEpoch)return true}return false})||(T=true);break}case "time-based":{let O=_.refreshInterval??0;if(O<=0){T=true;break}let N=A.completedAt;if(!N){T=true;break}(Date.now()-Date.parse(N))/1e3<O&&(T=true);break}case "manual":T=true;break}if(T)continue}let s=Ct(_);if(s.length===0){u.push(P);continue}let c=[],m=[],p=[];for(let h of s){if(f.has(h))continue;let T=a[h]||[];T.length===0?c.push(h):T.every(N=>Er(r.tasks[N]))?p.push({token:h,failedProducer:T[0]}):m.push(h);}c.length>0?R.push({taskName:P,missingTokens:c}):p.length>0?C.push({taskName:P,failedTokens:p.map(h=>h.token),failedProducers:[...new Set(p.map(h=>h.failedProducer))]}):m.length>0?k.push({taskName:P,waitingOn:m}):u.push(P);}let b={};if(u.length>1){let P=fn(u,n);for(let[_,A]of Object.entries(P))A.length>1&&(b[_]=A);}return {eligible:u,pending:k,unresolved:R,blocked:C,conflicts:b}}function Uo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of Ze(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let a of o)t[a]||(t[a]=[]),t[a].includes(r)||t[a].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var jt=class{constructor(){on(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Br(e){let t=Or(e);return Vo(t)}function Or(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Or).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Or(t[n])).join(",")+"}"}function Vo(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 Ko(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 Ho(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 Cn(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Ko(t)}function Jo(e){try{let t=JSON.parse(Ho(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Xt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:a}=t,d=new jt,f="state"in e&&"config"in e?e:_t(e),u=false,k=new Set,R=new Map(Object.entries(n)),C=new jt,b=false,P=false;function _(){if(!u){if(b){P=true;return}b=true;try{do P=!1,A();while(P)}finally{b=false;}}}function A(){let s=C.drain(),c=d.drain(),m=[...s,...c];if(m.length>0&&(f=Rn(f,m),o)){for(let h of m)if(h.type==="task-removal")try{o(h.taskName);}catch(T){console.warn("[reactive] onNodeRemoved failed:",T instanceof Error?T.message:String(T));}}let p=Nt(f);m.length>0&&a?.(m,f,p);for(let h of p.eligible)l(h);for(let h of m)if(h.type==="task-progress"){let{taskName:T,update:O}=h;if(!f.config.tasks[T])continue;let $=f.state.tasks[T];if(!$||$.status!=="running")continue;let J=Cn(T),oe=g(T,J,O).catch(pe=>{u||(C.append({type:"task-failed",taskName:T,error:pe.message??String(pe),timestamp:new Date().toISOString()}),_());}).finally(()=>{k.delete(oe);});k.add(oe);}}function x(s){let m=f.config.tasks[s].requires??[],p=new Map;for(let[T,O]of Object.entries(f.config.tasks))for(let N of O.provides??[])p.set(N,T);let h={};for(let T of m){let O=p.get(T);O?h[T]=f.state.tasks[O]?.data:h[T]=void 0;}return h}async function g(s,c,m){let p=f.config.tasks[s],h=p.taskHandlers??[],T=x(s);for(let O of h){let N=R.get(O);if(!N)throw new Error(`Handler '${O}' not found in registry (task '${s}')`);let $={nodeId:s,state:T,taskState:f.state.tasks[s],config:p,callbackToken:c,update:m};if(await N($)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${s}')`)}}function l(s){let m=f.config.tasks[s]?.taskHandlers;if(!m||m.length===0)return;C.append({type:"task-started",taskName:s,timestamp:new Date().toISOString()}),_();let p=Cn(s),h=g(s,p).catch(T=>{u||(C.append({type:"task-failed",taskName:s,error:T.message??String(T),timestamp:new Date().toISOString()}),_());}).finally(()=>{k.delete(h);});k.add(h);}return {push(s){u||(s.type==="task-completed"&&s.data&&!s.dataHash&&(s={...s,dataHash:Br(s.data)}),d.append(s),_());},pushAll(s){if(!u){for(let c of s)c.type==="task-completed"&&c.data&&!c.dataHash?d.append({...c,dataHash:Br(c.data)}):d.append(c);_();}},resolveCallback(s,c,m){if(u)return;let p=Jo(s);if(!p)return;let{taskName:h}=p;if(f.config.tasks[h]){if(m&&m.length>0)d.append({type:"task-failed",taskName:h,error:m.join("; "),timestamp:new Date().toISOString()});else {let T=c&&Object.keys(c).length>0?Br(c):void 0;d.append({type:"task-completed",taskName:h,data:c,dataHash:T,timestamp:new Date().toISOString()});}_();}},addNode(s,c){u||(d.append({type:"task-upsert",taskName:s,taskConfig:c,timestamp:new Date().toISOString()}),_());},removeNode(s){u||(d.append({type:"task-removal",taskName:s,timestamp:new Date().toISOString()}),_());},addRequires(s,c){u||(d.append({type:"node-requires-add",nodeName:s,tokens:c,timestamp:new Date().toISOString()}),_());},removeRequires(s,c){u||(d.append({type:"node-requires-remove",nodeName:s,tokens:c,timestamp:new Date().toISOString()}),_());},addProvides(s,c){u||(d.append({type:"node-provides-add",nodeName:s,tokens:c,timestamp:new Date().toISOString()}),_());},removeProvides(s,c){u||(d.append({type:"node-provides-remove",nodeName:s,tokens:c,timestamp:new Date().toISOString()}),_());},registerHandler(s,c){R.set(s,c);},unregisterHandler(s){R.delete(s);},retrigger(s){u||f.config.tasks[s]&&(d.append({type:"task-restart",taskName:s,timestamp:new Date().toISOString()}),_());},retriggerAll(s){if(!u){for(let c of s)f.config.tasks[c]&&d.append({type:"task-restart",taskName:c,timestamp:new Date().toISOString()});_();}},snapshot(){return bt(f)},getState(){return f},getSchedule(){return Nt(f)},async waitForHandlers(){k.size>0&&await Promise.allSettled([...k]);},async dispose(s){s?.wait&&k.size>0&&await Promise.allSettled([...k]),u=true;}}}function Zt(){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 Qo=Zt();Qo("./jsonata-sync.cjs");var Go=Zt(),Mt=Go("./jsonata-sync.cjs"),Fr=Mt;function bn(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function wn(e,t,r){let n=t.split("."),o=e;for(let a=0;a<n.length-1;a++)(o[n[a]]==null||typeof o[n[a]]!="object")&&(o[n[a]]={}),o=o[n[a]];o[n[n.length-1]]=r;}async function Wo(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 Mt(o.expr).evaluate(n);wn(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch{}return e}function zo(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=Fr(a.expr).evaluate(n);wn(e.computed_values,a.bindTo,d),n.computed_values=e.computed_values;}catch(d){let f=d instanceof Error?d.message:String(d);o.push({bindTo:a.bindTo,error:f});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Yo(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Mt(e).evaluate(n)}function Xo(e,t){return t.startsWith("fetched_sources.")?bn(e._sourcesData??{},t.slice(16)):bn(e,t)}var Sn=new Set(["metric","table","editable-table","chart","form","list","notes","todo","alert","narrative","badge","text","markdown","markup","selection","searchbox","query","ref","custom","actions"]),Zo=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function ea(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))Zo.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 f=a;typeof f.bindTo!="string"||!f.bindTo?t.push(`source_defs[${d}]: missing required "bindTo" property`):(n.has(f.bindTo)&&t.push(`source_defs[${d}]: bindTo "${f.bindTo}" is not unique across source_defs`),n.add(f.bindTo)),typeof f.outputFile!="string"||!f.outputFile?t.push(`source_defs[${d}]: missing required "outputFile" property`):(o.has(f.outputFile)&&t.push(`source_defs[${d}]: outputFile "${f.outputFile}" is not unique across source_defs`),o.add(f.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`):Sn.has(o.kind)||t.push(`view.elements[${a}].kind: unknown kind "${o.kind}". Valid: ${[...Sn].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 ta(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=false;if(typeof n.skip_when=="string"&&n.skip_when.trim().length>0)try{o=!!await Mt(n.skip_when).evaluate(r);}catch{o=false;}let a={};if(!o&&n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[d,f]of Object.entries(n.projections))if(typeof f=="string"&&f.trim().length>0)try{a[d]=await Mt(f).evaluate(r);}catch{a[d]=void 0;}}return {...n,_projections:a,_skip:o}}))}function ra(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o=false;if(typeof n.skip_when=="string"&&n.skip_when.trim().length>0)try{o=!!Fr(n.skip_when).evaluate(r);}catch{o=false;}let a={};if(!o&&n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[d,f]of Object.entries(n.projections))if(typeof f=="string"&&f.trim().length>0)try{a[d]=Fr(f).evaluate(r);}catch{a[d]=void 0;}}return {...n,_projections:a,_skip:o}})}var ze={run:Wo,runSync:zo,eval:Yo,resolve:Xo,validate:ea,enrichSources:ta,enrichSourcesSync:ra};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 qr(e,t){return rr(e)?e.then(t):t(e)}function An(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Nr(e,t){return {readValues(n){let o=e(n);return qr(o.listKeys(),a=>{let d=[...a].sort();if(d.length===0)return {version:null,values:{}};let f={},u=null;for(let k of d){let R=o.read(k);rr(R)?u=(u??Promise.resolve()).then(async()=>{f[k]=await R;}):f[k]=R;}return u?u.then(()=>({version:t(f),values:f})):{version:t(f),values:f}})},writeValues(n,o,a){let d=e(n),f=null;for(let u of a){let k=d.delete(u);rr(k)&&(f=(f??Promise.resolve()).then(()=>k).then(()=>{}));}for(let[u,k]of Object.entries(o)){let R=d.write(u,k);rr(R)&&(f=(f??Promise.resolve()).then(()=>R).then(()=>{}));}return f?f.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 qr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let a=An(o.values,n);return qr(e.writeValues(r,a,n.deleteKeys),d=>({ok:true,newVersion:d}))})}}}function vn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function xn(e){return {readEntriesAfterCursor(t){let r=vn(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return vn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function Tn(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function or(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ft(e,t){return or(e)?e.then(t):t(e)}function jr(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 na(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function oa(e,t){let r=e.match(t);return r?r[1]:null}function In(e,t,r){let n={},o=jr(e,a=>{let d=r(a);if(d)return ft(t(a),f=>{n[d]=f;})});return or(o)?o.then(()=>n):n}function ar(e,t){return {readSourceData(r,n){return ft(e.read(`${r}/${n}`),na)},ingestSourceDataStaged(r,n,o,a){return ft(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 ft(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function Mr(e,t){let r=(n,o)=>{try{let a=o(n);return or(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 ft(e.read(n),a=>e.write(n,[...a??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ft(e.read(n),a=>{let d=a;if(!(!d||d.length===0))return ft(jr(d,f=>r(f,o)),()=>e.delete(n))})}}}function Lr(e,t,r){return {readRuntime(n){return ft(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 ft(e.listKeys("cards/"),t=>In(t,r=>e.read(r),r=>oa(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return jr(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 ft(e.listKeys("data-objects/"),t=>In(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}var ot="sys_keys_board_state",Ae="__sys_keys_board_state_init";function Pn(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e.__private;return !!t&&typeof t=="object"&&!Array.isArray(t)&&t.visible_controlplane_only===true}function Dr(e){let t=e.filter(o=>!Pn(o)),r=[...new Set(t.map(o=>o.id).filter(o=>typeof o=="string"&&o.length>0))].sort(),n=[...new Set(t.flatMap(o=>Array.isArray(o.provides)?o.provides:[]).map(o=>o&&typeof o=="object"&&!Array.isArray(o)?o.bindTo:void 0).filter(o=>typeof o=="string"&&o.length>0&&o!==ot))].sort();return {card_ids:r,data_object_keys:n}}function $r(e,t){let r=e.filter(a=>!Pn(a)),n=[...new Set(r.map(a=>a.id).filter(a=>typeof a=="string"&&a.length>0))].sort(),o=[...new Set(Object.entries(t).filter(([a])=>a!==Ae).flatMap(([,a])=>Array.isArray(a.provides)?a.provides:[]).filter(a=>typeof a=="string"&&a.length>0&&a!==ot))].sort();return {card_ids:n,data_object_keys:o}}function xt(){return {id:Ae,meta:{title:"System Keys Board State",synthetic:true},provides:[{bindTo:ot,ref:`card_data.${ot}`}],card_data:{[ot]:{card_ids:[],data_object_keys:[]}},__private:{visible_controlplane_only:true}}}function Ut(e,t){function r(){return e.readIndex()??{}}function n(o,a,d){let f=String(a||"").split(".").filter(Boolean);if(f.length===0)return d&&typeof d=="object"&&!Array.isArray(d)?d:{value:d};let u={...o},k=u;for(let R=0;R<f.length-1;R++){let C=f[R],b=k[C],P=b&&typeof b=="object"&&!Array.isArray(b)?{...b}:{};k[C]=P,k=P;}return k[f[f.length-1]]=d,u}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 f=e.readCard(d.key);f?o.push(f):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[f,u]of Object.entries(a))o[f]!==u.checksum&&d.push(f);for(let f of Object.keys(o))a[f]||d.push(f);return d},validateUpsert(o,a){let d=r(),f=d[o],u=Object.entries(d).find(([,k])=>k.key===a);return f&&f.key!==a?{ok:false,error:`Card id "${o}" is already mapped to key "${f.key}", cannot remap to "${a}"`}:u&&u[0]!==o?{ok:false,error:`Key "${a}" is already mapped to card id "${u[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,a,d){let f=r(),u=d??f[o]?.key??e.defaultCardKey(o),k=e.writeCard(u,a);f[o]={key:u,checksum:k,updatedAt:new Date().toISOString()},e.writeIndex(f);},patchCard(o,a,d){let f=r(),u=f[o];if(!u||!e.cardExists(u.key))throw new Error(`card "${o}" not found`);let k=e.readCard(u.key);if(!k||typeof k!="object"||Array.isArray(k))throw new Error(`card "${o}" is not patchable`);let R=n(k,a,d),C=e.writeCard(u.key,R);f[o]={key:u.key,checksum:C,updatedAt:new Date().toISOString()},e.writeIndex(f);},removeCard(o){let a=r(),d=a[o];d&&(e.removeCard(d.key),delete a[o],e.writeIndex(a));},readIndex(){return r()}}}function ir(e,t){return ar(e,t)}function _n(e){return xn(e)}var ur="v1",mt="board/graph",En="board/lastJournalProcessedId";function Bn(e){return `cards/${e}/runtime`}function On(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 Fn(e){return sr(e)}function Lt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function aa(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Dt(e,t){return e?.lastRequestedToken?aa(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Ur(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function $t(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function wt(e){let t=e.cards.filter(f=>f.name!==Ae);if(t.length===e.cards.length)return e;let r=new Set;for(let f of t)for(let u of f.requires)r.add(u);let n=t.map(f=>({name:f.name,fanOut:f.unblocks.length})).sort((f,u)=>u.fanOut-f.fanOut||f.name.localeCompare(u.name)),o=n.length>0?n[0]:{name:null,fanOut:0},a=f=>t.filter(u=>u.status===f).length,d=t.filter(f=>f.requires.length===0&&f.unblocks.length===0).length;return {...e,summary:{...e.summary,card_count:t.length,completed:a("completed"),eligible:a("eligible"),pending:a("pending"),blocked:a("blocked"),unresolved:a("unresolved"),failed:a("failed"),in_progress:a("in-progress"),orphan_cards:d,topology:{edge_count:r.size,max_fan_out_card:o.name,max_fan_out:o.fanOut}},cards:t}}function dr(e){let{[ot]:t,...r}=e;return r}function vt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),a=Nt(t),d={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},f=new Map;for(let _ of a.pending)f.set(_.taskName,_.waitingOn);for(let _ of a.unresolved)f.set(_.taskName,_.missingTokens);for(let _ of a.blocked)f.set(_.taskName,_.failedTokens);let u=new Map;for(let[_,A]of Object.entries(n))for(let x of A.requires??[]){let g=u.get(x)??[];g.push(_),u.set(x,g);}let k=o.sort().map(_=>{let A=r[_],x=n[_]??{requires:[],provides:[]};A.status==="completed"?d.completed+=1:A.status==="failed"?d.failed+=1:A.status==="in-progress"&&(d.in_progress+=1);let g=x.requires??[],l=x.provides??[],s=Object.keys(A.data??{}).sort(),c=g.filter(N=>t.state.availableOutputs.includes(N)),m=g.filter(N=>!t.state.availableOutputs.includes(N)),p=f.get(_)??m,h=new Set;for(let N of l)for(let $ of u.get(N)??[])$!==_&&h.add($);let T=A.failedAt,O=A.error?{message:A.error,code:"TASK_FAILED",at:T,source:"task-runtime"}:void 0;return {name:_,status:A.status,error:O,requires:g,requires_satisfied:c,requires_missing:m,provides_declared:l,provides_runtime:s,blocked_by:p,unblocks:Array.from(h).sort(),runtime:{attempt_count:A.executionCount??0,restart_count:A.retryCount??0,in_progress_since:A.status==="in-progress"?A.startedAt??null:null,last_transition_at:A.lastUpdated??null,last_completed_at:A.completedAt??null,last_restarted_at:A.startedAt??null,status_age_ms:A.lastUpdated?0:null}}});d.pending=a.pending.length,d.blocked=a.blocked.length,d.unresolved=a.unresolved.length;let R=k.map(_=>({name:_.name,fanOut:_.unblocks.length})).sort((_,A)=>A.fanOut-_.fanOut||_.name.localeCompare(A.name)),C=R.length>0?R[0]:{name:null,fanOut:0},b=new Set;for(let _ of Object.values(n))for(let A of _.requires??[])b.add(A);let P=0;for(let[_,A]of Object.entries(n)){let x=(A.requires??[]).length===0,l=(A.provides??[]).some(s=>(u.get(s)??[]).some(c=>c!==_));x&&!l&&(P+=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:P,topology:{edge_count:Array.from(b).length,max_fan_out_card:C.name,max_fan_out:C.fanOut}},cards:k}}function sa(){return new Date().toISOString()}function qn(e,t,r,n,o,a,d){return async f=>{let u=[],k=r.cardStore.readCard(f.nodeId);if(!k)return "task-initiate-failure";let R=k.id;if(R===Ae){let G=r.activeTaskConfigs?.(),z={[ot]:G?$r(Object.keys(G).filter(B=>B!==Ae).map(B=>r.cardStore.readCard(B)).filter(B=>!!B),G):Dr(r.cardStore.readAllCards())};return (d??r.outputStore.writeDataObjects.bind(r.outputStore))(z),n(f.nodeId,z),"task-initiated"}let C=k.card_data??{},b=k.source_defs??[],P=r.cardRuntimeStore.readRuntime(R),_=false,A=()=>{_&&(r.cardRuntimeStore.writeRuntime(R,P),_=false);},x=G=>Lt(P._sources[G]),g=(G,z)=>{P._sources[G]=Lt(z),_=true;},l=f.taskState?.executionCount??0;if(P._lastExecutionCount!==l&&(P._sources={},P._lastExecutionCount=l,_=true),f.update){let G=f.update,z=G.outputFile;if(z){let B=x(z);if(G.failure){let w=G.rqt??B.lastRequestedToken??B.queueRequestedToken;w&&g(z,$t(B,w));}else {let w=G.rqt;if(!B.lastCompletedToken||w>B.lastCompletedToken){let K=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,y=false;K&&(y=r.fetchedSourcesStore.commitSourceData(R,z,K)),y?g(z,Ur(B,w)):g(z,$t(B,w));}}A();}}let c={};for(let[G,z]of Object.entries(f.state??{}))if(z!==null&&typeof z=="object"&&!Array.isArray(z)){let B=z[G];c[G]=B!==void 0?B:z;}else c[G]=z;let p=ze.enrichSourcesSync(Array.isArray(k.source_defs)?k.source_defs:void 0,{card_data:C,requires:c}).filter(G=>G._skip!==true),h=p,T={};for(let G of p)if(G.outputFile){let z=r.fetchedSourcesStore.readSourceData(R,G.outputFile);z!==null&&(T[G.bindTo]=z);}let O={id:R,card_data:{...C},requires:c,source_defs:b,compute:k.compute};O._sourcesData=T,k.compute&&ze.runSync(O,{sourcesData:T}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(R,O.computed_values??{});let N={...k},$=e.value;N.source_defs=Array.isArray(p)?p.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:$})):p;let J=sa(),oe=f.update?void 0:J,pe=h.filter(G=>{let z=G.outputFile;if(typeof z!="string"||!z)return true;let B=x(z);oe&&(B={...B,queueRequestedToken:oe},g(z,B));let w=B.queueRequestedToken??B.lastRequestedToken??J,K=Dt(B,w);return K==="in-flight"?false:K==="dispatch"});if(A(),pe.length>0){let G=false,z=J;for(let B of pe){let w=B.outputFile;if(typeof w!="string"||!w)continue;let K=x(w),y=K.queueRequestedToken??J;g(w,{...K,lastRequestedToken:y}),z=y,G=true;}return G&&A(),G&&(u.push({taskKind:"source-fetch",payload:{boardRef:Pe(e),enrichedCard:N,callbackToken:f.callbackToken,rqt:z}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(h.some(G=>{let z=G.outputFile;if(typeof z!="string"||!z)return false;let B=x(z),w=B.queueRequestedToken??B.lastRequestedToken??J;return Dt(B,w)==="in-flight"}))return "task-initiated";let ae=k.provides??[],re={};for(let{bindTo:G,ref:z}of ae)re[G]=ze.resolve(O,z);return (d??r.outputStore.writeDataObjects.bind(r.outputStore))(re),n(f.nodeId,re),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var Vt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function lr(e){return {[mt]:e.graph,[En]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function fr(e){let t=e[mt],r=e[En],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${mt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function Kt(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(R){return {status:"success",data:R}}function n(R){return {status:"fail",error:R}}function o(R){return {status:"error",error:R instanceof Error?R.message:String(R)}}function a(R){return R===Ae}async function d(R){let C=t.emitNotification;if(!C||R.length===0)return;let b=$e(R.filter(P=>P.kind!=="card_refreshed"?true:!a(P.cardId)));if(b.length!==0){if(b.length===1){await C(b[0]);return}await C(Ue({kind:"notification-batch",notifications:b}));}}function f(R){let C=R.params?.id;if(C){if(a(C))throw new Error(`card "${C}" not found`);let b=e.readCard(C);if(!b)throw new Error(`card "${C}" not found`);return [b]}return e.readAllCards().filter(b=>!a(b.id))}function u(R){let C=R.filter(b=>!a(b.id));return Ue({kind:"notification-batch",notifications:$e(C.map(b=>({kind:"card_refreshed",cardId:b.id,card:b})))})}function k(R){if(Array.isArray(R))return R;if(R&&typeof R=="object"){let C=R;return Array.isArray(C.files)?C.files:[R]}return null}return {get(R){try{return r({cards:f(R)})}catch(C){return o(C)}},buildNotificationBatch(R){try{return r(u(f(R)))}catch(C){return o(C)}},set(R){try{let C=R.body;if(C==null)return n("set requires a body (card object or array of cards)");let b=Array.isArray(C)?C:[C];for(let P of b){if(typeof P.id!="string")return n("each card must have a string `id` field");e.writeCard(P.id,P);}return d(b.map(P=>({kind:"card_refreshed",cardId:P.id,card:P}))),r({count:b.length})}catch(C){return o(C)}},del(R){try{let C=R.body?.ids??[],b=R.params?.id,P=b?[...C,b]:C;if(P.length===0)return n("del requires body.ids (string[]) or params.id");for(let _ of P)e.removeCard(_);return d(P.map(_=>({kind:"card_removed",cardId:_}))),r({count:P.length})}catch(C){return o(C)}},patch(R){try{let C=R.params?.id,b=R.params?.path;if(!C)return n("patch requires params.id");if(!b)return n("patch requires params.path");let P=R.body,_=P&&Object.prototype.hasOwnProperty.call(P,"value")?P.value:R.body;e.patchCard(C,b,_);let A=e.readCard(C);return A?(d([{kind:"card_refreshed",cardId:C,card:A}]),r({count:1})):n(`card "${C}" not found`)}catch(C){return o(C)}},appendFiles(R){try{let C=R.params?.id;if(!C)return n("appendFiles requires params.id");let b=e.readCard(C);if(!b)return n(`card "${C}" not found`);let P=k(R.body);if(!P||P.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let _=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},A=Array.isArray(_.files)?_.files:[],x=[...A,...P],g=P.map((s,c)=>({idx:A.length+c,entry:s})),l=this.patch({params:{id:C,path:"card_data.files"},body:{value:x}});return l.status!=="success"?l:r({files_added:g})}catch(C){return o(C)}}}}function he(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function me(e){return {status:"fail",error:e}}function be(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function ia(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 Mn(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 pr(e){try{let t=JSON.parse(Mn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Nn(e){return ia(JSON.stringify(e))}function jn(e){try{let t=JSON.parse(Mn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function We(){return new Date().toISOString()}function ua(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 Ln(e,t,r={}){zt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),a=Pe(e),d=r.boardRuntimeStoreRef,f=r.scratchStoreRef,u=r.taskExecutorRef,k=r.chatHandlerFlow,R=r.emitNotification??(j=>{if(!t.publishBoardChangeNotifications)return;let I=j.kind==="notification-batch"?j.notifications:[j];return t.publishBoardChangeNotifications(I)});function C(){if(!d)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return d}function b(j){if(j.length!==0)try{let I=$e(j),Q=Ue({kind:"notification-batch",notifications:I}),q=R(Q);q&&typeof q.catch=="function"&&q.catch(V=>o(`[board-live-cards-public] emitNotification failed: ${V instanceof Error?V.message:String(V)}`));}catch(I){o(`[board-live-cards-public] emitNotification failed: ${I instanceof Error?I.message:String(I)}`);}}function P(){let j=A().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 I=t.kvStorageForRef(j);return {readIndex(){return I.read("_index")},writeIndex(Q){I.write("_index",Q);},readCard(Q){return I.read(Q)},writeCard(Q,q){return I.write(Q,q),t.hashFn(q)},removeCard(Q){I.delete(Q);},cardExists(Q){return I.read(Q)!==null},defaultCardKey(Q){return Q}}}let _={readValues(j){let I=t.kvStorageForRef(C()),Q=I.listKeys().sort();if(Q.length===0)return {version:null,values:{}};let q={};for(let V of Q)q[V]=I.read(V);return {version:t.hashFn(q),values:q}},writeValues(j,I,Q){let q=t.kvStorageForRef(C());for(let V of Q)q.delete(V);for(let[V,ne]of Object.entries(I))q.write(V,ne);return t.hashFn(I)}},A=()=>cr(t.kvStorageForRef(C())),x=()=>On(_),g=()=>_n(t.journalAdapterForRef(C())),l=()=>Ut(P(),o),s=()=>{let j=A().readOutputsStoreRef();if(!j)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Fn(t.kvStorageForRef(j))};function c(){return u??A().readTaskExecutorRef()}function m(){return !!x().readSnapshot(e.value).values[mt]}function p(){let j=x().readSnapshot(e.value);if(!j.values[mt])throw new Error(`Board not initialized at ${e.value}`);return fr(j.values)}function h(j,I){let Q=x().commitSnapshot(e.value,{schemaVersion:ur,expectedVersion:I,commitId:t.genId(),committedAt:We(),deleteKeys:[],shallowMerge:lr(j)});if(!Q.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${I??"null"} current=${Q.currentVersion??"null"}`)}function T(j){g().appendEvent(j);}async function O(){let I=ua((X,de)=>{let i=X.payload,E=(i?.enrichedCard??{}).id??i?.cardId??"unknown";T({type:"task-failed",taskName:E,error:de,timestamp:We()});}),Q=p(),q=St(Q.graph),{events:V,newCursor:ne}=g().readEntriesAfterCursor(Q.lastDrainedJournalId),ce=K(),se=ir(ce,X=>t.resolveBlob(X)),Ce={...Q.runtimeByCardId},Be=new Map,Me={readRuntime(X){return Be.get(X)??Ce[X]??{_sources:{}}},writeRuntime(X,de){Be.set(X,de),Ce[X]=de;}},Le=[],De=new Map,Xe={readSourceData(X,de){let i=`${X}/${de}`;return De.has(i)?De.get(i):se.readSourceData(X,de)},ingestSourceDataStaged(X,de,i,v){se.ingestSourceDataStaged(X,de,i,v);},commitSourceData(X,de,i){let v=`${X}/.staged/${i}/${de}`,E=ce.read(v);if(E==null){let Y=ce.keyRef?.(v);Y&&(E=t.resolveBlob(Y));}if(E==null)return false;let U=`${X}/${de}`,H=E.trim();try{De.set(U,JSON.parse(H));}catch{De.set(U,H);}return Le.push({cardId:X,outputFile:de,deliveryToken:i}),true},hasSource(X,de){let i=`${X}/${de}`;return De.has(i)?true:se.hasSource(X,de)},listSources(X){let de=se.listSources(X),i=new Set;for(let E of De.keys())E.startsWith(`${X}/`)&&i.add(E.slice(`${X}/`.length));let v=new Set([...de,...i]);return Array.from(v)}},it=()=>q.config.tasks,He={cardStore:l(),cardRuntimeStore:Me,fetchedSourcesStore:Xe,outputStore:s(),executionRequestStore:I,activeTaskConfigs:()=>it()},ut=[],Ot=[],Ft=[],qt=new Map,ht=new Set,Jt=(X,de)=>{ut.push({type:"task-completed",taskName:X,data:de,timestamp:We()});},Tt=(X,de)=>{T({type:"task-failed",taskName:X,error:de,timestamp:We()});},It=Xt(q,{handlers:{"card-handler":qn(e,ne,He,Jt,Tt,(X,de)=>{Ot.push({cardId:X,values:de});},X=>{Ft.push(X);})},onNodeRemoved:X=>{qt.delete(X),Be.delete(X),delete Ce[X],ht.add(X);}});for(it=()=>It.getState().config.tasks,ut=V;ut.length>0;){let X=ut;ut=[];for(let de of X)if(de.type==="task-restart"){let i=He.cardStore.readCard(de.taskName);i&&qt.set(de.taskName,i);}It.pushAll(X),await It.waitForHandlers();}let Qt=It.getState();await It.dispose({wait:true});let nn=x().readSnapshot(e.value).version;h({lastDrainedJournalId:ne,graph:bt(Qt),runtimeByCardId:Ce},nn);for(let{cardId:X,values:de}of Ot)He.outputStore.writeComputedValues(X,de);for(let X of Ft)He.outputStore.writeDataObjects(X);for(let{cardId:X,outputFile:de,deliveryToken:i}of Le)se.commitSourceData(X,de,i);let Pt;try{Pt=wt(vt(a,Qt)),He.outputStore.writeStatusSnapshot(Pt);}catch(X){o(`[board-live-cards-public] status publish failed: ${X instanceof Error?X.message:String(X)}`);}let At=[];for(let{cardId:X,values:de}of Ot)At.push({kind:"computed_values",cardId:X,values:de});for(let X of Ft)for(let[de,i]of Object.entries(X))de&&At.push({kind:"data_object",key:de,payload:i});for(let[X,de]of qt)X!==Ae&&At.push({kind:"card_refreshed",cardId:X,card:de});for(let X of ht)At.push({kind:"card_removed",cardId:X});Pt!==void 0&&At.push({kind:"status",status:Pt}),b(At);let Rt=c()??{howToRun:"built-in",whatToRun:Pe({kind:"built-in",value:"source-cli-task-executor"})},vr=t.supportsDirectSourceOutput?.(Rt)===true;I.dispatchEntriesForJournalId(ne,X=>{if(X.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${X.taskKind}" \u2014 skipping`);return}let de=X.payload,i=de.enrichedCard?.id??"unknown",v=de.enrichedCard?.source_defs??[];if(Rt.howToRun==="queue-storage"&&vr){try{let E=t.queueStorageForRef(N(),"task-executor"),U=typeof Rt.extra?.boardId=="string"?Rt.extra.boardId:void 0,H=[];for(let Y of v){if(!Y.outputFile){o(`[dispatch] source "${Y.bindTo}" has no outputFile \u2014 skipping`);continue}let ie=t.genId(),fe=`${i}/.staged/${ie}/${Y.outputFile}`,Je=ce.keyRef?.(fe);if(!Je)continue;let Te={ref:Pe(Je),deliveryToken:ie,outputFile:Y.outputFile,cardId:i},Ge=Nn({cbk:de.callbackToken,rg:e.value,br:Pe(e),cid:i,b:Y.bindTo,d:Y.outputFile,cs:void 0,rqt:de.rqt,dt:Te.deliveryToken});H.push({...U?{boardId:U}:{},ref:Rt,args:{source_def:Y,base_ref:Pe(e),callback:n.createCallback(Ge),output:Te}});}H.length>0&&E.enqueueMany(H);}catch(E){Tt(i,E instanceof Error?E.message:String(E));}return}for(let E of v){if(!E.outputFile){o(`[dispatch] source "${E.bindTo}" has no outputFile \u2014 skipping`);continue}let U;if(vr){let Y=t.genId(),ie=`${i}/.staged/${Y}/${E.outputFile}`,fe=ce.keyRef?.(ie);fe&&(U={ref:Pe(fe),deliveryToken:Y,outputFile:E.outputFile,cardId:i});}let H=Nn({cbk:de.callbackToken,rg:e.value,br:Pe(e),cid:i,b:E.bindTo,d:E.outputFile,cs:void 0,rqt:de.rqt,...U?{dt:U.deliveryToken}:{}});t.dispatchExecution(Rt,{source_def:E,base_ref:Pe(e),callback:n.createCallback(H),...U?{output:U}:{}}).catch(Y=>Tt(i,Y instanceof Error?Y.message:String(Y)));}});}function N(){let j=A().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 $(){t.queueStorageForRef(N(),"process-accumulated").enqueue({boardRef:Pe(e)}),t.requestProcessAccumulated?.();}function J(){let j=t.queueStorageForRef(N(),"process-accumulated");for(;;){let I=j.lease({max:64,visibilityMs:1e3});if(I.length<=0)return;for(let Q of I)j.ack(Q.id,Q.leaseToken);if(I.length<64)return}}async function oe(){try{let j=()=>{let Q=p(),{events:q}=g().readEntriesAfterCursor(Q.lastDrainedJournalId);q.length<=0||$();},I=await an(t.lock,O,j);return he({ran:I!==!1})}catch(j){return be(j)}}function pe(){$();}function Z(j){try{let I=j.params?.cardStoreRef;if(!I)return me("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 me("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!m()){let Be=_t(Vt);h({lastDrainedJournalId:"",graph:bt(Be),runtimeByCardId:{}},null);}let Q=j.params?.outputsStoreRef;if(!Q)return me("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let q=j.params?.queueStoreRef;if(!q)return me("init requires params.queueStoreRef \u2014 pass the queue store ref here");let V=j.params?.fetchedSourcesStoreRef;if(!V)return me("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");f=j.params?.scratchStoreRef;let ne=j.params?.chatStoreRef;if(!ne)return me("init requires params.chatStoreRef \u2014 pass the chat store ref here");let ce=j.params?.artifactsStoreRef;if(!ce)return me("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let se=A();se.writeBoardRuntimeStoreRef(d),se.writeCardStoreRef(I),se.writeOutputsStoreRef(Q),se.writeQueueStoreRef(q),se.writeFetchedSourcesStoreRef(V),se.writeChatStoreRef(ne),se.writeArtifactsStoreRef(ce),l().writeCard(xt().id,xt());let Ce=y({params:{cardId:xt().id,restart:!0}});if(Ce.status!=="success")return Ce;try{s().writeStatusSnapshot(wt(vt(a,St(p().graph))));}catch{}return he()}catch(I){return be(I)}}function ae(j){try{let I=s().readStatusSnapshot();if(!I){I=wt(vt(a,St(p().graph)));try{s().writeStatusSnapshot(I);}catch{}}return he(I)}catch(I){return be(I)}}function re(j){try{let I=j.params?.id;if(!I)return me("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(I);}catch{}return T({type:"task-removal",taskName:I,timestamp:We()}),I!==Ae&&T({type:"task-restart",taskName:Ae,timestamp:We()}),pe(),he()}catch(I){return be(I)}}function G(j){try{let I=j.params?.cardId;if(!I)return me("addCardFiles requires params.cardId");let Q=mr(l(),{emitNotification:R}).appendFiles({params:{id:I},body:j.body});return Q.status!=="success"?Q:he({cardId:I,files_added:Q.data.files_added,notified:!0})}catch(I){return be(I)}}function z(j){try{let I=j.params?.id;return I?(T({type:"task-restart",taskName:I,timestamp:We()}),pe(),he()):me("retrigger requires params.id")}catch(I){return be(I)}}async function B(j){return J(),oe()}function w(){let j=A().readFetchedSourcesStoreRef();if(!j)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return j}function K(){return t.blobStorageForRef(w())}function y(j){try{let I=j.params?.cardId,Q=j.params?.all,q=!!j.params?.restart;if(!I&&!Q)return me("upsertCard requires --card-id <id> or --all");let V=Q?l().readAllCards().map(ce=>ce.id):[I];for(let ce of V)if(!l().readCard(ce))return me(`Card "${ce}" not found in board at ${e.value}`);let ne=!1;for(let ce of V){let se=l().readCard(ce),Ce=Kt(se),Be=t.hashFn(Ce),Me=t.kvStorage("card-upsert"),Le=Me.read(ce),De=Le?.taskConfigHash!==Be;if(!(!De&&!q)){if(De){let Xe=Le?.blobRef??l().readCardKey(ce)??ce;T({type:"task-upsert",taskName:ce,taskConfig:Ce,timestamp:We()}),Me.write(ce,{blobRef:Xe,taskConfigHash:Be,updatedAt:We()}),ne=ne||ce!==Ae;}q&&T({type:"task-restart",taskName:ce,timestamp:We()});}}return ne&&T({type:"task-restart",taskName:Ae,timestamp:We()}),pe(),he()}catch(I){return be(I)}}function S(j){try{let I=j.params?.token;if(!I)return me("taskFailed requires params.token");let Q=j.params?.error??"unknown error",q=pr(I);return q?(T({type:"task-failed",taskName:q.taskName,error:Q,timestamp:We()}),pe(),he()):me("Invalid callback token")}catch(I){return be(I)}}function F(j){try{let I=j.params?.token;if(!I)return me("taskProgress requires params.token");let q=(j.body??{}).update??{},V=pr(I);return V?(T({type:"task-progress",taskName:V.taskName,update:q,timestamp:We()}),pe(),he()):me("Invalid callback token")}catch(I){return be(I)}}function M(j){try{let I=j.params?.token,Q=j.params?.ref;if(!I)return me("sourceDataFetched requires params.token");if(!Q)return me("sourceDataFetched requires params.ref");let q=jn(I);if(!q)return me("Invalid source token");let{cbk:V,cid:ne,b:ce,d:se,cs:Ce,rqt:Be,dt:Me}=q,Le=ir(K(),He=>t.resolveBlob(He)),De=Me||t.genId();Me||Le.ingestSourceDataStaged(ne,se,ct(Q),De);let Xe=pr(V);if(!Xe)return me("Invalid callback token embedded in source token");let it=We();return T({type:"task-progress",taskName:Xe.taskName,update:{bindTo:ce,outputFile:se,fetchedAt:it,deliveryToken:De,sourceChecksum:Ce,rqt:Be},timestamp:it}),pe(),he()}catch(I){return be(I)}}function L(j){try{let I=j.params?.token,Q=j.params?.reason??"unknown";if(!I)return me("sourceDataFetchFailure requires params.token");let q=jn(I);if(!q)return me("Invalid source token");let{cbk:V,b:ne,d:ce,cs:se,rqt:Ce}=q,Be=pr(V);return Be?(T({type:"task-progress",taskName:Be.taskName,update:{bindTo:ne,outputFile:ce,failure:!0,reason:Q,sourceChecksum:se,rqt:Ce},timestamp:We()}),pe(),he()):me("Invalid callback token embedded in source token")}catch(I){return be(I)}}function D(j){try{let I=A().readCardStoreRef();return I?he({storeRef:I}):me(`Board at ${e.value} has no card store configured`)}catch(I){return be(I)}}function ee(j){try{return he({storeRef:d??null})}catch(I){return be(I)}}function ue(j){try{let I=A().readOutputsStoreRef();return I?he({storeRef:I}):me(`Board at ${e.value} has no outputs store configured`)}catch(I){return be(I)}}function Se(j){try{return he({storeRef:f??null})}catch(I){return be(I)}}function Ie(j){try{let I=A().readChatStoreRef();return he({storeRef:I})}catch(I){return be(I)}}function Ee(j){try{let I=A().readArtifactsStoreRef();return he({storeRef:I})}catch(I){return be(I)}}function ge(j){try{let I=A().readFetchedSourcesStoreRef();return he({storeRef:I})}catch(I){return be(I)}}function ke(j){try{let I=j.params?.key;if(!I)return me("getConfig requires params.key");let Q=A(),q;switch(I){case "task-executor":q=u??null;break;case "chat-handler-flow":q=k??null;break;case "board-runtime-store-ref":q=Q.readBoardRuntimeStoreRef();break;case "card-store-ref":q=Q.readCardStoreRef();break;case "outputs-store-ref":q=Q.readOutputsStoreRef();break;case "scratch-store-ref":q=f??null;break;case "chat-store-ref":q=Q.readChatStoreRef();break;case "artifacts-store-ref":q=Q.readArtifactsStoreRef();break;case "fetched-sources-store-ref":q=Q.readFetchedSourcesStoreRef();break;default:return me(`getConfig: unknown key "${I}"`)}return he({value:q})}catch(I){return be(I)}}function Ve(j){try{let I=j.params?.key;if(!I)return me("getOutputsDataObject requires params.key");if(I===ot)return he(null);let Q=s().readDataObject(I);return he(Q)}catch(I){return be(I)}}function we(j){try{return he(dr(s().readAllDataObjects()))}catch(I){return be(I)}}function Ke(j){try{let I=j.params?.key;if(!I)return me("getOutputsComputedValues requires params.key");let Q=s().readComputedValues(I);return he(Q)}catch(I){return be(I)}}function Ne(j){try{return he(s().readAllComputedValues())}catch(I){return be(I)}}function Re(){return ir(K(),j=>t.resolveBlob(j))}function et(j){let I=K().keyRef?.(j);if(!I)throw new Error("configured fetched-sources store does not support keyRef");return Pe(I)}function Qe(j){try{let I=j.params?.key;if(!I)return me("getOutputsFetchedSources requires params.key");let Q=Re().listSources(I),q={};for(let V of Q)q[V]=et(`${I}/${V}`);return he(q)}catch(I){return be(I)}}function tt(j){try{let I=Re(),Q=new Set;for(let V of K().listKeys()){let ne=V.indexOf("/");ne>0&&!V.includes("/.staged/")&&Q.add(V.slice(0,ne));}let q={};for(let V of Q){let ne=I.listSources(V);if(ne.length>0){q[V]={};for(let ce of ne)q[V][ce]=et(`${V}/${ce}`);}}return he(q)}catch(I){return be(I)}}function yt(j){try{let I=l().readAllCards().filter(se=>se.id!==Ae),Q=ae({});if(Q.status!=="success")return Q;let q=we({});if(q.status!=="success")return q;let V=Ne({});if(V.status!=="success")return V;let ne=V.data,ce={};for(let se of I){let Ce=typeof se?.id=="string"?se.id:null;if(!Ce)continue;let Be=se.card_data&&typeof se.card_data=="object"&&!Array.isArray(se.card_data)?se.card_data:{};ce[Ce]={schema_version:"v1",card_id:Ce,card_data:{...Be},computed_values:ne[Ce]&&typeof ne[Ce]=="object"?ne[Ce]:{}};}return he({cardDefinitions:I,statusSnapshot:Q.data,dataObjectsByToken:q.data,cardRuntimeById:ce})}catch(I){return be(I)}}return {init:Z,status:ae,getBoardRuntimeStoreRef:ee,getCardStoreRef:D,getOutputsStoreRef:ue,getScratchStoreRef:Se,getChatStoreRef:Ie,getArtifactsStoreRef:Ee,getFetchedSourcesStoreRef:ge,getConfig:ke,getOutputsDataObject:Ve,getAllOutputsDataObjects:we,getOutputsComputedValues:Ke,getAllOutputsComputedValues:Ne,getOutputsFetchedSources:Qe,getAllOutputsFetchedSources:tt,buildSseOneShotPayload:yt,removeCard:re,addCardFiles:G,retrigger:z,processAccumulatedEvents:B,upsertCard:y,taskFailed:S,taskProgress:F,sourceDataFetched:M,sourceDataFetchFailure:L}}function Dn(e,t,r){let n=r?.taskExecutorRef,o=()=>{if(r){if(!r.boardRuntimeStoreRef)throw new Error(`Board at ${e.value} requires boardRuntimeStoreRef for non-core runtime operations.`);return cr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return cr(t.kvStorage("config"))};function a(){let l=o().readCardStoreRef();if(!l)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let s=t.kvStorageForRef(l);return {readIndex(){return s.read("_index")},writeIndex(c){s.write("_index",c);},readCard(c){return s.read(c)},writeCard(c,m){return s.write(c,m),t.hashFn(m)},removeCard(c){s.delete(c);},cardExists(c){return s.read(c)!==null},defaultCardKey(c){return c}}}let d=()=>Ut(a(),t.onWarn??(()=>{}));function f(){return n??o().readTaskExecutorRef()}async function u(l,s){let c=t.validateSchema(s),m=[],p=f();if(p&&Array.isArray(s.source_defs))for(let T of s.source_defs){let O=typeof T.bindTo=="string"?T.bindTo:"(unknown)";try{let N;try{N=await t.invokeExecutor(p,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(T)});}catch(J){let oe=J;if(N=typeof oe?.stdout=="string"?oe.stdout:"",!N.trim()){m.push(`source "${O}": executor validate-source-def failed \u2014 ${J instanceof Error?J.message:String(J)}`);continue}}let $=JSON.parse(N.trim());if(!$.ok&&Array.isArray($.errors))for(let J of $.errors)m.push(`source "${O}": ${J}`);}catch(N){m.push(`source "${O}": executor validate-source-def failed \u2014 ${N instanceof Error?N.message:String(N)}`);}}let h=[...c.errors,...m];return he({cardId:l,isValid:h.length===0,issues:h})}function k(l,s){let c=l.params?.sourceIdx,m=l.params?.outRef;if(c===void 0)return me(`${s} requires params.sourceIdx`);if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return me(`${s} requires card JSON object in body`);let p=l.body,h=p["card-content"]??p,T=p["mock-projections"]??{},O=h.source_defs??[];if(c<0||c>=O.length)return me(`sourceIdx ${c} out of range (card has ${O.length} source(s))`);let N=O[c],$=typeof N.bindTo=="string"?N.bindTo:"source";return {src:N,bindTo:$,outRef:m,mockProjections:T}}async function R(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return me("validateCardPreflight requires card JSON object in body");let s=l.body,c=s["card-content"]??s,m=typeof c.id=="string"?c.id:"(unknown)";return await u(m,c)}catch(s){return be(s)}}async function C(l){try{let s=k(l,"probeSourcePreflight");if("status"in s)return s;let c=f();if(!c)return me("No task-executor registered for this board");try{let m={...s.src,_projections:s.mockProjections},p=await t.invokeExecutor(c,"probe-source-preflight",{timeout:s.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(m)}),h=JSON.parse(p.trim());return h.ok?he({bindTo:s.bindTo,reachable:h.reachable,latencyMs:h.latencyMs,note:h.note}):me(h.error??"Preflight probe failed")}catch{return me("Executor does not support probe-source-preflight")}}catch(s){return be(s)}}async function b(l){try{let s=k(l,"runSourcePreflight");if("status"in s)return s;let c=f();if(!c)return me("No task-executor registered for this board");try{let m={...s.src,_projections:s.mockProjections},p=await t.invokeExecutor(c,"run-source-preflight",{timeout:s.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(m)}),h=JSON.parse(p.trim());if(!h.ok)return he({bindTo:s.bindTo,ok:!1,result:null,issues:[h.error??"Preflight run failed"]});if(s.outRef){let T=ct(s.outRef);t.absoluteBlob.write(T.value,JSON.stringify(h.resultValue,null,2));}return he({bindTo:typeof h.bindTo=="string"?h.bindTo:s.bindTo,ok:!0,result:h.resultValue??null,issues:[]})}catch(m){let p=m instanceof Error?m.message:String(m);return he({bindTo:s.bindTo,ok:!1,result:null,issues:[p]})}}catch(s){return be(s)}}async function P(l){try{let s=f();if(!s)return me("No task-executor registered for this board");let c=await t.invokeExecutor(s,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return he(JSON.parse(c.trim()))}catch(s){return be(s)}}function _(l){try{let s=l.body;if(!s||!Array.isArray(s.ops))return me("updatesInCardStore requires body.ops array");let c=s.ops,m=d();for(let p of c){let h=p.op,T=p.id;if(!T)return me('op is missing "id"');if(h==="update"){let O=p["card-content"];if(!O)return me(`update op for "${T}" is missing "card-content"`);m.writeCard(T,O);}else return me(`Unknown op type: "${h??"(none)"}"`)}return he()}catch(s){return be(s)}}function A(l){try{let s=l.body;if(!s||!Array.isArray(s.ids))return me("readFromCardStore requires body.ids array");let c=s.ids,m=d(),p=c.map(h=>({id:h,"card-content":m.readCard(h)}));return he({cards:p})}catch(s){return be(s)}}function x(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return me("evalCardCompute requires a JSON object in body");let s=l.body,c=s["card-content"]??s,m=typeof c.id=="string"?c.id:"(unknown)",p=s["mock-fetched-sources"]??{},h=s["mock-requires"]??{},T=c.compute;if(!T||!Array.isArray(T)||T.length===0)return he({cardId:m,ok:!0,computed_values:{},errors:[]});let O={id:m,card_data:c.card_data??{},requires:h,source_defs:c.source_defs,compute:T},N=ze.runSync(O,{sourcesData:p}),$=N.node.computed_values??{},J=N.errors??[];return he({cardId:m,ok:J.length===0,computed_values:$,errors:J})}catch(s){return be(s)}}async function g(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return me("simulateCardCycle requires a JSON object in body");let s=l.body,c=s["card-content"]??s,m=typeof c.id=="string"?c.id:"(unknown)",p=s["mock-fetched-sources"]??{},h=s["mock-requires"]??{},T=await u(m,c),O=T.status==="success"?{isValid:T.data.isValid,issues:T.data.issues}:{isValid:!1,issues:[T.status==="fail"?T.error:"internal error"]},N=c.source_defs??[],$=c.card_data??{},J=[],oe=[],pe=[];if(N.length>0){J=ze.enrichSourcesSync(N,{card_data:$,requires:h}),oe=J.filter(S=>S._skip!==!0);for(let S of oe){let F=S.projections,M=S._projections;if(F&&M){for(let L of Object.keys(F))if(M[L]===void 0){let D=typeof S.bindTo=="string"?S.bindTo:"(unknown)";pe.push({bindTo:D,key:L,error:`Projection "${L}" resolved to undefined`});}}}}let Z=[],ae=new Set(oe.map(S=>typeof S.bindTo=="string"?S.bindTo:"")),re=Object.fromEntries(Object.entries(p).filter(([S])=>ae.has(S))),G=s["task-executor-ref"],z=(G?.howToRun&&G?.whatToRun?G:void 0)??f();for(let S=0;S<J.length;S++){let F=J[S],M=typeof F.bindTo=="string"?F.bindTo:`source_${S}`;if(F._skip===!0){Z.push({bindTo:M,skipped:!0});continue}if(!z){Z.push({bindTo:M,skipped:!0,error:"No task executor configured"});continue}try{let L={...F},D=await t.invokeExecutor(z,"run-source-preflight",{timeout:F.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(L)}),ee=JSON.parse(D.trim());ee.ok&&!Object.prototype.hasOwnProperty.call(p,M)&&Object.prototype.hasOwnProperty.call(ee,"resultValue")&&(re[M]=ee.resultValue),Z.push({bindTo:M,reachable:ee.reachable,latencyMs:ee.latencyMs,error:ee.ok?void 0:ee.error});}catch{Z.push({bindTo:M,skipped:!0,error:"Executor does not support run-source-preflight"});}}let B=c.compute,w={},K=[];if(B&&Array.isArray(B)&&B.length>0){let S={id:m,card_data:$,requires:h,source_defs:c.source_defs,compute:B},F=ze.runSync(S,{sourcesData:re});w=F.node.computed_values??{},K=F.errors??[];}let y=O.isValid&&pe.length===0&&K.length===0&&Z.every(S=>S.reachable!==!1);return he({cardId:m,ok:y,validation:O,source_probes:Z,projection_errors:pe,fetched_sources:re,computed_values:w,compute_errors:K})}catch(s){return be(s)}}return {validateCardPreflight:R,probeSourcePreflight:C,runSourcePreflight:b,evalCardCompute:x,simulateCardCycle:g,describeTaskExecutorCapabilities:P,updatesInCardStore:_,readFromCardStore:A}}function gr(e,t={}){function r(k){return {status:"success",data:k}}function n(k){return {status:"fail",error:k}}function o(k){return {status:"error",error:k instanceof Error?k.message:String(k)}}async function a(k){let R=t.emitNotification;if(!R||k.length===0)return;let C=$e(k);if(C.length===1){await R(C[0]);return}await R(Ue({kind:"notification-batch",notifications:C}));}async function d(k){let R=k.params?.id;if(R){let C=await e.readCard(R);if(!C)throw new Error(`card "${R}" not found`);return [C]}return await e.readAllCards()}function f(k){return Ue({kind:"notification-batch",notifications:$e(k.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function u(k){if(Array.isArray(k))return k;if(k&&typeof k=="object"){let R=k;return Array.isArray(R.files)?R.files:[k]}return null}return {async get(k){try{return r({cards:await d(k)})}catch(R){return o(R)}},async buildNotificationBatch(k){try{return r(f(await d(k)))}catch(R){return o(R)}},async set(k){try{let R=k.body;if(R==null)return n("set requires a body (card object or array of cards)");let C=Array.isArray(R)?R:[R];for(let b of C){if(typeof b.id!="string")return n("each card must have a string `id` field");await e.writeCard(b.id,b);}return await a(C.map(b=>({kind:"card_refreshed",cardId:b.id,card:b}))),r({count:C.length})}catch(R){return o(R)}},async del(k){try{let R=k.body?.ids??[],C=k.params?.id,b=C?[...R,C]:R;if(b.length===0)return n("del requires body.ids (string[]) or params.id");for(let P of b)await e.removeCard(P);return await a(b.map(P=>({kind:"card_removed",cardId:P}))),r({count:b.length})}catch(R){return o(R)}},async patch(k){try{let R=k.params?.id,C=k.params?.path;if(!R)return n("patch requires params.id");if(!C)return n("patch requires params.path");let b=k.body,P=b&&Object.prototype.hasOwnProperty.call(b,"value")?b.value:k.body;await e.patchCard(R,C,P);let _=await e.readCard(R);return _?(await a([{kind:"card_refreshed",cardId:R,card:_}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},async appendFiles(k){try{let R=k.params?.id;if(!R)return n("appendFiles requires params.id");let C=await e.readCard(R);if(!C)return n(`card "${R}" not found`);let b=u(k.body);if(!b||b.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let P=C.card_data&&typeof C.card_data=="object"&&!Array.isArray(C.card_data)?C.card_data:{},_=Array.isArray(P.files)?P.files:[],A=[..._,...b],x=b.map((l,s)=>({idx:_.length+s,entry:l})),g=await this.patch({params:{id:R,path:"card_data.files"},body:{value:A}});return g.status!=="success"?g:r({files_added:x})}catch(R){return o(R)}}}}async function $n(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Vr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Kr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Vr(r),leaseToken:r.leaseToken,leaseExpiresAt:r.leaseExpiresAt}))},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},async peekActive(){return (await e.peekActive()).map(Vr)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Vr(t),reason:t.reason}))}}}function Un(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return 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 ca(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function yr(e,t){return ca(e)?e.then(t):t(e)}function Vn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=Vn(r[n],o):r[n]=o;return r}function hr(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]:hr(a,o,r)}}function Kn(e){return {read:r=>e.read(r),get(r,n){return yr(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 yr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return yr(e.read(r),o=>e.write(r,Vn(o??{},n)))},patch(r,n,o){return yr(e.read(r),a=>{let d=n.split(".").filter(Boolean);return e.write(r,hr(a??{},d,o))})}}}function Rr(e){return Kn(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,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,f]of Object.entries(o))n[d]!==f.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],f=Object.entries(a).find(([,u])=>u.key===o);return d&&d.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${d.key}", cannot remap to "${o}"`}:f&&f[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${f[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,a){let d=await r(),f=a??d[n]?.key??e.defaultCardKey(n),u=await e.writeCard(f,o);d[n]={key:f,checksum:u,updatedAt:new Date().toISOString()},await e.writeIndex(d);},async patchCard(n,o,a){let d=await r(),f=d[n];if(!f||!await e.cardExists(f.key))throw new Error(`card "${n}" not found`);let u=await e.readCard(f.key);if(!u||typeof u!="object"||Array.isArray(u))throw new Error(`card "${n}" is not patchable`);let k=String(o||"").split(".").filter(Boolean),R=hr(u,k,a),C=await e.writeCard(f.key,R);d[n]={key:f.key,checksum:C,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 _e(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function xe(e){return {status:"fail",error:e}}function Oe(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function je(){return new Date().toISOString()}function da(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Qn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function br(e){try{let t=JSON.parse(Qn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Hn(e){return da(JSON.stringify(e))}function Jn(e){try{let t=JSON.parse(Qn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function la(e){return Lr(e,Bn,()=>({_sources:{}}))}function fa(e,t){return ar(e,t)}function ma(e){return sr(e)}function pa(e,t){return Mr(e,t)}function ga(e,t,r,n,o,a){return async d=>{let f=[],u=await r.cardStore.readCard(d.nodeId);if(!u)return "task-initiate-failure";let k=u.id;if(k===Ae){let Z=r.activeTaskConfigs?.(),ae={[ot]:Z?$r((await Promise.all(Object.keys(Z).filter(re=>re!==Ae).map(re=>r.cardStore.readCard(re)))).filter(re=>!!re),Z):await Dr(await r.cardStore.readAllCards())};return (a??(()=>{}))(ae),n(d.nodeId,ae),"task-initiated"}let R=u.card_data??{},C=u.source_defs??[],b=await r.cardRuntimeStore.readRuntime(k),P=false,_=async()=>{P&&(await r.cardRuntimeStore.writeRuntime(k,b),P=false);},A=Z=>Lt(b._sources[Z]),x=(Z,ae)=>{b._sources[Z]=Lt(ae),P=true;},g=d.taskState?.executionCount??0;if(b._lastExecutionCount!==g&&(b._sources={},b._lastExecutionCount=g,P=true),d.update){let Z=d.update.outputFile;if(Z){let ae=A(Z);if(d.update.failure){let re=d.update.rqt??ae.lastRequestedToken??ae.queueRequestedToken;re&&x(Z,$t(ae,re));}else {let re=d.update.rqt;if(!ae.lastCompletedToken||re>ae.lastCompletedToken){let G=typeof d.update.deliveryToken=="string"?d.update.deliveryToken:void 0,z=G?await r.fetchedSourcesStore.commitSourceData(k,Z,G):false;x(Z,z?Ur(ae,re):$t(ae,re));}}await _();}}let l={};for(let[Z,ae]of Object.entries(d.state??{}))if(ae!==null&&typeof ae=="object"&&!Array.isArray(ae)){let re=ae[Z];l[Z]=re!==void 0?re:ae;}else l[Z]=ae;let s={id:k,card_data:{...R},requires:l,source_defs:C,compute:u.compute},m=ze.enrichSourcesSync(Array.isArray(u.source_defs)?u.source_defs:void 0,{card_data:R,requires:l}).filter(Z=>Z._skip!==true),p=m,h={};for(let Z of m){if(!Z.outputFile)continue;let ae=await r.fetchedSourcesStore.readSourceData(k,Z.outputFile);ae!==null&&(h[Z.bindTo]=ae);}s._sourcesData=h,u.compute&&ze.runSync(s,{sourcesData:h}),(o??(()=>{}))(k,s.computed_values??{});let T={...u,source_defs:Array.isArray(m)?m.map(Z=>({...Z,boardDir:typeof Z.boardDir=="string"&&Z.boardDir?Z.boardDir:e.value})):m},O=je(),N=d.update?void 0:O,$=p.filter(Z=>{let ae=Z.outputFile;if(typeof ae!="string"||!ae)return true;let re=A(ae);N&&(re={...re,queueRequestedToken:N},x(ae,re));let G=re.queueRequestedToken??re.lastRequestedToken??O;return Dt(re,G)==="dispatch"});if(await _(),$.length>0){let Z=false,ae=O;for(let re of $){let G=re.outputFile;if(typeof G!="string"||!G)continue;let z=A(G),B=z.queueRequestedToken??O;x(G,{...z,lastRequestedToken:B}),ae=B,Z=true;}return Z&&await _(),Z&&(f.push({taskKind:"source-fetch",payload:{boardRef:Pe(e),enrichedCard:T,callbackToken:d.callbackToken,rqt:ae}}),await r.executionRequestStore.appendEntries(t,f)),"task-initiated"}if(p.some(Z=>{let ae=Z.outputFile;if(typeof ae!="string"||!ae)return false;let re=A(ae),G=re.queueRequestedToken??re.lastRequestedToken??O;return Dt(re,G)==="in-flight"}))return "task-initiated";let oe=u.provides??[],pe={};for(let{bindTo:Z,ref:ae}of oe)pe[Z]=ze.resolve(s,ae);return (a??(()=>{}))(pe),n(d.nodeId,pe),f.length>0&&await r.executionRequestStore.appendEntries(t,f),"task-initiated"}}function Gn(e,t,r={}){zt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),a=Pe(e),d=r.emitNotification??(B=>{if(!t.publishBoardChangeNotifications)return;let w=B.kind==="notification-batch"?B.notifications:[B];return t.publishBoardChangeNotifications(w)}),f=null,u=r.boardRuntimeStoreRef,k=r.scratchStoreRef,R=r.taskExecutorRef,C=r.chatHandlerFlow;function b(){if(!u)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return u}function P(B){if(B.length!==0)try{let w=$e(B),K=Ue({kind:"notification-batch",notifications:w});return Promise.resolve(d(K)).catch(y=>{o(`[async-board-live-cards-public] emitNotification failed: ${y instanceof Error?y.message:String(y)}`);})}catch(w){o(`[async-board-live-cards-public] emitNotification failed: ${w instanceof Error?w.message:String(w)}`);return}}let _=()=>Un(t.kvStorageForRef(b())),A=e.value,x=()=>nr(Nr(()=>t.kvStorageForRef(b()),t.hashFn),"v1"),g=async()=>{let B=await _().readOutputsStoreRef();if(!B)throw new Error(`Board at ${e.value} has no outputs store configured.`);return ma(t.kvStorageForRef(B))},l=async()=>{let B=await _().readCardStoreRef();if(!B)throw new Error(`Board at ${e.value} has no card store configured.`);let w=t.kvStorageForRef(B);return Cr(kr(Rr(w),t.hashFn),o)};async function s(){return !!(await x().readSnapshot(A)).values[mt]}async function c(){let B=await x().readSnapshot(A);if(!B.values[mt])throw new Error(`Board not initialized at ${e.value}`);return fr(B.values)}async function m(B,w){let K=await x().commitSnapshot(A,{schemaVersion:"v1",expectedVersion:w,deleteKeys:[],shallowMerge:lr(B)});if(!K.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${w??"null"} current=${K.currentVersion??"null"}`)}let p=()=>Tn(t.journalStorageForRef(b()));async function h(){return R??await _().readTaskExecutorRef()}async function T(){return dr(await(await g()).readAllDataObjects())}async function O(B){await p().appendEvent(B);}async function N(){let B=await _().readFetchedSourcesStoreRef();if(!B)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return B}async function $(){return t.blobStorageForRef(await N())}async function J(){return fa(await $(),B=>t.resolveBlob(B))}async function oe(B){let w=(await $()).keyRef?.(B);if(!w)throw new Error("configured fetched-sources store does not support keyRef");let K=await Promise.resolve(w);return Pe(K)}async function pe(){let B=pa(t.kvStorageForRef(b()),async(q,V)=>{let ne=q.payload,se=(ne.enrichedCard??{}).id??ne.cardId??"unknown";await O({type:"task-failed",taskName:se,error:V,timestamp:je()});}),w=la(t.kvStorageForRef(b())),K=await $(),y=await J(),S=await l(),F=await g(),M=new Map,L=new Map,D=[],ee=[],ue=[],Se=new Map,Ie=new Set,Ee={async readRuntime(q){return M.get(q)??await w.readRuntime(q)},async writeRuntime(q,V){M.set(q,V),we[q]=V;}},ge={async readSourceData(q,V){let ne=`${q}/${V}`;return L.has(ne)?L.get(ne):await y.readSourceData(q,V)},ingestSourceDataStaged(q,V,ne,ce){return y.ingestSourceDataStaged(q,V,ne,ce)},async commitSourceData(q,V,ne){let ce=`${q}/.staged/${ne}/${V}`,se=await K.read(ce);if(se==null){let Me=await Promise.resolve(K.keyRef?.(ce));Me&&(se=await t.resolveBlob(Me));}if(se==null)return false;let Ce=`${q}/${V}`,Be=se.trim();try{L.set(Ce,JSON.parse(Be));}catch{L.set(Ce,Be);}return D.push({cardId:q,outputFile:V,deliveryToken:ne}),true},async hasSource(q,V){let ne=`${q}/${V}`;return L.has(ne)||await y.hasSource(q,V)},async listSources(q){let V=await y.listSources(q),ne=[...L.keys()].filter(ce=>ce.startsWith(`${q}/`)).map(ce=>ce.slice(`${q}/`.length));return [...new Set([...V,...ne])]}},ke=await c(),Ve=St(ke.graph),we={...ke.runtimeByCardId},{events:Ke,newCursor:Ne}=await p().readEntriesAfterCursor(ke.lastDrainedJournalId),Re=Ke,et=()=>Ve.config.tasks,Qe=Xt(Ve,{handlers:{"card-handler":ga(e,Ne,{cardStore:S,cardRuntimeStore:Ee,fetchedSourcesStore:ge,outputStore:F,executionRequestStore:B,activeTaskConfigs:()=>et()},(q,V)=>{Re.push({type:"task-completed",taskName:q,data:V,timestamp:je()});},(q,V)=>{ee.push({cardId:q,values:V});},q=>{ue.push(q);})},onNodeRemoved:q=>{Se.delete(q),M.delete(q),delete we[q],Ie.add(q);}});for(et=()=>Qe.getState().config.tasks;Re.length>0;){let q=Re;Re=[];for(let V of q)if(V.type==="task-restart"){let ne=await S.readCard(V.taskName);ne&&Se.set(V.taskName,ne);}Qe.pushAll(q),await Qe.waitForHandlers();}let tt=Qe.getState();await Qe.dispose({wait:true}),await m({lastDrainedJournalId:Ne,graph:bt(tt),runtimeByCardId:we},(await x().readSnapshot(A)).version);for(let{cardId:q,values:V}of ee)await F.writeComputedValues(q,V);for(let q of ue)await F.writeDataObjects(q);for(let[q,V]of M)await w.writeRuntime(q,V);for(let q of D)await y.commitSourceData(q.cardId,q.outputFile,q.deliveryToken);let yt=wt(vt(a,tt));await F.writeStatusSnapshot(yt);let j=[];for(let{cardId:q,values:V}of ee)j.push({kind:"computed_values",cardId:q,values:V});for(let q of ue)for(let[V,ne]of Object.entries(q))j.push({kind:"data_object",key:V,payload:ne});for(let[q,V]of Se)q!==Ae&&j.push({kind:"card_refreshed",cardId:q,card:V});for(let q of Ie)j.push({kind:"card_removed",cardId:q});j.push({kind:"status",status:yt}),await P(j);let I=await h();if(!I)return;let Q=t.supportsDirectSourceOutput?.(I)===true;await B.dispatchEntriesForJournalId(Ne,async q=>{if(q.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${q.taskKind}" \u2014 skipping`);return}let V=q.payload,ne=V.enrichedCard?.id??"unknown",ce=V.enrichedCard?.source_defs??[];if(I.howToRun==="queue-storage"&&Q){try{let se=await _().readQueueStoreRef();if(!se)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let Ce=t.queueStorageForRef(se,"task-executor"),Be=typeof I.extra?.boardId=="string"?I.extra.boardId:void 0,Me=[];for(let Le of ce){if(!Le.outputFile)continue;let De=t.genId(),Xe=`${ne}/.staged/${De}/${Le.outputFile}`,it=await Promise.resolve(K.keyRef?.(Xe));if(!it)continue;let He={ref:Pe(it),deliveryToken:De,outputFile:Le.outputFile,cardId:ne},ut=Hn({cbk:V.callbackToken,rg:e.value,br:Pe(e),cid:ne,b:Le.bindTo,d:Le.outputFile,cs:void 0,rqt:V.rqt,dt:He.deliveryToken});Me.push({...Be?{boardId:Be}:{},ref:I,args:{source_def:Le,base_ref:Pe(e),callback:n.createCallback(ut),output:He}});}Me.length>0&&await Ce.enqueueMany(Me);}catch(se){await O({type:"task-failed",taskName:ne,error:se instanceof Error?se.message:String(se),timestamp:je()});}return}for(let se of ce){if(!se.outputFile)continue;let Ce;if(Q){let Le=t.genId(),De=`${ne}/.staged/${Le}/${se.outputFile}`,Xe=await Promise.resolve(K.keyRef?.(De));Xe&&(Ce={ref:Pe(Xe),deliveryToken:Le,outputFile:se.outputFile,cardId:ne});}let Be=Hn({cbk:V.callbackToken,rg:e.value,br:Pe(e),cid:ne,b:se.bindTo,d:se.outputFile,cs:void 0,rqt:V.rqt,...Ce?{dt:Ce.deliveryToken}:{}}),Me=await t.dispatchExecution(I,{source_def:se,base_ref:Pe(e),callback:n.createCallback(Be),...Ce?{output:Ce}:{}});Me.dispatched||await O({type:"task-failed",taskName:ne,error:Me.error??"dispatch failed",timestamp:je()});}});}async function Z(){try{let B=async()=>{let K=await c(),{events:y}=await p().readEntriesAfterCursor(K.lastDrainedJournalId);y.length>0&&await re();},w=await $n(t.lock,pe,B);return _e({ran:w!==!1})}catch(B){return Oe(B)}}async function ae(){return f||(f=Z().finally(()=>{f=null;}),f)}async function re(){let B=await _().readQueueStoreRef();if(!B)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);await t.queueStorageForRef(B,"process-accumulated").enqueue({boardRef:Pe(e)}),await t.requestProcessAccumulated?.();}async function G(){let B=await _().readQueueStoreRef();if(!B)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let w=t.queueStorageForRef(B,"process-accumulated");for(;;){let K=await w.lease({max:64,visibilityMs:1e3});if(K.length<=0)return;for(let y of K)await w.ack(y.id,y.leaseToken);if(K.length<64)return}}function z(){re();}return {async init(B){try{let w=B.params?.cardStoreRef;if(!w)return xe("init requires params.cardStoreRef");if(u=B.params?.boardRuntimeStoreRef,!u)return xe("init requires params.boardRuntimeStoreRef");let K=B.params?.outputsStoreRef;if(!K)return xe("init requires params.outputsStoreRef");let y=B.params?.queueStoreRef;if(!y)return xe("init requires params.queueStoreRef");let S=B.params?.fetchedSourcesStoreRef;if(!S)return xe("init requires params.fetchedSourcesStoreRef");k=B.params?.scratchStoreRef;let F=B.params?.chatStoreRef;if(!F)return xe("init requires params.chatStoreRef");let M=B.params?.artifactsStoreRef;if(!M)return xe("init requires params.artifactsStoreRef");await s()||await m({lastDrainedJournalId:"",graph:bt(_t(Vt)),runtimeByCardId:{}},null);let L=_();await L.writeBoardRuntimeStoreRef(u),await L.writeCardStoreRef(w),await L.writeOutputsStoreRef(K),await L.writeQueueStoreRef(y),await L.writeFetchedSourcesStoreRef(S),await L.writeChatStoreRef(F),await L.writeArtifactsStoreRef(M),await(await l()).writeCard(Ae,xt());let D=t.kvStorage("card-upsert"),ee=xt(),ue=Kt(ee),Se=t.hashFn(ue),Ee=(await D.read(Ae))?.blobRef??await(await l()).readCardKey(Ae)??Ae;return await O({type:"task-upsert",taskName:Ae,taskConfig:ue,timestamp:je()}),await D.write(Ae,{blobRef:Ee,taskConfigHash:Se,updatedAt:je()}),await O({type:"task-restart",taskName:Ae,timestamp:je()}),z(),await(await g()).writeStatusSnapshot(wt(vt(a,St((await c()).graph)))),_e()}catch(w){return Oe(w)}},async status(B){try{let w=await g(),K=await w.readStatusSnapshot();return K||(K=wt(vt(a,St((await c()).graph))),await w.writeStatusSnapshot(K)),_e(K)}catch(w){return Oe(w)}},async getCardStoreRef(B){try{let w=await _().readCardStoreRef();return w?_e({storeRef:w}):xe(`Board at ${e.value} has no card store configured`)}catch(w){return Oe(w)}},async getBoardRuntimeStoreRef(B){try{return _e({storeRef:u??null})}catch(w){return Oe(w)}},async getOutputsStoreRef(B){try{let w=await _().readOutputsStoreRef();return w?_e({storeRef:w}):xe(`Board at ${e.value} has no outputs store configured`)}catch(w){return Oe(w)}},async getScratchStoreRef(B){try{return _e({storeRef:k??null})}catch(w){return Oe(w)}},async getChatStoreRef(B){try{return _e({storeRef:await _().readChatStoreRef()})}catch(w){return Oe(w)}},async getArtifactsStoreRef(B){try{return _e({storeRef:await _().readArtifactsStoreRef()})}catch(w){return Oe(w)}},async getFetchedSourcesStoreRef(B){try{return _e({storeRef:await _().readFetchedSourcesStoreRef()})}catch(w){return Oe(w)}},async getConfig(B){try{let w=B.params?.key;if(!w)return xe("getConfig requires params.key");let K=_(),y;switch(w){case "task-executor":y=R??null;break;case "chat-handler-flow":y=C??null;break;case "board-runtime-store-ref":y=await K.readBoardRuntimeStoreRef();break;case "card-store-ref":y=await K.readCardStoreRef();break;case "outputs-store-ref":y=await K.readOutputsStoreRef();break;case "scratch-store-ref":y=k??null;break;case "chat-store-ref":y=await K.readChatStoreRef();break;case "artifacts-store-ref":y=await K.readArtifactsStoreRef();break;case "fetched-sources-store-ref":y=await K.readFetchedSourcesStoreRef();break;default:return xe(`getConfig: unknown key "${w}"`)}return _e({value:y})}catch(w){return Oe(w)}},async getOutputsDataObject(B){try{let w=B.params?.key;if(!w)return xe("getOutputsDataObject requires params.key");if(w===ot)return _e(null);let K=await T();return _e(K[w]??null)}catch(w){return Oe(w)}},async getAllOutputsDataObjects(B){try{return _e(await T())}catch(w){return Oe(w)}},async getOutputsComputedValues(B){try{let w=B.params?.key;return w?_e(await(await g()).readComputedValues(w)):xe("getOutputsComputedValues requires params.key")}catch(w){return Oe(w)}},async getAllOutputsComputedValues(B){try{return _e(await(await g()).readAllComputedValues())}catch(w){return Oe(w)}},async getOutputsFetchedSources(B){try{let w=B.params?.key;if(!w)return xe("getOutputsFetchedSources requires params.key");let K=await(await J()).listSources(w),y={};for(let S of K)y[S]=await oe(`${w}/${S}`);return _e(y)}catch(w){return Oe(w)}},async getAllOutputsFetchedSources(B){try{let w=await J(),K=await(await $()).listKeys(),y=new Set;for(let F of K){let M=F.indexOf("/");M>0&&!F.includes("/.staged/")&&y.add(F.slice(0,M));}let S={};for(let F of y){let M=await w.listSources(F);if(M.length!==0){S[F]={};for(let L of M)S[F][L]=await oe(`${F}/${L}`);}}return _e(S)}catch(w){return Oe(w)}},async buildSseOneShotPayload(B){try{let w=(await(await l()).readAllCards()).filter(L=>L.id!==Ae),K=await this.status({});if(K.status!=="success")return K;let y=await this.getAllOutputsDataObjects({});if(y.status!=="success")return y;let S=await this.getAllOutputsComputedValues({});if(S.status!=="success")return S;let F=S.data,M={};for(let L of w){let D=typeof L?.id=="string"?L.id:null;if(!D)continue;let ee=L.card_data&&typeof L.card_data=="object"&&!Array.isArray(L.card_data)?L.card_data:{};M[D]={schema_version:"v1",card_id:D,card_data:{...ee},computed_values:F[D]&&typeof F[D]=="object"?F[D]:{}};}return _e({cardDefinitions:w,statusSnapshot:K.data,dataObjectsByToken:y.data,cardRuntimeById:M})}catch(w){return Oe(w)}},async addCardFiles(B){try{let w=B.params?.cardId;if(!w)return xe("addCardFiles requires params.cardId");let y=await gr(await l(),{emitNotification:d}).appendFiles({params:{id:w},body:B.body});return y.status!=="success"?y:_e({cardId:w,files_added:y.data.files_added,notified:!0})}catch(w){return Oe(w)}},async removeCard(B){try{let w=B.params?.id;if(!w)return xe("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(w);}catch{}return await O({type:"task-removal",taskName:w,timestamp:je()}),w!==Ae&&await O({type:"task-restart",taskName:Ae,timestamp:je()}),z(),_e()}catch(w){return Oe(w)}},async retrigger(B){try{let w=B.params?.id;return w?(await O({type:"task-restart",taskName:w,timestamp:je()}),z(),_e()):xe("retrigger requires params.id")}catch(w){return Oe(w)}},async processAccumulatedEvents(B){return await G(),ae()},async upsertCard(B){try{let w=B.params?.cardId,K=B.params?.all,y=!!B.params?.restart;if(!w&&!K)return xe("upsertCard requires --card-id <id> or --all");let S=await l(),F=K?(await S.readAllCards()).map(D=>D.id):[w];for(let D of F)if(!await S.readCard(D))return xe(`Card "${D}" not found in board at ${e.value}`);let M=t.kvStorage("card-upsert"),L=!1;for(let D of F){let ee=await S.readCard(D);if(!ee)continue;let ue=Kt(ee),Se=t.hashFn(ue),Ie=await M.read(D),Ee=Ie?.taskConfigHash!==Se;if(!(!Ee&&!y)){if(Ee){let ge=Ie?.blobRef??await S.readCardKey(D)??D;await O({type:"task-upsert",taskName:D,taskConfig:ue,timestamp:je()}),await M.write(D,{blobRef:ge,taskConfigHash:Se,updatedAt:je()}),L=L||D!==Ae;}y&&await O({type:"task-restart",taskName:D,timestamp:je()});}}return L&&await O({type:"task-restart",taskName:Ae,timestamp:je()}),z(),_e()}catch(w){return Oe(w)}},async taskFailed(B){try{let w=B.params?.token;if(!w)return xe("taskFailed requires params.token");let K=B.params?.error??"unknown error",y=br(w);return y?(await O({type:"task-failed",taskName:y.taskName,error:K,timestamp:je()}),z(),_e()):xe("Invalid callback token")}catch(w){return Oe(w)}},async taskProgress(B){try{let w=B.params?.token;if(!w)return xe("taskProgress requires params.token");let K=(B.body??{}).update??{},y=br(w);return y?(await O({type:"task-progress",taskName:y.taskName,update:K,timestamp:je()}),z(),_e()):xe("Invalid callback token")}catch(w){return Oe(w)}},async sourceDataFetched(B){try{let w=B.params?.token,K=B.params?.ref;if(!w)return xe("sourceDataFetched requires params.token");if(!K)return xe("sourceDataFetched requires params.ref");let y=Jn(w);if(!y)return xe("Invalid source token");let S=await J(),F=y.dt||t.genId();y.dt||await S.ingestSourceDataStaged(y.cid,y.d,ct(K),F);let M=br(y.cbk);return M?(await O({type:"task-progress",taskName:M.taskName,update:{bindTo:y.b,outputFile:y.d,fetchedAt:je(),deliveryToken:F,sourceChecksum:y.cs,rqt:y.rqt},timestamp:je()}),z(),_e()):xe("Invalid callback token embedded in source token")}catch(w){return Oe(w)}},async sourceDataFetchFailure(B){try{let w=B.params?.token,K=B.params?.reason??"unknown";if(!w)return xe("sourceDataFetchFailure requires params.token");let y=Jn(w);if(!y)return xe("Invalid source token");let S=br(y.cbk);return S?(await O({type:"task-progress",taskName:S.taskName,update:{bindTo:y.b,outputFile:y.d,failure:!0,reason:K,sourceChecksum:y.cs,rqt:y.rqt},timestamp:je()}),z(),_e()):xe("Invalid callback token embedded in source token")}catch(w){return Oe(w)}}}}async function ya(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Wn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=$e(n);if(a.length===1){await o(a[0]);return}await o(Ue({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 ya(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 Hr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ha(e){return {...Hr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function Ra(e){return {...Hr(e),reason:e.reason}}function Jr(e){return {enqueueRequest(t){return e.enqueue(t).id},enqueueRequestIfAbsent:e.enqueueIfAbsent?(t,r)=>{let n=e.enqueueIfAbsent(t,r);return n?n.id:null}:void 0,leaseRequests(t){return e.lease(t).map(ha)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(Hr)},peekDeadLetter(){return e.peekDeadLetter().map(Ra)}}}function ka(e,t){return e.peekActive().find(r=>r.id===t)}function zn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=$e(n);if(a.length===1){await o(a[0]);return}await o(Ue({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=ka(e,n);a&&r([{kind:"message_enqueued",lane:t.lane,message:a}]);}return o},discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Yn(){return new Date().toISOString()}function Xn(e){return new TextEncoder().encode(e).byteLength}function Ca(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Zn(e){function t(r){let n=e.stat?Ca(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let o=e.read(r);return o===null?{key:r}:{key:r,size:Xn(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Yn(),a.size=a.size??Xn(n),a},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let 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??Yn(),a.size=a.size??n.byteLength,a},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function eo(){function e(o,a){if(!Array.isArray(o))return [];let d=[];for(let f of o){if(!f||typeof f!="object")continue;let u=f;typeof u.stored_name=="string"&&d.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:a||null,chat:u.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 f=new Set(d.map(u=>u.stored_name));for(let u of a)f.has(u.stored_name)||(d.push(u),f.add(u.stored_name));return o.files=d,d}function n(o,a,d){let f=t(o);if(!Number.isInteger(a)||a<0||a>=f.length)return {ok:false,reason:"index_out_of_range"};let u=f[a];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:d&&d!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function to(e,t={}){let r=t.emitNotification;function n(g){let l=typeof g=="number"?g:Number(g);return Number.isInteger(l)&&l>0?l:null}function o(g,l){let s=l;for(let c=g.length-1;c>=0;c-=1)if(g[c]?.role==="user"&&(s-=1,s===0))return g.slice(c);return g}function a(g){return g.some(l=>typeof l?.turn=="string"&&l.turn!=="")}function d(g,l){if(l<=0)return [];if(!a(g))return o(g,l);let s=new Map,c=[];for(let p of g){let h=typeof p?.turn=="string"?p.turn:"";s.has(h)||(s.set(h,[]),c.push(h)),s.get(h).push(p);}return c.slice(Math.max(0,c.length-l)).flatMap(p=>s.get(p)??[])}function f(g){return {status:"success",data:g}}function u(g){return {status:"fail",error:g}}function k(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}function R(g){return {role:String(g.role||"system"),text:String(g.text||""),files:Array.isArray(g.files)?g.files:[],...typeof g.turn=="string"&&g.turn?{turn:g.turn}:{}}}async function C(g){if(!r||g.length===0)return;let l=$e(g);if(l.length===1){await r(l[0]);return}await r(Ue({kind:"notification-batch",notifications:l}));}async function b(g){let l=await e.readAll(g);return d(l,1).map(R)}async function P(g){let l=Date.now();return {kind:"card_chats",cardId:g,sentAt:new Date(l).toISOString(),sentAtMs:l,messages:await b(g),receiving:true,processing:await e.isProcessing(g)}}async function _(g,l="command envelope"){let s=typeof g.cardId=="string"?g.cardId:void 0;if(!g.command)return u(`chat-store: ${l} missing "command"`);if(!s)return u(`chat-store: ${l} missing "cardId"`);if(g.command==="append")return await x.append({params:{cardId:s},body:{role:g.role,text:g.text,files:g.files,turn:g.turn}});if(g.command==="read-all")return await x.readAll({params:{cardId:s},body:{lastUserTurns:g.lastUserTurns,tailTurns:g.tailTurns,turnId:g.turnId,allTurns:g.allTurns,tailTurnsBeforeId:g.tailTurnsBeforeId}});if(g.command==="read-after")return await x.readAfter({params:{cardId:s},body:{cursor:g.cursor??null}});if(g.command==="clear")return await x.clear({params:{cardId:s}});if(g.command==="set-processing")return await x.setProcessing({params:{cardId:s},body:{active:g.active}});if(g.command==="is-processing")return await x.isProcessing({params:{cardId:s}});if(g.command==="get-config")return await x.getConfig({params:{cardId:s}});if(g.command==="set-config"){let{command:c,cardId:m,...p}=g;return await x.setConfig({params:{cardId:s},body:p})}return u(`chat-store: unknown command "${String(g.command)}"`)}async function A(g){if(!Array.isArray(g.commands)||g.commands.length===0)return u('chat-store: command envelope must include a non-empty "commands" array');let l=[];for(let s=0;s<g.commands.length;s+=1){let c=g.commands[s];if(!c||typeof c!="object"||Array.isArray(c))return u(`chat-store: command envelope entry ${s} must be an object`);let m={cardId:g.cardId,...c},p=await _(m,`command envelope entry ${s}`);if(p.status!=="success")return p;l.push({index:s,command:String(m.command),data:p.data});}return f({results:l})}let x={async append(g){try{let l=g.params?.cardId;if(!l)return u("append requires params.cardId");let s=g.body??{},c=typeof s.role=="string"?s.role:"",m=typeof s.text=="string"?s.text:"",p=Array.isArray(s.files)?s.files:[],h=typeof s.turn=="string"?s.turn:"";if(!c)return u("append requires body.role");let T=await e.append(l,c,m,p,h);return await C([{kind:"chat_messages",cardId:l,messages:await b(l)}]),f({id:T})}catch(l){return k(l)}},async readAll(g){try{let l=g.params?.cardId;if(!l)return u("readAll requires params.cardId");let s=g.body??{},c=typeof s.turnId=="string"?s.turnId:"",m=s.allTurns===!0,p=typeof s.tailTurnsBeforeId=="string"?s.tailTurnsBeforeId:"",h=s.tailTurns===void 0?s.lastUserTurns:s.tailTurns,T=h===void 0?m||c?void 0:1:n(h);if(h!==void 0&&T===null)return u("readAll requires body.tailTurns (positive integer)");let O=await e.readAll(l),N=O.filter($=>!c||String($.turn||"")===c);if(p){let $=T;if(typeof $!="number"||!Number.isInteger($)||$<=0)return u("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let J=new Map,oe=[];for(let re of O){let G=String(re.turn||"");J.has(G)||(J.set(G,[]),oe.push(G)),J.get(G).push(re);}let pe=oe.findIndex(re=>re===p),Z=Math.max(0,pe-$);return N=(pe===-1?[]:oe.slice(Z,pe)).flatMap(re=>J.get(re)??[]),f({records:N})}return f(typeof T=="number"?{records:d(N,T)}:{records:N})}catch(l){return k(l)}},async buildSseOneShotBatch(g){try{let l=g.params?.cardId;if(!l)return u("buildSseOneShotBatch requires params.cardId");let s=g.body??{},c=typeof s.receiving=="boolean"?s.receiving:!0,m=await P(l);return f(Ue({kind:"notification-batch",notifications:[{...m,receiving:c}]}))}catch(l){return k(l)}},async readAfter(g){try{let l=g.params?.cardId;if(!l)return u("readAfter requires params.cardId");let c=(g.body??{}).cursor??null;return f(await e.readAfter(l,c))}catch(l){return k(l)}},async clear(g){try{let l=g.params?.cardId;return l?(await e.clear(l),f({ok:!0})):u("clear requires params.cardId")}catch(l){return k(l)}},async setProcessing(g){try{let l=g.params?.cardId;if(!l)return u("setProcessing requires params.cardId");let s=g.body??{};return typeof s.active!="boolean"?u("setProcessing requires body.active (boolean)"):(await e.setProcessing(l,s.active),await C([{kind:"chat_processing",cardId:l,active:s.active,sentAtMs:Date.now()}]),f({ok:!0}))}catch(l){return k(l)}},async isProcessing(g){try{let l=g.params?.cardId;return l?f({active:await e.isProcessing(l)}):u("isProcessing requires params.cardId")}catch(l){return k(l)}},async getConfig(g){try{let l=g.params?.cardId;return l?f({config:await e.getConfig(l)}):u("getConfig requires params.cardId")}catch(l){return k(l)}},async setConfig(g){try{let l=g.params?.cardId;if(!l)return u("setConfig requires params.cardId");let s=g.body??{};return await e.setConfig(l,s),f({ok:!0})}catch(l){return k(l)}},run:_,runBatch:A};return x}function Et(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function ro(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(Et):[]:Et(e)?[e]:[]}function no(e,t,r){let n=0;return {accepted:e.filter(a=>{if(!Et(a))return n++,false;let d=a;return typeof d.sentAtMs=="number"&&t-d.sentAtMs>r?(n++,false):true}),rejected:n}}function ao(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Qr(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 ba(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function oo(e,t){if(t.kind==="status"){Qr(t.status)&&(e.status=t.status);return}if(t.kind==="computed_values"){e.computedValues[t.cardId]=t.values;return}if(t.kind==="data_object"){e.dataObjects[t.key]=t.payload;return}if(t.kind==="card_refreshed"){e.cards[t.cardId]=t.card;return}t.kind==="card_removed"&&(delete e.cards[t.cardId],delete e.computedValues[t.cardId]);}function so(e,t){if(ba(t)){for(let r of t.notifications)Et(r)&&oo(e,r);return}Et(t)&&oo(e,t);}function Gr(e){let t=new Map,r=0;function n(l){let s=JSON.stringify(l);return r++,`id: ${r}
|
|
1
|
+
var ServerRuntimeControlface=(function(exports){'use strict';var Bo=Object.defineProperty;var Oo=(e,t,r)=>t in e?Bo(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var an=(e,t,r)=>Oo(e,t+"",r);var zt="b64:";function Fo(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 qo(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 Pe(e){return `${zt}${Fo(JSON.stringify(e))}`}function ct(e){if(!e.startsWith(zt))throw new Error(`Invalid ref format (expected ${zt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(qo(e.slice(zt.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 sn(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 un(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?ct(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function st(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _r(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 le(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function dt(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function lt(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function pt(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Yt(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 Er(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function gt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o,c=a.status;if(c==="success")return Object.prototype.hasOwnProperty.call(a,"data")?o:{status:"success",data:{}};if(c==="fail"||c==="error")return o}return {status:"success",data:o}}function nt(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let a=n.data;if(a&&typeof a=="object"&&!Array.isArray(a)){let c=a.issues;if(Array.isArray(c)){let u=c.find(k=>typeof k=="string"&&k.trim());if(typeof u=="string")return `Validation failed: ${u}`}let l=a.errors;if(Array.isArray(l)&&l.length>0)return "Validation failed"}}return "Validation failed"}return t}function Br(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpControlplaneToolRegistry:a,retriggerCard:c,applyCardAction:l,resolveChatHandlerTarget:u,sendCardFileDownloadResponse:k}=e;async function h(C,b,P){let _=C.method||"GET",A=P,x=A.pathname;try{if(_==="POST"&&x===`${t}/mcp-actions`){await o();let d=Date.now(),m=new Date(d).toISOString(),p=await n(C),R=typeof p.tool=="string"?p.tool.trim():"",T=p.args&&typeof p.args=="object"&&!Array.isArray(p.args)?p.args:{};if(!R)return r(b,400,{error:"tool is required"}),!0;let O=le(T,"card_id");if(!O)return r(b,400,{error:"MCP action requires card_id"}),!0;if(R==="retrigger-card"||R==="retrigger"){await c(O);let Q=Date.now();return r(b,200,{status:"success",data:{ok:!0,cardId:O,actionType:R,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(Q).toISOString(),responseSentAtMs:Q,responseStatus:200}}),!0}let N=lt(T,"payload");if(R==="chat-send"&&!await u(O)){let Q=Date.now();return r(b,409,{error:`chat handler is not configured for card: ${O}`,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(Q).toISOString(),responseSentAtMs:Q,responseStatus:409}),!0}if(R==="chat-send"){let Q=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!Q||!String(Q).trim()){let oe=Date.now();return r(b,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${O}`,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(oe).toISOString(),responseSentAtMs:oe,responseStatus:400}),!0}}await l(O,R,N);let $=Date.now();return r(b,200,{status:"success",data:{ok:!0,cardId:O,actionType:R,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date($).toISOString(),responseSentAtMs:$,responseStatus:200}}),!0}if(_==="POST"&&x===`${t}/mcp-controlplane`){await o();let d=await n(C),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 gt(m,p,a());if(R&&typeof R=="object"&&!Array.isArray(R)){let T=R;if(T.status==="fail")return r(b,400,{error:nt(R,"Request failed")}),!0;if(T.status==="error")return r(b,500,{error:nt(R,"Internal error")}),!0}r(b,200,R);}catch(R){let T=typeof R?.statusCode=="number"?Number(R.statusCode):500,O=R instanceof Error?R.message:String(R);r(b,T,{error:O});}return !0}let g=x.match(new RegExp(`^${st(t)}/cards/([^/]+)/retrigger$`));if(_==="POST"&&g){await o();let d=decodeURIComponent(g[1]);return await c(d),r(b,200,{ok:!0}),!0}let f=x.match(new RegExp(`^${st(t)}/cards/([^/]+)/actions$`));if(_==="POST"&&f){await o();let d=decodeURIComponent(f[1]),m=Date.now(),p=new Date(m).toISOString(),R=await n(C),T=R?.actionType;if(T==="chat-send"&&!await u(d)){let N=Date.now();return r(b,409,{error:`chat handler is not configured for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(N).toISOString(),responseSentAtMs:N,responseStatus:409}),!0}if(T==="chat-send"){let N=R?.payload??{},$=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!$||!String($).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 l(d,T,R?.payload);let O=Date.now();return r(b,200,{ok:!0,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(O).toISOString(),responseSentAtMs:O,responseStatus:200}),!0}let s=x.match(new RegExp(`^${st(t)}/cards/([^/]+)/files/(\\d+)$`));if(_==="GET"&&s){let d=decodeURIComponent(s[1]),m=parseInt(s[2],10),p=A.searchParams.get("sn");return await k(b,d,m,p),!0}return !1}catch(g){let f=g?.statusCode||500;return r(b,f,{error:String(g?.message||g)}),true}}return {handleRuntimeApi:h}}function Xt(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 No(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 jo(e){return e.category?e:{...e,category:No(e.kind)}}function $e(e){return e.map(t=>jo(t))}function Ue(e){return {...e,category:e.category??"batch",notifications:$e(e.notifications)}}var kt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function et(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function Ct(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function cn(e){return e.tasks??{}}function Or(e){return e?e.status===kt.FAILED||e.status===kt.INACTIVATED:false}function dn(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function ln(e){return e.maxExecutions}function fn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===kt.COMPLETED){let a=e.tasks[n];a&&et(a).forEach(l=>r.add(l));}return Array.from(r)}function mn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;et(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function pn(e,t,r){let n=e.tasks[t]??Zt(),o={};if(r){let c=r.tasks[t],l=Ct(c);for(let u of l)for(let[k,h]of Object.entries(r.tasks))if(et(h).includes(u)){let C=e.tasks[k];C?.lastDataHash&&(o[u]=C.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 gn(e,t,r,n,o,a){let c=e.tasks[r]??Zt(),l=t.tasks[r];if(!l)throw new Error(`Task "${r}" not found in graph`);let u;n&&l.on&&l.on[n]?u=l.on[n]:u=et(l);let k=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let b=l.requires??[];for(let P of b)for(let[_,A]of Object.entries(t.tasks))if(et(A).includes(P)){let x=e.tasks[_];x?.lastDataHash&&(k[P]=x.lastDataHash);break}}let h={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:a,lastConsumedHashes:k,error:void 0},C=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:h},availableOutputs:C,lastUpdated:new Date().toISOString()}}function yn(e,t,r,n){let o=e.tasks[r]??Zt(),a=t.tasks[r];if(a?.retry){let u=o.retryCount+1;if(u<=a.retry.max_attempts){let k={...o,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:k},lastUpdated:new Date().toISOString()}}}let c={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},l=e.availableOutputs;if(a?.on_failure&&a.on_failure.length>0&&(l=[...new Set([...e.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&c.executionCount>=a.circuit_breaker.max_executions){let u=a.circuit_breaker.on_break;l=[...new Set([...l,...u])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:l,lastUpdated:new Date().toISOString()}}function hn(e,t,r,n){let o=e.tasks[t]??Zt(),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 Rn(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 _t(e,t){let r=`live-${Date.now()}`,n={};for(let a of Object.keys(e.tasks))n[a]=Cn();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 Mo(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:pn(n,t.taskName,r)};case "task-completed":return {config:r,state:gn(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:yn(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:hn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Rn(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:Ho(n,t.action)};case "task-upsert":return Lo(e,t.taskName,t.taskConfig);case "task-removal":return Do(e,t.taskName);case "node-requires-add":return $o(e,t.nodeName,t.tokens);case "node-requires-remove":return Uo(e,t.nodeName,t.tokens);case "node-provides-add":return Vo(e,t.nodeName,t.tokens);case "node-provides-remove":return Ko(e,t.nodeName,t.tokens);default:return e}}function kn(e,t){return t.reduce((r,n)=>Mo(r,n),e)}function Lo(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]:Cn()},lastUpdated:new Date().toISOString()}}}function Do(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 $o(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ct(n),a=r.filter(c=>!o.includes(c));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...a]}}},state:e.state}}function Uo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ct(n),a=o.filter(c=>!r.includes(c));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:a}}},state:e.state}}function Vo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=et(n),a=r.filter(c=>!o.includes(c));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...a]}}},state:e.state}}function Ko(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=et(n),a=o.filter(c=>!r.includes(c));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:a}}},state:e.state}}function bt(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function St(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 Cn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ho(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 Nt(e){let{config:t,state:r}=e,n=cn(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=Qo(n),c=fn(t,r.tasks),l=new Set([...c,...r.availableOutputs]),u=[],k=[],h=[],C=[];for(let[P,_]of Object.entries(n)){let A=r.tasks[P],x=dn(_,t.settings),g=x!=="once";if(A?.status===kt.RUNNING||Or(A))continue;let f=ln(_);if(f!==void 0&&A&&A.executionCount>=f||_.circuit_breaker&&A&&A.executionCount>=_.circuit_breaker.max_executions||!g&&A?.status===kt.COMPLETED)continue;if(g&&A?.status===kt.COMPLETED){let R=Ct(_),T=false;switch(x){case "data-changed":{R.length>0&&R.some(N=>{for(let[$,Q]of Object.entries(n))if(et(Q).includes(N)){let oe=r.tasks[$];if(!oe)continue;let pe=A.lastConsumedHashes?.[N];return oe.lastDataHash==null?oe.executionCount>A.lastEpoch:oe.lastDataHash!==pe}return false})||(T=true);break}case "epoch-changed":{R.length>0&&R.some(N=>{for(let[$,Q]of Object.entries(n))if(et(Q).includes(N)){let oe=r.tasks[$];if(oe&&oe.executionCount>A.lastEpoch)return true}return false})||(T=true);break}case "time-based":{let O=_.refreshInterval??0;if(O<=0){T=true;break}let N=A.completedAt;if(!N){T=true;break}(Date.now()-Date.parse(N))/1e3<O&&(T=true);break}case "manual":T=true;break}if(T)continue}let s=Ct(_);if(s.length===0){u.push(P);continue}let d=[],m=[],p=[];for(let R of s){if(l.has(R))continue;let T=a[R]||[];T.length===0?d.push(R):T.every(N=>Or(r.tasks[N]))?p.push({token:R,failedProducer:T[0]}):m.push(R);}d.length>0?h.push({taskName:P,missingTokens:d}):p.length>0?C.push({taskName:P,failedTokens:p.map(R=>R.token),failedProducers:[...new Set(p.map(R=>R.failedProducer))]}):m.length>0?k.push({taskName:P,waitingOn:m}):u.push(P);}let b={};if(u.length>1){let P=mn(u,n);for(let[_,A]of Object.entries(P))A.length>1&&(b[_]=A);}return {eligible:u,pending:k,unresolved:h,blocked:C,conflicts:b}}function Qo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of et(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 jt=class{constructor(){an(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Fr(e){let t=qr(e);return Jo(t)}function qr(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(qr).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+qr(t[n])).join(",")+"}"}function Jo(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 Go(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 Wo(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 bn(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Go(t)}function zo(e){try{let t=JSON.parse(Wo(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function er(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:a}=t,c=new jt,l="state"in e&&"config"in e?e:_t(e),u=false,k=new Set,h=new Map(Object.entries(n)),C=new jt,b=false,P=false;function _(){if(!u){if(b){P=true;return}b=true;try{do P=!1,A();while(P)}finally{b=false;}}}function A(){let s=C.drain(),d=c.drain(),m=[...s,...d];if(m.length>0&&(l=kn(l,m),o)){for(let R of m)if(R.type==="task-removal")try{o(R.taskName);}catch(T){console.warn("[reactive] onNodeRemoved failed:",T instanceof Error?T.message:String(T));}}let p=Nt(l);m.length>0&&a?.(m,l,p);for(let R of p.eligible)f(R);for(let R of m)if(R.type==="task-progress"){let{taskName:T,update:O}=R;if(!l.config.tasks[T])continue;let $=l.state.tasks[T];if(!$||$.status!=="running")continue;let Q=bn(T),oe=g(T,Q,O).catch(pe=>{u||(C.append({type:"task-failed",taskName:T,error:pe.message??String(pe),timestamp:new Date().toISOString()}),_());}).finally(()=>{k.delete(oe);});k.add(oe);}}function x(s){let m=l.config.tasks[s].requires??[],p=new Map;for(let[T,O]of Object.entries(l.config.tasks))for(let N of O.provides??[])p.set(N,T);let R={};for(let T of m){let O=p.get(T);O?R[T]=l.state.tasks[O]?.data:R[T]=void 0;}return R}async function g(s,d,m){let p=l.config.tasks[s],R=p.taskHandlers??[],T=x(s);for(let O of R){let N=h.get(O);if(!N)throw new Error(`Handler '${O}' not found in registry (task '${s}')`);let $={nodeId:s,state:T,taskState:l.state.tasks[s],config:p,callbackToken:d,update:m};if(await N($)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${s}')`)}}function f(s){let m=l.config.tasks[s]?.taskHandlers;if(!m||m.length===0)return;C.append({type:"task-started",taskName:s,timestamp:new Date().toISOString()}),_();let p=bn(s),R=g(s,p).catch(T=>{u||(C.append({type:"task-failed",taskName:s,error:T.message??String(T),timestamp:new Date().toISOString()}),_());}).finally(()=>{k.delete(R);});k.add(R);}return {push(s){u||(s.type==="task-completed"&&s.data&&!s.dataHash&&(s={...s,dataHash:Fr(s.data)}),c.append(s),_());},pushAll(s){if(!u){for(let d of s)d.type==="task-completed"&&d.data&&!d.dataHash?c.append({...d,dataHash:Fr(d.data)}):c.append(d);_();}},resolveCallback(s,d,m){if(u)return;let p=zo(s);if(!p)return;let{taskName:R}=p;if(l.config.tasks[R]){if(m&&m.length>0)c.append({type:"task-failed",taskName:R,error:m.join("; "),timestamp:new Date().toISOString()});else {let T=d&&Object.keys(d).length>0?Fr(d):void 0;c.append({type:"task-completed",taskName:R,data:d,dataHash:T,timestamp:new Date().toISOString()});}_();}},addNode(s,d){u||(c.append({type:"task-upsert",taskName:s,taskConfig:d,timestamp:new Date().toISOString()}),_());},removeNode(s){u||(c.append({type:"task-removal",taskName:s,timestamp:new Date().toISOString()}),_());},addRequires(s,d){u||(c.append({type:"node-requires-add",nodeName:s,tokens:d,timestamp:new Date().toISOString()}),_());},removeRequires(s,d){u||(c.append({type:"node-requires-remove",nodeName:s,tokens:d,timestamp:new Date().toISOString()}),_());},addProvides(s,d){u||(c.append({type:"node-provides-add",nodeName:s,tokens:d,timestamp:new Date().toISOString()}),_());},removeProvides(s,d){u||(c.append({type:"node-provides-remove",nodeName:s,tokens:d,timestamp:new Date().toISOString()}),_());},registerHandler(s,d){h.set(s,d);},unregisterHandler(s){h.delete(s);},retrigger(s){u||l.config.tasks[s]&&(c.append({type:"task-restart",taskName:s,timestamp:new Date().toISOString()}),_());},retriggerAll(s){if(!u){for(let d of s)l.config.tasks[d]&&c.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});_();}},snapshot(){return bt(l)},getState(){return l},getSchedule(){return Nt(l)},async waitForHandlers(){k.size>0&&await Promise.allSettled([...k]);},async dispose(s){s?.wait&&k.size>0&&await Promise.allSettled([...k]),u=true;}}}function tr(){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 Yo=tr();Yo("./jsonata-sync.cjs");var Xo=tr(),Mt=Xo("./jsonata-sync.cjs"),Nr=Mt;function Sn(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 vn(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 Zo(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 Mt(o.expr).evaluate(n);vn(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch{}return e}function ea(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let a of e.compute)try{let c=Nr(a.expr).evaluate(n);vn(e.computed_values,a.bindTo,c),n.computed_values=e.computed_values;}catch(c){let l=c instanceof Error?c.message:String(c);o.push({bindTo:a.bindTo,error:l});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function ta(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Mt(e).evaluate(n)}function ra(e,t){return t.startsWith("fetched_sources.")?Sn(e._sourcesData??{},t.slice(16)):Sn(e,t)}var wn=new Set(["metric","table","editable-table","chart","form","list","notes","todo","alert","narrative","badge","text","markdown","markup","selection","searchbox","query","ref","custom","actions"]),na=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function oa(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))na.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof a.ref!="string"||!a.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof a.expr!="string"||!a.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((a,c)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`source_defs[${c}]: must be an object`);else {let l=a;typeof l.bindTo!="string"||!l.bindTo?t.push(`source_defs[${c}]: missing required "bindTo" property`):(n.has(l.bindTo)&&t.push(`source_defs[${c}]: bindTo "${l.bindTo}" is not unique across source_defs`),n.add(l.bindTo)),typeof l.outputFile!="string"||!l.outputFile?t.push(`source_defs[${c}]: missing required "outputFile" property`):(o.has(l.outputFile)&&t.push(`source_defs[${c}]: outputFile "${l.outputFile}" is not unique across source_defs`),o.add(l.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`):wn.has(o.kind)||t.push(`view.elements[${a}].kind: unknown kind "${o.kind}". Valid: ${[...wn].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 aa(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=false;if(typeof n.skip_when=="string"&&n.skip_when.trim().length>0)try{o=!!await Mt(n.skip_when).evaluate(r);}catch{o=false;}let a={};if(!o&&n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[c,l]of Object.entries(n.projections))if(typeof l=="string"&&l.trim().length>0)try{a[c]=await Mt(l).evaluate(r);}catch{a[c]=void 0;}}return {...n,_projections:a,_skip:o}}))}function sa(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o=false;if(typeof n.skip_when=="string"&&n.skip_when.trim().length>0)try{o=!!Nr(n.skip_when).evaluate(r);}catch{o=false;}let a={};if(!o&&n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[c,l]of Object.entries(n.projections))if(typeof l=="string"&&l.trim().length>0)try{a[c]=Nr(l).evaluate(r);}catch{a[c]=void 0;}}return {...n,_projections:a,_skip:o}})}var Ye={run:Zo,runSync:ea,eval:ta,resolve:ra,validate:oa,enrichSources:aa,enrichSourcesSync:sa};function rr(e){return JSON.stringify(e)}function nr(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 or(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function jr(e,t){return or(e)?e.then(t):t(e)}function xn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Mr(e,t){return {readValues(n){let o=e(n);return jr(o.listKeys(),a=>{let c=[...a].sort();if(c.length===0)return {version:null,values:{}};let l={},u=null;for(let k of c){let h=o.read(k);or(h)?u=(u??Promise.resolve()).then(async()=>{l[k]=await h;}):l[k]=h;}return u?u.then(()=>({version:t(l),values:l})):{version:t(l),values:l}})},writeValues(n,o,a){let c=e(n),l=null;for(let u of a){let k=c.delete(u);or(k)&&(l=(l??Promise.resolve()).then(()=>k).then(()=>{}));}for(let[u,k]of Object.entries(o)){let h=c.write(u,k);or(h)&&(l=(l??Promise.resolve()).then(()=>h).then(()=>{}));}return l?l.then(()=>t(o)):t(o)}}}function ar(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 jr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let a=xn(o.values,n);return jr(e.writeValues(r,a,n.deleteKeys),c=>({ok:true,newVersion:c}))})}}}function An(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function Tn(e){return {readEntriesAfterCursor(t){let r=An(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 An(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function In(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 sr(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ft(e,t){return sr(e)?e.then(t):t(e)}function Lr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);sr(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function ia(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function ua(e,t){let r=e.match(t);return r?r[1]:null}function Pn(e,t,r){let n={},o=Lr(e,a=>{let c=r(a);if(c)return ft(t(a),l=>{n[c]=l;})});return sr(o)?o.then(()=>n):n}function ir(e,t){return {readSourceData(r,n){return ft(e.read(`${r}/${n}`),ia)},ingestSourceDataStaged(r,n,o,a){return ft(t(o),c=>e.write(`${r}/.staged/${a}/${n}`,c))},commitSourceData(r,n,o){let a=`${r}/.staged/${o}/${n}`,c=`${r}/${n}`;return e.renameKey(a,c)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return ft(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function Dr(e,t){let r=(n,o)=>{try{let a=o(n);return sr(a)?a.catch(c=>t(n,c instanceof Error?c.message:String(c))):void 0}catch(a){try{return t(n,a instanceof Error?a.message:String(a))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return ft(e.read(n),a=>e.write(n,[...a??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ft(e.read(n),a=>{let c=a;if(!(!c||c.length===0))return ft(Lr(c,l=>r(l,o)),()=>e.delete(n))})}}}function $r(e,t,r){return {readRuntime(n){return ft(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function ur(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return ft(e.listKeys("cards/"),t=>Pn(t,r=>e.read(r),r=>ua(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return Lr(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 ft(e.listKeys("data-objects/"),t=>Pn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}var ot="sys_keys_board_state",Ae="__sys_keys_board_state_init";function _n(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 Ur(e){let t=e.filter(o=>!_n(o)),r=[...new Set(t.map(o=>o.id).filter(o=>typeof o=="string"&&o.length>0))].sort(),n=[...new Set(t.flatMap(o=>Array.isArray(o.provides)?o.provides:[]).map(o=>o&&typeof o=="object"&&!Array.isArray(o)?o.bindTo:void 0).filter(o=>typeof o=="string"&&o.length>0&&o!==ot))].sort();return {card_ids:r,data_object_keys:n}}function Vr(e,t){let r=e.filter(a=>!_n(a)),n=[...new Set(r.map(a=>a.id).filter(a=>typeof a=="string"&&a.length>0))].sort(),o=[...new Set(Object.entries(t).filter(([a])=>a!==Ae).flatMap(([,a])=>Array.isArray(a.provides)?a.provides:[]).filter(a=>typeof a=="string"&&a.length>0&&a!==ot))].sort();return {card_ids:n,data_object_keys:o}}function xt(){return {id:Ae,meta:{title:"System Keys Board State",synthetic:true},provides:[{bindTo:ot,ref:`card_data.${ot}`}],card_data:{[ot]:{card_ids:[],data_object_keys:[]}},__private:{visible_controlplane_only:true}}}function Ut(e,t){function r(){return e.readIndex()??{}}function n(o,a,c){let l=String(a||"").split(".").filter(Boolean);if(l.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let u={...o},k=u;for(let h=0;h<l.length-1;h++){let C=l[h],b=k[C],P=b&&typeof b=="object"&&!Array.isArray(b)?{...b}:{};k[C]=P,k=P;}return k[l[l.length-1]]=c,u}return {readCard(o){let a=r()[o];return !a||!e.cardExists(a.key)?null:e.readCard(a.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[a,c]of Object.entries(r())){if(!e.cardExists(c.key))continue;let l=e.readCard(c.key);l?o.push(l):t?.(`[card-store] could not read card "${a}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[a,c]of Object.entries(r()))o[a]=c.checksum;return o},changedSince(o){let a=r(),c=[];for(let[l,u]of Object.entries(a))o[l]!==u.checksum&&c.push(l);for(let l of Object.keys(o))a[l]||c.push(l);return c},validateUpsert(o,a){let c=r(),l=c[o],u=Object.entries(c).find(([,k])=>k.key===a);return l&&l.key!==a?{ok:false,error:`Card id "${o}" is already mapped to key "${l.key}", cannot remap to "${a}"`}:u&&u[0]!==o?{ok:false,error:`Key "${a}" is already mapped to card id "${u[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,a,c){let l=r(),u=c??l[o]?.key??e.defaultCardKey(o),k=e.writeCard(u,a);l[o]={key:u,checksum:k,updatedAt:new Date().toISOString()},e.writeIndex(l);},patchCard(o,a,c){let l=r(),u=l[o];if(!u||!e.cardExists(u.key))throw new Error(`card "${o}" not found`);let k=e.readCard(u.key);if(!k||typeof k!="object"||Array.isArray(k))throw new Error(`card "${o}" is not patchable`);let h=n(k,a,c),C=e.writeCard(u.key,h);l[o]={key:u.key,checksum:C,updatedAt:new Date().toISOString()},e.writeIndex(l);},removeCard(o){let a=r(),c=a[o];c&&(e.removeCard(c.key),delete a[o],e.writeIndex(a));},readIndex(){return r()}}}function cr(e,t){return ir(e,t)}function En(e){return Tn(e)}var dr="v1",mt="board/graph",Bn="board/lastJournalProcessedId";function On(e){return `cards/${e}/runtime`}function Fn(e){return ar(e,dr)}function lr(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 nr(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",rr(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 qn(e){return ur(e)}function Lt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function ca(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Dt(e,t){return e?.lastRequestedToken?ca(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Kr(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function $t(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function wt(e){let t=e.cards.filter(l=>l.name!==Ae);if(t.length===e.cards.length)return e;let r=new Set;for(let l of t)for(let u of l.requires)r.add(u);let n=t.map(l=>({name:l.name,fanOut:l.unblocks.length})).sort((l,u)=>u.fanOut-l.fanOut||l.name.localeCompare(u.name)),o=n.length>0?n[0]:{name:null,fanOut:0},a=l=>t.filter(u=>u.status===l).length,c=t.filter(l=>l.requires.length===0&&l.unblocks.length===0).length;return {...e,summary:{...e.summary,card_count:t.length,completed:a("completed"),eligible:a("eligible"),pending:a("pending"),blocked:a("blocked"),unresolved:a("unresolved"),failed:a("failed"),in_progress:a("in-progress"),orphan_cards:c,topology:{edge_count:r.size,max_fan_out_card:o.name,max_fan_out:o.fanOut}},cards:t}}function fr(e){let{[ot]:t,...r}=e;return r}function vt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),a=Nt(t),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},l=new Map;for(let _ of a.pending)l.set(_.taskName,_.waitingOn);for(let _ of a.unresolved)l.set(_.taskName,_.missingTokens);for(let _ of a.blocked)l.set(_.taskName,_.failedTokens);let u=new Map;for(let[_,A]of Object.entries(n))for(let x of A.requires??[]){let g=u.get(x)??[];g.push(_),u.set(x,g);}let k=o.sort().map(_=>{let A=r[_],x=n[_]??{requires:[],provides:[]};A.status==="completed"?c.completed+=1:A.status==="failed"?c.failed+=1:A.status==="in-progress"&&(c.in_progress+=1);let g=x.requires??[],f=x.provides??[],s=Object.keys(A.data??{}).sort(),d=g.filter(N=>t.state.availableOutputs.includes(N)),m=g.filter(N=>!t.state.availableOutputs.includes(N)),p=l.get(_)??m,R=new Set;for(let N of f)for(let $ of u.get(N)??[])$!==_&&R.add($);let T=A.failedAt,O=A.error?{message:A.error,code:"TASK_FAILED",at:T,source:"task-runtime"}:void 0;return {name:_,status:A.status,error:O,requires:g,requires_satisfied:d,requires_missing:m,provides_declared:f,provides_runtime:s,blocked_by:p,unblocks:Array.from(R).sort(),runtime:{attempt_count:A.executionCount??0,restart_count:A.retryCount??0,in_progress_since:A.status==="in-progress"?A.startedAt??null:null,last_transition_at:A.lastUpdated??null,last_completed_at:A.completedAt??null,last_restarted_at:A.startedAt??null,status_age_ms:A.lastUpdated?0:null}}});c.pending=a.pending.length,c.blocked=a.blocked.length,c.unresolved=a.unresolved.length;let h=k.map(_=>({name:_.name,fanOut:_.unblocks.length})).sort((_,A)=>A.fanOut-_.fanOut||_.name.localeCompare(A.name)),C=h.length>0?h[0]:{name:null,fanOut:0},b=new Set;for(let _ of Object.values(n))for(let A of _.requires??[])b.add(A);let P=0;for(let[_,A]of Object.entries(n)){let x=(A.requires??[]).length===0,f=(A.provides??[]).some(s=>(u.get(s)??[]).some(d=>d!==_));x&&!f&&(P+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:c.completed,eligible:a.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:P,topology:{edge_count:Array.from(b).length,max_fan_out_card:C.name,max_fan_out:C.fanOut}},cards:k}}function da(){return new Date().toISOString()}function Nn(e,t,r,n,o,a,c){return async l=>{let u=[],k=r.cardStore.readCard(l.nodeId);if(!k)return "task-initiate-failure";let h=k.id;if(h===Ae){let G=r.activeTaskConfigs?.(),z={[ot]:G?Vr(Object.keys(G).filter(B=>B!==Ae).map(B=>r.cardStore.readCard(B)).filter(B=>!!B),G):Ur(r.cardStore.readAllCards())};return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(z),n(l.nodeId,z),"task-initiated"}let C=k.card_data??{},b=k.source_defs??[],P=r.cardRuntimeStore.readRuntime(h),_=false,A=()=>{_&&(r.cardRuntimeStore.writeRuntime(h,P),_=false);},x=G=>Lt(P._sources[G]),g=(G,z)=>{P._sources[G]=Lt(z),_=true;},f=l.taskState?.executionCount??0;if(P._lastExecutionCount!==f&&(P._sources={},P._lastExecutionCount=f,_=true),l.update){let G=l.update,z=G.outputFile;if(z){let B=x(z);if(G.failure){let w=G.rqt??B.lastRequestedToken??B.queueRequestedToken;w&&g(z,$t(B,w));}else {let w=G.rqt;if(!B.lastCompletedToken||w>B.lastCompletedToken){let K=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,y=false;K&&(y=r.fetchedSourcesStore.commitSourceData(h,z,K)),y?g(z,Kr(B,w)):g(z,$t(B,w));}}A();}}let d={};for(let[G,z]of Object.entries(l.state??{}))if(z!==null&&typeof z=="object"&&!Array.isArray(z)){let B=z[G];d[G]=B!==void 0?B:z;}else d[G]=z;let p=Ye.enrichSourcesSync(Array.isArray(k.source_defs)?k.source_defs:void 0,{card_data:C,requires:d}).filter(G=>G._skip!==true),R=p,T={};for(let G of p)if(G.outputFile){let z=r.fetchedSourcesStore.readSourceData(h,G.outputFile);z!==null&&(T[G.bindTo]=z);}let O={id:h,card_data:{...C},requires:d,source_defs:b,compute:k.compute};O._sourcesData=T,k.compute&&Ye.runSync(O,{sourcesData:T}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(h,O.computed_values??{});let N={...k},$=e.value;N.source_defs=Array.isArray(p)?p.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:$})):p;let Q=da(),oe=l.update?void 0:Q,pe=R.filter(G=>{let z=G.outputFile;if(typeof z!="string"||!z)return true;let B=x(z);oe&&(B={...B,queueRequestedToken:oe},g(z,B));let w=B.queueRequestedToken??B.lastRequestedToken??Q,K=Dt(B,w);return K==="in-flight"?false:K==="dispatch"});if(A(),pe.length>0){let G=false,z=Q;for(let B of pe){let w=B.outputFile;if(typeof w!="string"||!w)continue;let K=x(w),y=K.queueRequestedToken??Q;g(w,{...K,lastRequestedToken:y}),z=y,G=true;}return G&&A(),G&&(u.push({taskKind:"source-fetch",payload:{boardRef:Pe(e),enrichedCard:N,callbackToken:l.callbackToken,rqt:z}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(R.some(G=>{let z=G.outputFile;if(typeof z!="string"||!z)return false;let B=x(z),w=B.queueRequestedToken??B.lastRequestedToken??Q;return Dt(B,w)==="in-flight"}))return "task-initiated";let ae=k.provides??[],re={};for(let{bindTo:G,ref:z}of ae)re[G]=Ye.resolve(O,z);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(re),n(l.nodeId,re),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var Vt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function mr(e){return {[mt]:e.graph,[Bn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function pr(e){let t=e[mt],r=e[Bn],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${mt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function Kt(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 gr(e,t={}){function r(h){return {status:"success",data:h}}function n(h){return {status:"fail",error:h}}function o(h){return {status:"error",error:h instanceof Error?h.message:String(h)}}function a(h){return h===Ae}async function c(h){let C=t.emitNotification;if(!C||h.length===0)return;let b=$e(h.filter(P=>P.kind!=="card_refreshed"?true:!a(P.cardId)));if(b.length!==0){if(b.length===1){await C(b[0]);return}await C(Ue({kind:"notification-batch",notifications:b}));}}function l(h){let C=h.params?.id;if(C){if(a(C))throw new Error(`card "${C}" not found`);let b=e.readCard(C);if(!b)throw new Error(`card "${C}" not found`);return [b]}return e.readAllCards().filter(b=>!a(b.id))}function u(h){let C=h.filter(b=>!a(b.id));return Ue({kind:"notification-batch",notifications:$e(C.map(b=>({kind:"card_refreshed",cardId:b.id,card:b})))})}function k(h){if(Array.isArray(h))return h;if(h&&typeof h=="object"){let C=h;return Array.isArray(C.files)?C.files:[h]}return null}return {get(h){try{return r({cards:l(h)})}catch(C){return o(C)}},buildNotificationBatch(h){try{return r(u(l(h)))}catch(C){return o(C)}},set(h){try{let C=h.body;if(C==null)return n("set requires a body (card object or array of cards)");let b=Array.isArray(C)?C:[C];for(let P of b){if(typeof P.id!="string")return n("each card must have a string `id` field");e.writeCard(P.id,P);}return c(b.map(P=>({kind:"card_refreshed",cardId:P.id,card:P}))),r({count:b.length})}catch(C){return o(C)}},del(h){try{let C=h.body?.ids??[],b=h.params?.id,P=b?[...C,b]:C;if(P.length===0)return n("del requires body.ids (string[]) or params.id");for(let _ of P)e.removeCard(_);return c(P.map(_=>({kind:"card_removed",cardId:_}))),r({count:P.length})}catch(C){return o(C)}},patch(h){try{let C=h.params?.id,b=h.params?.path;if(!C)return n("patch requires params.id");if(!b)return n("patch requires params.path");let P=h.body,_=P&&Object.prototype.hasOwnProperty.call(P,"value")?P.value:h.body;e.patchCard(C,b,_);let A=e.readCard(C);return A?(c([{kind:"card_refreshed",cardId:C,card:A}]),r({count:1})):n(`card "${C}" not found`)}catch(C){return o(C)}},appendFiles(h){try{let C=h.params?.id;if(!C)return n("appendFiles requires params.id");let b=e.readCard(C);if(!b)return n(`card "${C}" not found`);let P=k(h.body);if(!P||P.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let _=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},A=Array.isArray(_.files)?_.files:[],x=[...A,...P],g=P.map((s,d)=>({idx:A.length+d,entry:s})),f=this.patch({params:{id:C,path:"card_data.files"},body:{value:x}});return f.status!=="success"?f:r({files_added:g})}catch(C){return o(C)}}}}function he(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function me(e){return {status:"fail",error:e}}function be(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function la(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Ln(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function yr(e){try{let t=JSON.parse(Ln(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function jn(e){return la(JSON.stringify(e))}function Mn(e){try{let t=JSON.parse(Ln(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function We(){return new Date().toISOString()}function fa(e){let t=new Map;return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.get(r)??[];t.set(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.get(r);if(!(!o||o.length===0)){for(let a of o)try{n(a);}catch(c){try{e(a,c instanceof Error?c.message:String(c));}catch{}}t.delete(r);}}}}function Dn(e,t,r={}){Xt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),a=Pe(e),c=r.boardRuntimeStoreRef,l=r.scratchStoreRef,u=r.taskExecutorRef,k=r.chatHandlerFlow,h=r.emitNotification??(j=>{if(!t.publishBoardChangeNotifications)return;let I=j.kind==="notification-batch"?j.notifications:[j];return t.publishBoardChangeNotifications(I)});function C(){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(j){if(j.length!==0)try{let I=$e(j),J=Ue({kind:"notification-batch",notifications:I}),q=h(J);q&&typeof q.catch=="function"&&q.catch(V=>o(`[board-live-cards-public] emitNotification failed: ${V instanceof Error?V.message:String(V)}`));}catch(I){o(`[board-live-cards-public] emitNotification failed: ${I instanceof Error?I.message:String(I)}`);}}function P(){let j=A().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 I=t.kvStorageForRef(j);return {readIndex(){return I.read("_index")},writeIndex(J){I.write("_index",J);},readCard(J){return I.read(J)},writeCard(J,q){return I.write(J,q),t.hashFn(q)},removeCard(J){I.delete(J);},cardExists(J){return I.read(J)!==null},defaultCardKey(J){return J}}}let _={readValues(j){let I=t.kvStorageForRef(C()),J=I.listKeys().sort();if(J.length===0)return {version:null,values:{}};let q={};for(let V of J)q[V]=I.read(V);return {version:t.hashFn(q),values:q}},writeValues(j,I,J){let q=t.kvStorageForRef(C());for(let V of J)q.delete(V);for(let[V,ne]of Object.entries(I))q.write(V,ne);return t.hashFn(I)}},A=()=>lr(t.kvStorageForRef(C())),x=()=>Fn(_),g=()=>En(t.journalAdapterForRef(C())),f=()=>Ut(P(),o),s=()=>{let j=A().readOutputsStoreRef();if(!j)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return qn(t.kvStorageForRef(j))};function d(){return u??A().readTaskExecutorRef()}function m(){return !!x().readSnapshot(e.value).values[mt]}function p(){let j=x().readSnapshot(e.value);if(!j.values[mt])throw new Error(`Board not initialized at ${e.value}`);return pr(j.values)}function R(j,I){let J=x().commitSnapshot(e.value,{schemaVersion:dr,expectedVersion:I,commitId:t.genId(),committedAt:We(),deleteKeys:[],shallowMerge:mr(j)});if(!J.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${I??"null"} current=${J.currentVersion??"null"}`)}function T(j){g().appendEvent(j);}async function O(){let I=fa((X,de)=>{let i=X.payload,E=(i?.enrichedCard??{}).id??i?.cardId??"unknown";T({type:"task-failed",taskName:E,error:de,timestamp:We()});}),J=p(),q=St(J.graph),{events:V,newCursor:ne}=g().readEntriesAfterCursor(J.lastDrainedJournalId),ce=K(),se=cr(ce,X=>t.resolveBlob(X)),Ce={...J.runtimeByCardId},Be=new Map,Me={readRuntime(X){return Be.get(X)??Ce[X]??{_sources:{}}},writeRuntime(X,de){Be.set(X,de),Ce[X]=de;}},Le=[],De=new Map,Ze={readSourceData(X,de){let i=`${X}/${de}`;return De.has(i)?De.get(i):se.readSourceData(X,de)},ingestSourceDataStaged(X,de,i,v){se.ingestSourceDataStaged(X,de,i,v);},commitSourceData(X,de,i){let v=`${X}/.staged/${i}/${de}`,E=ce.read(v);if(E==null){let Y=ce.keyRef?.(v);Y&&(E=t.resolveBlob(Y));}if(E==null)return false;let U=`${X}/${de}`,H=E.trim();try{De.set(U,JSON.parse(H));}catch{De.set(U,H);}return Le.push({cardId:X,outputFile:de,deliveryToken:i}),true},hasSource(X,de){let i=`${X}/${de}`;return De.has(i)?true:se.hasSource(X,de)},listSources(X){let de=se.listSources(X),i=new Set;for(let E of De.keys())E.startsWith(`${X}/`)&&i.add(E.slice(`${X}/`.length));let v=new Set([...de,...i]);return Array.from(v)}},it=()=>q.config.tasks,He={cardStore:f(),cardRuntimeStore:Me,fetchedSourcesStore:Ze,outputStore:s(),executionRequestStore:I,activeTaskConfigs:()=>it()},ut=[],Ot=[],Ft=[],qt=new Map,ht=new Set,Gt=(X,de)=>{ut.push({type:"task-completed",taskName:X,data:de,timestamp:We()});},Tt=(X,de)=>{T({type:"task-failed",taskName:X,error:de,timestamp:We()});},It=er(q,{handlers:{"card-handler":Nn(e,ne,He,Gt,Tt,(X,de)=>{Ot.push({cardId:X,values:de});},X=>{Ft.push(X);})},onNodeRemoved:X=>{qt.delete(X),Be.delete(X),delete Ce[X],ht.add(X);}});for(it=()=>It.getState().config.tasks,ut=V;ut.length>0;){let X=ut;ut=[];for(let de of X)if(de.type==="task-restart"){let i=He.cardStore.readCard(de.taskName);i&&qt.set(de.taskName,i);}It.pushAll(X),await It.waitForHandlers();}let Wt=It.getState();await It.dispose({wait:true});let on=x().readSnapshot(e.value).version;R({lastDrainedJournalId:ne,graph:bt(Wt),runtimeByCardId:Ce},on);for(let{cardId:X,values:de}of Ot)He.outputStore.writeComputedValues(X,de);for(let X of Ft)He.outputStore.writeDataObjects(X);for(let{cardId:X,outputFile:de,deliveryToken:i}of Le)se.commitSourceData(X,de,i);let Pt;try{Pt=wt(vt(a,Wt)),He.outputStore.writeStatusSnapshot(Pt);}catch(X){o(`[board-live-cards-public] status publish failed: ${X instanceof Error?X.message:String(X)}`);}let At=[];for(let{cardId:X,values:de}of Ot)At.push({kind:"computed_values",cardId:X,values:de});for(let X of Ft)for(let[de,i]of Object.entries(X))de&&At.push({kind:"data_object",key:de,payload:i});for(let[X,de]of qt)X!==Ae&&At.push({kind:"card_refreshed",cardId:X,card:de});for(let X of ht)At.push({kind:"card_removed",cardId:X});Pt!==void 0&&At.push({kind:"status",status:Pt}),b(At);let Rt=d()??{howToRun:"built-in",whatToRun:Pe({kind:"built-in",value:"source-cli-task-executor"})},xr=t.supportsDirectSourceOutput?.(Rt)===true;I.dispatchEntriesForJournalId(ne,X=>{if(X.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${X.taskKind}" \u2014 skipping`);return}let de=X.payload,i=de.enrichedCard?.id??"unknown",v=de.enrichedCard?.source_defs??[];if(Rt.howToRun==="queue-storage"&&xr){try{let E=t.queueStorageForRef(N(),"task-executor"),U=typeof Rt.extra?.boardId=="string"?Rt.extra.boardId:void 0,H=[];for(let Y of v){if(!Y.outputFile){o(`[dispatch] source "${Y.bindTo}" has no outputFile \u2014 skipping`);continue}let ie=t.genId(),fe=`${i}/.staged/${ie}/${Y.outputFile}`,Qe=ce.keyRef?.(fe);if(!Qe)continue;let Te={ref:Pe(Qe),deliveryToken:ie,outputFile:Y.outputFile,cardId:i},Ge=jn({cbk:de.callbackToken,rg:e.value,br:Pe(e),cid:i,b:Y.bindTo,d:Y.outputFile,cs:void 0,rqt:de.rqt,dt:Te.deliveryToken});H.push({...U?{boardId:U}:{},ref:Rt,args:{source_def:Y,base_ref:Pe(e),callback:n.createCallback(Ge),output:Te}});}H.length>0&&E.enqueueMany(H);}catch(E){Tt(i,E instanceof Error?E.message:String(E));}return}for(let E of v){if(!E.outputFile){o(`[dispatch] source "${E.bindTo}" has no outputFile \u2014 skipping`);continue}let U;if(xr){let Y=t.genId(),ie=`${i}/.staged/${Y}/${E.outputFile}`,fe=ce.keyRef?.(ie);fe&&(U={ref:Pe(fe),deliveryToken:Y,outputFile:E.outputFile,cardId:i});}let H=jn({cbk:de.callbackToken,rg:e.value,br:Pe(e),cid:i,b:E.bindTo,d:E.outputFile,cs:void 0,rqt:de.rqt,...U?{dt:U.deliveryToken}:{}});t.dispatchExecution(Rt,{source_def:E,base_ref:Pe(e),callback:n.createCallback(H),...U?{output:U}:{}}).catch(Y=>Tt(i,Y instanceof Error?Y.message:String(Y)));}});}function N(){let j=A().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 $(){t.queueStorageForRef(N(),"process-accumulated").enqueue({boardRef:Pe(e)}),t.requestProcessAccumulated?.();}function Q(){let j=t.queueStorageForRef(N(),"process-accumulated");for(;;){let I=j.lease({max:64,visibilityMs:1e3});if(I.length<=0)return;for(let J of I)j.ack(J.id,J.leaseToken);if(I.length<64)return}}async function oe(){try{let j=()=>{let J=p(),{events:q}=g().readEntriesAfterCursor(J.lastDrainedJournalId);q.length<=0||$();},I=await sn(t.lock,O,j);return he({ran:I!==!1})}catch(j){return be(j)}}function pe(){$();}function Z(j){try{let I=j.params?.cardStoreRef;if(!I)return me("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(c=j.params?.boardRuntimeStoreRef,!c)return me("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!m()){let Be=_t(Vt);R({lastDrainedJournalId:"",graph:bt(Be),runtimeByCardId:{}},null);}let J=j.params?.outputsStoreRef;if(!J)return me("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let q=j.params?.queueStoreRef;if(!q)return me("init requires params.queueStoreRef \u2014 pass the queue store ref here");let V=j.params?.fetchedSourcesStoreRef;if(!V)return me("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");l=j.params?.scratchStoreRef;let ne=j.params?.chatStoreRef;if(!ne)return me("init requires params.chatStoreRef \u2014 pass the chat store ref here");let ce=j.params?.artifactsStoreRef;if(!ce)return me("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let se=A();se.writeBoardRuntimeStoreRef(c),se.writeCardStoreRef(I),se.writeOutputsStoreRef(J),se.writeQueueStoreRef(q),se.writeFetchedSourcesStoreRef(V),se.writeChatStoreRef(ne),se.writeArtifactsStoreRef(ce),f().writeCard(xt().id,xt());let Ce=y({params:{cardId:xt().id,restart:!0}});if(Ce.status!=="success")return Ce;try{s().writeStatusSnapshot(wt(vt(a,St(p().graph))));}catch{}return he()}catch(I){return be(I)}}function ae(j){try{let I=s().readStatusSnapshot();if(!I){I=wt(vt(a,St(p().graph)));try{s().writeStatusSnapshot(I);}catch{}}return he(I)}catch(I){return be(I)}}function re(j){try{let I=j.params?.id;if(!I)return me("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(I);}catch{}return T({type:"task-removal",taskName:I,timestamp:We()}),I!==Ae&&T({type:"task-restart",taskName:Ae,timestamp:We()}),pe(),he()}catch(I){return be(I)}}function G(j){try{let I=j.params?.cardId;if(!I)return me("addCardFiles requires params.cardId");let J=gr(f(),{emitNotification:h}).appendFiles({params:{id:I},body:j.body});return J.status!=="success"?J:he({cardId:I,files_added:J.data.files_added,notified:!0})}catch(I){return be(I)}}function z(j){try{let I=j.params?.id;return I?(T({type:"task-restart",taskName:I,timestamp:We()}),pe(),he()):me("retrigger requires params.id")}catch(I){return be(I)}}async function B(j){return Q(),oe()}function w(){let j=A().readFetchedSourcesStoreRef();if(!j)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return j}function K(){return t.blobStorageForRef(w())}function y(j){try{let I=j.params?.cardId,J=j.params?.all,q=!!j.params?.restart;if(!I&&!J)return me("upsertCard requires --card-id <id> or --all");let V=J?f().readAllCards().map(ce=>ce.id):[I];for(let ce of V)if(!f().readCard(ce))return me(`Card "${ce}" not found in board at ${e.value}`);let ne=!1;for(let ce of V){let se=f().readCard(ce),Ce=Kt(se),Be=t.hashFn(Ce),Me=t.kvStorage("card-upsert"),Le=Me.read(ce),De=Le?.taskConfigHash!==Be;if(!(!De&&!q)){if(De){let Ze=Le?.blobRef??f().readCardKey(ce)??ce;T({type:"task-upsert",taskName:ce,taskConfig:Ce,timestamp:We()}),Me.write(ce,{blobRef:Ze,taskConfigHash:Be,updatedAt:We()}),ne=ne||ce!==Ae;}q&&T({type:"task-restart",taskName:ce,timestamp:We()});}}return ne&&T({type:"task-restart",taskName:Ae,timestamp:We()}),pe(),he()}catch(I){return be(I)}}function S(j){try{let I=j.params?.token;if(!I)return me("taskFailed requires params.token");let J=j.params?.error??"unknown error",q=yr(I);return q?(T({type:"task-failed",taskName:q.taskName,error:J,timestamp:We()}),pe(),he()):me("Invalid callback token")}catch(I){return be(I)}}function F(j){try{let I=j.params?.token;if(!I)return me("taskProgress requires params.token");let q=(j.body??{}).update??{},V=yr(I);return V?(T({type:"task-progress",taskName:V.taskName,update:q,timestamp:We()}),pe(),he()):me("Invalid callback token")}catch(I){return be(I)}}function M(j){try{let I=j.params?.token,J=j.params?.ref;if(!I)return me("sourceDataFetched requires params.token");if(!J)return me("sourceDataFetched requires params.ref");let q=Mn(I);if(!q)return me("Invalid source token");let{cbk:V,cid:ne,b:ce,d:se,cs:Ce,rqt:Be,dt:Me}=q,Le=cr(K(),He=>t.resolveBlob(He)),De=Me||t.genId();Me||Le.ingestSourceDataStaged(ne,se,ct(J),De);let Ze=yr(V);if(!Ze)return me("Invalid callback token embedded in source token");let it=We();return T({type:"task-progress",taskName:Ze.taskName,update:{bindTo:ce,outputFile:se,fetchedAt:it,deliveryToken:De,sourceChecksum:Ce,rqt:Be},timestamp:it}),pe(),he()}catch(I){return be(I)}}function L(j){try{let I=j.params?.token,J=j.params?.reason??"unknown";if(!I)return me("sourceDataFetchFailure requires params.token");let q=Mn(I);if(!q)return me("Invalid source token");let{cbk:V,b:ne,d:ce,cs:se,rqt:Ce}=q,Be=yr(V);return Be?(T({type:"task-progress",taskName:Be.taskName,update:{bindTo:ne,outputFile:ce,failure:!0,reason:J,sourceChecksum:se,rqt:Ce},timestamp:We()}),pe(),he()):me("Invalid callback token embedded in source token")}catch(I){return be(I)}}function D(j){try{let I=A().readCardStoreRef();return I?he({storeRef:I}):me(`Board at ${e.value} has no card store configured`)}catch(I){return be(I)}}function ee(j){try{return he({storeRef:c??null})}catch(I){return be(I)}}function ue(j){try{let I=A().readOutputsStoreRef();return I?he({storeRef:I}):me(`Board at ${e.value} has no outputs store configured`)}catch(I){return be(I)}}function Se(j){try{return he({storeRef:l??null})}catch(I){return be(I)}}function Ie(j){try{let I=A().readChatStoreRef();return he({storeRef:I})}catch(I){return be(I)}}function Ee(j){try{let I=A().readArtifactsStoreRef();return he({storeRef:I})}catch(I){return be(I)}}function ge(j){try{let I=A().readFetchedSourcesStoreRef();return he({storeRef:I})}catch(I){return be(I)}}function ke(j){try{let I=j.params?.key;if(!I)return me("getConfig requires params.key");let J=A(),q;switch(I){case "task-executor":q=u??null;break;case "chat-handler-flow":q=k??null;break;case "board-runtime-store-ref":q=J.readBoardRuntimeStoreRef();break;case "card-store-ref":q=J.readCardStoreRef();break;case "outputs-store-ref":q=J.readOutputsStoreRef();break;case "scratch-store-ref":q=l??null;break;case "chat-store-ref":q=J.readChatStoreRef();break;case "artifacts-store-ref":q=J.readArtifactsStoreRef();break;case "fetched-sources-store-ref":q=J.readFetchedSourcesStoreRef();break;default:return me(`getConfig: unknown key "${I}"`)}return he({value:q})}catch(I){return be(I)}}function Ve(j){try{let I=j.params?.key;if(!I)return me("getOutputsDataObject requires params.key");if(I===ot)return he(null);let J=s().readDataObject(I);return he(J)}catch(I){return be(I)}}function we(j){try{return he(fr(s().readAllDataObjects()))}catch(I){return be(I)}}function Ke(j){try{let I=j.params?.key;if(!I)return me("getOutputsComputedValues requires params.key");let J=s().readComputedValues(I);return he(J)}catch(I){return be(I)}}function Ne(j){try{return he(s().readAllComputedValues())}catch(I){return be(I)}}function Re(){return cr(K(),j=>t.resolveBlob(j))}function tt(j){let I=K().keyRef?.(j);if(!I)throw new Error("configured fetched-sources store does not support keyRef");return Pe(I)}function Je(j){try{let I=j.params?.key;if(!I)return me("getOutputsFetchedSources requires params.key");let J=Re().listSources(I),q={};for(let V of J)q[V]=tt(`${I}/${V}`);return he(q)}catch(I){return be(I)}}function rt(j){try{let I=Re(),J=new Set;for(let V of K().listKeys()){let ne=V.indexOf("/");ne>0&&!V.includes("/.staged/")&&J.add(V.slice(0,ne));}let q={};for(let V of J){let ne=I.listSources(V);if(ne.length>0){q[V]={};for(let ce of ne)q[V][ce]=tt(`${V}/${ce}`);}}return he(q)}catch(I){return be(I)}}function yt(j){try{let I=f().readAllCards().filter(se=>se.id!==Ae),J=ae({});if(J.status!=="success")return J;let q=we({});if(q.status!=="success")return q;let V=Ne({});if(V.status!=="success")return V;let ne=V.data,ce={};for(let se of I){let Ce=typeof se?.id=="string"?se.id:null;if(!Ce)continue;let Be=se.card_data&&typeof se.card_data=="object"&&!Array.isArray(se.card_data)?se.card_data:{};ce[Ce]={schema_version:"v1",card_id:Ce,card_data:{...Be},computed_values:ne[Ce]&&typeof ne[Ce]=="object"?ne[Ce]:{}};}return he({cardDefinitions:I,statusSnapshot:J.data,dataObjectsByToken:q.data,cardRuntimeById:ce})}catch(I){return be(I)}}return {init:Z,status:ae,getBoardRuntimeStoreRef:ee,getCardStoreRef:D,getOutputsStoreRef:ue,getScratchStoreRef:Se,getChatStoreRef:Ie,getArtifactsStoreRef:Ee,getFetchedSourcesStoreRef:ge,getConfig:ke,getOutputsDataObject:Ve,getAllOutputsDataObjects:we,getOutputsComputedValues:Ke,getAllOutputsComputedValues:Ne,getOutputsFetchedSources:Je,getAllOutputsFetchedSources:rt,buildSseOneShotPayload:yt,removeCard:re,addCardFiles:G,retrigger:z,processAccumulatedEvents:B,upsertCard:y,taskFailed:S,taskProgress:F,sourceDataFetched:M,sourceDataFetchFailure:L}}function $n(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 lr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return lr(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(d){s.write("_index",d);},readCard(d){return s.read(d)},writeCard(d,m){return s.write(d,m),t.hashFn(m)},removeCard(d){s.delete(d);},cardExists(d){return s.read(d)!==null},defaultCardKey(d){return d}}}let c=()=>Ut(a(),t.onWarn??(()=>{}));function l(){return n??o().readTaskExecutorRef()}async function u(f,s){let d=t.validateSchema(s),m=[],p=l();if(p&&Array.isArray(s.source_defs))for(let T of s.source_defs){let O=typeof T.bindTo=="string"?T.bindTo:"(unknown)";try{let N;try{N=await t.invokeExecutor(p,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(T)});}catch(Q){let oe=Q;if(N=typeof oe?.stdout=="string"?oe.stdout:"",!N.trim()){m.push(`source "${O}": executor validate-source-def failed \u2014 ${Q instanceof Error?Q.message:String(Q)}`);continue}}let $=JSON.parse(N.trim());if(!$.ok&&Array.isArray($.errors))for(let Q of $.errors)m.push(`source "${O}": ${Q}`);}catch(N){m.push(`source "${O}": executor validate-source-def failed \u2014 ${N instanceof Error?N.message:String(N)}`);}}let R=[...d.errors,...m];return he({cardId:f,isValid:R.length===0,issues:R})}function k(f,s){let d=f.params?.sourceIdx,m=f.params?.outRef;if(d===void 0)return me(`${s} requires params.sourceIdx`);if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return me(`${s} requires card JSON object in body`);let p=f.body,R=p["card-content"]??p,T=p["mock-projections"]??{},O=R.source_defs??[];if(d<0||d>=O.length)return me(`sourceIdx ${d} out of range (card has ${O.length} source(s))`);let N=O[d],$=typeof N.bindTo=="string"?N.bindTo:"source";return {src:N,bindTo:$,outRef:m,mockProjections:T}}async function h(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return me("validateCardPreflight requires card JSON object in body");let s=f.body,d=s["card-content"]??s,m=typeof d.id=="string"?d.id:"(unknown)";return await u(m,d)}catch(s){return be(s)}}async function C(f){try{let s=k(f,"probeSourcePreflight");if("status"in s)return s;let d=l();if(!d)return me("No task-executor registered for this board");try{let m={...s.src,_projections:s.mockProjections},p=await t.invokeExecutor(d,"probe-source-preflight",{timeout:s.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(m)}),R=JSON.parse(p.trim());return R.ok?he({bindTo:s.bindTo,reachable:R.reachable,latencyMs:R.latencyMs,note:R.note}):me(R.error??"Preflight probe failed")}catch{return me("Executor does not support probe-source-preflight")}}catch(s){return be(s)}}async function b(f){try{let s=k(f,"runSourcePreflight");if("status"in s)return s;let d=l();if(!d)return me("No task-executor registered for this board");try{let m={...s.src,_projections:s.mockProjections},p=await t.invokeExecutor(d,"run-source-preflight",{timeout:s.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(m)}),R=JSON.parse(p.trim());if(!R.ok)return he({bindTo:s.bindTo,ok:!1,result:null,issues:[R.error??"Preflight run failed"]});if(s.outRef){let T=ct(s.outRef);t.absoluteBlob.write(T.value,JSON.stringify(R.resultValue,null,2));}return he({bindTo:typeof R.bindTo=="string"?R.bindTo:s.bindTo,ok:!0,result:R.resultValue??null,issues:[]})}catch(m){let p=m instanceof Error?m.message:String(m);return he({bindTo:s.bindTo,ok:!1,result:null,issues:[p]})}}catch(s){return be(s)}}async function P(f){try{let s=l();if(!s)return me("No task-executor registered for this board");let d=await t.invokeExecutor(s,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return he(JSON.parse(d.trim()))}catch(s){return be(s)}}function _(f){try{let s=f.body;if(!s||!Array.isArray(s.ops))return me("updatesInCardStore requires body.ops array");let d=s.ops,m=c();for(let p of d){let R=p.op,T=p.id;if(!T)return me('op is missing "id"');if(R==="update"){let O=p["card-content"];if(!O)return me(`update op for "${T}" is missing "card-content"`);m.writeCard(T,O);}else return me(`Unknown op type: "${R??"(none)"}"`)}return he()}catch(s){return be(s)}}function A(f){try{let s=f.body;if(!s||!Array.isArray(s.ids))return me("readFromCardStore requires body.ids array");let d=s.ids,m=c(),p=d.map(R=>({id:R,"card-content":m.readCard(R)}));return he({cards:p})}catch(s){return be(s)}}function x(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return me("evalCardCompute requires a JSON object in body");let s=f.body,d=s["card-content"]??s,m=typeof d.id=="string"?d.id:"(unknown)",p=s["mock-fetched-sources"]??{},R=s["mock-requires"]??{},T=d.compute;if(!T||!Array.isArray(T)||T.length===0)return he({cardId:m,ok:!0,computed_values:{},errors:[]});let O={id:m,card_data:d.card_data??{},requires:R,source_defs:d.source_defs,compute:T},N=Ye.runSync(O,{sourcesData:p}),$=N.node.computed_values??{},Q=N.errors??[];return he({cardId:m,ok:Q.length===0,computed_values:$,errors:Q})}catch(s){return be(s)}}async function g(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return me("simulateCardCycle requires a JSON object in body");let s=f.body,d=s["card-content"]??s,m=typeof d.id=="string"?d.id:"(unknown)",p=s["mock-fetched-sources"]??{},R=s["mock-requires"]??{},T=await u(m,d),O=T.status==="success"?{isValid:T.data.isValid,issues:T.data.issues}:{isValid:!1,issues:[T.status==="fail"?T.error:"internal error"]},N=d.source_defs??[],$=d.card_data??{},Q=[],oe=[],pe=[];if(N.length>0){Q=Ye.enrichSourcesSync(N,{card_data:$,requires:R}),oe=Q.filter(S=>S._skip!==!0);for(let S of oe){let F=S.projections,M=S._projections;if(F&&M){for(let L of Object.keys(F))if(M[L]===void 0){let D=typeof S.bindTo=="string"?S.bindTo:"(unknown)";pe.push({bindTo:D,key:L,error:`Projection "${L}" resolved to undefined`});}}}}let Z=[],ae=new Set(oe.map(S=>typeof S.bindTo=="string"?S.bindTo:"")),re=Object.fromEntries(Object.entries(p).filter(([S])=>ae.has(S))),G=s["task-executor-ref"],z=(G?.howToRun&&G?.whatToRun?G:void 0)??l();for(let S=0;S<Q.length;S++){let F=Q[S],M=typeof F.bindTo=="string"?F.bindTo:`source_${S}`;if(F._skip===!0){Z.push({bindTo:M,skipped:!0});continue}if(!z){Z.push({bindTo:M,skipped:!0,error:"No task executor configured"});continue}try{let L={...F},D=await t.invokeExecutor(z,"run-source-preflight",{timeout:F.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(L)}),ee=JSON.parse(D.trim());ee.ok&&!Object.prototype.hasOwnProperty.call(p,M)&&Object.prototype.hasOwnProperty.call(ee,"resultValue")&&(re[M]=ee.resultValue),Z.push({bindTo:M,reachable:ee.reachable,latencyMs:ee.latencyMs,error:ee.ok?void 0:ee.error});}catch{Z.push({bindTo:M,skipped:!0,error:"Executor does not support run-source-preflight"});}}let B=d.compute,w={},K=[];if(B&&Array.isArray(B)&&B.length>0){let S={id:m,card_data:$,requires:R,source_defs:d.source_defs,compute:B},F=Ye.runSync(S,{sourcesData:re});w=F.node.computed_values??{},K=F.errors??[];}let y=O.isValid&&pe.length===0&&K.length===0&&Z.every(S=>S.reachable!==!1);return he({cardId:m,ok:y,validation:O,source_probes:Z,projection_errors:pe,fetched_sources:re,computed_values:w,compute_errors:K})}catch(s){return be(s)}}return {validateCardPreflight:h,probeSourcePreflight:C,runSourcePreflight:b,evalCardCompute:x,simulateCardCycle:g,describeTaskExecutorCapabilities:P,updatesInCardStore:_,readFromCardStore:A}}function hr(e,t={}){function r(k){return {status:"success",data:k}}function n(k){return {status:"fail",error:k}}function o(k){return {status:"error",error:k instanceof Error?k.message:String(k)}}async function a(k){let h=t.emitNotification;if(!h||k.length===0)return;let C=$e(k);if(C.length===1){await h(C[0]);return}await h(Ue({kind:"notification-batch",notifications:C}));}async function c(k){let h=k.params?.id;if(h){let C=await e.readCard(h);if(!C)throw new Error(`card "${h}" not found`);return [C]}return await e.readAllCards()}function l(k){return Ue({kind:"notification-batch",notifications:$e(k.map(h=>({kind:"card_refreshed",cardId:h.id,card:h})))})}function u(k){if(Array.isArray(k))return k;if(k&&typeof k=="object"){let h=k;return Array.isArray(h.files)?h.files:[k]}return null}return {async get(k){try{return r({cards:await c(k)})}catch(h){return o(h)}},async buildNotificationBatch(k){try{return r(l(await c(k)))}catch(h){return o(h)}},async set(k){try{let h=k.body;if(h==null)return n("set requires a body (card object or array of cards)");let C=Array.isArray(h)?h:[h];for(let b of C){if(typeof b.id!="string")return n("each card must have a string `id` field");await e.writeCard(b.id,b);}return await a(C.map(b=>({kind:"card_refreshed",cardId:b.id,card:b}))),r({count:C.length})}catch(h){return o(h)}},async del(k){try{let h=k.body?.ids??[],C=k.params?.id,b=C?[...h,C]:h;if(b.length===0)return n("del requires body.ids (string[]) or params.id");for(let P of b)await e.removeCard(P);return await a(b.map(P=>({kind:"card_removed",cardId:P}))),r({count:b.length})}catch(h){return o(h)}},async patch(k){try{let h=k.params?.id,C=k.params?.path;if(!h)return n("patch requires params.id");if(!C)return n("patch requires params.path");let b=k.body,P=b&&Object.prototype.hasOwnProperty.call(b,"value")?b.value:k.body;await e.patchCard(h,C,P);let _=await e.readCard(h);return _?(await a([{kind:"card_refreshed",cardId:h,card:_}]),r({count:1})):n(`card "${h}" not found`)}catch(h){return o(h)}},async appendFiles(k){try{let h=k.params?.id;if(!h)return n("appendFiles requires params.id");let C=await e.readCard(h);if(!C)return n(`card "${h}" not found`);let b=u(k.body);if(!b||b.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let P=C.card_data&&typeof C.card_data=="object"&&!Array.isArray(C.card_data)?C.card_data:{},_=Array.isArray(P.files)?P.files:[],A=[..._,...b],x=b.map((f,s)=>({idx:_.length+s,entry:f})),g=await this.patch({params:{id:h,path:"card_data.files"},body:{value:A}});return g.status!=="success"?g:r({files_added:x})}catch(h){return o(h)}}}}async function Un(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Hr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Ht(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Hr(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(Hr)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Hr(t),reason:t.reason}))}}}function Vn(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 nr(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",rr(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 ma(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Rr(e,t){return ma(e)?e.then(t):t(e)}function Kn(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]=Kn(r[n],o):r[n]=o;return r}function kr(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]:kr(a,o,r)}}function Hn(e){return {read:r=>e.read(r),get(r,n){return Rr(e.read(r),o=>{if(o===null)return null;let a=o;for(let c of n.split(".").filter(Boolean)){if(a===null||typeof a!="object"||Array.isArray(a))return null;a=a[c]??null;}return a??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return Rr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return Rr(e.read(r),o=>e.write(r,Kn(o??{},n)))},patch(r,n,o){return Rr(e.read(r),a=>{let c=n.split(".").filter(Boolean);return e.write(r,kr(a??{},c,o))})}}}function Cr(e){return Hn(e)}function br(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 Sr(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,a]of Object.entries(await r())){if(!await e.cardExists(a.key))continue;let c=await e.readCard(a.key);c?n.push(c):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,a]of Object.entries(await r()))n[o]=a.checksum;return n},async changedSince(n){let o=await r(),a=[];for(let[c,l]of Object.entries(o))n[c]!==l.checksum&&a.push(c);for(let c of Object.keys(n))o[c]||a.push(c);return a},async validateUpsert(n,o){let a=await r(),c=a[n],l=Object.entries(a).find(([,u])=>u.key===o);return c&&c.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${c.key}", cannot remap to "${o}"`}:l&&l[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${l[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,a){let c=await r(),l=a??c[n]?.key??e.defaultCardKey(n),u=await e.writeCard(l,o);c[n]={key:l,checksum:u,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async patchCard(n,o,a){let c=await r(),l=c[n];if(!l||!await e.cardExists(l.key))throw new Error(`card "${n}" not found`);let u=await e.readCard(l.key);if(!u||typeof u!="object"||Array.isArray(u))throw new Error(`card "${n}" is not patchable`);let k=String(o||"").split(".").filter(Boolean),h=kr(u,k,a),C=await e.writeCard(l.key,h);c[n]={key:l.key,checksum:C,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async removeCard(n){let o=await r(),a=o[n];a&&(await e.removeCard(a.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function _e(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function xe(e){return {status:"fail",error:e}}function Oe(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function je(){return new Date().toISOString()}function pa(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 Gn(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 wr(e){try{let t=JSON.parse(Gn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Qn(e){return pa(JSON.stringify(e))}function Jn(e){try{let t=JSON.parse(Gn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ga(e){return $r(e,On,()=>({_sources:{}}))}function ya(e,t){return ir(e,t)}function ha(e){return ur(e)}function Ra(e,t){return Dr(e,t)}function ka(e,t,r,n,o,a){return async c=>{let l=[],u=await r.cardStore.readCard(c.nodeId);if(!u)return "task-initiate-failure";let k=u.id;if(k===Ae){let Z=r.activeTaskConfigs?.(),ae={[ot]:Z?Vr((await Promise.all(Object.keys(Z).filter(re=>re!==Ae).map(re=>r.cardStore.readCard(re)))).filter(re=>!!re),Z):await Ur(await r.cardStore.readAllCards())};return (a??(()=>{}))(ae),n(c.nodeId,ae),"task-initiated"}let h=u.card_data??{},C=u.source_defs??[],b=await r.cardRuntimeStore.readRuntime(k),P=false,_=async()=>{P&&(await r.cardRuntimeStore.writeRuntime(k,b),P=false);},A=Z=>Lt(b._sources[Z]),x=(Z,ae)=>{b._sources[Z]=Lt(ae),P=true;},g=c.taskState?.executionCount??0;if(b._lastExecutionCount!==g&&(b._sources={},b._lastExecutionCount=g,P=true),c.update){let Z=c.update.outputFile;if(Z){let ae=A(Z);if(c.update.failure){let re=c.update.rqt??ae.lastRequestedToken??ae.queueRequestedToken;re&&x(Z,$t(ae,re));}else {let re=c.update.rqt;if(!ae.lastCompletedToken||re>ae.lastCompletedToken){let G=typeof c.update.deliveryToken=="string"?c.update.deliveryToken:void 0,z=G?await r.fetchedSourcesStore.commitSourceData(k,Z,G):false;x(Z,z?Kr(ae,re):$t(ae,re));}}await _();}}let f={};for(let[Z,ae]of Object.entries(c.state??{}))if(ae!==null&&typeof ae=="object"&&!Array.isArray(ae)){let re=ae[Z];f[Z]=re!==void 0?re:ae;}else f[Z]=ae;let s={id:k,card_data:{...h},requires:f,source_defs:C,compute:u.compute},m=Ye.enrichSourcesSync(Array.isArray(u.source_defs)?u.source_defs:void 0,{card_data:h,requires:f}).filter(Z=>Z._skip!==true),p=m,R={};for(let Z of m){if(!Z.outputFile)continue;let ae=await r.fetchedSourcesStore.readSourceData(k,Z.outputFile);ae!==null&&(R[Z.bindTo]=ae);}s._sourcesData=R,u.compute&&Ye.runSync(s,{sourcesData:R}),(o??(()=>{}))(k,s.computed_values??{});let T={...u,source_defs:Array.isArray(m)?m.map(Z=>({...Z,boardDir:typeof Z.boardDir=="string"&&Z.boardDir?Z.boardDir:e.value})):m},O=je(),N=c.update?void 0:O,$=p.filter(Z=>{let ae=Z.outputFile;if(typeof ae!="string"||!ae)return true;let re=A(ae);N&&(re={...re,queueRequestedToken:N},x(ae,re));let G=re.queueRequestedToken??re.lastRequestedToken??O;return Dt(re,G)==="dispatch"});if(await _(),$.length>0){let Z=false,ae=O;for(let re of $){let G=re.outputFile;if(typeof G!="string"||!G)continue;let z=A(G),B=z.queueRequestedToken??O;x(G,{...z,lastRequestedToken:B}),ae=B,Z=true;}return Z&&await _(),Z&&(l.push({taskKind:"source-fetch",payload:{boardRef:Pe(e),enrichedCard:T,callbackToken:c.callbackToken,rqt:ae}}),await r.executionRequestStore.appendEntries(t,l)),"task-initiated"}if(p.some(Z=>{let ae=Z.outputFile;if(typeof ae!="string"||!ae)return false;let re=A(ae),G=re.queueRequestedToken??re.lastRequestedToken??O;return Dt(re,G)==="in-flight"}))return "task-initiated";let oe=u.provides??[],pe={};for(let{bindTo:Z,ref:ae}of oe)pe[Z]=Ye.resolve(s,ae);return (a??(()=>{}))(pe),n(c.nodeId,pe),l.length>0&&await r.executionRequestStore.appendEntries(t,l),"task-initiated"}}function Wn(e,t,r={}){Xt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),a=Pe(e),c=r.emitNotification??(B=>{if(!t.publishBoardChangeNotifications)return;let w=B.kind==="notification-batch"?B.notifications:[B];return t.publishBoardChangeNotifications(w)}),l=null,u=r.boardRuntimeStoreRef,k=r.scratchStoreRef,h=r.taskExecutorRef,C=r.chatHandlerFlow;function b(){if(!u)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return u}function P(B){if(B.length!==0)try{let w=$e(B),K=Ue({kind:"notification-batch",notifications:w});return Promise.resolve(c(K)).catch(y=>{o(`[async-board-live-cards-public] emitNotification failed: ${y instanceof Error?y.message:String(y)}`);})}catch(w){o(`[async-board-live-cards-public] emitNotification failed: ${w instanceof Error?w.message:String(w)}`);return}}let _=()=>Vn(t.kvStorageForRef(b())),A=e.value,x=()=>ar(Mr(()=>t.kvStorageForRef(b()),t.hashFn),"v1"),g=async()=>{let B=await _().readOutputsStoreRef();if(!B)throw new Error(`Board at ${e.value} has no outputs store configured.`);return ha(t.kvStorageForRef(B))},f=async()=>{let B=await _().readCardStoreRef();if(!B)throw new Error(`Board at ${e.value} has no card store configured.`);let w=t.kvStorageForRef(B);return Sr(br(Cr(w),t.hashFn),o)};async function s(){return !!(await x().readSnapshot(A)).values[mt]}async function d(){let B=await x().readSnapshot(A);if(!B.values[mt])throw new Error(`Board not initialized at ${e.value}`);return pr(B.values)}async function m(B,w){let K=await x().commitSnapshot(A,{schemaVersion:"v1",expectedVersion:w,deleteKeys:[],shallowMerge:mr(B)});if(!K.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${w??"null"} current=${K.currentVersion??"null"}`)}let p=()=>In(t.journalStorageForRef(b()));async function R(){return h??await _().readTaskExecutorRef()}async function T(){return fr(await(await g()).readAllDataObjects())}async function O(B){await p().appendEvent(B);}async function N(){let B=await _().readFetchedSourcesStoreRef();if(!B)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return B}async function $(){return t.blobStorageForRef(await N())}async function Q(){return ya(await $(),B=>t.resolveBlob(B))}async function oe(B){let w=(await $()).keyRef?.(B);if(!w)throw new Error("configured fetched-sources store does not support keyRef");let K=await Promise.resolve(w);return Pe(K)}async function pe(){let B=Ra(t.kvStorageForRef(b()),async(q,V)=>{let ne=q.payload,se=(ne.enrichedCard??{}).id??ne.cardId??"unknown";await O({type:"task-failed",taskName:se,error:V,timestamp:je()});}),w=ga(t.kvStorageForRef(b())),K=await $(),y=await Q(),S=await f(),F=await g(),M=new Map,L=new Map,D=[],ee=[],ue=[],Se=new Map,Ie=new Set,Ee={async readRuntime(q){return M.get(q)??await w.readRuntime(q)},async writeRuntime(q,V){M.set(q,V),we[q]=V;}},ge={async readSourceData(q,V){let ne=`${q}/${V}`;return L.has(ne)?L.get(ne):await y.readSourceData(q,V)},ingestSourceDataStaged(q,V,ne,ce){return y.ingestSourceDataStaged(q,V,ne,ce)},async commitSourceData(q,V,ne){let ce=`${q}/.staged/${ne}/${V}`,se=await K.read(ce);if(se==null){let Me=await Promise.resolve(K.keyRef?.(ce));Me&&(se=await t.resolveBlob(Me));}if(se==null)return false;let Ce=`${q}/${V}`,Be=se.trim();try{L.set(Ce,JSON.parse(Be));}catch{L.set(Ce,Be);}return D.push({cardId:q,outputFile:V,deliveryToken:ne}),true},async hasSource(q,V){let ne=`${q}/${V}`;return L.has(ne)||await y.hasSource(q,V)},async listSources(q){let V=await y.listSources(q),ne=[...L.keys()].filter(ce=>ce.startsWith(`${q}/`)).map(ce=>ce.slice(`${q}/`.length));return [...new Set([...V,...ne])]}},ke=await d(),Ve=St(ke.graph),we={...ke.runtimeByCardId},{events:Ke,newCursor:Ne}=await p().readEntriesAfterCursor(ke.lastDrainedJournalId),Re=Ke,tt=()=>Ve.config.tasks,Je=er(Ve,{handlers:{"card-handler":ka(e,Ne,{cardStore:S,cardRuntimeStore:Ee,fetchedSourcesStore:ge,outputStore:F,executionRequestStore:B,activeTaskConfigs:()=>tt()},(q,V)=>{Re.push({type:"task-completed",taskName:q,data:V,timestamp:je()});},(q,V)=>{ee.push({cardId:q,values:V});},q=>{ue.push(q);})},onNodeRemoved:q=>{Se.delete(q),M.delete(q),delete we[q],Ie.add(q);}});for(tt=()=>Je.getState().config.tasks;Re.length>0;){let q=Re;Re=[];for(let V of q)if(V.type==="task-restart"){let ne=await S.readCard(V.taskName);ne&&Se.set(V.taskName,ne);}Je.pushAll(q),await Je.waitForHandlers();}let rt=Je.getState();await Je.dispose({wait:true}),await m({lastDrainedJournalId:Ne,graph:bt(rt),runtimeByCardId:we},(await x().readSnapshot(A)).version);for(let{cardId:q,values:V}of ee)await F.writeComputedValues(q,V);for(let q of ue)await F.writeDataObjects(q);for(let[q,V]of M)await w.writeRuntime(q,V);for(let q of D)await y.commitSourceData(q.cardId,q.outputFile,q.deliveryToken);let yt=wt(vt(a,rt));await F.writeStatusSnapshot(yt);let j=[];for(let{cardId:q,values:V}of ee)j.push({kind:"computed_values",cardId:q,values:V});for(let q of ue)for(let[V,ne]of Object.entries(q))j.push({kind:"data_object",key:V,payload:ne});for(let[q,V]of Se)q!==Ae&&j.push({kind:"card_refreshed",cardId:q,card:V});for(let q of Ie)j.push({kind:"card_removed",cardId:q});j.push({kind:"status",status:yt}),await P(j);let I=await R();if(!I)return;let J=t.supportsDirectSourceOutput?.(I)===true;await B.dispatchEntriesForJournalId(Ne,async q=>{if(q.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${q.taskKind}" \u2014 skipping`);return}let V=q.payload,ne=V.enrichedCard?.id??"unknown",ce=V.enrichedCard?.source_defs??[];if(I.howToRun==="queue-storage"&&J){try{let se=await _().readQueueStoreRef();if(!se)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let Ce=t.queueStorageForRef(se,"task-executor"),Be=typeof I.extra?.boardId=="string"?I.extra.boardId:void 0,Me=[];for(let Le of ce){if(!Le.outputFile)continue;let De=t.genId(),Ze=`${ne}/.staged/${De}/${Le.outputFile}`,it=await Promise.resolve(K.keyRef?.(Ze));if(!it)continue;let He={ref:Pe(it),deliveryToken:De,outputFile:Le.outputFile,cardId:ne},ut=Qn({cbk:V.callbackToken,rg:e.value,br:Pe(e),cid:ne,b:Le.bindTo,d:Le.outputFile,cs:void 0,rqt:V.rqt,dt:He.deliveryToken});Me.push({...Be?{boardId:Be}:{},ref:I,args:{source_def:Le,base_ref:Pe(e),callback:n.createCallback(ut),output:He}});}Me.length>0&&await Ce.enqueueMany(Me);}catch(se){await O({type:"task-failed",taskName:ne,error:se instanceof Error?se.message:String(se),timestamp:je()});}return}for(let se of ce){if(!se.outputFile)continue;let Ce;if(J){let Le=t.genId(),De=`${ne}/.staged/${Le}/${se.outputFile}`,Ze=await Promise.resolve(K.keyRef?.(De));Ze&&(Ce={ref:Pe(Ze),deliveryToken:Le,outputFile:se.outputFile,cardId:ne});}let Be=Qn({cbk:V.callbackToken,rg:e.value,br:Pe(e),cid:ne,b:se.bindTo,d:se.outputFile,cs:void 0,rqt:V.rqt,...Ce?{dt:Ce.deliveryToken}:{}}),Me=await t.dispatchExecution(I,{source_def:se,base_ref:Pe(e),callback:n.createCallback(Be),...Ce?{output:Ce}:{}});Me.dispatched||await O({type:"task-failed",taskName:ne,error:Me.error??"dispatch failed",timestamp:je()});}});}async function Z(){try{let B=async()=>{let K=await d(),{events:y}=await p().readEntriesAfterCursor(K.lastDrainedJournalId);y.length>0&&await re();},w=await Un(t.lock,pe,B);return _e({ran:w!==!1})}catch(B){return Oe(B)}}async function ae(){return l||(l=Z().finally(()=>{l=null;}),l)}async function re(){let B=await _().readQueueStoreRef();if(!B)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);await t.queueStorageForRef(B,"process-accumulated").enqueue({boardRef:Pe(e)}),await t.requestProcessAccumulated?.();}async function G(){let B=await _().readQueueStoreRef();if(!B)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let w=t.queueStorageForRef(B,"process-accumulated");for(;;){let K=await w.lease({max:64,visibilityMs:1e3});if(K.length<=0)return;for(let y of K)await w.ack(y.id,y.leaseToken);if(K.length<64)return}}function z(){re();}return {async init(B){try{let w=B.params?.cardStoreRef;if(!w)return xe("init requires params.cardStoreRef");if(u=B.params?.boardRuntimeStoreRef,!u)return xe("init requires params.boardRuntimeStoreRef");let K=B.params?.outputsStoreRef;if(!K)return xe("init requires params.outputsStoreRef");let y=B.params?.queueStoreRef;if(!y)return xe("init requires params.queueStoreRef");let S=B.params?.fetchedSourcesStoreRef;if(!S)return xe("init requires params.fetchedSourcesStoreRef");k=B.params?.scratchStoreRef;let F=B.params?.chatStoreRef;if(!F)return xe("init requires params.chatStoreRef");let M=B.params?.artifactsStoreRef;if(!M)return xe("init requires params.artifactsStoreRef");await s()||await m({lastDrainedJournalId:"",graph:bt(_t(Vt)),runtimeByCardId:{}},null);let L=_();await L.writeBoardRuntimeStoreRef(u),await L.writeCardStoreRef(w),await L.writeOutputsStoreRef(K),await L.writeQueueStoreRef(y),await L.writeFetchedSourcesStoreRef(S),await L.writeChatStoreRef(F),await L.writeArtifactsStoreRef(M),await(await f()).writeCard(Ae,xt());let D=t.kvStorage("card-upsert"),ee=xt(),ue=Kt(ee),Se=t.hashFn(ue),Ee=(await D.read(Ae))?.blobRef??await(await f()).readCardKey(Ae)??Ae;return await O({type:"task-upsert",taskName:Ae,taskConfig:ue,timestamp:je()}),await D.write(Ae,{blobRef:Ee,taskConfigHash:Se,updatedAt:je()}),await O({type:"task-restart",taskName:Ae,timestamp:je()}),z(),await(await g()).writeStatusSnapshot(wt(vt(a,St((await d()).graph)))),_e()}catch(w){return Oe(w)}},async status(B){try{let w=await g(),K=await w.readStatusSnapshot();return K||(K=wt(vt(a,St((await d()).graph))),await w.writeStatusSnapshot(K)),_e(K)}catch(w){return Oe(w)}},async getCardStoreRef(B){try{let w=await _().readCardStoreRef();return w?_e({storeRef:w}):xe(`Board at ${e.value} has no card store configured`)}catch(w){return Oe(w)}},async getBoardRuntimeStoreRef(B){try{return _e({storeRef:u??null})}catch(w){return Oe(w)}},async getOutputsStoreRef(B){try{let w=await _().readOutputsStoreRef();return w?_e({storeRef:w}):xe(`Board at ${e.value} has no outputs store configured`)}catch(w){return Oe(w)}},async getScratchStoreRef(B){try{return _e({storeRef:k??null})}catch(w){return Oe(w)}},async getChatStoreRef(B){try{return _e({storeRef:await _().readChatStoreRef()})}catch(w){return Oe(w)}},async getArtifactsStoreRef(B){try{return _e({storeRef:await _().readArtifactsStoreRef()})}catch(w){return Oe(w)}},async getFetchedSourcesStoreRef(B){try{return _e({storeRef:await _().readFetchedSourcesStoreRef()})}catch(w){return Oe(w)}},async getConfig(B){try{let w=B.params?.key;if(!w)return xe("getConfig requires params.key");let K=_(),y;switch(w){case "task-executor":y=h??null;break;case "chat-handler-flow":y=C??null;break;case "board-runtime-store-ref":y=await K.readBoardRuntimeStoreRef();break;case "card-store-ref":y=await K.readCardStoreRef();break;case "outputs-store-ref":y=await K.readOutputsStoreRef();break;case "scratch-store-ref":y=k??null;break;case "chat-store-ref":y=await K.readChatStoreRef();break;case "artifacts-store-ref":y=await K.readArtifactsStoreRef();break;case "fetched-sources-store-ref":y=await K.readFetchedSourcesStoreRef();break;default:return xe(`getConfig: unknown key "${w}"`)}return _e({value:y})}catch(w){return Oe(w)}},async getOutputsDataObject(B){try{let w=B.params?.key;if(!w)return xe("getOutputsDataObject requires params.key");if(w===ot)return _e(null);let K=await T();return _e(K[w]??null)}catch(w){return Oe(w)}},async getAllOutputsDataObjects(B){try{return _e(await T())}catch(w){return Oe(w)}},async getOutputsComputedValues(B){try{let w=B.params?.key;return w?_e(await(await g()).readComputedValues(w)):xe("getOutputsComputedValues requires params.key")}catch(w){return Oe(w)}},async getAllOutputsComputedValues(B){try{return _e(await(await g()).readAllComputedValues())}catch(w){return Oe(w)}},async getOutputsFetchedSources(B){try{let w=B.params?.key;if(!w)return xe("getOutputsFetchedSources requires params.key");let K=await(await Q()).listSources(w),y={};for(let S of K)y[S]=await oe(`${w}/${S}`);return _e(y)}catch(w){return Oe(w)}},async getAllOutputsFetchedSources(B){try{let w=await Q(),K=await(await $()).listKeys(),y=new Set;for(let F of K){let M=F.indexOf("/");M>0&&!F.includes("/.staged/")&&y.add(F.slice(0,M));}let S={};for(let F of y){let M=await w.listSources(F);if(M.length!==0){S[F]={};for(let L of M)S[F][L]=await oe(`${F}/${L}`);}}return _e(S)}catch(w){return Oe(w)}},async buildSseOneShotPayload(B){try{let w=(await(await f()).readAllCards()).filter(L=>L.id!==Ae),K=await this.status({});if(K.status!=="success")return K;let y=await this.getAllOutputsDataObjects({});if(y.status!=="success")return y;let S=await this.getAllOutputsComputedValues({});if(S.status!=="success")return S;let F=S.data,M={};for(let L of w){let D=typeof L?.id=="string"?L.id:null;if(!D)continue;let ee=L.card_data&&typeof L.card_data=="object"&&!Array.isArray(L.card_data)?L.card_data:{};M[D]={schema_version:"v1",card_id:D,card_data:{...ee},computed_values:F[D]&&typeof F[D]=="object"?F[D]:{}};}return _e({cardDefinitions:w,statusSnapshot:K.data,dataObjectsByToken:y.data,cardRuntimeById:M})}catch(w){return Oe(w)}},async addCardFiles(B){try{let w=B.params?.cardId;if(!w)return xe("addCardFiles requires params.cardId");let y=await hr(await f(),{emitNotification:c}).appendFiles({params:{id:w},body:B.body});return y.status!=="success"?y:_e({cardId:w,files_added:y.data.files_added,notified:!0})}catch(w){return Oe(w)}},async removeCard(B){try{let w=B.params?.id;if(!w)return xe("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(w);}catch{}return await O({type:"task-removal",taskName:w,timestamp:je()}),w!==Ae&&await O({type:"task-restart",taskName:Ae,timestamp:je()}),z(),_e()}catch(w){return Oe(w)}},async retrigger(B){try{let w=B.params?.id;return w?(await O({type:"task-restart",taskName:w,timestamp:je()}),z(),_e()):xe("retrigger requires params.id")}catch(w){return Oe(w)}},async processAccumulatedEvents(B){return await G(),ae()},async upsertCard(B){try{let w=B.params?.cardId,K=B.params?.all,y=!!B.params?.restart;if(!w&&!K)return xe("upsertCard requires --card-id <id> or --all");let S=await f(),F=K?(await S.readAllCards()).map(D=>D.id):[w];for(let D of F)if(!await S.readCard(D))return xe(`Card "${D}" not found in board at ${e.value}`);let M=t.kvStorage("card-upsert"),L=!1;for(let D of F){let ee=await S.readCard(D);if(!ee)continue;let ue=Kt(ee),Se=t.hashFn(ue),Ie=await M.read(D),Ee=Ie?.taskConfigHash!==Se;if(!(!Ee&&!y)){if(Ee){let ge=Ie?.blobRef??await S.readCardKey(D)??D;await O({type:"task-upsert",taskName:D,taskConfig:ue,timestamp:je()}),await M.write(D,{blobRef:ge,taskConfigHash:Se,updatedAt:je()}),L=L||D!==Ae;}y&&await O({type:"task-restart",taskName:D,timestamp:je()});}}return L&&await O({type:"task-restart",taskName:Ae,timestamp:je()}),z(),_e()}catch(w){return Oe(w)}},async taskFailed(B){try{let w=B.params?.token;if(!w)return xe("taskFailed requires params.token");let K=B.params?.error??"unknown error",y=wr(w);return y?(await O({type:"task-failed",taskName:y.taskName,error:K,timestamp:je()}),z(),_e()):xe("Invalid callback token")}catch(w){return Oe(w)}},async taskProgress(B){try{let w=B.params?.token;if(!w)return xe("taskProgress requires params.token");let K=(B.body??{}).update??{},y=wr(w);return y?(await O({type:"task-progress",taskName:y.taskName,update:K,timestamp:je()}),z(),_e()):xe("Invalid callback token")}catch(w){return Oe(w)}},async sourceDataFetched(B){try{let w=B.params?.token,K=B.params?.ref;if(!w)return xe("sourceDataFetched requires params.token");if(!K)return xe("sourceDataFetched requires params.ref");let y=Jn(w);if(!y)return xe("Invalid source token");let S=await Q(),F=y.dt||t.genId();y.dt||await S.ingestSourceDataStaged(y.cid,y.d,ct(K),F);let M=wr(y.cbk);return M?(await O({type:"task-progress",taskName:M.taskName,update:{bindTo:y.b,outputFile:y.d,fetchedAt:je(),deliveryToken:F,sourceChecksum:y.cs,rqt:y.rqt},timestamp:je()}),z(),_e()):xe("Invalid callback token embedded in source token")}catch(w){return Oe(w)}},async sourceDataFetchFailure(B){try{let w=B.params?.token,K=B.params?.reason??"unknown";if(!w)return xe("sourceDataFetchFailure requires params.token");let y=Jn(w);if(!y)return xe("Invalid source token");let S=wr(y.cbk);return S?(await O({type:"task-progress",taskName:S.taskName,update:{bindTo:y.b,outputFile:y.d,failure:!0,reason:K,sourceChecksum:y.cs,rqt:y.rqt},timestamp:je()}),z(),_e()):xe("Invalid callback token embedded in source token")}catch(w){return Oe(w)}}}}async function Ca(e,t){return (await e.peekActive()).find(r=>r.id===t)}function zn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=$e(n);if(a.length===1){await o(a[0]);return}await o(Ue({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 Ca(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 ba(e){return {...Qr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function Sa(e){return {...Qr(e),reason:e.reason}}function Qt(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(ba)},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(Sa)}}}function wa(e,t){return e.peekActive().find(r=>r.id===t)}function Yn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=$e(n);if(a.length===1){await o(a[0]);return}await o(Ue({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=wa(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 Xn(){return new Date().toISOString()}function Zn(e){return new TextEncoder().encode(e).byteLength}function va(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function eo(e){function t(r){let n=e.stat?va(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:Zn(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??Xn(),a.size=a.size??Zn(n),a},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let c=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,c);}let a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Xn(),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 to(){function e(o,a){if(!Array.isArray(o))return [];let c=[];for(let l of o){if(!l||typeof l!="object")continue;let u=l;typeof u.stored_name=="string"&&c.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:a||null,chat:u.chat===true});}return c}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,a){let c=t(o);if(a.length===0)return o.files=c,c;let l=new Set(c.map(u=>u.stored_name));for(let u of a)l.has(u.stored_name)||(c.push(u),l.add(u.stored_name));return o.files=c,c}function n(o,a,c){let l=t(o);if(!Number.isInteger(a)||a<0||a>=l.length)return {ok:false,reason:"index_out_of_range"};let u=l[a];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function ro(e,t={}){let r=t.emitNotification;function n(g){let f=typeof g=="number"?g:Number(g);return Number.isInteger(f)&&f>0?f:null}function o(g,f){let s=f;for(let d=g.length-1;d>=0;d-=1)if(g[d]?.role==="user"&&(s-=1,s===0))return g.slice(d);return g}function a(g){return g.some(f=>typeof f?.turn=="string"&&f.turn!=="")}function c(g,f){if(f<=0)return [];if(!a(g))return o(g,f);let s=new Map,d=[];for(let p of g){let R=typeof p?.turn=="string"?p.turn:"";s.has(R)||(s.set(R,[]),d.push(R)),s.get(R).push(p);}return d.slice(Math.max(0,d.length-f)).flatMap(p=>s.get(p)??[])}function l(g){return {status:"success",data:g}}function u(g){return {status:"fail",error:g}}function k(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}function h(g){return {role:String(g.role||"system"),text:String(g.text||""),files:Array.isArray(g.files)?g.files:[],...typeof g.turn=="string"&&g.turn?{turn:g.turn}:{}}}async function C(g){if(!r||g.length===0)return;let f=$e(g);if(f.length===1){await r(f[0]);return}await r(Ue({kind:"notification-batch",notifications:f}));}async function b(g){let f=await e.readAll(g);return c(f,1).map(h)}async function P(g){let f=Date.now();return {kind:"card_chats",cardId:g,sentAt:new Date(f).toISOString(),sentAtMs:f,messages:await b(g),receiving:true,processing:await e.isProcessing(g)}}async function _(g,f="command envelope"){let s=typeof g.cardId=="string"?g.cardId:void 0;if(!g.command)return u(`chat-store: ${f} missing "command"`);if(!s)return u(`chat-store: ${f} missing "cardId"`);if(g.command==="append")return await x.append({params:{cardId:s},body:{role:g.role,text:g.text,files:g.files,turn:g.turn}});if(g.command==="read-all")return await x.readAll({params:{cardId:s},body:{lastUserTurns:g.lastUserTurns,tailTurns:g.tailTurns,turnId:g.turnId,allTurns:g.allTurns,tailTurnsBeforeId:g.tailTurnsBeforeId}});if(g.command==="read-after")return await x.readAfter({params:{cardId:s},body:{cursor:g.cursor??null}});if(g.command==="clear")return await x.clear({params:{cardId:s}});if(g.command==="set-processing")return await x.setProcessing({params:{cardId:s},body:{active:g.active}});if(g.command==="is-processing")return await x.isProcessing({params:{cardId:s}});if(g.command==="get-config")return await x.getConfig({params:{cardId:s}});if(g.command==="set-config"){let{command:d,cardId:m,...p}=g;return await x.setConfig({params:{cardId:s},body:p})}return u(`chat-store: unknown command "${String(g.command)}"`)}async function A(g){if(!Array.isArray(g.commands)||g.commands.length===0)return u('chat-store: command envelope must include a non-empty "commands" array');let f=[];for(let s=0;s<g.commands.length;s+=1){let d=g.commands[s];if(!d||typeof d!="object"||Array.isArray(d))return u(`chat-store: command envelope entry ${s} must be an object`);let m={cardId:g.cardId,...d},p=await _(m,`command envelope entry ${s}`);if(p.status!=="success")return p;f.push({index:s,command:String(m.command),data:p.data});}return l({results:f})}let x={async append(g){try{let f=g.params?.cardId;if(!f)return u("append requires params.cardId");let s=g.body??{},d=typeof s.role=="string"?s.role:"",m=typeof s.text=="string"?s.text:"",p=Array.isArray(s.files)?s.files:[],R=typeof s.turn=="string"?s.turn:"";if(!d)return u("append requires body.role");let T=await e.append(f,d,m,p,R);return await C([{kind:"chat_messages",cardId:f,messages:await b(f)}]),l({id:T})}catch(f){return k(f)}},async readAll(g){try{let f=g.params?.cardId;if(!f)return u("readAll requires params.cardId");let s=g.body??{},d=typeof s.turnId=="string"?s.turnId:"",m=s.allTurns===!0,p=typeof s.tailTurnsBeforeId=="string"?s.tailTurnsBeforeId:"",R=s.tailTurns===void 0?s.lastUserTurns:s.tailTurns,T=R===void 0?m||d?void 0:1:n(R);if(R!==void 0&&T===null)return u("readAll requires body.tailTurns (positive integer)");let O=await e.readAll(f),N=O.filter($=>!d||String($.turn||"")===d);if(p){let $=T;if(typeof $!="number"||!Number.isInteger($)||$<=0)return u("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let Q=new Map,oe=[];for(let re of O){let G=String(re.turn||"");Q.has(G)||(Q.set(G,[]),oe.push(G)),Q.get(G).push(re);}let pe=oe.findIndex(re=>re===p),Z=Math.max(0,pe-$);return N=(pe===-1?[]:oe.slice(Z,pe)).flatMap(re=>Q.get(re)??[]),l({records:N})}return l(typeof T=="number"?{records:c(N,T)}:{records:N})}catch(f){return k(f)}},async buildSseOneShotBatch(g){try{let f=g.params?.cardId;if(!f)return u("buildSseOneShotBatch requires params.cardId");let s=g.body??{},d=typeof s.receiving=="boolean"?s.receiving:!0,m=await P(f);return l(Ue({kind:"notification-batch",notifications:[{...m,receiving:d}]}))}catch(f){return k(f)}},async readAfter(g){try{let f=g.params?.cardId;if(!f)return u("readAfter requires params.cardId");let d=(g.body??{}).cursor??null;return l(await e.readAfter(f,d))}catch(f){return k(f)}},async clear(g){try{let f=g.params?.cardId;return f?(await e.clear(f),l({ok:!0})):u("clear requires params.cardId")}catch(f){return k(f)}},async setProcessing(g){try{let f=g.params?.cardId;if(!f)return u("setProcessing requires params.cardId");let s=g.body??{};return typeof s.active!="boolean"?u("setProcessing requires body.active (boolean)"):(await e.setProcessing(f,s.active),await C([{kind:"chat_processing",cardId:f,active:s.active,sentAtMs:Date.now()}]),l({ok:!0}))}catch(f){return k(f)}},async isProcessing(g){try{let f=g.params?.cardId;return f?l({active:await e.isProcessing(f)}):u("isProcessing requires params.cardId")}catch(f){return k(f)}},async getConfig(g){try{let f=g.params?.cardId;return f?l({config:await e.getConfig(f)}):u("getConfig requires params.cardId")}catch(f){return k(f)}},async setConfig(g){try{let f=g.params?.cardId;if(!f)return u("setConfig requires params.cardId");let s=g.body??{};return await e.setConfig(f,s),l({ok:!0})}catch(f){return k(f)}},run:_,runBatch:A};return x}function Et(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function no(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(Et):[]:Et(e)?[e]:[]}function oo(e,t,r){let n=0;return {accepted:e.filter(a=>{if(!Et(a))return n++,false;let c=a;return typeof c.sentAtMs=="number"&&t-c.sentAtMs>r?(n++,false):true}),rejected:n}}function so(){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 Aa(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function ao(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 io(e,t){if(Aa(t)){for(let r of t.notifications)Et(r)&&ao(e,r);return}Et(t)&&ao(e,t);}function Gr(e){let t=new Map,r=0;function n(f){let s=JSON.stringify(f);return r++,`id: ${r}
|
|
2
2
|
data: ${s}
|
|
3
3
|
|
|
4
|
-
`}function o(l){let s=l;try{s.flushHeaders?.();}catch{}try{s.flush?.();}catch{}try{s.socket?.setNoDelay?.(!0);}catch{}try{s.socket?.uncork?.();}catch{}}function a(l,s){let c=t.get(l);if(c&&!(s&&c.res!==s)){t.delete(l);try{e.onSseClientDisconnected?.(l);}catch{}try{c.res.end();}catch{}}}function d(l,s,c){let m=t.get(l);m&&a(l,m.res),t.set(l,{res:s,subscribedChatCardIds:c?.subscribedChatCardIds??new Set,subscribedChannelNames:c?.subscribedChannelNames??new Set,subscribedCardChannels:c?.subscribedCardChannels??new Map});}function f(l,s){let c=t.get(l);if(!c)return;let m=n(s);try{c.res.write(m),o(c.res);}catch{a(l,c.res);}}function u(l){return Ue({kind:"notification-batch",notifications:l})}async function k(l,s){let c=await e.buildChatOneShotBatch(l,s);return c.status==="success"?c.data:u([])}async function R(l,s){let c=t.get(l);return c?(c.subscribedChatCardIds.add(s),f(l,await k(s,true)),true):false}function C(l,s){let c=t.get(l);return c?(c.subscribedChatCardIds.delete(s),true):false}function b(l,s,c){let m=t.get(l);if(!m)return false;if(c){let p=m.subscribedCardChannels.get(c)??new Set;return p.add(s),m.subscribedCardChannels.set(c,p),true}return m.subscribedChannelNames.add(s),true}function P(l,s,c){let m=t.get(l);if(!m)return false;if(c){let p=m.subscribedCardChannels.get(c);return p&&(p.delete(s),p.size===0&&m.subscribedCardChannels.delete(c)),true}return m.subscribedChannelNames.delete(s),true}function _(l){return l.kind==="card_chats"||l.kind==="chat_messages"||l.kind==="chat_processing"}function A(l){return l.kind==="card_watchparty"}function x(l,s,c){return l.subscribedChannelNames.has(s)?true:!!l.subscribedCardChannels.get(c)?.has(s)}function g(l){if(!l||l.length===0)return;let s=[],c=new Map,m=new Map;for(let p of l)if(A(p)){let h=`${p.cardId}\0${p.channel}`,T=m.get(h)??[];T.push(p),m.set(h,T);}else if(_(p)){let h=c.get(p.cardId)??[];h.push(p),c.set(p.cardId,h);}else s.push(p);if(s.length>0){let p=u(s);for(let h of t.keys())f(h,p);}for(let[p,h]of c.entries()){let T=u(h);for(let[O,N]of t.entries())N.subscribedChatCardIds.has(p)&&f(O,T);}for(let[p,h]of m.entries()){let T=p.indexOf("\0"),O=T>=0?p.slice(0,T):"",N=T>=0?p.slice(T+1):p,$=u(h);for(let[J,oe]of t.entries())!O||!N||x(oe,N,O)&&f(J,$);}}return {size:()=>t.size,has:l=>t.has(l),get:l=>t.get(l),buildFrame:n,flushTransport:o,register:d,disconnect:a,writeFrame:f,subscribeChat:R,unsubscribeChat:C,subscribeChannel:b,unsubscribeChannel:P,broadcastNotificationBatch:g}}function Wr(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 zr(e,t){return Wr(await e,t)}function Yr(e){let t=le(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool requires a card private key with at least two identifier segments (e.g. chat.foundry_thread_id)"),{statusCode:400});return t}function Xr(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function io(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:a,getMcpFacade:d,getMcpCardStoreFacade:f}=e;function u(s){let c=le(s,"board_id");if(!c)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(c!==t)throw Object.assign(new Error(`Unknown board_id: ${c}`),{statusCode:400})}function k(s){let c=le(s,"client_id");if(!c)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return c}function R(s){u(s);let c=k(s),m=le(s,"channel_name"),p=le(s,"card_id")||void 0;if(!m)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:c,channelName:m,...p?{cardId:p}:{}}}function C(s){u(s);let c=le(s,"card_id");if(!c)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:c}}async function b(s){await r();let{cardId:c}=C(s),m=k(s);if(!await n.subscribeChat(m,c))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:c,clientId:m,subscribed:true}}}async function P(s){await r();let{cardId:c}=C(s),m=k(s);if(!n.unsubscribeChat(m,c))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:c,clientId:m,subscribed:false}}}async function _(s,c){await r();let{clientId:m,channelName:p,cardId:h}=R(s);if(!n.has(m))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return c?(n.subscribeChannel(m,p,h),o?.(m,p,h?{cardId:h}:{})):(n.unsubscribeChannel(m,p,h),a?.(m,p,h?{cardId:h}:{})),{status:"success",data:{boardId:t,clientId:m,channelName:p,subscribed:c,...h?{cardId:h}:{}}}}async function A(s,c){let{cardId:m}=C(s);return await d().setChatProcessing({cardId:m,active:c}),{status:"success",data:{boardId:t,cardId:m,active:c}}}async function x(s){let{cardId:c}=C(s),m=await d().getChatProcessing({cardId:c});return {status:"success",data:{boardId:t,cardId:c,active:m.active}}}async function g(s){let{cardId:c}=C(s),m=Yr(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 p=await zr(f().get({params:{id:c}}),"cardStore.get"),h=Array.isArray(p.cards)&&p.cards.length>0&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null,T=h?Xr(h,"visible_controlplane_only").value:void 0;if(s.value!==T)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:c,key:m}}}return Wr(await f().patch({params:{id:c,path:`__private.${m}`},body:{value:s.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:c,key:m}}}async function l(s){let{cardId:c}=C(s),m=Yr(s),p=await zr(f().get({params:{id:c}}),"cardStore.get"),h=Array.isArray(p.cards)&&p.cards.length>0&&p.cards[0]&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null;if(!h)throw Object.assign(new Error(`Card "${c}" not found`),{statusCode:404});let T=Xr(h,m);return {status:"success",data:{boardId:t,cardId:c,key:m,exists:T.exists,value:T.value}}}return {requireCardArgs:C,subscribeChat:b,unsubscribeChat:P,watchChannel:_,setChatProcessing:A,getChatProcessing:x,setCardMeta:g,getCardMeta:l}}function uo(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e,a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1;function d(P){return {role:String(P.role||"system"),text:String(P.text||""),files:Array.isArray(P.files)?P.files:[],...typeof P.turn=="string"&&P.turn?{turn:P.turn}:{}}}function f(P){if(P.length===0)return null;if(P.length===1)return P[0];let _=[],A=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],x={};for(let l of A)x[l]=0;for(let l of P){let s=l,c=Array.isArray(s.cards)?s.cards:[];_.push(...c);for(let m of A)x[m]+=Number(s?.summary?.[m]||0);}let g=P[0];return {...g,cards:_,summary:{...g.summary||{},card_count:_.length,...x}}}async function u(){let P=[];for(let _ of r)try{let A=await _.boardOps.buildSseOneShotPayload({});A.status==="success"&&A.data&&P.push(A.data);}catch{}return P}async function k(){let _=(await u()).map(A=>A.statusSnapshot).filter(Boolean);if(_.length===0){let A=r.map(x=>x.notification.status).filter(Boolean);return f(A)}return f(_)}async function R(){let P={},_=await u();for(let A of _)Object.assign(P,A.cardRuntimeById||{});if(Object.keys(P).length>0)return P;for(let A of r)for(let[x,g]of Object.entries(A.notification.computedValues)){let l=A.notification.cards[x];P[x]={schema_version:"v1",card_id:x,card_data:l?.card_data??{},computed_values:g??{}};}return P}async function C(){let P={},_=await u();for(let A of _)Object.assign(P,A.dataObjectsByToken||{});if(Object.keys(P).length===0)for(let A of r)Object.assign(P,A.notification.dataObjects||{});return P}async function b(){let P=await u(),_=P.flatMap(l=>Array.isArray(l.cardDefinitions)?l.cardDefinitions:[]),A={},x={};for(let l of P)Object.assign(A,l.dataObjectsByToken||{}),Object.assign(x,l.cardRuntimeById||{});let g={};for(let l of _){if(!l?.id)continue;let s=l.id;try{let c=await n(s,{tailTurns:a}),m=await o(s);(c.length>0||m)&&(g[s]={messages:c.map(p=>d(p)),receiving:!1,processing:m});}catch{}}return {boardId:t,cardDefinitions:_,statusSnapshot:await k(),dataObjectsByToken:A,cardRuntimeById:x,cardChatsByCardId:g}}return {readStatusSnapshot:k,readCardRuntimeArtifacts:R,readDataObjectsByToken:C,buildPublishedRuntimePayload:b}}function Sa(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function co(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:a,writeChatRecord:d}=e;async function f(C){let b=[];try{let P=await o(C);if(!P)return b;let _=n().read(P.card_data&&typeof P.card_data=="object"?P.card_data:null);for(let A of _)b.push(String(A.stored_name??""));}catch{}return b}async function u(C,b,P,_,A){let x=t(C),g=r(C),l=Sa(b),s=typeof A=="number"?A:(await f(C)).length,m=`${String(s+1).padStart(3,"0")}-${l}`.slice(-36);if(!g.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${C}`),{statusCode:500});return await g.files.putBytes(`${x}/${m}`,new Uint8Array(_),P||"application/octet-stream"),{name:l,stored_name:m,size:_.length,mime_type:P||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function k(C,b,P,_,A){if(!_.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let x=A?.inChat===true,g=await u(C,b,P,_),l=null;if(await a(C,s=>{let c=new Date().toISOString(),m=s.card_data&&typeof s.card_data=="object"?s.card_data:{};s.card_data=m;let p=n().normalizeIncoming([{name:g.name,stored_name:g.stored_name,size:g.size,mime_type:g.mime_type,uploaded_at:g.uploaded_at||c,chat:x}],c);return l=n().merge(m,p).findIndex(T=>T.stored_name===g.stored_name),s}),x&&A?.suppressChatRecordWrite!==true){let s=typeof l=="number"&&l>=0?` #${l}`:"";await d(C,"system",`file uploaded: ${g.name} as ${g.stored_name}${s}`,[],A?.turnId??"");}return {ok:true,file:{...g,...typeof l=="number"&&l>=0?{file_idx:l}:{},chat:x},...typeof l=="number"&&l>=0?{file_idx:l}:{}}}async function R(C,b,P){if(!Array.isArray(b)||b.length===0)throw Object.assign(new Error("uploadCardFilesMultiple requires at least one file"),{statusCode:400});for(let c of b)if(!c.buffer.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let A=(await f(C)).length,x=[];for(let c of b){let m=await u(C,c.requestedName,c.contentType,c.buffer,A);x.push(m),A+=1;}let g=typeof P?.message=="string"?P.message:"",l=[],s={};return await a(C,c=>{let m=new Date().toISOString(),p=c.card_data&&typeof c.card_data=="object"?c.card_data:{};c.card_data=p;let h=n().normalizeIncoming(x.map(N=>({name:N.name,stored_name:N.stored_name,size:N.size,mime_type:N.mime_type,uploaded_at:N.uploaded_at||m,chat:false})),m),T=n().merge(p,h);l.length=0;for(let N of x)l.push(T.findIndex($=>$.stored_name===N.stored_name));let O=Array.isArray(p.filegroups)?p.filegroups:[];return s={message:g,file_idxs:l.slice(),created_at:m},O.push(s),p.filegroups=O,c}),{ok:true,files:x.map((c,m)=>({...c,file_idx:l[m],chat:false})),file_idxs:l.slice(),filegroup:s}}return {uploadCardFile:k,uploadCardFilesMultiple:R,readCardStoredFileNames:f}}function lo(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:le(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=dt(t,"tail_turns"),n=dt(t,"tail"),o=le(t,"turn_id"),a=t.all_turns===true,d=le(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:le(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...a?{allTurns:true}:{},...d?{tailTurnsBeforeId:d}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:le(t,"card_id"),fileIdx:Number(dt(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockRequires:pt(t,"mock_requires","mock_requires"),mockFetchedSources:pt(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockProjections:lt(t,"mock_projections"),sourceIdx:Wt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockProjections:lt(t,"mock_projections"),sourceIdx:Wt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:le(t,"card_id"),sourceIdx:Wt(t,"source_idx","source_idx"),mockRequires:pt(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockRequires:lt(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:le(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=le(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:le(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"stage-ai-failure-message":t=>{let r=le(t,"turn_id"),n=le(t,"failure");if(!r)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty turn_id"),{statusCode:400});if(!n)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty failure"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:le(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:le(t,"card_id"),candidateCardContent:lt(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:le(t,"card_id")})}}function fo(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:le(t,"token"),ref:le(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:le(t,"token"),reason:le(t,"reason")})}}function mo(e){let{boardId:t,uploadCardFile:r,uploadCardFilesMultiple:n,getMcpFacade:o,controlplane:a}=e;function d(u,k){let R=le(u,"board_id");if(!R)throw Object.assign(new Error(`${k} requires board_id`),{statusCode:400});if(R!==t)throw Object.assign(new Error(`Unknown board_id: ${R}`),{statusCode:400})}function f(u,k){let{cardId:R}=a.requireCardArgs(u),C=le(u,"turn_id");return d(u,k),o().manageAddChatAttachment({cardId:R,role:le(u,"role")||"user",...C?{turn:C}:{},files:[{file_name:le(u,"file_name"),content_type:le(u,"content_type")||"application/octet-stream",...typeof u.text=="string"?{text:u.text}:{},...typeof u.base64=="string"?{base64:u.base64}:{},...Array.isArray(u.bytes)?{bytes:u.bytes}:{}}]})}return {"list-runtime-cards":u=>(d(u,"list-runtime-cards"),o().listRuntimeCards()),"sse.subscribe-chat":u=>a.subscribeChat(u),"sse.unsubscribe-chat":u=>a.unsubscribeChat(u),"sse.watch-channel":u=>a.watchChannel(u,true),"sse.unwatch-channel":u=>a.watchChannel(u,false),"getstate.is-chat-processing":u=>a.getChatProcessing(u),"setstate.chat-processing-started":u=>a.setChatProcessing(u,true),"setstate.chat-processing-done":u=>a.setChatProcessing(u,false),"getstate.card-private":u=>a.getCardMeta(u),"setstate.card-private":u=>a.setCardMeta(u),"manage.upload-card-file":u=>{let k=le(u,"card_id"),R=le(u,"file_name"),C=le(u,"content_type")||"application/octet-stream",b=Pr(u);if(d(u,"manage.upload-card-file"),!k)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!R)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(k,R,C,b,{inChat:false})},"manage.upload-card-file-multiple":u=>{let k=le(u,"card_id"),R=le(u,"message"),C=Array.isArray(u.files)?u.files:[];if(d(u,"manage.upload-card-file-multiple"),!k)throw Object.assign(new Error("manage.upload-card-file-multiple requires card_id"),{statusCode:400});if(C.length===0)throw Object.assign(new Error("manage.upload-card-file-multiple requires a non-empty files array"),{statusCode:400});let b=C.map((P,_)=>{let A=P&&typeof P=="object"?P:{},x=le(A,"file_name");if(!x)throw Object.assign(new Error(`manage.upload-card-file-multiple files[${_}] requires file_name`),{statusCode:400});let g=Pr(A);if(!g)throw Object.assign(new Error(`manage.upload-card-file-multiple files[${_}] requires bytes, text, or base64`),{statusCode:400});return {requestedName:x,contentType:le(A,"content_type")||"application/octet-stream",buffer:g}});return n(k,b,R?{message:R}:void 0)},"manage.add-chat-attachment":u=>f(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>f(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:k}=a.requireCardArgs(u),R=le(u,"role")||"user",C=le(u,"turn_id");return d(u,"manage.add-chat-entry-and-any-attachments"),o().manageAddChatEntryAndAnyAttachments({cardId:k,role:R,...typeof u.text=="string"?{text:u.text}:{},...C?{turn:C}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:k}=a.requireCardArgs(u);return d(u,"manage.patch-card"),o().managePatchCard({cardId:k,patch:lt(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:k}=a.requireCardArgs(u);return d(u,"manage.upsert-card"),o().manageUpsertCard({cardId:k,candidateCardContent:lt(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:k}=a.requireCardArgs(u);return d(u,"manage.remove-card"),o().manageRemoveCard({cardId:k},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:k}=a.requireCardArgs(u);return {status:"success",data:{cards:await o().adminReadCard({cardId:k})}}},"manage.admin-upsert-card":u=>{let k=le(u,"board_id"),R=le(u,"card_id");if(!k)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!R)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(k!==t)throw Object.assign(new Error(`Unknown board_id: ${k}`),{statusCode:400});return o().adminUpsertCard({cardId:R,candidateCardContent:lt(u,"candidate_card_content")})}}}function at(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function po(e,t){if(e?.status==="success"&&Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw e?.status==="success"?new Error(`${t} returned success without data`):e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function W(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function qe(e){return Array.isArray(e)?e:[]}function en(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 Zr(e,t){let r=W(e.view);return {elements:qe(r.elements).map((o,a)=>{let d=W(o),f=W(d.data),u=W(d.spec),k=typeof d.visible=="string"?!!en(t,d.visible):true,R=typeof f.bind=="string"?f.bind:void 0,C=typeof u.maxRows=="number"?u.maxRows:typeof f.maxRows=="number"?f.maxRows:void 0,b=R?en(t,R):void 0,P={id:typeof d.id=="string"&&d.id?d.id:`element-${a}`,kind:d.kind,label:d.label,visible:k};return b!==void 0&&(P.resolved=Array.isArray(b)&&typeof C=="number"?b.slice(0,C):b),P})}}function go(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=qe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],a={};for(let d of o){let f=W(d),u=typeof f.bindTo=="string"?f.bindTo:"",k=typeof f.ref=="string"?f.ref:"";if(!u||!k)continue;let R=en(t,k);R!==void 0&&(a[u]=R);}return a}function wa(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 va(e){return {"card-content":e}}function Sr(e){let t={...e};return delete t.__private,t}function Aa(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function xa(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function Ta(e,t){let r=xa(e);if(!t||Object.keys(t).length===0)return r;function n(o,a,d){let f=String(a||"").split(".").filter(Boolean);if(!f.length)return;let u=o;for(let k=0;k<f.length-1;k+=1){let R=f[k];(!u[R]||typeof u[R]!="object")&&(u[R]={}),u=u[R];}u[f[f.length-1]]=d;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,a=W(r.view),d=qe(a.elements);for(let f of d){let u=W(f),k=W(u.data),R=typeof u.writeTo=="string"&&u.writeTo?u.writeTo:typeof k.writeTo=="string"?k.writeTo:"";if(R){o=R;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 wr(e){return W(e.__private).visible_controlplane_only===true}async function Bt(e,t){let r=await Ye(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function yo(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:a,sourceFetchDone:d,sourceFetchFailed:f,uploadCardFile:u,buildFileDownloadUrl:k,readFetchedSourceJsonByRef:R}=e;function C(y,S){if(typeof y=="function")return y;throw new Error(`${S} is not configured for this MCP facade`)}async function b(){let y=await Ye(n.get({}),"cardStore.get");return Array.isArray(y.cards)?y.cards.map(S=>W(S)).filter(S=>!wr(S)):[]}function P(y){if(Array.isArray(y.bytes))return new Uint8Array(y.bytes.map(S=>Math.max(0,Math.min(255,Number(S)||0))));if(typeof y.text=="string")return new TextEncoder().encode(y.text);if(typeof y.base64=="string"){let S=String(y.base64).replace(/-/g,"+").replace(/_/g,"/"),F=S+"=".repeat((4-S.length%4)%4),M=atob(F);return Uint8Array.from(M,L=>L.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function _(){let y=W(await Ye(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:y.version,commonSourceFields:W(y.commonSourceDefFields),sourceKinds:W(y.sourceKinds)}}async function A(){let y=W(await Ye(t.status({}),"status")),S=W(y.summary),F=qe(y.cards),M=await Ye(n.get({}),"cardStore.get"),L=new Set((Array.isArray(M.cards)?M.cards.map(W):[]).filter(wr).map(ee=>typeof ee.id=="string"?ee.id:"").filter(Boolean)),D=F.filter(ee=>!L.has(String(W(ee).name??"")));return {meta:W(y.meta),summary:{card_count:typeof S.card_count=="number"?S.card_count:0,completed:typeof S.completed=="number"?S.completed:0,eligible:typeof S.eligible=="number"?S.eligible:0,pending:typeof S.pending=="number"?S.pending:0,blocked:typeof S.blocked=="number"?S.blocked:0,in_progress:typeof S.in_progress=="number"?S.in_progress:0,failed:typeof S.failed=="number"?S.failed:0,unresolved:typeof S.unresolved=="number"?S.unresolved:0},cards:D.map(ee=>{let ue=W(ee);return {"card-id":typeof ue.name=="string"?ue.name:null,status:ue.status??null,error:ue.error??null,requires:qe(ue.requires),requires_satisfied:qe(ue.requires_satisfied),requires_missing:qe(ue.requires_missing),provides_declared:qe(ue.provides_declared),provides_runtime:qe(ue.provides_runtime)}})}}async function x(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let F=W(await Ye(t.status({}),"status")),L=qe(F.cards).map(W).find(Re=>Re.name===S);if(!L)throw new Error(`card "${S}" not found in board status`);let D=W(await Bt(n,S)),ee=Sr(D),ue=qe(L.requires_satisfied).filter(Re=>typeof Re=="string"&&!!Re),Se=qe(L.provides_runtime).filter(Re=>typeof Re=="string"&&!!Re),Ie=Object.fromEntries(await Promise.all(ue.map(async Re=>[Re,await Ye(t.getOutputsDataObject({params:{key:Re}}),`getOutputsDataObject(${Re})`)]))),Ee=Object.fromEntries(await Promise.all(Se.map(async Re=>[Re,await Ye(t.getOutputsDataObject({params:{key:Re}}),`getOutputsDataObject(${Re})`)]))),ge=W(await Ye(t.getOutputsComputedValues({params:{key:S}}),"getOutputsComputedValues")),ke=await Ye(t.getOutputsFetchedSources({params:{key:S}}),"getOutputsFetchedSources"),Ve=qe(D.source_defs).map(W),we={};for(let Re of Ve)typeof Re.bindTo=="string"&&typeof Re.outputFile=="string"&&(we[Re.outputFile]=Re.bindTo);let Ke={};for(let[Re,et]of Object.entries(ke)){let Qe=we[Re]??Re;if(!R||typeof et!="string"){Ke[Qe]=null;continue}try{Ke[Qe]=R({cardId:S,ref:et});}catch{Ke[Qe]=null;}}let Ne={card_data:W(D.card_data),requires:Ie,fetched_sources:Ke,computed_values:ge};return {cardId:S,card_status_in_board:L,card_definition_and_static_data:ee,refs_for_fetched_source_files:ke,runtime_data:{requires:Ie,provides:Ee,computed_values:ge,rendered_view:Zr(D,Ne)}}}async function g(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("inspectChatMessagesOnCards requires cardId");let F=typeof y.turnId=="string"?y.turnId:"",M=y.allTurns===true,L=typeof y.tailTurnsBeforeId=="string"?y.tailTurnsBeforeId:"",D=M?void 0:y.lastUserTurns??(F?void 0:1),ee=y.tail,ue={...D===void 0?{}:{tailTurns:D},...F?{turnId:F}:{},...M?{allTurns:true}:{},...L?{tailTurnsBeforeId:L}:{}},Se=Object.keys(ue).length>0?{params:{cardId:S},body:ue}:{params:{cardId:S}},Ie=at(await o.readAll(Se),"chatStore.readAll"),Ee=W(await Bt(n,S)),ge=qe(W(Ee.card_data).files).map((we,Ke)=>({idx:Ke,stored_name:W(we).stored_name})).filter(we=>typeof we.stored_name=="string"&&we.stored_name.length>0),Ve=(Array.isArray(Ie.records)?Ie.records:[]).map(we=>{let Ne=W(we.payload),Re={...we},et=typeof we?.role=="string"?we.role:typeof Ne.role=="string"?String(Ne.role):"",Qe=typeof we?.text=="string"?we.text:typeof Ne.text=="string"?String(Ne.text):"";if(et==="system"){let tt=wa(Qe);if(tt!==null&&ge.some(j=>j.idx===tt)){let j=`Retrieve using inspect-file-contents --card-id ${S} --file-idx ${tt}`;Re.retrieval_hint=j,Object.keys(Ne).length>0&&typeof we.role!="string"&&(Re.payload={...Ne,retrieval_hint:j});}}return Re});return {cardId:S,messages:typeof ee=="number"&&ee>=0?Ve.slice(-ee):Ve}}async function l(y){let S=String(y.cardId||"").trim(),F=Number(y.fileIdx);if(!S)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=W(await Bt(n,S)),L=qe(W(M.card_data).files).map(W);if(F>=L.length)throw new Error(`attachment index ${F} is out of range for card "${S}"`);let D=L[F],ee=typeof D.stored_name=="string"?D.stored_name:null;return {cardId:S,fileIdx:F,downloadUrl:k({cardId:S,fileIdx:F,storedName:ee}),...typeof D.name=="string"?{name:D.name}:{},...typeof D.stored_name=="string"?{stored_name:D.stored_name}:{},...typeof D.mime_type=="string"?{mime_type:D.mime_type}:{},...typeof D.size=="number"?{size:D.size}:{},...typeof D.uploaded_at=="string"?{uploaded_at:D.uploaded_at}:{}}}async function s(y){return await r.validateCardPreflight({body:va(y.candidateCardContent)})}function c(y){if(!y.mockRequires||typeof y.mockRequires!="object"||Array.isArray(y.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!y.mockFetchedSources||typeof y.mockFetchedSources!="object"||Array.isArray(y.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let S=r.evalCardCompute({body:{"card-content":y.candidateCardContent,"mock-requires":y.mockRequires,"mock-fetched-sources":y.mockFetchedSources}});if(S.status!=="success")return S;let F=W(po(S,"evalCardCompute")),M=W(y.candidateCardContent),L={card_data:W(M.card_data),requires:W(y.mockRequires),fetched_sources:W(y.mockFetchedSources),computed_values:W(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:W(F.computed_values),errors:qe(F.errors).map(D=>{let ee=W(D);return {bindTo:typeof ee.bindTo=="string"?ee.bindTo:"",error:typeof ee.error=="string"?ee.error:""}}),provides_outputs:go(M,L),rendered_view:Zr(M,L)}}}async function m(y){return await r.probeSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":y.candidateCardContent,"mock-projections":y.mockProjections}})}async function p(y){return await r.runSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":y.candidateCardContent,"mock-projections":y.mockProjections}})}async function h(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!y.mockRequires||typeof y.mockRequires!="object"||Array.isArray(y.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let F=W(await Bt(n,S)),M=qe(F.source_defs).filter(D=>!!D&&typeof D=="object"&&!Array.isArray(D)),L={};if(y.sourceIdx>=0&&y.sourceIdx<M.length){let D=M[y.sourceIdx],ee=ze.enrichSourcesSync([D],{card_data:W(F.card_data),requires:y.mockRequires});Array.isArray(ee)&&ee.length>0&&(L=W(ee[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":F,"mock-requires":y.mockRequires,"mock-projections":L}})}async function T(y){let S=W(await Ye(r.simulateCardCycle({body:{"card-content":y.candidateCardContent,"mock-requires":y.mockRequires}}),"simulateCardCycle")),F=W(y.candidateCardContent),M=W(S.validation),L=qe(S.source_probes),D=qe(S.projection_errors),ee=W(S.fetched_sources),ue=qe(S.compute_errors),Se=W(S.computed_values),Ie={card_data:W(F.card_data),requires:y.mockRequires,fetched_sources:ee,computed_values:Se},Ee=[];for(let ge of qe(M.issues))typeof ge=="string"&&ge&&Ee.push(ge);for(let ge of L){let ke=W(ge),Ve=typeof ke.bindTo=="string"?ke.bindTo:"source",we=typeof ke.error=="string"?ke.error:"";we&&Ee.push(`${Ve}: ${we}`);}for(let ge of D){let ke=W(ge),Ve=typeof ke.bindTo=="string"?ke.bindTo:"source",we=typeof ke.key=="string"?ke.key:"projection",Ke=typeof ke.error=="string"?ke.error:"projection failed";Ee.push(`${Ve}.${we}: ${Ke}`);}for(let ge of ue){let ke=W(ge),Ve=typeof ke.bindTo=="string"?ke.bindTo:"compute",we=typeof ke.error=="string"?ke.error:"compute failed";Ee.push(`${Ve}: ${we}`);}return {status:"success",data:{cardId:typeof S.cardId=="string"?S.cardId:"(unknown)",ok:S.ok===true,issues:Ee,provides_outputs:go(F,Ie),rendered_view:Zr(F,Ie)}}}async function O(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("manageReadCard requires cardId");let F=await Ye(n.get({params:{id:S}}),"cardStore.get");return (Array.isArray(F.cards)?F.cards.map(W):[]).map(L=>Sr(L))}async function N(y){let S=await Promise.all(qe(y.files).map(async F=>{let M=W(F),L=String(M.file_name??M.fileName??M.name??"").trim(),D=String(M.content_type??M.contentType??"application/octet-stream");if(!L)throw new Error("file entry requires file_name");return await u({cardId:y.cardId,fileName:L,contentType:D,bytes:P(M),suppressChatRecordWrite:true})}));for(let[F,M]of S.entries()){let L=W(M.file),D=typeof M.file_idx=="number"&&Number.isInteger(M.file_idx)&&M.file_idx>=0?M.file_idx:F,ee=y.role==="assistant"?`AI generated: ${String(L.name||"")} as ${String(L.stored_name||"")} #${D}`:`file uploaded: ${String(L.name||"")} as ${String(L.stored_name||"")} #${D}`;at(await o.append({params:{cardId:y.cardId},body:{role:"system",text:ee,files:[],turn:y.turn}}),"chatStore.append(system attachment message)");}return S.map(F=>F.file)}async function $(y){let S=String(y.cardId||"").trim(),F=String(y.role||"user").trim()||"user",M=typeof y.turn=="string"?y.turn:"";if(!S)throw new Error("manageAddChatAttachment requires cardId");let L=await N({cardId:S,role:F,turn:M,files:y.files});return {status:"success",data:{cardId:S,turn:M,files:L}}}async function J(y){let S=String(y.cardId||"").trim(),F=String(y.role||"").trim(),M=typeof y.text=="string"?y.text:"",L=typeof y.turn=="string"?y.turn:"";if(!S)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!F)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(F==="assistant"&&L){let ue=at(await o.readAll({params:{cardId:S},body:{turnId:L}}),"chatStore.readAll(existing turn messages)"),Se=Array.isArray(ue.records)?ue.records.find(Ie=>Ie.role==="assistant"&&String(Ie.turn||"")===L):void 0;if(Se)return {status:"success",data:{cardId:S,id:String(Se.id),role:F,turn:L,files:Array.isArray(Se.files)?Se.files:[]}}}let D=await N({cardId:S,role:F,turn:L,files:y.files}),ee=at(await o.append({params:{cardId:S},body:{role:F,text:M,files:D,turn:L}}),"chatStore.append");return {status:"success",data:{cardId:S,id:String(ee.id),role:F,turn:L,files:D}}}async function oe(y,S={}){let F=String(y.cardId||"").trim(),M=W(y.patch);if(!F)throw new Error("managePatchCard requires cardId");let L=await O({cardId:F}),D=W(L[0]),ee=Ta(D,M);return pe({cardId:F,candidateCardContent:ee},S)}async function pe(y,S={}){let F=String(y.cardId||"").trim(),M=W(y.candidateCardContent),L=Sr(M);if(!F)throw new Error("manageUpsertCard requires cardId");if(typeof L.id!="string"||!L.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(L.id!==F)throw new Error(`candidateCardContent.id must match cardId (${F})`);let D=null;try{D=await s({candidateCardContent:L});}catch(ge){let ke=ge instanceof Error?ge.message:String(ge);if(!/non-core adapter is not configured/i.test(ke))throw ge;D=null;}if(D!==null){let ge=W(D),ke=W(ge.data);if(ge.status!=="success"||ke.isValid!==true)return {status:"fail",step:"validate",validation:D}}let ee=null;try{ee=await Bt(n,F);}catch{ee=null;}let ue=ee?W(ee):null;if(ue&&wr(ue)&&!S.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404});let Se={...L,...ue&&Aa(ue,"__private")?{__private:ue.__private}:{}},Ie=await n.set({body:Se});at(Ie,"cardStore.set");let Ee;try{Ee=await t.upsertCard({params:{cardId:F,restart:!0}}),at(Ee,"upsertCard");}catch(ge){try{ee&&await n.set({body:ee});}catch{}throw ge}return {status:"success",data:{validation:D,card_saved:null,board_result:Ee}}}async function Z(y,S={}){let F=String(y.cardId||"").trim();if(!F)throw new Error("manageRemoveCard requires cardId");if(!S.allowControlplaneOnlyCards){let D=await Ye(n.get({params:{id:F}}),"cardStore.get");if((Array.isArray(D.cards)?D.cards.map(W):[]).some(wr))throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404})}let M=await t.removeCard({params:{id:F}});at(M,"removeCard");let L=await n.del({params:{id:F}});return at(L,"cardStore.del"),{status:"success",data:{board_result:M,store_result:L}}}async function ae(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("adminReadCard requires cardId");let F=await Ye(n.get({params:{id:S}}),"cardStore.get");return Array.isArray(F.cards)?F.cards.map(M=>W(M)):[]}async function re(y){let S=String(y.cardId||"").trim(),F=W(y.candidateCardContent),M=Sr(F);if(!S)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!==S)throw new Error(`candidateCardContent.id must match cardId (${S})`);let L=await s({candidateCardContent:M}),D=W(L),ee=W(D.data);if(D.status!=="success"||ee.isValid!==true)return {status:"fail",step:"validate",validation:L};let ue=null;try{ue=await Bt(n,S);}catch{ue=null;}let Se=ue?W(W(ue).__private):{},Ie={...M,__private:{...Se,visible_controlplane_only:true}},Ee=await n.set({body:Ie});at(Ee,"cardStore.set");let ge;try{ge=await t.upsertCard({params:{cardId:S,restart:!0}}),at(ge,"upsertCard");}catch(ke){try{ue&&await n.set({body:ue});}catch{}throw ke}return {status:"success",data:{validation:L,card_saved:null,board_result:ge}}}async function G(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("getChatProcessing requires cardId");let F=po(await o.isProcessing({params:{cardId:S}}),"chatStore.isProcessing");return {cardId:S,active:!!F.active}}async function z(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("setChatProcessing requires cardId");if(typeof y.active!="boolean")throw new Error("setChatProcessing requires boolean active");return at(await o.setProcessing({params:{cardId:S},body:{active:y.active}}),"chatStore.setProcessing"),{cardId:S,active:y.active}}async function B(){let y=await C(a,"webhook.process-accumulated")();return y?.status==="fail"||y?.status==="error"?y:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(y??{},"data")?y.data??null:null}}}async function w(y){let S=String(y.token||"").trim(),F=String(y.ref||"").trim();if(!S)throw new Error("webhookSourceFetchDone requires token");if(!F)throw new Error("webhookSourceFetchDone requires ref");let M=await C(d,"webhook.source-fetch-done")({token:S,ref:F});return M?.status==="fail"||M?.status==="error"?M:{status:"success",data:{token:S,ref:F,runtime_result:Object.prototype.hasOwnProperty.call(M??{},"data")?M.data??null:null}}}async function K(y){let S=String(y.token||"").trim(),F=String(y.reason||"").trim();if(!S)throw new Error("webhookSourceFetchFailed requires token");if(!F)throw new Error("webhookSourceFetchFailed requires reason");let M=await C(f,"webhook.source-fetch-failed")({token:S,reason:F});return M?.status==="fail"||M?.status==="error"?M:{status:"success",data:{token:S,reason:F,runtime_result:Object.prototype.hasOwnProperty.call(M??{},"data")?M.data??null:null}}}return {listRuntimeCards:b,discoverSourceKinds:_,inspectBoardRuntimeStatus:A,inspectCardDefinitionAndRuntime:x,inspectChatMessagesOnCards:g,inspectFileContents:l,preflightValidateCandidateCardDefinition:s,preflightMaterializeCandidateCard:c,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:h,preflightRunOneCycleWithCandidateCard:T,manageReadCard:O,manageAddChatAttachment:$,manageAddChatEntryAndAnyAttachments:J,managePatchCard:oe,manageUpsertCard:pe,manageRemoveCard:Z,adminReadCard:ae,adminUpsertCard:re,getChatProcessing:G,setChatProcessing:z,webhookProcessAccumulated:B,webhookSourceFetchDone:w,webhookSourceFetchFailed:K}}async function Ye(e,t){return at(await e,t)}function ho(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:a,readCardRuntimeArtifacts:d,readCardFromStore:f,readCardDefinitions:u,processAccumulatedLaneInternal:k,reportSourceFetched:R,reportSourceFetchFailure:C,uploadCardFile:b,chatStorePublic:P,serverUrl:_,apiBasePath:A}=e;function x(){return t[0]??null}function g(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let p=m?.params?.key;return p?{status:"success",data:(await a())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let p=m?.params?.key;return p?{status:"success",data:(await d())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let p=m?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let h=n(p)??x();return h?h.boardOps.getOutputsFetchedSources({params:{key:p}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let p=m?.params?.id;if(!p)return {status:"fail",error:"removeCard requires params.id"};let h=n(p)??x();return h?h.boardOps.removeCard({params:{id:p}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"upsertCard requires params.cardId"};let h=n(p)??x();if(!h)return {status:"fail",error:"Board context is unavailable"};let T=await h.boardOps.upsertCard({params:{cardId:p,restart:m.params.restart===true}});if(T.status!=="success")return T;if(rt(h.boardAdapter)){let O=await k(true);if(O.status!=="success")return O}return T}}}function l(){let m=()=>{let p=x();if(!p?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return p.nonCore};return {describeTaskExecutorCapabilities(p){return 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 s(){return {async get(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(p){let h=await f(p);return h?{status:"success",data:{cards:[h]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await u()}}},async set(m){let p=m.body;if(p==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let h=Array.isArray(p)?p:[p];for(let T of h){let O=T,N=typeof O.id=="string"?O.id:"";if(!N)return {status:"fail",error:"each card must have a string `id` field"};let $=r.get(N)??0,J=t[$]??x();if(!J)return {status:"fail",error:"Board context is unavailable"};let oe=await J.cardStoreOps.set({body:O});if(oe.status!=="success")return oe;r.set(N,$);}return {status:"success",data:{count:h.length}}},async del(m){let p=[m.params?.id,...m.body?.ids??[]].filter(h=>typeof h=="string"&&!!h);if(p.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let h of p){let T=n(h)??x();if(!T)return {status:"fail",error:"Board context is unavailable"};let O=await T.cardStoreOps.del({params:{id:h}});if(O.status!=="success")return O;r.delete(h);}return {status:"success",data:{count:p.length}}},async patch(m){let p=typeof m.params?.id=="string"?m.params.id:void 0,h=typeof m.params?.path=="string"?m.params.path:void 0;if(!p||!h)return {status:"fail",error:"patch requires params.id and params.path"};let T=n(p)??x();return T?T.cardStoreOps.patch(m):{status:"fail",error:"Board context is unavailable"}},async appendFiles(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(!p)return {status:"fail",error:"appendFiles requires params.id"};let h=n(p)??x();return h?h.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function c(){return yo({board:g(),nonCore:l(),cardStore:s(),chatStore:P,processAccumulated:()=>k(true),sourceFetchDone:({token:m,ref:p})=>R(m,p),sourceFetchFailed:({token:m,reason:p})=>C(m,p),uploadCardFile({cardId:m,fileName:p,contentType:h,bytes:T,suppressChatRecordWrite:O}){return b(m,p,h,T,{inChat:true,...O===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:p,storedName:h}){let T=`${_||""}${A}/cards/${encodeURIComponent(m)}/files/${p}`;return h?`${T}?sn=${encodeURIComponent(h)}`:T},readFetchedSourceJsonByRef({cardId:m,ref:p}){let h=n(m)??x();if(!h||rt(h.boardAdapter))return null;let N=h.boardAdapter.resolveBlob(ct(p)).trim();return N?JSON.parse(N):null}})}return {mcpBoardFacade:g,mcpNonCoreFacade:l,mcpCardStoreFacade:s,createMcpFacade:c}}function Ro(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:a,createMcpToolRegistry:d,resolveCardFileDownloadPayload:f,isLikelyTextMimeType:u,sliceTextByLines:k}=e;async function R(C,b,P){let _=C.method||"GET",A=P,x=A.pathname;try{if(_==="POST"&&x===`${t}/mcp`){await o();let g=await n(C),l=typeof g.tool=="string"?g.tool.trim():"",s=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.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 c=await gt(l,s,d(a()));if(c&&typeof c=="object"&&!Array.isArray(c)){let m=c;if(m.status==="fail")return r(b,400,{error:nt(c,"Request failed")}),!0;if(m.status==="error")return r(b,500,{error:nt(c,"Internal error")}),!0}r(b,200,c);}catch(c){let m=typeof c?.statusCode=="number"?Number(c.statusCode):500,p=c instanceof Error?c.message:String(c);r(b,m,{error:p});}return !0}if(_==="POST"&&x===`${t}/mcp-raw`){await o();let g=await n(C),l=typeof g.tool=="string"?g.tool.trim():"",s=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.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 c=le(s,"card_id","cardId"),m=dt(s,"file_idx","fileIdx"),p=dt(s,"head-lines","headLines"),h=dt(s,"tail-lines","tailLines"),T=dt(s,"head-bytes","headBytes"),O=dt(s,"tail-bytes","tailBytes");if(!c)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,h,T,O].filter(B=>B!==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[B,w]of [["head-lines",p],["tail-lines",h],["head-bytes",T],["tail-bytes",O]])if(w!==void 0&&(!Number.isInteger(w)||w<0))return r(b,400,{error:`inspect.file-contents requires ${B} to be a non-negative integer`}),!0;let $=await a().inspectFileContents({cardId:c,fileIdx:m}),J=typeof $?.stored_name=="string"?$.stored_name:null,{fileRecord:oe,bytes:pe}=await f(c,m,J),Z=String(oe.name||oe.stored_name||"download.bin"),ae=String(oe.mime_type||"application/octet-stream"),re=(A.searchParams.get("resp")||"").trim().toLowerCase();if(re&&re!=="json-b64")return r(b,400,{error:`unsupported resp mode: ${re}`}),!0;let G=re==="json-b64",z;if(p!==void 0||h!==void 0){if(!u(ae))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 B=new TextDecoder().decode(pe),w=p!==void 0?k(B,"head",p):k(B,"tail",h);z=typeof Buffer<"u"?Buffer.from(w,"utf8"):new TextEncoder().encode(w);}else if(T!==void 0||O!==void 0){let B=T??O;z=T!==void 0?pe.slice(0,B):pe.slice(Math.max(0,pe.length-B));}else z=pe;if(G){let B=typeof Buffer<"u"?Buffer.from(z).toString("base64"):btoa(String.fromCharCode(...z));return r(b,200,{bodyBase64:B,mimeType:ae,filename:Z,byteLength:z.length}),!0}return b.writeHead(200,{"Content-Type":ae,"Content-Disposition":`attachment; filename="${Z}"`,"Content-Length":z.length}),b.end(z),!0}return !1}catch(g){let l=g?.statusCode||500;return r(b,l,{error:String(g?.message||g)}),true}}return {handleAgentfaceApi:R}}function ko(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:a}=e;async function d(f,u,k){let R=f.method||"GET",C=k.pathname;try{if(R==="POST"&&C===`${t}/mcp-webhooks`){await o();let b=await n(f),P=typeof b.tool=="string"?b.tool.trim():"",_=b.args&&typeof b.args=="object"&&!Array.isArray(b.args)?b.args:{};if(!P)return r(u,400,{error:"tool is required"}),!0;try{let A=await gt(P,_,a());if(A&&typeof A=="object"&&!Array.isArray(A)){let x=A;if(x.status==="fail")return r(u,400,{error:nt(A,"Request failed")}),!0;if(x.status==="error")return r(u,500,{error:nt(A,"Internal error")}),!0}r(u,200,A);}catch(A){let x=typeof A?.statusCode=="number"?Number(A.statusCode):500,g=A instanceof Error?A.message:String(A);r(u,x,{error:g});}return !0}return !1}catch(b){let P=b?.statusCode||500;return r(u,P,{error:String(b?.message||b)}),true}}return {handleWebhooksApi:d}}function tn(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:a,onChannelSubscribed:d,onChannelUnsubscribed:f}=e;function u(R,C,b,P,_){if(!t.has(C)){n(R,404,{error:`SSE client not connected: ${C}`});return}_?(t.subscribeChannel(C,b,P.cardId),d?.(C,b,P)):(t.unsubscribeChannel(C,b,P.cardId),f?.(C,b,P)),n(R,200,{ok:true,clientId:C,channelName:b,...P.cardId?{cardId:P.cardId}:{},subscribed:_});}async function k(R,C,b,P){let _=P?.oneShot===true,A=P?.bootstrapPayload!==false,x=!_&&b?t.get(b):null,g=x?new Set(x.subscribedChatCardIds):new Set,l=x?new Set(x.subscribedChannelNames):new Set,s=x?new Map(Array.from(x.subscribedCardChannels.entries(),([m,p])=>[m,new Set(p)])):new Map;if(C.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(C),A){let m=await o(),p=t.buildFrame(m);C.write(p);}if(_){C.end();return}if(!b)throw new Error("clientId is required for streaming SSE");t.register(b,C,{subscribedChatCardIds:g,subscribedChannelNames:l,subscribedCardChannels:s});try{a?.(b,m=>{t.writeFrame(b,m);});}catch{}let c=setInterval(()=>{try{C.write(`: keepalive
|
|
4
|
+
`}function o(f){let s=f;try{s.flushHeaders?.();}catch{}try{s.flush?.();}catch{}try{s.socket?.setNoDelay?.(!0);}catch{}try{s.socket?.uncork?.();}catch{}}function a(f,s){let d=t.get(f);if(d&&!(s&&d.res!==s)){t.delete(f);try{e.onSseClientDisconnected?.(f);}catch{}try{d.res.end();}catch{}}}function c(f,s,d){let m=t.get(f);m&&a(f,m.res),t.set(f,{res:s,subscribedChatCardIds:d?.subscribedChatCardIds??new Set,subscribedChannelNames:d?.subscribedChannelNames??new Set,subscribedCardChannels:d?.subscribedCardChannels??new Map});}function l(f,s){let d=t.get(f);if(!d)return;let m=n(s);try{d.res.write(m),o(d.res);}catch{a(f,d.res);}}function u(f){return Ue({kind:"notification-batch",notifications:f})}async function k(f,s){let d=await e.buildChatOneShotBatch(f,s);return d.status==="success"?d.data:u([])}async function h(f,s){let d=t.get(f);return d?(d.subscribedChatCardIds.add(s),l(f,await k(s,true)),true):false}function C(f,s){let d=t.get(f);return d?(d.subscribedChatCardIds.delete(s),true):false}function b(f,s,d){let m=t.get(f);if(!m)return false;if(d){let p=m.subscribedCardChannels.get(d)??new Set;return p.add(s),m.subscribedCardChannels.set(d,p),true}return m.subscribedChannelNames.add(s),true}function P(f,s,d){let m=t.get(f);if(!m)return false;if(d){let p=m.subscribedCardChannels.get(d);return p&&(p.delete(s),p.size===0&&m.subscribedCardChannels.delete(d)),true}return m.subscribedChannelNames.delete(s),true}function _(f){return f.kind==="card_chats"||f.kind==="chat_messages"||f.kind==="chat_processing"}function A(f){return f.kind==="card_watchparty"}function x(f,s,d){return f.subscribedChannelNames.has(s)?true:!!f.subscribedCardChannels.get(d)?.has(s)}function g(f){if(!f||f.length===0)return;let s=[],d=new Map,m=new Map;for(let p of f)if(A(p)){let R=`${p.cardId}\0${p.channel}`,T=m.get(R)??[];T.push(p),m.set(R,T);}else if(_(p)){let R=d.get(p.cardId)??[];R.push(p),d.set(p.cardId,R);}else s.push(p);if(s.length>0){let p=u(s);for(let R of t.keys())l(R,p);}for(let[p,R]of d.entries()){let T=u(R);for(let[O,N]of t.entries())N.subscribedChatCardIds.has(p)&&l(O,T);}for(let[p,R]of m.entries()){let T=p.indexOf("\0"),O=T>=0?p.slice(0,T):"",N=T>=0?p.slice(T+1):p,$=u(R);for(let[Q,oe]of t.entries())!O||!N||x(oe,N,O)&&l(Q,$);}}return {size:()=>t.size,has:f=>t.has(f),get:f=>t.get(f),buildFrame:n,flushTransport:o,register:c,disconnect:a,writeFrame:l,subscribeChat:h,unsubscribeChat:C,subscribeChannel:b,unsubscribeChannel:P,broadcastNotificationBatch:g}}function Wr(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 zr(e,t){return Wr(await e,t)}function Yr(e){let t=le(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool requires a card private key with at least two identifier segments (e.g. chat.foundry_thread_id)"),{statusCode:400});return t}function Xr(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 uo(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:a,getMcpFacade:c,getMcpCardStoreFacade:l}=e;function u(s){let d=le(s,"board_id");if(!d)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(d!==t)throw Object.assign(new Error(`Unknown board_id: ${d}`),{statusCode:400})}function k(s){let d=le(s,"client_id");if(!d)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return d}function h(s){u(s);let d=k(s),m=le(s,"channel_name"),p=le(s,"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 C(s){u(s);let d=le(s,"card_id");if(!d)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:d}}async function b(s){await r();let{cardId:d}=C(s),m=k(s);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 P(s){await r();let{cardId:d}=C(s),m=k(s);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 _(s,d){await r();let{clientId:m,channelName:p,cardId:R}=h(s);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),a?.(m,p,R?{cardId:R}:{})),{status:"success",data:{boardId:t,clientId:m,channelName:p,subscribed:d,...R?{cardId:R}:{}}}}async function A(s,d){let{cardId:m}=C(s);return await c().setChatProcessing({cardId:m,active:d}),{status:"success",data:{boardId:t,cardId:m,active:d}}}async function x(s){let{cardId:d}=C(s),m=await c().getChatProcessing({cardId:d});return {status:"success",data:{boardId:t,cardId:d,active:m.active}}}async function g(s){let{cardId:d}=C(s),m=Yr(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 p=await zr(l().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,T=R?Xr(R,"visible_controlplane_only").value:void 0;if(s.value!==T)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 Wr(await l().patch({params:{id:d,path:`__private.${m}`},body:{value:s.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:d,key:m}}}async function f(s){let{cardId:d}=C(s),m=Yr(s),p=await zr(l().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 T=Xr(R,m);return {status:"success",data:{boardId:t,cardId:d,key:m,exists:T.exists,value:T.value}}}return {requireCardArgs:C,subscribeChat:b,unsubscribeChat:P,watchChannel:_,setChatProcessing:A,getChatProcessing:x,setCardMeta:g,getCardMeta:f}}function co(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e,a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1;function c(P){return {role:String(P.role||"system"),text:String(P.text||""),files:Array.isArray(P.files)?P.files:[],...typeof P.turn=="string"&&P.turn?{turn:P.turn}:{}}}function l(P){if(P.length===0)return null;if(P.length===1)return P[0];let _=[],A=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],x={};for(let f of A)x[f]=0;for(let f of P){let s=f,d=Array.isArray(s.cards)?s.cards:[];_.push(...d);for(let m of A)x[m]+=Number(s?.summary?.[m]||0);}let g=P[0];return {...g,cards:_,summary:{...g.summary||{},card_count:_.length,...x}}}async function u(){let P=[];for(let _ of r)try{let A=await _.boardOps.buildSseOneShotPayload({});A.status==="success"&&A.data&&P.push(A.data);}catch{}return P}async function k(){let _=(await u()).map(A=>A.statusSnapshot).filter(Boolean);if(_.length===0){let A=r.map(x=>x.notification.status).filter(Boolean);return l(A)}return l(_)}async function h(){let P={},_=await u();for(let A of _)Object.assign(P,A.cardRuntimeById||{});if(Object.keys(P).length>0)return P;for(let A of r)for(let[x,g]of Object.entries(A.notification.computedValues)){let f=A.notification.cards[x];P[x]={schema_version:"v1",card_id:x,card_data:f?.card_data??{},computed_values:g??{}};}return P}async function C(){let P={},_=await u();for(let A of _)Object.assign(P,A.dataObjectsByToken||{});if(Object.keys(P).length===0)for(let A of r)Object.assign(P,A.notification.dataObjects||{});return P}async function b(){let P=await u(),_=P.flatMap(f=>Array.isArray(f.cardDefinitions)?f.cardDefinitions:[]),A={},x={};for(let f of P)Object.assign(A,f.dataObjectsByToken||{}),Object.assign(x,f.cardRuntimeById||{});let g={};for(let f of _){if(!f?.id)continue;let s=f.id;try{let d=await n(s,{tailTurns:a}),m=await o(s);(d.length>0||m)&&(g[s]={messages:d.map(p=>c(p)),receiving:!1,processing:m});}catch{}}return {boardId:t,cardDefinitions:_,statusSnapshot:await k(),dataObjectsByToken:A,cardRuntimeById:x,cardChatsByCardId:g}}return {readStatusSnapshot:k,readCardRuntimeArtifacts:h,readDataObjectsByToken:C,buildPublishedRuntimePayload:b}}function xa(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 lo(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:a,writeChatRecord:c}=e;async function l(C){let b=[];try{let P=await o(C);if(!P)return b;let _=n().read(P.card_data&&typeof P.card_data=="object"?P.card_data:null);for(let A of _)b.push(String(A.stored_name??""));}catch{}return b}async function u(C,b,P,_,A){let x=t(C),g=r(C),f=xa(b),s=typeof A=="number"?A:(await l(C)).length,m=`${String(s+1).padStart(3,"0")}-${f}`.slice(-36);if(!g.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${C}`),{statusCode:500});return await g.files.putBytes(`${x}/${m}`,new Uint8Array(_),P||"application/octet-stream"),{name:f,stored_name:m,size:_.length,mime_type:P||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function k(C,b,P,_,A){if(!_.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let x=A?.inChat===true,g=await u(C,b,P,_),f=null;if(await a(C,s=>{let d=new Date().toISOString(),m=s.card_data&&typeof s.card_data=="object"?s.card_data:{};s.card_data=m;let p=n().normalizeIncoming([{name:g.name,stored_name:g.stored_name,size:g.size,mime_type:g.mime_type,uploaded_at:g.uploaded_at||d,chat:x}],d);return f=n().merge(m,p).findIndex(T=>T.stored_name===g.stored_name),s}),x&&A?.suppressChatRecordWrite!==true){let s=typeof f=="number"&&f>=0?` #${f}`:"";await c(C,"system",`file uploaded: ${g.name} as ${g.stored_name}${s}`,[],A?.turnId??"");}return {ok:true,file:{...g,...typeof f=="number"&&f>=0?{file_idx:f}:{},chat:x},...typeof f=="number"&&f>=0?{file_idx:f}:{}}}async function h(C,b,P){if(!Array.isArray(b)||b.length===0)throw Object.assign(new Error("uploadCardFilesMultiple requires at least one file"),{statusCode:400});for(let d of b)if(!d.buffer.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let A=(await l(C)).length,x=[];for(let d of b){let m=await u(C,d.requestedName,d.contentType,d.buffer,A);x.push(m),A+=1;}let g=typeof P?.message=="string"?P.message:"",f=[],s={};return await a(C,d=>{let m=new Date().toISOString(),p=d.card_data&&typeof d.card_data=="object"?d.card_data:{};d.card_data=p;let R=n().normalizeIncoming(x.map(N=>({name:N.name,stored_name:N.stored_name,size:N.size,mime_type:N.mime_type,uploaded_at:N.uploaded_at||m,chat:false})),m),T=n().merge(p,R);f.length=0;for(let N of x)f.push(T.findIndex($=>$.stored_name===N.stored_name));let O=Array.isArray(p.filegroups)?p.filegroups:[];return s={message:g,file_idxs:f.slice(),created_at:m},O.push(s),p.filegroups=O,d}),{ok:true,files:x.map((d,m)=>({...d,file_idx:f[m],chat:false})),file_idxs:f.slice(),filegroup:s}}return {uploadCardFile:k,uploadCardFilesMultiple:h,readCardStoredFileNames:l}}function fo(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:le(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=dt(t,"tail_turns"),n=dt(t,"tail"),o=le(t,"turn_id"),a=t.all_turns===true,c=le(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:le(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...a?{allTurns:true}:{},...c?{tailTurnsBeforeId:c}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:le(t,"card_id"),fileIdx:Number(dt(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockRequires:pt(t,"mock_requires","mock_requires"),mockFetchedSources:pt(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockProjections:lt(t,"mock_projections"),sourceIdx:Yt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockProjections:lt(t,"mock_projections"),sourceIdx:Yt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:le(t,"card_id"),sourceIdx:Yt(t,"source_idx","source_idx"),mockRequires:pt(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockRequires:lt(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:le(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=le(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:le(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"stage-ai-failure-message":t=>{let r=le(t,"turn_id"),n=le(t,"failure");if(!r)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty turn_id"),{statusCode:400});if(!n)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty failure"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:le(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:le(t,"card_id"),candidateCardContent:lt(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:le(t,"card_id")})}}function mo(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:le(t,"token"),ref:le(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:le(t,"token"),reason:le(t,"reason")})}}function po(e){let{boardId:t,uploadCardFile:r,uploadCardFilesMultiple:n,getMcpFacade:o,controlplane:a}=e;function c(u,k){let h=le(u,"board_id");if(!h)throw Object.assign(new Error(`${k} requires board_id`),{statusCode:400});if(h!==t)throw Object.assign(new Error(`Unknown board_id: ${h}`),{statusCode:400})}function l(u,k){let{cardId:h}=a.requireCardArgs(u),C=le(u,"turn_id");return c(u,k),o().manageAddChatAttachment({cardId:h,role:le(u,"role")||"user",...C?{turn:C}:{},files:[{file_name:le(u,"file_name"),content_type:le(u,"content_type")||"application/octet-stream",...typeof u.text=="string"?{text:u.text}:{},...typeof u.base64=="string"?{base64:u.base64}:{},...Array.isArray(u.bytes)?{bytes:u.bytes}:{}}]})}return {"list-runtime-cards":u=>(c(u,"list-runtime-cards"),o().listRuntimeCards()),"sse.subscribe-chat":u=>a.subscribeChat(u),"sse.unsubscribe-chat":u=>a.unsubscribeChat(u),"sse.watch-channel":u=>a.watchChannel(u,true),"sse.unwatch-channel":u=>a.watchChannel(u,false),"getstate.is-chat-processing":u=>a.getChatProcessing(u),"setstate.chat-processing-started":u=>a.setChatProcessing(u,true),"setstate.chat-processing-done":u=>a.setChatProcessing(u,false),"getstate.card-private":u=>a.getCardMeta(u),"setstate.card-private":u=>a.setCardMeta(u),"manage.upload-card-file":u=>{let k=le(u,"card_id"),h=le(u,"file_name"),C=le(u,"content_type")||"application/octet-stream",b=Er(u);if(c(u,"manage.upload-card-file"),!k)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!h)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(k,h,C,b,{inChat:false})},"manage.upload-card-file-multiple":u=>{let k=le(u,"card_id"),h=le(u,"message"),C=Array.isArray(u.files)?u.files:[];if(c(u,"manage.upload-card-file-multiple"),!k)throw Object.assign(new Error("manage.upload-card-file-multiple requires card_id"),{statusCode:400});if(C.length===0)throw Object.assign(new Error("manage.upload-card-file-multiple requires a non-empty files array"),{statusCode:400});let b=C.map((P,_)=>{let A=P&&typeof P=="object"?P:{},x=le(A,"file_name");if(!x)throw Object.assign(new Error(`manage.upload-card-file-multiple files[${_}] requires file_name`),{statusCode:400});let g=Er(A);if(!g)throw Object.assign(new Error(`manage.upload-card-file-multiple files[${_}] requires bytes, text, or base64`),{statusCode:400});return {requestedName:x,contentType:le(A,"content_type")||"application/octet-stream",buffer:g}});return n(k,b,h?{message:h}:void 0)},"manage.add-chat-attachment":u=>l(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>l(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:k}=a.requireCardArgs(u),h=le(u,"role")||"user",C=le(u,"turn_id");return c(u,"manage.add-chat-entry-and-any-attachments"),o().manageAddChatEntryAndAnyAttachments({cardId:k,role:h,...typeof u.text=="string"?{text:u.text}:{},...C?{turn:C}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:k}=a.requireCardArgs(u);return c(u,"manage.patch-card"),o().managePatchCard({cardId:k,patch:lt(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:k}=a.requireCardArgs(u);return c(u,"manage.upsert-card"),o().manageUpsertCard({cardId:k,candidateCardContent:lt(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:k}=a.requireCardArgs(u);return c(u,"manage.remove-card"),o().manageRemoveCard({cardId:k},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:k}=a.requireCardArgs(u);return {status:"success",data:{cards:await o().adminReadCard({cardId:k})}}},"manage.admin-upsert-card":u=>{let k=le(u,"board_id"),h=le(u,"card_id");if(!k)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!h)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(k!==t)throw Object.assign(new Error(`Unknown board_id: ${k}`),{statusCode:400});return o().adminUpsertCard({cardId:h,candidateCardContent:lt(u,"candidate_card_content")})}}}function at(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function go(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 qe(e){return Array.isArray(e)?e:[]}function en(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 Zr(e,t){let r=W(e.view);return {elements:qe(r.elements).map((o,a)=>{let c=W(o),l=W(c.data),u=W(c.spec),k=typeof c.visible=="string"?!!en(t,c.visible):true,h=typeof l.bind=="string"?l.bind:void 0,C=typeof u.maxRows=="number"?u.maxRows:typeof l.maxRows=="number"?l.maxRows:void 0,b=h?en(t,h):void 0,P={id:typeof c.id=="string"&&c.id?c.id:`element-${a}`,kind:c.kind,label:c.label,visible:k};return b!==void 0&&(P.resolved=Array.isArray(b)&&typeof C=="number"?b.slice(0,C):b),P})}}function yo(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=qe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],a={};for(let c of o){let l=W(c),u=typeof l.bindTo=="string"?l.bindTo:"",k=typeof l.ref=="string"?l.ref:"";if(!u||!k)continue;let h=en(t,k);h!==void 0&&(a[u]=h);}return a}function Ta(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 Ia(e){return {"card-content":e}}function vr(e){let t={...e};return delete t.__private,t}function Pa(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function _a(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function Ea(e,t){let r=_a(e);if(!t||Object.keys(t).length===0)return r;function n(o,a,c){let l=String(a||"").split(".").filter(Boolean);if(!l.length)return;let u=o;for(let k=0;k<l.length-1;k+=1){let h=l[k];(!u[h]||typeof u[h]!="object")&&(u[h]={}),u=u[h];}u[l[l.length-1]]=c;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,a=W(r.view),c=qe(a.elements);for(let l of c){let u=W(l),k=W(u.data),h=typeof u.writeTo=="string"&&u.writeTo?u.writeTo:typeof k.writeTo=="string"?k.writeTo:"";if(h){o=h;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 Ar(e){return W(e.__private).visible_controlplane_only===true}async function Bt(e,t){let r=await Xe(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 ho(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:a,sourceFetchDone:c,sourceFetchFailed:l,uploadCardFile:u,buildFileDownloadUrl:k,readFetchedSourceJsonByRef:h}=e;function C(y,S){if(typeof y=="function")return y;throw new Error(`${S} is not configured for this MCP facade`)}async function b(){let y=await Xe(n.get({}),"cardStore.get");return Array.isArray(y.cards)?y.cards.map(S=>W(S)).filter(S=>!Ar(S)):[]}function P(y){if(Array.isArray(y.bytes))return new Uint8Array(y.bytes.map(S=>Math.max(0,Math.min(255,Number(S)||0))));if(typeof y.text=="string")return new TextEncoder().encode(y.text);if(typeof y.base64=="string"){let S=String(y.base64).replace(/-/g,"+").replace(/_/g,"/"),F=S+"=".repeat((4-S.length%4)%4),M=atob(F);return Uint8Array.from(M,L=>L.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function _(){let y=W(await Xe(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:y.version,commonSourceFields:W(y.commonSourceDefFields),sourceKinds:W(y.sourceKinds)}}async function A(){let y=W(await Xe(t.status({}),"status")),S=W(y.summary),F=qe(y.cards),M=await Xe(n.get({}),"cardStore.get"),L=new Set((Array.isArray(M.cards)?M.cards.map(W):[]).filter(Ar).map(ee=>typeof ee.id=="string"?ee.id:"").filter(Boolean)),D=F.filter(ee=>!L.has(String(W(ee).name??"")));return {meta:W(y.meta),summary:{card_count:typeof S.card_count=="number"?S.card_count:0,completed:typeof S.completed=="number"?S.completed:0,eligible:typeof S.eligible=="number"?S.eligible:0,pending:typeof S.pending=="number"?S.pending:0,blocked:typeof S.blocked=="number"?S.blocked:0,in_progress:typeof S.in_progress=="number"?S.in_progress:0,failed:typeof S.failed=="number"?S.failed:0,unresolved:typeof S.unresolved=="number"?S.unresolved:0},cards:D.map(ee=>{let ue=W(ee);return {"card-id":typeof ue.name=="string"?ue.name:null,status:ue.status??null,error:ue.error??null,requires:qe(ue.requires),requires_satisfied:qe(ue.requires_satisfied),requires_missing:qe(ue.requires_missing),provides_declared:qe(ue.provides_declared),provides_runtime:qe(ue.provides_runtime)}})}}async function x(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let F=W(await Xe(t.status({}),"status")),L=qe(F.cards).map(W).find(Re=>Re.name===S);if(!L)throw new Error(`card "${S}" not found in board status`);let D=W(await Bt(n,S)),ee=vr(D),ue=qe(L.requires_satisfied).filter(Re=>typeof Re=="string"&&!!Re),Se=qe(L.provides_runtime).filter(Re=>typeof Re=="string"&&!!Re),Ie=Object.fromEntries(await Promise.all(ue.map(async Re=>[Re,await Xe(t.getOutputsDataObject({params:{key:Re}}),`getOutputsDataObject(${Re})`)]))),Ee=Object.fromEntries(await Promise.all(Se.map(async Re=>[Re,await Xe(t.getOutputsDataObject({params:{key:Re}}),`getOutputsDataObject(${Re})`)]))),ge=W(await Xe(t.getOutputsComputedValues({params:{key:S}}),"getOutputsComputedValues")),ke=await Xe(t.getOutputsFetchedSources({params:{key:S}}),"getOutputsFetchedSources"),Ve=qe(D.source_defs).map(W),we={};for(let Re of Ve)typeof Re.bindTo=="string"&&typeof Re.outputFile=="string"&&(we[Re.outputFile]=Re.bindTo);let Ke={};for(let[Re,tt]of Object.entries(ke)){let Je=we[Re]??Re;if(!h||typeof tt!="string"){Ke[Je]=null;continue}try{Ke[Je]=h({cardId:S,ref:tt});}catch{Ke[Je]=null;}}let Ne={card_data:W(D.card_data),requires:Ie,fetched_sources:Ke,computed_values:ge};return {cardId:S,card_status_in_board:L,card_definition_and_static_data:ee,refs_for_fetched_source_files:ke,runtime_data:{requires:Ie,provides:Ee,computed_values:ge,rendered_view:Zr(D,Ne)}}}async function g(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("inspectChatMessagesOnCards requires cardId");let F=typeof y.turnId=="string"?y.turnId:"",M=y.allTurns===true,L=typeof y.tailTurnsBeforeId=="string"?y.tailTurnsBeforeId:"",D=M?void 0:y.lastUserTurns??(F?void 0:1),ee=y.tail,ue={...D===void 0?{}:{tailTurns:D},...F?{turnId:F}:{},...M?{allTurns:true}:{},...L?{tailTurnsBeforeId:L}:{}},Se=Object.keys(ue).length>0?{params:{cardId:S},body:ue}:{params:{cardId:S}},Ie=at(await o.readAll(Se),"chatStore.readAll"),Ee=W(await Bt(n,S)),ge=qe(W(Ee.card_data).files).map((we,Ke)=>({idx:Ke,stored_name:W(we).stored_name})).filter(we=>typeof we.stored_name=="string"&&we.stored_name.length>0),Ve=(Array.isArray(Ie.records)?Ie.records:[]).map(we=>{let Ne=W(we.payload),Re={...we},tt=typeof we?.role=="string"?we.role:typeof Ne.role=="string"?String(Ne.role):"",Je=typeof we?.text=="string"?we.text:typeof Ne.text=="string"?String(Ne.text):"";if(tt==="system"){let rt=Ta(Je);if(rt!==null&&ge.some(j=>j.idx===rt)){let j=`Retrieve using inspect-file-contents --card-id ${S} --file-idx ${rt}`;Re.retrieval_hint=j,Object.keys(Ne).length>0&&typeof we.role!="string"&&(Re.payload={...Ne,retrieval_hint:j});}}return Re});return {cardId:S,messages:typeof ee=="number"&&ee>=0?Ve.slice(-ee):Ve}}async function f(y){let S=String(y.cardId||"").trim(),F=Number(y.fileIdx);if(!S)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=W(await Bt(n,S)),L=qe(W(M.card_data).files).map(W);if(F>=L.length)throw new Error(`attachment index ${F} is out of range for card "${S}"`);let D=L[F],ee=typeof D.stored_name=="string"?D.stored_name:null;return {cardId:S,fileIdx:F,downloadUrl:k({cardId:S,fileIdx:F,storedName:ee}),...typeof D.name=="string"?{name:D.name}:{},...typeof D.stored_name=="string"?{stored_name:D.stored_name}:{},...typeof D.mime_type=="string"?{mime_type:D.mime_type}:{},...typeof D.size=="number"?{size:D.size}:{},...typeof D.uploaded_at=="string"?{uploaded_at:D.uploaded_at}:{}}}async function s(y){return await r.validateCardPreflight({body:Ia(y.candidateCardContent)})}function d(y){if(!y.mockRequires||typeof y.mockRequires!="object"||Array.isArray(y.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!y.mockFetchedSources||typeof y.mockFetchedSources!="object"||Array.isArray(y.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let S=r.evalCardCompute({body:{"card-content":y.candidateCardContent,"mock-requires":y.mockRequires,"mock-fetched-sources":y.mockFetchedSources}});if(S.status!=="success")return S;let F=W(go(S,"evalCardCompute")),M=W(y.candidateCardContent),L={card_data:W(M.card_data),requires:W(y.mockRequires),fetched_sources:W(y.mockFetchedSources),computed_values:W(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:W(F.computed_values),errors:qe(F.errors).map(D=>{let ee=W(D);return {bindTo:typeof ee.bindTo=="string"?ee.bindTo:"",error:typeof ee.error=="string"?ee.error:""}}),provides_outputs:yo(M,L),rendered_view:Zr(M,L)}}}async function m(y){return await r.probeSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":y.candidateCardContent,"mock-projections":y.mockProjections}})}async function p(y){return await r.runSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":y.candidateCardContent,"mock-projections":y.mockProjections}})}async function R(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!y.mockRequires||typeof y.mockRequires!="object"||Array.isArray(y.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let F=W(await Bt(n,S)),M=qe(F.source_defs).filter(D=>!!D&&typeof D=="object"&&!Array.isArray(D)),L={};if(y.sourceIdx>=0&&y.sourceIdx<M.length){let D=M[y.sourceIdx],ee=Ye.enrichSourcesSync([D],{card_data:W(F.card_data),requires:y.mockRequires});Array.isArray(ee)&&ee.length>0&&(L=W(ee[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":F,"mock-requires":y.mockRequires,"mock-projections":L}})}async function T(y){let S=W(await Xe(r.simulateCardCycle({body:{"card-content":y.candidateCardContent,"mock-requires":y.mockRequires}}),"simulateCardCycle")),F=W(y.candidateCardContent),M=W(S.validation),L=qe(S.source_probes),D=qe(S.projection_errors),ee=W(S.fetched_sources),ue=qe(S.compute_errors),Se=W(S.computed_values),Ie={card_data:W(F.card_data),requires:y.mockRequires,fetched_sources:ee,computed_values:Se},Ee=[];for(let ge of qe(M.issues))typeof ge=="string"&&ge&&Ee.push(ge);for(let ge of L){let ke=W(ge),Ve=typeof ke.bindTo=="string"?ke.bindTo:"source",we=typeof ke.error=="string"?ke.error:"";we&&Ee.push(`${Ve}: ${we}`);}for(let ge of D){let ke=W(ge),Ve=typeof ke.bindTo=="string"?ke.bindTo:"source",we=typeof ke.key=="string"?ke.key:"projection",Ke=typeof ke.error=="string"?ke.error:"projection failed";Ee.push(`${Ve}.${we}: ${Ke}`);}for(let ge of ue){let ke=W(ge),Ve=typeof ke.bindTo=="string"?ke.bindTo:"compute",we=typeof ke.error=="string"?ke.error:"compute failed";Ee.push(`${Ve}: ${we}`);}return {status:"success",data:{cardId:typeof S.cardId=="string"?S.cardId:"(unknown)",ok:S.ok===true,issues:Ee,provides_outputs:yo(F,Ie),rendered_view:Zr(F,Ie)}}}async function O(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("manageReadCard requires cardId");let F=await Xe(n.get({params:{id:S}}),"cardStore.get");return (Array.isArray(F.cards)?F.cards.map(W):[]).map(L=>vr(L))}async function N(y){let S=await Promise.all(qe(y.files).map(async F=>{let M=W(F),L=String(M.file_name??M.fileName??M.name??"").trim(),D=String(M.content_type??M.contentType??"application/octet-stream");if(!L)throw new Error("file entry requires file_name");return await u({cardId:y.cardId,fileName:L,contentType:D,bytes:P(M),suppressChatRecordWrite:true})}));for(let[F,M]of S.entries()){let L=W(M.file),D=typeof M.file_idx=="number"&&Number.isInteger(M.file_idx)&&M.file_idx>=0?M.file_idx:F,ee=y.role==="assistant"?`AI generated: ${String(L.name||"")} as ${String(L.stored_name||"")} #${D}`:`file uploaded: ${String(L.name||"")} as ${String(L.stored_name||"")} #${D}`;at(await o.append({params:{cardId:y.cardId},body:{role:"system",text:ee,files:[],turn:y.turn}}),"chatStore.append(system attachment message)");}return S.map(F=>F.file)}async function $(y){let S=String(y.cardId||"").trim(),F=String(y.role||"user").trim()||"user",M=typeof y.turn=="string"?y.turn:"";if(!S)throw new Error("manageAddChatAttachment requires cardId");let L=await N({cardId:S,role:F,turn:M,files:y.files});return {status:"success",data:{cardId:S,turn:M,files:L}}}async function Q(y){let S=String(y.cardId||"").trim(),F=String(y.role||"").trim(),M=typeof y.text=="string"?y.text:"",L=typeof y.turn=="string"?y.turn:"";if(!S)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!F)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(F==="assistant"&&L){let ue=at(await o.readAll({params:{cardId:S},body:{turnId:L}}),"chatStore.readAll(existing turn messages)"),Se=Array.isArray(ue.records)?ue.records.find(Ie=>Ie.role==="assistant"&&String(Ie.turn||"")===L):void 0;if(Se)return {status:"success",data:{cardId:S,id:String(Se.id),role:F,turn:L,files:Array.isArray(Se.files)?Se.files:[]}}}let D=await N({cardId:S,role:F,turn:L,files:y.files}),ee=at(await o.append({params:{cardId:S},body:{role:F,text:M,files:D,turn:L}}),"chatStore.append");return {status:"success",data:{cardId:S,id:String(ee.id),role:F,turn:L,files:D}}}async function oe(y,S={}){let F=String(y.cardId||"").trim(),M=W(y.patch);if(!F)throw new Error("managePatchCard requires cardId");let L=await O({cardId:F}),D=W(L[0]),ee=Ea(D,M);return pe({cardId:F,candidateCardContent:ee},S)}async function pe(y,S={}){let F=String(y.cardId||"").trim(),M=W(y.candidateCardContent),L=vr(M);if(!F)throw new Error("manageUpsertCard requires cardId");if(typeof L.id!="string"||!L.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(L.id!==F)throw new Error(`candidateCardContent.id must match cardId (${F})`);let D=null;try{D=await s({candidateCardContent:L});}catch(ge){let ke=ge instanceof Error?ge.message:String(ge);if(!/non-core adapter is not configured/i.test(ke))throw ge;D=null;}if(D!==null){let ge=W(D),ke=W(ge.data);if(ge.status!=="success"||ke.isValid!==true)return {status:"fail",step:"validate",validation:D}}let ee=null;try{ee=await Bt(n,F);}catch{ee=null;}let ue=ee?W(ee):null;if(ue&&Ar(ue)&&!S.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404});let Se={...L,...ue&&Pa(ue,"__private")?{__private:ue.__private}:{}},Ie=await n.set({body:Se});at(Ie,"cardStore.set");let Ee;try{Ee=await t.upsertCard({params:{cardId:F,restart:!0}}),at(Ee,"upsertCard");}catch(ge){try{ee&&await n.set({body:ee});}catch{}throw ge}return {status:"success",data:{validation:D,card_saved:null,board_result:Ee}}}async function Z(y,S={}){let F=String(y.cardId||"").trim();if(!F)throw new Error("manageRemoveCard requires cardId");if(!S.allowControlplaneOnlyCards){let D=await Xe(n.get({params:{id:F}}),"cardStore.get");if((Array.isArray(D.cards)?D.cards.map(W):[]).some(Ar))throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404})}let M=await t.removeCard({params:{id:F}});at(M,"removeCard");let L=await n.del({params:{id:F}});return at(L,"cardStore.del"),{status:"success",data:{board_result:M,store_result:L}}}async function ae(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("adminReadCard requires cardId");let F=await Xe(n.get({params:{id:S}}),"cardStore.get");return Array.isArray(F.cards)?F.cards.map(M=>W(M)):[]}async function re(y){let S=String(y.cardId||"").trim(),F=W(y.candidateCardContent),M=vr(F);if(!S)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!==S)throw new Error(`candidateCardContent.id must match cardId (${S})`);let L=await s({candidateCardContent:M}),D=W(L),ee=W(D.data);if(D.status!=="success"||ee.isValid!==true)return {status:"fail",step:"validate",validation:L};let ue=null;try{ue=await Bt(n,S);}catch{ue=null;}let Se=ue?W(W(ue).__private):{},Ie={...M,__private:{...Se,visible_controlplane_only:true}},Ee=await n.set({body:Ie});at(Ee,"cardStore.set");let ge;try{ge=await t.upsertCard({params:{cardId:S,restart:!0}}),at(ge,"upsertCard");}catch(ke){try{ue&&await n.set({body:ue});}catch{}throw ke}return {status:"success",data:{validation:L,card_saved:null,board_result:ge}}}async function G(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("getChatProcessing requires cardId");let F=go(await o.isProcessing({params:{cardId:S}}),"chatStore.isProcessing");return {cardId:S,active:!!F.active}}async function z(y){let S=String(y.cardId||"").trim();if(!S)throw new Error("setChatProcessing requires cardId");if(typeof y.active!="boolean")throw new Error("setChatProcessing requires boolean active");return at(await o.setProcessing({params:{cardId:S},body:{active:y.active}}),"chatStore.setProcessing"),{cardId:S,active:y.active}}async function B(){let y=await C(a,"webhook.process-accumulated")();return y?.status==="fail"||y?.status==="error"?y:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(y??{},"data")?y.data??null:null}}}async function w(y){let S=String(y.token||"").trim(),F=String(y.ref||"").trim();if(!S)throw new Error("webhookSourceFetchDone requires token");if(!F)throw new Error("webhookSourceFetchDone requires ref");let M=await C(c,"webhook.source-fetch-done")({token:S,ref:F});return M?.status==="fail"||M?.status==="error"?M:{status:"success",data:{token:S,ref:F,runtime_result:Object.prototype.hasOwnProperty.call(M??{},"data")?M.data??null:null}}}async function K(y){let S=String(y.token||"").trim(),F=String(y.reason||"").trim();if(!S)throw new Error("webhookSourceFetchFailed requires token");if(!F)throw new Error("webhookSourceFetchFailed requires reason");let M=await C(l,"webhook.source-fetch-failed")({token:S,reason:F});return M?.status==="fail"||M?.status==="error"?M:{status:"success",data:{token:S,reason:F,runtime_result:Object.prototype.hasOwnProperty.call(M??{},"data")?M.data??null:null}}}return {listRuntimeCards:b,discoverSourceKinds:_,inspectBoardRuntimeStatus:A,inspectCardDefinitionAndRuntime:x,inspectChatMessagesOnCards:g,inspectFileContents:f,preflightValidateCandidateCardDefinition:s,preflightMaterializeCandidateCard:d,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:R,preflightRunOneCycleWithCandidateCard:T,manageReadCard:O,manageAddChatAttachment:$,manageAddChatEntryAndAnyAttachments:Q,managePatchCard:oe,manageUpsertCard:pe,manageRemoveCard:Z,adminReadCard:ae,adminUpsertCard:re,getChatProcessing:G,setChatProcessing:z,webhookProcessAccumulated:B,webhookSourceFetchDone:w,webhookSourceFetchFailed:K}}async function Xe(e,t){return at(await e,t)}function Ro(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:a,readCardRuntimeArtifacts:c,readCardFromStore:l,readCardDefinitions:u,processAccumulatedLaneInternal:k,reportSourceFetched:h,reportSourceFetchFailure:C,uploadCardFile:b,chatStorePublic:P,serverUrl:_,apiBasePath:A}=e;function x(){return t[0]??null}function g(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let p=m?.params?.key;return p?{status:"success",data:(await a())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let p=m?.params?.key;return p?{status:"success",data:(await c())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let p=m?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let R=n(p)??x();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)??x();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)??x();if(!R)return {status:"fail",error:"Board context is unavailable"};let T=await R.boardOps.upsertCard({params:{cardId:p,restart:m.params.restart===true}});if(T.status!=="success")return T;if(ze(R.boardAdapter)){let O=await k(true);if(O.status!=="success")return O}return T}}}function f(){let m=()=>{let p=x();if(!p?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return p.nonCore};return {describeTaskExecutorCapabilities(p){return 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 s(){return {async get(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(p){let R=await l(p);return R?{status:"success",data:{cards:[R]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await u()}}},async set(m){let p=m.body;if(p==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let R=Array.isArray(p)?p:[p];for(let T of R){let O=T,N=typeof O.id=="string"?O.id:"";if(!N)return {status:"fail",error:"each card must have a string `id` field"};let $=r.get(N)??0,Q=t[$]??x();if(!Q)return {status:"fail",error:"Board context is unavailable"};let oe=await Q.cardStoreOps.set({body:O});if(oe.status!=="success")return oe;r.set(N,$);}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 T=n(R)??x();if(!T)return {status:"fail",error:"Board context is unavailable"};let O=await T.cardStoreOps.del({params:{id:R}});if(O.status!=="success")return O;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 T=n(p)??x();return T?T.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)??x();return R?R.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function d(){return ho({board:g(),nonCore:f(),cardStore:s(),chatStore:P,processAccumulated:()=>k(true),sourceFetchDone:({token:m,ref:p})=>h(m,p),sourceFetchFailed:({token:m,reason:p})=>C(m,p),uploadCardFile({cardId:m,fileName:p,contentType:R,bytes:T,suppressChatRecordWrite:O}){return b(m,p,R,T,{inChat:true,...O===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:p,storedName:R}){let T=`${_||""}${A}/cards/${encodeURIComponent(m)}/files/${p}`;return R?`${T}?sn=${encodeURIComponent(R)}`:T},readFetchedSourceJsonByRef({cardId:m,ref:p}){let R=n(m)??x();if(!R||ze(R.boardAdapter))return null;let N=R.boardAdapter.resolveBlob(ct(p)).trim();return N?JSON.parse(N):null}})}return {mcpBoardFacade:g,mcpNonCoreFacade:f,mcpCardStoreFacade:s,createMcpFacade:d}}function ko(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:a,createMcpToolRegistry:c,resolveCardFileDownloadPayload:l,isLikelyTextMimeType:u,sliceTextByLines:k}=e;async function h(C,b,P){let _=C.method||"GET",A=P,x=A.pathname;try{if(_==="POST"&&x===`${t}/mcp`){await o();let g=await n(C),f=typeof g.tool=="string"?g.tool.trim():"",s=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!f)return r(b,400,{error:"tool is required"}),!0;if(f==="inspect.file-contents")return r(b,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let d=await gt(f,s,c(a()));if(d&&typeof d=="object"&&!Array.isArray(d)){let m=d;if(m.status==="fail")return r(b,400,{error:nt(d,"Request failed")}),!0;if(m.status==="error")return r(b,500,{error:nt(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(_==="POST"&&x===`${t}/mcp-raw`){await o();let g=await n(C),f=typeof g.tool=="string"?g.tool.trim():"",s=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!f)return r(b,400,{error:"tool is required"}),!0;if(f!=="inspect.file-contents")return r(b,400,{error:`Tool does not support raw response: ${f}`}),!0;let d=le(s,"card_id","cardId"),m=dt(s,"file_idx","fileIdx"),p=dt(s,"head-lines","headLines"),R=dt(s,"tail-lines","tailLines"),T=dt(s,"head-bytes","headBytes"),O=dt(s,"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,T,O].filter(B=>B!==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[B,w]of [["head-lines",p],["tail-lines",R],["head-bytes",T],["tail-bytes",O]])if(w!==void 0&&(!Number.isInteger(w)||w<0))return r(b,400,{error:`inspect.file-contents requires ${B} to be a non-negative integer`}),!0;let $=await a().inspectFileContents({cardId:d,fileIdx:m}),Q=typeof $?.stored_name=="string"?$.stored_name:null,{fileRecord:oe,bytes:pe}=await l(d,m,Q),Z=String(oe.name||oe.stored_name||"download.bin"),ae=String(oe.mime_type||"application/octet-stream"),re=(A.searchParams.get("resp")||"").trim().toLowerCase();if(re&&re!=="json-b64")return r(b,400,{error:`unsupported resp mode: ${re}`}),!0;let G=re==="json-b64",z;if(p!==void 0||R!==void 0){if(!u(ae))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 B=new TextDecoder().decode(pe),w=p!==void 0?k(B,"head",p):k(B,"tail",R);z=typeof Buffer<"u"?Buffer.from(w,"utf8"):new TextEncoder().encode(w);}else if(T!==void 0||O!==void 0){let B=T??O;z=T!==void 0?pe.slice(0,B):pe.slice(Math.max(0,pe.length-B));}else z=pe;if(G){let B=typeof Buffer<"u"?Buffer.from(z).toString("base64"):btoa(String.fromCharCode(...z));return r(b,200,{bodyBase64:B,mimeType:ae,filename:Z,byteLength:z.length}),!0}return b.writeHead(200,{"Content-Type":ae,"Content-Disposition":`attachment; filename="${Z}"`,"Content-Length":z.length}),b.end(z),!0}return !1}catch(g){let f=g?.statusCode||500;return r(b,f,{error:String(g?.message||g)}),true}}return {handleAgentfaceApi:h}}function Co(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:a}=e;async function c(l,u,k){let h=l.method||"GET",C=k.pathname;try{if(h==="POST"&&C===`${t}/mcp-webhooks`){await o();let b=await n(l),P=typeof b.tool=="string"?b.tool.trim():"",_=b.args&&typeof b.args=="object"&&!Array.isArray(b.args)?b.args:{};if(!P)return r(u,400,{error:"tool is required"}),!0;try{let A=await gt(P,_,a());if(A&&typeof A=="object"&&!Array.isArray(A)){let x=A;if(x.status==="fail")return r(u,400,{error:nt(A,"Request failed")}),!0;if(x.status==="error")return r(u,500,{error:nt(A,"Internal error")}),!0}r(u,200,A);}catch(A){let x=typeof A?.statusCode=="number"?Number(A.statusCode):500,g=A instanceof Error?A.message:String(A);r(u,x,{error:g});}return !0}return !1}catch(b){let P=b?.statusCode||500;return r(u,P,{error:String(b?.message||b)}),true}}return {handleWebhooksApi:c}}function tn(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:a,onChannelSubscribed:c,onChannelUnsubscribed:l}=e;function u(h,C,b,P,_){if(!t.has(C)){n(h,404,{error:`SSE client not connected: ${C}`});return}_?(t.subscribeChannel(C,b,P.cardId),c?.(C,b,P)):(t.unsubscribeChannel(C,b,P.cardId),l?.(C,b,P)),n(h,200,{ok:true,clientId:C,channelName:b,...P.cardId?{cardId:P.cardId}:{},subscribed:_});}async function k(h,C,b,P){let _=P?.oneShot===true,A=P?.bootstrapPayload!==false,x=!_&&b?t.get(b):null,g=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,p])=>[m,new Set(p)])):new Map;if(C.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(C),A){let m=await o(),p=t.buildFrame(m);C.write(p);}if(_){C.end();return}if(!b)throw new Error("clientId is required for streaming SSE");t.register(b,C,{subscribedChatCardIds:g,subscribedChannelNames:f,subscribedCardChannels:s});try{a?.(b,m=>{t.writeFrame(b,m);});}catch{}let d=setInterval(()=>{try{C.write(`: keepalive
|
|
5
5
|
|
|
6
|
-
`);}catch{}},15e3);R.on("close",()=>{clearInterval(c),t.disconnect(b,C);});}return {handleChannelSubscription:u,handleSse:k}}function Co(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:a,boardContexts:d,publishPersistedStateSnapshot:f,upsertCardsFromSource:u,sseHub:k,queueSseHub:R}=e,{handleSse:C,handleChannelSubscription:b}=tn(e),{handleSse:P}=tn({...e,sseHub:R,buildPublishedRuntimePayload:async()=>null});async function _(A,x,g){let l=A.method||"GET",s=g,c=s.pathname;try{if(l==="GET"&&c===`${t}/sse`){let O=s.searchParams.has("one-shot");await o();let N=String(s.searchParams.get("clientId")||"").trim();if(!O&&!N)return r(x,400,{error:"clientId query param is required for SSE"}),!0;if(await C(A,x,N||void 0,{oneShot:O}),O)return !0;for(let $=0;$<d.length;$++)await f(d[$]),await u(d[$],$),await f(d[$]);return !0}if(l==="GET"&&c===`${t}/sse-q`){let O=String(s.searchParams.get("clientId")||"").trim();return O?(await P(A,x,O,{bootstrapPayload:!1}),!0):(r(x,400,{error:"clientId query param is required for SSE"}),!0)}let m=c.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(l==="POST"&&m){await a();let O=decodeURIComponent(m[1]),N=await n(A),$=typeof N?.clientId=="string"?N.clientId.trim():"";return $?await k.subscribeChat($,O)?(r(x,200,{ok:!0,clientId:$,cardId:O,subscribed:!0}),!0):(r(x,404,{error:`SSE client not connected: ${$}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let p=c.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(l==="POST"&&p){await a();let O=decodeURIComponent(p[1]),N=await n(A),$=typeof N?.clientId=="string"?N.clientId.trim():"";return $?k.unsubscribeChat($,O)?(r(x,200,{ok:!0,clientId:$,cardId:O,subscribed:!1}),!0):(r(x,404,{error:`SSE client not connected: ${$}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let h=c.match(new RegExp(`^${st(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&h){await a();let O=decodeURIComponent(h[1]),N=h[2]==="subscribe",$=await n(A),J=typeof $?.clientId=="string"?$.clientId.trim():"";return J?(b(x,J,O,{},N),!0):(r(x,400,{error:"clientId is required"}),!0)}let T=c.match(new RegExp(`^${st(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&T){await a();let O=decodeURIComponent(T[1]),N=decodeURIComponent(T[2]),$=T[3]==="subscribe",J=await n(A),oe=typeof J?.clientId=="string"?J.clientId.trim():"";return oe?(b(x,oe,N,{cardId:O},$),!0):(r(x,400,{error:"clientId is required"}),!0)}return !1}catch(m){let p=m?.statusCode||500;return r(x,p,{error:String(m?.message||m)}),true}}return {handleWatchersRoutes:_,handleSse:C,handleChannelSubscription:b}}var Ia=3e4;function Pa(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function bo(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,a=`${t}/notify-q`;async function d(f,u,k){if(k.pathname!==a)return false;if((f.method??"").toUpperCase()!=="POST")return o(u,405,{status:"error",error:"Method not allowed"}),true;if(!Pa(f))return o(u,403,{status:"error",error:"Forbidden"}),true;let R;try{R=await n(f);}catch{return o(u,400,{status:"error",error:"Invalid JSON body"}),true}if(!R||typeof R!="object"||!Array.isArray(R.notifications))return o(u,400,{status:"error",error:"body.notifications must be an array"}),true;let C=R.notifications,{accepted:b,rejected:P}=no(C,Date.now(),Ia);return b.length>0&&r(b),o(u,200,{status:"success",data:{accepted:b.length,rejected:P}}),true}return {handleNotifyRoute:d}}var wo={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},So="chat-handler-flow-queue",Ht="__probe__echo__probe__";function _a(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...wo,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1,d=e.logger||{info:console.log,warn:console.warn,error:console.error},f=e.invocationAdapter,u=e.chatFlowRunner||null,k=e.notificationTransport||null,R=e.serverUrl||null,C=e.executionExtra||{},b=e.onSseClientConnected,P=e.onSseClientDisconnected,_=e.onChannelSubscribed,A=e.onChannelUnsubscribed,x=Gr({buildChatOneShotBatch:async(i,v)=>await Se.buildSseOneShotBatch({params:{cardId:i},body:{receiving:v}}),onSseClientDisconnected:P}),g=Gr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function l(i){function v(te){return {...te,queueStorageForRef(ye,Fe){return zn(te.queueStorageForRef(ye,Fe),{lane:Fe,emitNotification:ie})}}}function E(te){return {...te,queueStorageForRef(ye,Fe){return Wn(te.queueStorageForRef(ye,Fe),{lane:Fe,emitNotification:ie})}}}function U(te){return {async get(ye){return te.get(ye)},async set(ye){return te.set(ye)},async del(ye){return te.del(ye)},async patch(ye){return te.patch(ye)},async appendFiles(ye){return te.appendFiles(ye)}}}function H(te){return {async get(ye){return await te.get(ye)},async set(ye){return await te.set(ye)},async del(ye){return await te.del(ye)},async patch(ye){return await te.patch(ye)},async appendFiles(ye){return await te.appendFiles(ye)}}}let Y=null;function ie(te){if(te.kind==="notification-batch"){Z(te.notifications,Y??void 0);return}Z([te],Y??void 0);}let fe=rt(i.boardAdapter)?E(i.boardAdapter):v(i.boardAdapter),Je=i.nonCoreAdapter??(!rt(fe)&&T(fe)?fe:null),Te=rt(fe)?Gn(i.baseRef,fe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,scratchStoreRef:i.scratchStoreRef,taskExecutorRef:i.taskExecutorRef,chatHandlerFlow:i.chatHandlerFlow,emitNotification:ie}):Ln(i.baseRef,fe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,scratchStoreRef:i.scratchStoreRef,taskExecutorRef:i.taskExecutorRef,chatHandlerFlow:i.chatHandlerFlow,emitNotification:ie}),Ge=i.nonCore??(Je?Dn(i.baseRef,Je,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,taskExecutorRef:i.taskExecutorRef}):null),Ao=fe.chatStorageForRef(i.chatStoreRef),Ar,xo=rt(fe)?(()=>{let te=Cr(kr(Rr(fe.kvStorageForRef(i.cardStoreRef)),fe.hashFn),d.warn),ye=gr(te,{emitNotification:ie}),Fe=H(ye);return Ar={get(ve){return Fe.get(ve)},set(ve){return Fe.set(ve)}},Fe})():(()=>{let te=fe.kvStorageForRef(i.cardStoreRef),Fe=mr(Ut({readIndex:()=>te.read("_index"),writeIndex:ve=>te.write("_index",ve),readCard:ve=>te.read(ve),writeCard:(ve,Tr)=>(te.write(ve,Tr),ve),removeCard:ve=>{te.delete(ve);},cardExists:ve=>te.read(ve)!==null,defaultCardKey:ve=>ve},d.warn),{emitNotification:ie});return Ar=Fe,U(Fe)})(),xr;if(rt(fe)){let te=fe.blobStorageForRef(i.artifactsStoreRef);xr={async putBytes(ye,Fe){if(te.writeBytes){await te.writeBytes(ye,Fe);return}let ve=JSON.stringify({__kind:"bytes-array",data:[...Fe]});await te.write(ye,ve);},async getBytes(ye){if(te.readBytes){let ve=await te.readBytes(ye);if(ve!==null)return ve}let Fe=await te.read(ye);if(Fe===null)return null;try{let ve=JSON.parse(Fe);if(ve&&ve.__kind==="bytes-array"&&Array.isArray(ve.data))return new Uint8Array(ve.data)}catch{}return new TextEncoder().encode(Fe)},async listKeys(ye){return await te.listKeys(ye)}};}else {let te=fe.blobStorageForRef(i.artifactsStoreRef),ye=Zn(te);xr={putBytes(Fe,ve,Tr){ye.putBytes(Fe,ve,Tr);},getBytes(Fe){return ye.getBytes(Fe)},listKeys(Fe){return ye.list(Fe).map(ve=>ve.key)}};}let To={async init(te){return Te.init(te)},async status(te){return Te.status(te)},async getConfig(te){return Te.getConfig(te)},async getAllOutputsDataObjects(te){return Te.getAllOutputsDataObjects(te)},async getAllOutputsComputedValues(te){return Te.getAllOutputsComputedValues(te)},async getOutputsFetchedSources(te){return Te.getOutputsFetchedSources(te)},async buildSseOneShotPayload(te){return Te.buildSseOneShotPayload(te)},async upsertCard(te){return Te.upsertCard(te)},async removeCard(te){return Te.removeCard(te)},async sourceDataFetched(te){return Te.sourceDataFetched(te)},async sourceDataFetchFailure(te){return Te.sourceDataFetchFailure(te)}};return Y={label:i.label,board:Te,nonCore:Ge,publicCardStore:Ar,boardOps:To,cardStoreOps:xo,get filesArtifacts(){return xr},get chatStorage(){return Ao},boardAdapter:fe,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:ao(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},Y}let s=e.boards.map(l),c=new Map;function m(i){return c.get(i)??0}function p(i){return i.queueStoreRef}function h(i,v){if(rt(i.boardAdapter)){let U=i.boardAdapter.queueStorageForRef(p(i),v);return Kr(U)}let E=i.boardAdapter.queueStorageForRef(p(i),v);return Jr(E)}function T(i){let v=i;return typeof v.invokeExecutor=="function"&&typeof v.validateSchema=="function"}function O(i){let v=s[m(i)];return {files:v?v.filesArtifacts:null}}function N(){return eo()}function $(i){return String(i||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function J(i){return "cardId"in i&&typeof i.cardId=="string"?y(i.cardId)??void 0:s[0]??void 0}function oe(i){for(let v of i){let E=J(v);if(E)return E}return s[0]??void 0}function pe(i,v={}){if(!i||i.length===0)return;let E=$e(i),U={kind:"notification-batch",notifications:E},H=v.ctx??oe(E);if(v.appendState!==false&&H&&so(H.notification,U),v.broadcastSse!==false){let Y=E.filter(fe=>fe.kind==="message_enqueued"),ie=E.filter(fe=>fe.kind!=="message_enqueued");ie.length>0&&x.broadcastNotificationBatch(ie),Y.length>0&&g.broadcastNotificationBatch(Y);}if(!(v.mirrorExternal===false||!H?.boardAdapter.publishBoardChangeNotifications))try{let Y=E.filter(ie=>ie.category==="board-output"||ie.category==="card-store"||ie.category==="chat-store"||ie.category==="hosted-runtime");Y.length>0&&H.boardAdapter.publishBoardChangeNotifications(Y);}catch{}}function Z(i,v){pe(i,{ctx:v,appendState:true,broadcastSse:true,mirrorExternal:true});}async function ae(i){if(!i||i.notificationTeardown||!k||!i.notifyRef)return;let v=await k.subscribe(i.notifyRef,E=>{let U=ro(E);pe(U,{ctx:i,appendState:true,broadcastSse:true,mirrorExternal:false});});i.notificationTeardown=v;}async function re(i){if(!i||i.initialized)return;let v={boardRuntimeStoreRef:i.boardRuntimeStoreRef,cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef,fetchedSourcesStoreRef:i.fetchedSourcesStoreRef,artifactsStoreRef:i.artifactsStoreRef,queueStoreRef:i.queueStoreRef,chatStoreRef:i.chatStoreRef,scratchStoreRef:i.scratchStoreRef},E={};i.taskExecutorRef&&(E["task-executor-ref"]=i.taskExecutorRef),i.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=i.chatHandlerFlow);let U=await i.boardOps.init({params:v,body:E});if(U.status!=="success")throw Object.assign(new Error(U.error||`init failed for ${i.label}`),{statusCode:500});if(await ae(i),!i.chatHandlerFlow&&i.chatHandlerRef&&f.describe)try{let H=await f.describe(i.chatHandlerRef);H&&H.kind!=="chat-handler"?d.warn(`[init] chat-handler describe returned kind="${H.kind}", expected "chat-handler" for ${i.label}`):H&&d.info(`[init] chat-handler validated: ${H.name} (protocol ${H.protocolVersion}) for ${i.label}`);}catch(H){d.warn(`[init] chat-handler describe failed for ${i.label}: ${H?.message||String(H)}`);}i.initialized=true;}async function G(i){let v=[],E=await i.boardOps.status({});E.status==="success"&&E.data!=null&&Qr(E.data)&&v.push({kind:"status",status:E.data});let U=await i.boardOps.getAllOutputsDataObjects({});if(U.status==="success"&&U.data!=null)for(let[Y,ie]of Object.entries(U.data))Y&&v.push({kind:"data_object",key:Y,payload:ie});let H=await i.boardOps.getAllOutputsComputedValues({});if(H.status==="success"&&H.data!=null)for(let[Y,ie]of Object.entries(H.data))Y&&ie&&typeof ie=="object"&&!Array.isArray(ie)&&v.push({kind:"computed_values",cardId:Y,values:ie});v.length>0&&pe(v,{ctx:i,appendState:true,broadcastSse:true,mirrorExternal:false});}async function z(i,v){if(!i||i.cardsBootstrapped)return;let E=await i.cardStoreOps.get({}),U=E.status==="success"&&Array.isArray(E.data?.cards)?E.data.cards:[];for(let H of U)typeof H.id=="string"&&(c.set(H.id,v),await i.boardOps.upsertCard({params:{cardId:H.id}}));i.cardsBootstrapped=true;}async function B(){for(let i of s)await re(i);}async function w(){await B();for(let i=0;i<s.length;i++)await G(s[i]),await z(s[i],i),await G(s[i]);}async function K(i=false){i||await B();for(let v of s){let E=await v.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}function y(i){return s[m(i)]??null}async function S(i){let v=y(i);if(!v)return null;let E=await v.cardStoreOps.get({params:{id:i}});if(E.status!=="success")return null;let U=Array.isArray(E.data?.cards)?E.data.cards:[];return U.length>0?U[0]:null}async function F(){let i=async E=>{if(!E)return [];let U=await E.cardStoreOps.get({});return U.status!=="success"||!Array.isArray(U.data?.cards)?[]:U.data.cards},v=[];for(let E of s)v.push(...await i(E));return v}function M(){return s[0]??null}function L(i){return y(i)??M()}function D(i){let v=L(i);if(!v)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${i}`),{statusCode:404});return v.chatStorage}async function ee(i){return await D(i).isProcessing(i)}async function ue(i,v){let E=await Se.setProcessing({params:{cardId:i},body:{active:v}});if(E.status!=="success")throw Object.assign(new Error(E.error||`Failed to set chat processing for card: ${i}`),{statusCode:500})}let Se=to({append(i,v,E,U,H){return D(i).append(i,v,E,U,H)},readAll(i){return D(i).readAll(i)},readAfter(i,v){return D(i).readAfter(i,v)},clear(i){return D(i).clear(i)},setProcessing(i,v){return D(i).setProcessing(i,v)},isProcessing(i){return D(i).isProcessing(i)},getConfig(i){return D(i).getConfig(i)},setConfig(i,v){return D(i).setConfig(i,v)}},{emitNotification(i){if(i.kind==="notification-batch"){Z(i.notifications);return}Z([i]);}}),Ie=ho({boardContexts:s,cardOwnerIndex:c,cardContextForCard:i=>y(i),readStatusSnapshot:()=>Re(),readDataObjectsByToken:()=>Qe(),readCardRuntimeArtifacts:()=>et(),readCardFromStore:i=>S(i),readCardDefinitions:()=>F(),processAccumulatedLaneInternal:i=>K(i),reportSourceFetched:(i,v)=>Jt(i,{ref:v}),reportSourceFetchFailure:(i,v)=>Tt(i,{reason:v}),uploadCardFile:(i,v,E,U,H)=>se(i,v,E,U,H),chatStorePublic:Se,serverUrl:R,apiBasePath:t}),Ee=Ie.mcpCardStoreFacade,ge=Ie.createMcpFacade,ke=io({boardId:o,bootstrapBoard:()=>w(),sseHub:x,onChannelSubscribed:_,onChannelUnsubscribed:A,getMcpFacade:()=>ge(),getMcpCardStoreFacade:()=>Ee()});function Ve(i){return lo(i)}function we(){return fo(ge())}function Ke(){return mo({boardId:o,uploadCardFile:se,uploadCardFilesMultiple:Ce,getMcpFacade:()=>ge(),controlplane:ke})}let Ne=uo({boardId:o,boardContexts:s,readChatRecords:(i,v)=>ne(i,v),getChatProcessing:i=>ee(i),chatBootstrapTailTurns:a}),Re=Ne.readStatusSnapshot,et=Ne.readCardRuntimeArtifacts,Qe=Ne.readDataObjectsByToken,tt=Ne.buildPublishedRuntimePayload;async function yt(i,v,E){let U=E?.syncBoard!==false,H=E?.restartOnlyIfChanged===true,Y=y(i);if(!Y)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let ie=await S(i);if(!ie)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let fe=H?JSON.stringify(ie):null,Je=v(ie)||ie;if(H&&JSON.stringify(Je)===fe)return;let Te=await Y.cardStoreOps.set({body:Je});if(Te.status!=="success")throw Object.assign(new Error(Te.error||`Failed to persist card: ${i}`),{statusCode:500});if(U){let Ge=await Y.boardOps.upsertCard({params:{cardId:i,restart:true}});if(Ge.status!=="success")throw Object.assign(new Error(Ge.error||`Failed to upsert card: ${i}`),{statusCode:500})}}async function j(i,v){await yt(i,v,{syncBoard:true});}async function I(i,v){await yt(i,v,{syncBoard:false});}async function Q(i){let v=y(i);if(!v)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});if(!await S(i))throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let U=await v.boardOps.upsertCard({params:{cardId:i,restart:true}});if(U.status!=="success")throw Object.assign(new Error(U.error||`Failed to retrigger card: ${i}`),{statusCode:500})}async function q(i){let v=await Se.clear({params:{cardId:i}});if(v.status!=="success")throw Object.assign(new Error(v.error||`Failed to clear chat records for card: ${i}`),{statusCode:500});try{await ue(i,!1);}catch{}}async function V(i,v,E,U,H=""){let Y=typeof E=="string"?E.trim():"",ie=await Se.append({params:{cardId:i},body:{role:v||"system",text:Y,files:U,turn:H}});if(ie.status!=="success")throw Object.assign(new Error(ie.error||`Failed to append chat record for card: ${i}`),{statusCode:500});return String(ie.data?.id||"")}async function ne(i,v){let E=Number.isInteger(v?.tailTurns)&&v?.tailTurns>0?v?.tailTurns:void 0,U=await Se.readAll({params:{cardId:i},...E===void 0?{}:{body:{tailTurns:E}}});if(U.status!=="success")throw Object.assign(new Error(U.error||`Failed to read chat records for card: ${i}`),{statusCode:500});return Array.isArray(U.data?.records)?U.data.records:[]}let ce=co({safeCardId:i=>$(i),artifactsStores:i=>O(i),cardFileMetadataStore:()=>N(),readCardFromStore:i=>S(i),updateCardLocalOnly:(i,v)=>I(i,v),writeChatRecord:(i,v,E,U,H)=>V(i,v,E,U,H)}),se=ce.uploadCardFile,Ce=ce.uploadCardFilesMultiple;async function Be(i){let v=y(i);if(!v)return null;let E=await v.boardOps.getConfig({params:{key:"chat-handler-flow"}}),H=(E.status==="success"?E.data?.value:null)??v.chatHandlerFlow??null,Y=v.chatHandlerRef;return H==null&&(!Y||typeof Y!="object")?null:{ctx:v,handlerFlow:H,handlerRef:Y}}function Me(i){let v=typeof i=="string"?i.trim():"";if(v.length<Ht.length*2||!v.startsWith(Ht)||!v.endsWith(Ht))return null;let E=v.slice(Ht.length,v.length-Ht.length).trim(),U=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(E);return U?{assistant:U[1].trim().toLowerCase(),text:U[2].trim()}:{assistant:"echo",text:E}}async function Le(i,v,E=false,U="",H=""){try{let Y=await Be(i);if(!Y){try{await ue(i,!1);}catch{}return}let{ctx:ie,handlerFlow:fe,handlerRef:Je}=Y;if(!E)try{await ue(i,!0);}catch{}let Te={boardId:o,cardId:String(i),lastChatEntryId:v,...U?{turnId:U}:{},...typeof H=="string"&&H.trim()?{probe:H.trim()}:{},...C,...R?{serverUrl:R}:{}},Ge=fe!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:So}}:Je;rt(ie.boardAdapter)?await h(ie,"chat-agent").enqueueRequest({boardId:o,ref:Ge,args:fe!=null?{...Te,__chatHandlerFlow:fe}:Te}):h(ie,"chat-agent").enqueueRequest({boardId:o,ref:Ge,args:fe!=null?{...Te,__chatHandlerFlow:fe}:Te}),await Promise.resolve(ie.boardAdapter.requestProcessAccumulated?.());}catch(Y){try{await ue(i,!1);}catch{}d.warn(`[chat-handler] queue failed for card "${i}": ${Y instanceof Error?Y.message:String(Y)}`);}}async function De(i,v,E){if(v.howToRun==="built-in"&&sn(v)===So){let U=u,H=E.__chatHandlerFlow,Y={...E};return delete Y.__chatHandlerFlow,U?U.run(H,Y,{boardId:o,cardId:String(Y.cardId||""),label:i.label,logger:d,serverUrl:R,executionExtra:C}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return f.invoke(v,E)}async function Xe(i,v=false){v||await B();let E=typeof i.args?.cardId=="string"?i.args.cardId:"",U=E?y(E):M();if(!U)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let H=await De(U,i.ref,i.args);if(!H.dispatched){if(E)try{await ue(E,!1);}catch{}throw new Error(H.error||`chat-agent dispatch failed for card "${E||"unknown"}"`)}}async function it(i,v,E){if(v==="chat-send"){let H=E&&typeof E["turn-id"]=="string"?E["turn-id"]:E&&typeof E.turnId=="string"?E.turnId:E&&typeof E.turn=="string"?E.turn:"";if(E&&"files"in E&&E.files!==void 0&&E.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let Y=Ke(),ie=Me(E?.text),fe=ie?ie.text:E?.text,Je=await gt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:i,role:"user",text:fe,turn_id:H,files:[]},Y);if(Je?.status!=="success")throw new Error(nt(Je,`chat-send append failed for card ${i}`));let Te=Je?.data?.id;if(typeof Te!="string"||!Te)throw new Error(`chat-send did not return an append id for card ${i}`);let Ge=await gt("setstate.chat-processing-started",{board_id:o,card_id:i},Y);if(Ge?.status!=="success")throw new Error(nt(Ge,`chat-send processing update failed for card ${i}`));Le(i,Te,true,H,ie?.assistant||"");return}await j(i,H=>{let Y=new Date().toISOString(),ie=H.card_data&&typeof H.card_data=="object"?H.card_data:{};if(H.card_data=ie,v==="file-upload"){let fe=N().normalizeIncoming(E?.files,Y);return fe.length>0&&N().merge(ie,fe),H}if(v==="action"){let fe=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!fe)return H;ie.lastAction={buttonId:fe,at:Y},ie.lastActionText=`${fe} @ ${Y}`;}return H});}function He(i,v,E){let U=JSON.stringify(E),H=typeof Buffer<"u"?Buffer.byteLength(U):new TextEncoder().encode(U).length;i.writeHead(v,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":H}),i.end(U);}async function ut(i,v,E){let U=await S(i);if(!U)throw Object.assign(new Error("Card not found"),{statusCode:404});let H=N().resolve(U.card_data,v,E);if(!H.ok&&H.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!H.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let Y=H.file,ie=$(i),fe=O(i),Je=String(Y.stored_name||""),Te=`${ie}/${Je}`,Ge=fe.files?await fe.files.getBytes(Te):null;if(!Ge)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:Y,bytes:Ge}}async function Ot(i,v,E,U){let{fileRecord:H,bytes:Y}=await ut(v,E,U),ie=String(H.name||H.stored_name||"download.bin"),fe=String(H.mime_type||"application/octet-stream");i.writeHead(200,{"Content-Type":fe,"Content-Disposition":`attachment; filename="${ie}"`,"Content-Length":Y.length}),i.end(Y);}function Ft(i){let v=String(i||"").toLowerCase();return v.startsWith("text/")||v.includes("json")||v.includes("xml")||v.includes("javascript")||v.includes("typescript")||v.includes("yaml")||v.includes("csv")}function qt(i,v,E){let U=i.split(/\r?\n/);return (v==="head"?U.slice(0,E):U.slice(-E)).join(`
|
|
7
|
-
`)}async function ht(i){let v=[];for await(let U of i)v.push(U);let E=typeof Buffer<"u"?Buffer.concat(v).toString("utf-8").trim():new TextDecoder().decode(
|
|
6
|
+
`);}catch{}},15e3);h.on("close",()=>{clearInterval(d),t.disconnect(b,C);});}return {handleChannelSubscription:u,handleSse:k}}function bo(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:a,boardContexts:c,publishPersistedStateSnapshot:l,upsertCardsFromSource:u,sseHub:k,queueSseHub:h}=e,{handleSse:C,handleChannelSubscription:b}=tn(e),{handleSse:P}=tn({...e,sseHub:h,buildPublishedRuntimePayload:async()=>null});async function _(A,x,g){let f=A.method||"GET",s=g,d=s.pathname;try{if(f==="GET"&&d===`${t}/sse`){let O=s.searchParams.has("one-shot");await o();let N=String(s.searchParams.get("clientId")||"").trim();if(!O&&!N)return r(x,400,{error:"clientId query param is required for SSE"}),!0;if(await C(A,x,N||void 0,{oneShot:O}),O)return !0;for(let $=0;$<c.length;$++)await l(c[$]),await u(c[$],$),await l(c[$]);return !0}if(f==="GET"&&d===`${t}/sse-q`){let O=String(s.searchParams.get("clientId")||"").trim();return O?(await P(A,x,O,{bootstrapPayload:!1}),!0):(r(x,400,{error:"clientId query param is required for SSE"}),!0)}let m=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(f==="POST"&&m){await a();let O=decodeURIComponent(m[1]),N=await n(A),$=typeof N?.clientId=="string"?N.clientId.trim():"";return $?await k.subscribeChat($,O)?(r(x,200,{ok:!0,clientId:$,cardId:O,subscribed:!0}),!0):(r(x,404,{error:`SSE client not connected: ${$}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let p=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(f==="POST"&&p){await a();let O=decodeURIComponent(p[1]),N=await n(A),$=typeof N?.clientId=="string"?N.clientId.trim():"";return $?k.unsubscribeChat($,O)?(r(x,200,{ok:!0,clientId:$,cardId:O,subscribed:!1}),!0):(r(x,404,{error:`SSE client not connected: ${$}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let R=d.match(new RegExp(`^${st(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&R){await a();let O=decodeURIComponent(R[1]),N=R[2]==="subscribe",$=await n(A),Q=typeof $?.clientId=="string"?$.clientId.trim():"";return Q?(b(x,Q,O,{},N),!0):(r(x,400,{error:"clientId is required"}),!0)}let T=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&T){await a();let O=decodeURIComponent(T[1]),N=decodeURIComponent(T[2]),$=T[3]==="subscribe",Q=await n(A),oe=typeof Q?.clientId=="string"?Q.clientId.trim():"";return oe?(b(x,oe,N,{cardId:O},$),!0):(r(x,400,{error:"clientId is required"}),!0)}return !1}catch(m){let p=m?.statusCode||500;return r(x,p,{error:String(m?.message||m)}),true}}return {handleWatchersRoutes:_,handleSse:C,handleChannelSubscription:b}}var Ba=3e4;function Oa(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function So(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,a=`${t}/notify-q`;async function c(l,u,k){if(k.pathname!==a)return false;if((l.method??"").toUpperCase()!=="POST")return o(u,405,{status:"error",error:"Method not allowed"}),true;if(!Oa(l))return o(u,403,{status:"error",error:"Forbidden"}),true;let h;try{h=await n(l);}catch{return o(u,400,{status:"error",error:"Invalid JSON body"}),true}if(!h||typeof h!="object"||!Array.isArray(h.notifications))return o(u,400,{status:"error",error:"body.notifications must be an array"}),true;let C=h.notifications,{accepted:b,rejected:P}=oo(C,Date.now(),Ba);return b.length>0&&r(b),o(u,200,{status:"success",data:{accepted:b.length,rejected:P}}),true}return {handleNotifyRoute:c}}function wo(e){return {lanes:e}}function rn(e,t){return t?{...e,...t.pollIntervalMs!=null?{pollIntervalMs:t.pollIntervalMs}:{},...t.visibilityMs!=null?{visibilityMs:t.visibilityMs}:{},...t.concurrency!=null?{concurrency:t.concurrency}:{},...t.maxAttempts!=null?{maxAttempts:t.maxAttempts}:{}}:e}function vo(e,t,r,n){return {id:e,async lease(o){return (await Promise.resolve(t.leaseRequests(o))).map(c=>({id:c.messageId,attempt:c.attempt,message:c.request,ack:()=>Promise.resolve(t.ackRequest(c.messageId,c.leaseToken)),nack:l=>Promise.resolve(t.nackRequest(c.messageId,c.leaseToken,l))}))},async handle(o){await r(o.args,o);},onError:n?(o,a)=>n(o,a.attempt,a.message):void 0}}function Fa(e,t,r,n){return {id:e,async lease(o){return (await Promise.resolve(t.lease(o))).map(c=>({id:c.id,attempt:c.attempt,message:c.body,ack:()=>Promise.resolve(t.ack(c.id,c.leaseToken)),nack:l=>Promise.resolve(t.nack(c.id,c.leaseToken,l))}))},async handle(){await r();},onError:n?(o,a)=>n(o,a.attempt):void 0}}function qa(e){let t=e.logger??{info(){},warn(){},error(){}},r=e.boardAdapter,n=e.runtime.queueLaneTuning??{},o=r.queueStorageForRef(e.queueStoreRef,"process-accumulated"),a=ze(r)?Ht(r.queueStorageForRef(e.queueStoreRef,"chat-agent")):Qt(r.queueStorageForRef(e.queueStoreRef,"chat-agent")),c=[];if(c.push(rn(Fa("process-accumulated",o,async()=>{let l=await e.runtime.__drainProcessAccumulatedLane();if(l.status!=="success")throw new Error(l.error||`__drainProcessAccumulatedLane returned ${l.status}`)},(l,u)=>{t.error(`[board-server] queued process-accumulated failed for ${e.boardId} (attempt ${u}): ${String(l&&l.message||l)}`);}),n.processAccumulated)),c.push(rn(vo("chat-agent",a,async(l,u)=>{await e.runtime.handleChatAgentRequest(u);},(l,u,k)=>{let h=typeof k.args?.cardId=="string"?k.args.cardId:"";t.error(`[board-server] queued chat-agent failed for ${e.boardId}${h?`/${h}`:""} (attempt ${u}): ${String(l&&l.message||l)}`);}),n.chatAgent)),e.executeTaskExecutorRequest){let l=ze(r)?Ht(r.queueStorageForRef(e.queueStoreRef,"task-executor")):Qt(r.queueStorageForRef(e.queueStoreRef,"task-executor"));c.push(rn(vo("task-executor",l,e.executeTaskExecutorRequest,(u,k)=>{t.error(`[board-server] queued board-worker failed for ${e.boardId} (attempt ${k}): ${String(u&&u.message||u)}`);}),n.taskExecutor));}return wo(c)}var xo={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Ao="chat-handler-flow-queue",Jt="__probe__echo__probe__";function Na(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...xo,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1,c=e.logger||{info:console.log,warn:console.warn,error:console.error},l=e.invocationAdapter,u=e.chatFlowRunner||null,k=e.notificationTransport||null,h=e.serverUrl||null,C=e.executionExtra||{},b=e.onSseClientConnected,P=e.onSseClientDisconnected,_=e.onChannelSubscribed,A=e.onChannelUnsubscribed,x=Gr({buildChatOneShotBatch:async(i,v)=>await Se.buildSseOneShotBatch({params:{cardId:i},body:{receiving:v}}),onSseClientDisconnected:P}),g=Gr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function f(i){function v(te){return {...te,queueStorageForRef(ye,Fe){return Yn(te.queueStorageForRef(ye,Fe),{lane:Fe,emitNotification:ie})}}}function E(te){return {...te,queueStorageForRef(ye,Fe){return zn(te.queueStorageForRef(ye,Fe),{lane:Fe,emitNotification:ie})}}}function U(te){return {async get(ye){return te.get(ye)},async set(ye){return te.set(ye)},async del(ye){return te.del(ye)},async patch(ye){return te.patch(ye)},async appendFiles(ye){return te.appendFiles(ye)}}}function H(te){return {async get(ye){return await te.get(ye)},async set(ye){return await te.set(ye)},async del(ye){return await te.del(ye)},async patch(ye){return await te.patch(ye)},async appendFiles(ye){return await te.appendFiles(ye)}}}let Y=null;function ie(te){if(te.kind==="notification-batch"){Z(te.notifications,Y??void 0);return}Z([te],Y??void 0);}let fe=ze(i.boardAdapter)?E(i.boardAdapter):v(i.boardAdapter),Qe=i.nonCoreAdapter??(!ze(fe)&&T(fe)?fe:null),Te=ze(fe)?Wn(i.baseRef,fe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,scratchStoreRef:i.scratchStoreRef,taskExecutorRef:i.taskExecutorRef,chatHandlerFlow:i.chatHandlerFlow,emitNotification:ie}):Dn(i.baseRef,fe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,scratchStoreRef:i.scratchStoreRef,taskExecutorRef:i.taskExecutorRef,chatHandlerFlow:i.chatHandlerFlow,emitNotification:ie}),Ge=i.nonCore??(Qe?$n(i.baseRef,Qe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,taskExecutorRef:i.taskExecutorRef}):null),Po=fe.chatStorageForRef(i.chatStoreRef),Tr,_o=ze(fe)?(()=>{let te=Sr(br(Cr(fe.kvStorageForRef(i.cardStoreRef)),fe.hashFn),c.warn),ye=hr(te,{emitNotification:ie}),Fe=H(ye);return Tr={get(ve){return Fe.get(ve)},set(ve){return Fe.set(ve)}},Fe})():(()=>{let te=fe.kvStorageForRef(i.cardStoreRef),Fe=gr(Ut({readIndex:()=>te.read("_index"),writeIndex:ve=>te.write("_index",ve),readCard:ve=>te.read(ve),writeCard:(ve,Pr)=>(te.write(ve,Pr),ve),removeCard:ve=>{te.delete(ve);},cardExists:ve=>te.read(ve)!==null,defaultCardKey:ve=>ve},c.warn),{emitNotification:ie});return Tr=Fe,U(Fe)})(),Ir;if(ze(fe)){let te=fe.blobStorageForRef(i.artifactsStoreRef);Ir={async putBytes(ye,Fe){if(te.writeBytes){await te.writeBytes(ye,Fe);return}let ve=JSON.stringify({__kind:"bytes-array",data:[...Fe]});await te.write(ye,ve);},async getBytes(ye){if(te.readBytes){let ve=await te.readBytes(ye);if(ve!==null)return ve}let Fe=await te.read(ye);if(Fe===null)return null;try{let ve=JSON.parse(Fe);if(ve&&ve.__kind==="bytes-array"&&Array.isArray(ve.data))return new Uint8Array(ve.data)}catch{}return new TextEncoder().encode(Fe)},async listKeys(ye){return await te.listKeys(ye)}};}else {let te=fe.blobStorageForRef(i.artifactsStoreRef),ye=eo(te);Ir={putBytes(Fe,ve,Pr){ye.putBytes(Fe,ve,Pr);},getBytes(Fe){return ye.getBytes(Fe)},listKeys(Fe){return ye.list(Fe).map(ve=>ve.key)}};}let Eo={async init(te){return Te.init(te)},async status(te){return Te.status(te)},async getConfig(te){return Te.getConfig(te)},async getAllOutputsDataObjects(te){return Te.getAllOutputsDataObjects(te)},async getAllOutputsComputedValues(te){return Te.getAllOutputsComputedValues(te)},async getOutputsFetchedSources(te){return Te.getOutputsFetchedSources(te)},async buildSseOneShotPayload(te){return Te.buildSseOneShotPayload(te)},async upsertCard(te){return Te.upsertCard(te)},async removeCard(te){return Te.removeCard(te)},async sourceDataFetched(te){return Te.sourceDataFetched(te)},async sourceDataFetchFailure(te){return Te.sourceDataFetchFailure(te)}};return Y={label:i.label,board:Te,nonCore:Ge,publicCardStore:Tr,boardOps:Eo,cardStoreOps:_o,get filesArtifacts(){return Ir},get chatStorage(){return Po},boardAdapter:fe,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:so(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},Y}let s=e.boards.map(f),d=new Map;function m(i){return d.get(i)??0}function p(i){return i.queueStoreRef}function R(i,v){if(ze(i.boardAdapter)){let U=i.boardAdapter.queueStorageForRef(p(i),v);return Ht(U)}let E=i.boardAdapter.queueStorageForRef(p(i),v);return Qt(E)}function T(i){let v=i;return typeof v.invokeExecutor=="function"&&typeof v.validateSchema=="function"}function O(i){let v=s[m(i)];return {files:v?v.filesArtifacts:null}}function N(){return to()}function $(i){return String(i||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function Q(i){return "cardId"in i&&typeof i.cardId=="string"?y(i.cardId)??void 0:s[0]??void 0}function oe(i){for(let v of i){let E=Q(v);if(E)return E}return s[0]??void 0}function pe(i,v={}){if(!i||i.length===0)return;let E=$e(i),U={kind:"notification-batch",notifications:E},H=v.ctx??oe(E);if(v.appendState!==false&&H&&io(H.notification,U),v.broadcastSse!==false){let Y=E.filter(fe=>fe.kind==="message_enqueued"),ie=E.filter(fe=>fe.kind!=="message_enqueued");ie.length>0&&x.broadcastNotificationBatch(ie),Y.length>0&&g.broadcastNotificationBatch(Y);}if(!(v.mirrorExternal===false||!H?.boardAdapter.publishBoardChangeNotifications))try{let Y=E.filter(ie=>ie.category==="board-output"||ie.category==="card-store"||ie.category==="chat-store"||ie.category==="hosted-runtime");Y.length>0&&H.boardAdapter.publishBoardChangeNotifications(Y);}catch{}}function Z(i,v){pe(i,{ctx:v,appendState:true,broadcastSse:true,mirrorExternal:true});}async function ae(i){if(!i||i.notificationTeardown||!k||!i.notifyRef)return;let v=await k.subscribe(i.notifyRef,E=>{let U=no(E);pe(U,{ctx:i,appendState:true,broadcastSse:true,mirrorExternal:false});});i.notificationTeardown=v;}async function re(i){if(!i||i.initialized)return;let v={boardRuntimeStoreRef:i.boardRuntimeStoreRef,cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef,fetchedSourcesStoreRef:i.fetchedSourcesStoreRef,artifactsStoreRef:i.artifactsStoreRef,queueStoreRef:i.queueStoreRef,chatStoreRef:i.chatStoreRef,scratchStoreRef:i.scratchStoreRef},E={};i.taskExecutorRef&&(E["task-executor-ref"]=i.taskExecutorRef),i.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=i.chatHandlerFlow);let U=await i.boardOps.init({params:v,body:E});if(U.status!=="success")throw Object.assign(new Error(U.error||`init failed for ${i.label}`),{statusCode:500});if(await ae(i),!i.chatHandlerFlow&&i.chatHandlerRef&&l.describe)try{let H=await l.describe(i.chatHandlerRef);H&&H.kind!=="chat-handler"?c.warn(`[init] chat-handler describe returned kind="${H.kind}", expected "chat-handler" for ${i.label}`):H&&c.info(`[init] chat-handler validated: ${H.name} (protocol ${H.protocolVersion}) for ${i.label}`);}catch(H){c.warn(`[init] chat-handler describe failed for ${i.label}: ${H?.message||String(H)}`);}i.initialized=true;}async function G(i){let v=[],E=await i.boardOps.status({});E.status==="success"&&E.data!=null&&Jr(E.data)&&v.push({kind:"status",status:E.data});let U=await i.boardOps.getAllOutputsDataObjects({});if(U.status==="success"&&U.data!=null)for(let[Y,ie]of Object.entries(U.data))Y&&v.push({kind:"data_object",key:Y,payload:ie});let H=await i.boardOps.getAllOutputsComputedValues({});if(H.status==="success"&&H.data!=null)for(let[Y,ie]of Object.entries(H.data))Y&&ie&&typeof ie=="object"&&!Array.isArray(ie)&&v.push({kind:"computed_values",cardId:Y,values:ie});v.length>0&&pe(v,{ctx:i,appendState:true,broadcastSse:true,mirrorExternal:false});}async function z(i,v){if(!i||i.cardsBootstrapped)return;let E=await i.cardStoreOps.get({}),U=E.status==="success"&&Array.isArray(E.data?.cards)?E.data.cards:[];for(let H of U)typeof H.id=="string"&&(d.set(H.id,v),await i.boardOps.upsertCard({params:{cardId:H.id}}));i.cardsBootstrapped=true;}async function B(){for(let i of s)await re(i);}async function w(){await B();for(let i=0;i<s.length;i++)await G(s[i]),await z(s[i],i),await G(s[i]);}async function K(i=false){i||await B();for(let v of s){let E=await v.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}function y(i){return s[m(i)]??null}async function S(i){let v=y(i);if(!v)return null;let E=await v.cardStoreOps.get({params:{id:i}});if(E.status!=="success")return null;let U=Array.isArray(E.data?.cards)?E.data.cards:[];return U.length>0?U[0]:null}async function F(){let i=async E=>{if(!E)return [];let U=await E.cardStoreOps.get({});return U.status!=="success"||!Array.isArray(U.data?.cards)?[]:U.data.cards},v=[];for(let E of s)v.push(...await i(E));return v}function M(){return s[0]??null}function L(i){return y(i)??M()}function D(i){let v=L(i);if(!v)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${i}`),{statusCode:404});return v.chatStorage}async function ee(i){return await D(i).isProcessing(i)}async function ue(i,v){let E=await Se.setProcessing({params:{cardId:i},body:{active:v}});if(E.status!=="success")throw Object.assign(new Error(E.error||`Failed to set chat processing for card: ${i}`),{statusCode:500})}let Se=ro({append(i,v,E,U,H){return D(i).append(i,v,E,U,H)},readAll(i){return D(i).readAll(i)},readAfter(i,v){return D(i).readAfter(i,v)},clear(i){return D(i).clear(i)},setProcessing(i,v){return D(i).setProcessing(i,v)},isProcessing(i){return D(i).isProcessing(i)},getConfig(i){return D(i).getConfig(i)},setConfig(i,v){return D(i).setConfig(i,v)}},{emitNotification(i){if(i.kind==="notification-batch"){Z(i.notifications);return}Z([i]);}}),Ie=Ro({boardContexts:s,cardOwnerIndex:d,cardContextForCard:i=>y(i),readStatusSnapshot:()=>Re(),readDataObjectsByToken:()=>Je(),readCardRuntimeArtifacts:()=>tt(),readCardFromStore:i=>S(i),readCardDefinitions:()=>F(),processAccumulatedLaneInternal:i=>K(i),reportSourceFetched:(i,v)=>Gt(i,{ref:v}),reportSourceFetchFailure:(i,v)=>Tt(i,{reason:v}),uploadCardFile:(i,v,E,U,H)=>se(i,v,E,U,H),chatStorePublic:Se,serverUrl:h,apiBasePath:t}),Ee=Ie.mcpCardStoreFacade,ge=Ie.createMcpFacade,ke=uo({boardId:o,bootstrapBoard:()=>w(),sseHub:x,onChannelSubscribed:_,onChannelUnsubscribed:A,getMcpFacade:()=>ge(),getMcpCardStoreFacade:()=>Ee()});function Ve(i){return fo(i)}function we(){return mo(ge())}function Ke(){return po({boardId:o,uploadCardFile:se,uploadCardFilesMultiple:Ce,getMcpFacade:()=>ge(),controlplane:ke})}let Ne=co({boardId:o,boardContexts:s,readChatRecords:(i,v)=>ne(i,v),getChatProcessing:i=>ee(i),chatBootstrapTailTurns:a}),Re=Ne.readStatusSnapshot,tt=Ne.readCardRuntimeArtifacts,Je=Ne.readDataObjectsByToken,rt=Ne.buildPublishedRuntimePayload;async function yt(i,v,E){let U=E?.syncBoard!==false,H=E?.restartOnlyIfChanged===true,Y=y(i);if(!Y)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let ie=await S(i);if(!ie)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let fe=H?JSON.stringify(ie):null,Qe=v(ie)||ie;if(H&&JSON.stringify(Qe)===fe)return;let Te=await Y.cardStoreOps.set({body:Qe});if(Te.status!=="success")throw Object.assign(new Error(Te.error||`Failed to persist card: ${i}`),{statusCode:500});if(U){let Ge=await Y.boardOps.upsertCard({params:{cardId:i,restart:true}});if(Ge.status!=="success")throw Object.assign(new Error(Ge.error||`Failed to upsert card: ${i}`),{statusCode:500})}}async function j(i,v){await yt(i,v,{syncBoard:true});}async function I(i,v){await yt(i,v,{syncBoard:false});}async function J(i){let v=y(i);if(!v)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});if(!await S(i))throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let U=await v.boardOps.upsertCard({params:{cardId:i,restart:true}});if(U.status!=="success")throw Object.assign(new Error(U.error||`Failed to retrigger card: ${i}`),{statusCode:500})}async function q(i){let v=await Se.clear({params:{cardId:i}});if(v.status!=="success")throw Object.assign(new Error(v.error||`Failed to clear chat records for card: ${i}`),{statusCode:500});try{await ue(i,!1);}catch{}}async function V(i,v,E,U,H=""){let Y=typeof E=="string"?E.trim():"",ie=await Se.append({params:{cardId:i},body:{role:v||"system",text:Y,files:U,turn:H}});if(ie.status!=="success")throw Object.assign(new Error(ie.error||`Failed to append chat record for card: ${i}`),{statusCode:500});return String(ie.data?.id||"")}async function ne(i,v){let E=Number.isInteger(v?.tailTurns)&&v?.tailTurns>0?v?.tailTurns:void 0,U=await Se.readAll({params:{cardId:i},...E===void 0?{}:{body:{tailTurns:E}}});if(U.status!=="success")throw Object.assign(new Error(U.error||`Failed to read chat records for card: ${i}`),{statusCode:500});return Array.isArray(U.data?.records)?U.data.records:[]}let ce=lo({safeCardId:i=>$(i),artifactsStores:i=>O(i),cardFileMetadataStore:()=>N(),readCardFromStore:i=>S(i),updateCardLocalOnly:(i,v)=>I(i,v),writeChatRecord:(i,v,E,U,H)=>V(i,v,E,U,H)}),se=ce.uploadCardFile,Ce=ce.uploadCardFilesMultiple;async function Be(i){let v=y(i);if(!v)return null;let E=await v.boardOps.getConfig({params:{key:"chat-handler-flow"}}),H=(E.status==="success"?E.data?.value:null)??v.chatHandlerFlow??null,Y=v.chatHandlerRef;return H==null&&(!Y||typeof Y!="object")?null:{ctx:v,handlerFlow:H,handlerRef:Y}}function Me(i){let v=typeof i=="string"?i.trim():"";if(v.length<Jt.length*2||!v.startsWith(Jt)||!v.endsWith(Jt))return null;let E=v.slice(Jt.length,v.length-Jt.length).trim(),U=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(E);return U?{assistant:U[1].trim().toLowerCase(),text:U[2].trim()}:{assistant:"echo",text:E}}async function Le(i,v,E=false,U="",H=""){try{let Y=await Be(i);if(!Y){try{await ue(i,!1);}catch{}return}let{ctx:ie,handlerFlow:fe,handlerRef:Qe}=Y;if(!E)try{await ue(i,!0);}catch{}let Te={boardId:o,cardId:String(i),lastChatEntryId:v,...U?{turnId:U}:{},...typeof H=="string"&&H.trim()?{probe:H.trim()}:{},...C,...h?{serverUrl:h}:{}},Ge=fe!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:Ao}}:Qe;ze(ie.boardAdapter)?await R(ie,"chat-agent").enqueueRequest({boardId:o,ref:Ge,args:fe!=null?{...Te,__chatHandlerFlow:fe}:Te}):R(ie,"chat-agent").enqueueRequest({boardId:o,ref:Ge,args:fe!=null?{...Te,__chatHandlerFlow:fe}:Te}),await Promise.resolve(ie.boardAdapter.requestProcessAccumulated?.());}catch(Y){try{await ue(i,!1);}catch{}c.warn(`[chat-handler] queue failed for card "${i}": ${Y instanceof Error?Y.message:String(Y)}`);}}async function De(i,v,E){if(v.howToRun==="built-in"&&un(v)===Ao){let U=u,H=E.__chatHandlerFlow,Y={...E};return delete Y.__chatHandlerFlow,U?U.run(H,Y,{boardId:o,cardId:String(Y.cardId||""),label:i.label,logger:c,serverUrl:h,executionExtra:C}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return l.invoke(v,E)}async function Ze(i,v=false){v||await B();let E=typeof i.args?.cardId=="string"?i.args.cardId:"",U=E?y(E):M();if(!U)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let H=await De(U,i.ref,i.args);if(!H.dispatched){if(E)try{await ue(E,!1);}catch{}throw new Error(H.error||`chat-agent dispatch failed for card "${E||"unknown"}"`)}}async function it(i,v,E){if(v==="chat-send"){let H=E&&typeof E["turn-id"]=="string"?E["turn-id"]:E&&typeof E.turnId=="string"?E.turnId:E&&typeof E.turn=="string"?E.turn:"";if(E&&"files"in E&&E.files!==void 0&&E.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let Y=Ke(),ie=Me(E?.text),fe=ie?ie.text:E?.text,Qe=await gt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:i,role:"user",text:fe,turn_id:H,files:[]},Y);if(Qe?.status!=="success")throw new Error(nt(Qe,`chat-send append failed for card ${i}`));let Te=Qe?.data?.id;if(typeof Te!="string"||!Te)throw new Error(`chat-send did not return an append id for card ${i}`);let Ge=await gt("setstate.chat-processing-started",{board_id:o,card_id:i},Y);if(Ge?.status!=="success")throw new Error(nt(Ge,`chat-send processing update failed for card ${i}`));Le(i,Te,true,H,ie?.assistant||"");return}await j(i,H=>{let Y=new Date().toISOString(),ie=H.card_data&&typeof H.card_data=="object"?H.card_data:{};if(H.card_data=ie,v==="file-upload"){let fe=N().normalizeIncoming(E?.files,Y);return fe.length>0&&N().merge(ie,fe),H}if(v==="action"){let fe=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!fe)return H;ie.lastAction={buttonId:fe,at:Y},ie.lastActionText=`${fe} @ ${Y}`;}return H});}function He(i,v,E){let U=JSON.stringify(E),H=typeof Buffer<"u"?Buffer.byteLength(U):new TextEncoder().encode(U).length;i.writeHead(v,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":H}),i.end(U);}async function ut(i,v,E){let U=await S(i);if(!U)throw Object.assign(new Error("Card not found"),{statusCode:404});let H=N().resolve(U.card_data,v,E);if(!H.ok&&H.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!H.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let Y=H.file,ie=$(i),fe=O(i),Qe=String(Y.stored_name||""),Te=`${ie}/${Qe}`,Ge=fe.files?await fe.files.getBytes(Te):null;if(!Ge)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:Y,bytes:Ge}}async function Ot(i,v,E,U){let{fileRecord:H,bytes:Y}=await ut(v,E,U),ie=String(H.name||H.stored_name||"download.bin"),fe=String(H.mime_type||"application/octet-stream");i.writeHead(200,{"Content-Type":fe,"Content-Disposition":`attachment; filename="${ie}"`,"Content-Length":Y.length}),i.end(Y);}function Ft(i){let v=String(i||"").toLowerCase();return v.startsWith("text/")||v.includes("json")||v.includes("xml")||v.includes("javascript")||v.includes("typescript")||v.includes("yaml")||v.includes("csv")}function qt(i,v,E){let U=i.split(/\r?\n/);return (v==="head"?U.slice(0,E):U.slice(-E)).join(`
|
|
7
|
+
`)}async function ht(i){let v=[];for await(let U of i)v.push(U);let E=typeof Buffer<"u"?Buffer.concat(v).toString("utf-8").trim():new TextDecoder().decode(_r(v)).trim();return E?JSON.parse(E):{}}async function Gt(i,v){let E=typeof v.ref=="string"?v.ref.trim():"";if(!E)return {status:"fail",error:"board-worker success callback requires body.ref"};let U=s[0];return U?U.boardOps.sourceDataFetched({params:{token:i,ref:E}}):{status:"fail",error:"no board context"}}async function Tt(i,v){let E=typeof v.reason=="string"&&v.reason.trim()?v.reason:"unknown",U=s[0];return U?U.boardOps.sourceDataFetchFailure({params:{token:i,reason:E}}):{status:"fail",error:"no board context"}}let nn=bo({sseHub:x,queueSseHub:g,corsHeaders:r,json:He,buildPublishedRuntimePayload:()=>rt(),onSseClientConnected:b,onChannelSubscribed:_,onChannelUnsubscribed:A,apiBasePath:t,readJsonBody:i=>ht(i),initBoardAndSetup:()=>B(),bootstrapBoard:()=>w(),boardContexts:s,publishPersistedStateSnapshot:i=>G(i),upsertCardsFromSource:(i,v)=>z(i,v)}).handleWatchersRoutes,Wt=ko({apiBasePath:t,json:He,readJsonBody:i=>ht(i),bootstrapBoard:()=>w(),createMcpFacade:()=>ge(),createMcpToolRegistry:i=>Ve(i),resolveCardFileDownloadPayload:(i,v,E)=>ut(i,v,E),isLikelyTextMimeType:i=>Ft(i),sliceTextByLines:(i,v,E)=>qt(i,v,E)}).handleAgentfaceApi,Pt=Co({apiBasePath:t,json:He,readJsonBody:i=>ht(i),initBoardAndSetup:()=>B(),createMcpWebhookToolRegistry:()=>we()}).handleWebhooksApi,Rt=Br({apiBasePath:t,json:He,readJsonBody:i=>ht(i),bootstrapBoard:()=>w(),createMcpControlplaneToolRegistry:()=>Ke(),retriggerCard:i=>J(i),applyCardAction:(i,v,E)=>it(i,v,E),resolveChatHandlerTarget:i=>Be(i),sendCardFileDownloadResponse:(i,v,E,U)=>Ot(i,v,E,U)}).handleRuntimeApi,X=So({apiBasePath:t,emitNotifications:i=>Z(i),readJsonBody:i=>ht(i),json:(i,v,E)=>He(i,v,E)}).handleNotifyRoute;async function de(i,v,E){return !!(await Wt(i,v,E)||await Pt(i,v,E)||await nn(i,v,E)||await X(i,v,E)||await Rt(i,v,E))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:de,emitNotification(i){if(i.kind==="notification-batch"){Z(i.notifications);return}Z([i]);},buildPublishedRuntimePayload:rt,__drainProcessAccumulatedLane:K,handleChatAgentRequest:Ze,clearChatRecords:q,reportSourceFetched(i,v){return Gt(i,{ref:v})},reportSourceFetchFailure(i,v){return Tt(i,{reason:v})},get cardStore(){return s[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function ja(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...xo,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,a=new Map,c="boards-config.json";function l(){let x=n.getText(c);if(!x)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(x)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function u(x){n.putText(c,JSON.stringify(x,null,2));}function k(x){let g=String(x||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return g.length>0&&g.length<=64?g:null}function h(x){if(a.has(x))return a.get(x);let f=l().boards.find(d=>d.id===x)||{},s=o(x,f);return a.set(x,s),s}function C(x,g,f){let s=JSON.stringify(f),d=typeof Buffer<"u"?Buffer.byteLength(s):new TextEncoder().encode(s).length;x.writeHead(g,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":d}),x.end(s);}async function b(x,g,f){let s=x.method||"GET",d=f.pathname;if(s==="GET"&&d===t)return C(g,200,{ok:true,boards:l().boards}),true;if(s==="POST"&&d===t){let m=[];for await(let Q of x)m.push(Q);let p=typeof Buffer<"u"?Buffer.concat(m).toString("utf-8").trim():new TextDecoder().decode(_r(m)).trim(),R={};try{R=p?JSON.parse(p):{};}catch{R={};}let T=k(R.id);if(!T)return C(g,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let O=l();if(O.boards.some(Q=>Q.id===T))return C(g,409,{error:`Board "${T}" is already registered`}),true;let N=typeof R.label=="string"&&R.label.trim()?R.label.trim():T,$={id:T,label:N};for(let[Q,oe]of Object.entries(R))Q==="id"||Q==="label"||oe!=null&&($[Q]=oe);return O.boards.push($),u(O),C(g,200,{ok:true,board:$}),true}return false}async function P(x,g,f){let d=f.pathname.match(new RegExp(`^${st(t)}/([^/]+)(/|$)`));if(!d)return false;let m=k(decodeURIComponent(d[1]));return m?l().boards.some(T=>T.id===m)?!!await h(m).handleRuntimeApi(x,g,f):(C(g,404,{error:`Board "${m}" not registered. POST ${t} with {id} to register it first.`}),true):(C(g,400,{error:"Invalid board id"}),true)}async function _(x,g,f){return !!(await b(x,g,f)||await P(x,g,f))}function A(x){if(!l().boards.some(f=>f.id===x))throw Object.assign(new Error(`Board "${x}" not registered`),{statusCode:404});return {service:h(x)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:_,requireBoardService:A}}async function Ma(e,t){try{await e.handle(t.message,t),await t.ack();}catch(r){let n=t.attempt>=Math.max(1,Math.floor(e.maxAttempts??5));await t.nack({dead:n,reason:r instanceof Error?r.message:String(r)}),e.onError?.(r,t);}}async function To(e){let t=Math.max(1,Math.floor(e.visibilityMs??6e4)),r=Math.max(1,Math.floor(e.concurrency??1)),n=await e.lease({max:r,visibilityMs:t});for(let o of n)await Ma(e,o);return n.length}async function La(e,t){let r=Math.max(1,Math.floor(t?.maxPasses??256)),n=0;for(let o=0;o<r;o+=1){let a=await To(e);if(n+=a,a<=0)return n}throw new Error(`drainQueueLaneToIdle exceeded ${r} passes for lane "${e.id}"`)}exports.createHostedBoardQueueLaneRegistry=qa;exports.createMultiBoardServerRuntime=ja;exports.createRoutesRuntimeApi=Br;exports.createSingleBoardServerRuntime=Na;exports.drainQueueLaneOnce=To;exports.drainQueueLaneToIdle=La;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
|
|
8
8
|
//# sourceMappingURL=server-runtime-controlface.js.map
|