yaml-flow 8.9.1 → 8.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/browser/asset-integrity.json +5 -5
  2. package/browser/live-cards.schema.json +1 -6
  3. package/browser/server-runtime-controlface.js +4 -4
  4. package/lib/board-live-cards-mcp.cjs +1 -1
  5. package/lib/board-live-cards-mcp.js +1 -1
  6. package/lib/board-live-cards-node.cjs +2 -2
  7. package/lib/board-live-cards-node.js +1 -1
  8. package/lib/board-live-cards-public.cjs +1 -1
  9. package/lib/board-live-cards-public.js +1 -1
  10. package/lib/board-live-cards-server-runtime.cjs +1 -1
  11. package/lib/board-live-cards-server-runtime.js +1 -1
  12. package/lib/board-livegraph-runtime/index.cjs +1 -1
  13. package/lib/board-livegraph-runtime/index.js +1 -1
  14. package/lib/card-compute/index.cjs +1 -1
  15. package/lib/card-compute/index.d.cts +0 -1
  16. package/lib/card-compute/index.d.ts +0 -1
  17. package/lib/card-compute/index.js +1 -1
  18. package/lib/card-validation.cjs +1 -1
  19. package/lib/card-validation.js +1 -1
  20. package/lib/{chunk-32GZ4ODA.js → chunk-4VZL3GWU.js} +3 -3
  21. package/lib/{chunk-4HIEOBJC.js → chunk-7E5NKZIO.js} +2 -2
  22. package/lib/{chunk-XQAHHUZO.cjs → chunk-7W4QQX7S.cjs} +2 -2
  23. package/lib/chunk-BVQISI6G.js +3 -0
  24. package/lib/chunk-CBRVINMT.js +2 -0
  25. package/lib/chunk-E46UCDYN.js +2 -0
  26. package/lib/{chunk-OPNGCSXJ.js → chunk-GLKWEPX6.js} +2 -2
  27. package/lib/{chunk-JAL25FGA.cjs → chunk-GTHQJXYW.cjs} +2 -2
  28. package/lib/{chunk-ORBKEBNX.cjs → chunk-IRGTOCEU.cjs} +2 -2
  29. package/lib/chunk-JHXRGPL7.cjs +3 -0
  30. package/lib/{chunk-HDGEWOC2.cjs → chunk-KSKPS6OO.cjs} +2 -2
  31. package/lib/chunk-M53MX233.js +3 -0
  32. package/lib/chunk-N5RUH4NG.cjs +3 -0
  33. package/lib/chunk-NLC4FN7V.cjs +2 -0
  34. package/lib/{chunk-7KSENEPK.js → chunk-OEL5P7XE.js} +2 -2
  35. package/lib/{chunk-XLHMUPBW.js → chunk-RWAEV253.js} +2 -2
  36. package/lib/chunk-UG55PF75.cjs +2 -0
  37. package/lib/{chunk-INRLKWC2.cjs → chunk-WYKCHXBZ.cjs} +3 -3
  38. package/lib/chunk-YXKWIPQM.cjs +3 -0
  39. package/lib/chunk-ZA4FS27N.js +3 -0
  40. package/lib/cloud-storage.cjs +1 -1
  41. package/lib/cloud-storage.js +1 -1
  42. package/lib/continuous-event-graph/index.cjs +1 -1
  43. package/lib/continuous-event-graph/index.js +1 -1
  44. package/lib/firestore-storage/index.cjs +1 -1
  45. package/lib/firestore-storage/index.js +1 -1
  46. package/lib/index.cjs +2 -2
  47. package/lib/index.js +1 -1
  48. package/lib/localstorage-storage/index.cjs +1 -1
  49. package/lib/localstorage-storage/index.js +1 -1
  50. package/lib/server-runtime/index.cjs +1 -1
  51. package/lib/server-runtime/index.js +1 -1
  52. package/lib/server-runtime-controlface/index.cjs +1 -1
  53. package/lib/server-runtime-controlface/index.js +1 -1
  54. package/lib/server-runtime-core/index.cjs +1 -1
  55. package/lib/server-runtime-core/index.js +1 -1
  56. package/package.json +1 -1
  57. package/schema/live-cards.schema.json +1 -6
  58. package/lib/chunk-3KC6LBOG.js +0 -3
  59. package/lib/chunk-FO4KNVU7.cjs +0 -2
  60. package/lib/chunk-HWYMZK3N.cjs +0 -3
  61. package/lib/chunk-IXZG74EW.cjs +0 -2
  62. package/lib/chunk-JMDHDY6M.js +0 -2
  63. package/lib/chunk-RP2I3OLA.cjs +0 -3
  64. package/lib/chunk-TMS7KDKH.js +0 -3
  65. package/lib/chunk-UIUCNV3X.cjs +0 -3
  66. package/lib/chunk-VS4E7QFN.js +0 -3
  67. package/lib/chunk-YBYXCFAI.js +0 -2
@@ -1,8 +1,8 @@
1
- var ServerRuntimeControlface=(function(exports){'use strict';var Ro=Object.defineProperty;var ko=(e,t,r)=>t in e?Ro(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Qr=(e,t,r)=>ko(e,t+"",r);var Dt="b64:";function Co(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function bo(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ke(e){return `${Dt}${Co(JSON.stringify(e))}`}function at(e){if(!e.startsWith(Dt))throw new Error(`Invalid ref format (expected ${Dt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(bo(e.slice(Dt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Wr(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function tt(e){return typeof e.journalStorage=="function"}function zr(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?at(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function ot(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wr(e){let t=e.reduce((o,s)=>o+s.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}function le(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function st(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function it(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function ft(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function $t(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let s=Number(o);if(Number.isFinite(s))return s}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Yr(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function mt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,c=s.status;if(c==="success")return Object.prototype.hasOwnProperty.call(s,"data")?o:{status:"success",data:{}};if(c==="fail"||c==="error")return o}return {status:"success",data:o}}function rt(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let s=n.data;if(s&&typeof s=="object"&&!Array.isArray(s)){let c=s.issues;if(Array.isArray(c)){let m=c.find(p=>typeof p=="string"&&p.trim());if(typeof m=="string")return `Validation failed: ${m}`}let u=s.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function vr(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,buildPublishedRuntimePayload:c,createMcpControlplaneToolRegistry:u,retriggerCard:m,applyCardAction:p,resolveChatHandlerTarget:R,sendCardFileDownloadResponse:S}=e;async function A(B,x,_){let I=B.method||"GET",y=_,d=y.pathname;try{if(I==="POST"&&d===`${t}/mcp-actions`){await s();let f=Date.now(),k=new Date(f).toISOString(),v=await n(B),O=typeof v.tool=="string"?v.tool.trim():"",M=v.args&&typeof v.args=="object"&&!Array.isArray(v.args)?v.args:{};if(!O)return r(x,400,{error:"tool is required"}),!0;let D=le(M,"card_id");if(!D)return r(x,400,{error:"MCP action requires card_id"}),!0;if(O==="retrigger-card"||O==="retrigger"){await m(D);let se=Date.now();return r(x,200,{status:"success",data:{ok:!0,cardId:D,actionType:O,requestReceivedAt:k,requestReceivedAtMs:f,responseSentAt:new Date(se).toISOString(),responseSentAtMs:se,responseStatus:200}}),!0}let J=it(M,"payload");if(O==="chat-send"&&!await R(D)){let se=Date.now();return r(x,409,{error:`chat handler is not configured for card: ${D}`,requestReceivedAt:k,requestReceivedAtMs:f,responseSentAt:new Date(se).toISOString(),responseSentAtMs:se,responseStatus:409}),!0}if(O==="chat-send"){let se=typeof J["turn-id"]=="string"?J["turn-id"]:typeof J.turnId=="string"?J.turnId:typeof J.turn=="string"?J.turn:"";if(!se||!String(se).trim()){let te=Date.now();return r(x,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${D}`,requestReceivedAt:k,requestReceivedAtMs:f,responseSentAt:new Date(te).toISOString(),responseSentAtMs:te,responseStatus:400}),!0}}await p(D,O,J);let ee=Date.now();return r(x,200,{status:"success",data:{ok:!0,cardId:D,actionType:O,requestReceivedAt:k,requestReceivedAtMs:f,responseSentAt:new Date(ee).toISOString(),responseSentAtMs:ee,responseStatus:200}}),!0}if(I==="POST"&&d===`${t}/mcp-controlplane`){await s();let f=await n(B),k=typeof f.tool=="string"?f.tool.trim():"",v=f.args&&typeof f.args=="object"&&!Array.isArray(f.args)?f.args:{};if(!k)return r(x,400,{error:"tool is required"}),!0;try{let O=await mt(k,v,u());if(O&&typeof O=="object"&&!Array.isArray(O)){let M=O;if(M.status==="fail")return r(x,400,{error:rt(O,"Request failed")}),!0;if(M.status==="error")return r(x,500,{error:rt(O,"Internal error")}),!0}r(x,200,O);}catch(O){let M=typeof O?.statusCode=="number"?Number(O.statusCode):500,D=O instanceof Error?O.message:String(O);r(x,M,{error:D});}return !0}let i=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/retrigger$`));if(I==="POST"&&i){await s();let f=decodeURIComponent(i[1]);return await m(f),r(x,200,{ok:!0}),!0}let l=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/actions$`));if(I==="POST"&&l){await s();let f=decodeURIComponent(l[1]),k=Date.now(),v=new Date(k).toISOString(),O=await n(B),M=O?.actionType;if(M==="chat-send"&&!await R(f)){let J=Date.now();return r(x,409,{error:`chat handler is not configured for card: ${f}`,requestReceivedAt:v,requestReceivedAtMs:k,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:409}),!0}if(M==="chat-send"){let J=O?.payload??{},ee=typeof J["turn-id"]=="string"?J["turn-id"]:typeof J.turnId=="string"?J.turnId:typeof J.turn=="string"?J.turn:"";if(!ee||!String(ee).trim()){let se=Date.now();return r(x,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${f}`,requestReceivedAt:v,requestReceivedAtMs:k,responseSentAt:new Date(se).toISOString(),responseSentAtMs:se,responseStatus:400}),!0}}await p(f,M,O?.payload);let D=Date.now();return r(x,200,{ok:!0,requestReceivedAt:v,requestReceivedAtMs:k,responseSentAt:new Date(D).toISOString(),responseSentAtMs:D,responseStatus:200}),!0}let g=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/files/(\\d+)$`));if(I==="GET"&&g){let f=decodeURIComponent(g[1]),k=parseInt(g[2],10),v=y.searchParams.get("sn");return await S(x,f,k,v),!0}return !1}catch(i){let l=i?.statusCode||500;return r(x,l,{error:String(i?.message||i)}),true}}return {handleRuntimeApi:A}}function Vt(e,t){if(!e||typeof e!="object")throw new Error(`${t}: adapter.callbackTransport is required`);if(typeof e.createCallback!="function")throw new Error(`${t}: adapter.callbackTransport.createCallback is required`)}function So(e){switch(e){case "computed_values":case "data_object":case "status":return "board-output";case "card_refreshed":case "card_removed":return "card-store";case "card_chats":case "chat_messages":return "chat-store";case "chat_processing":case "card_watchparty":return "hosted-runtime";case "message_enqueued":return "queue-storage"}}function wo(e){return e.category?e:{...e,category:So(e.kind)}}function qe(e){return e.map(t=>wo(t))}function Ne(e){return {...e,category:e.category??"batch",notifications:qe(e.notifications)}}var gt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ye(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function yt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Xr(e){return e.tasks??{}}function Ar(e){return e?e.status===gt.FAILED||e.status===gt.INACTIVATED:false}function Zr(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function en(e){return e.maxExecutions}function tn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===gt.COMPLETED){let s=e.tasks[n];s&&Ye(s).forEach(u=>r.add(u));}return Array.from(r)}function rn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Ye(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function nn(e,t,r){let n=e.tasks[t]??Ut(),o={};if(r){let c=r.tasks[t],u=yt(c);for(let m of u)for(let[p,R]of Object.entries(r.tasks))if(Ye(R).includes(m)){let S=e.tasks[p];S?.lastDataHash&&(o[m]=S.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function on(e,t,r,n,o,s){let c=e.tasks[r]??Ut(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let m;n&&u.on&&u.on[n]?m=u.on[n]:m=Ye(u);let p=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let A=u.requires??[];for(let B of A)for(let[x,_]of Object.entries(t.tasks))if(Ye(_).includes(B)){let I=e.tasks[x];I?.lastDataHash&&(p[B]=I.lastDataHash);break}}let R={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:p,error:void 0},S=[...new Set([...e.availableOutputs,...m])];return {...e,tasks:{...e.tasks,[r]:R},availableOutputs:S,lastUpdated:new Date().toISOString()}}function an(e,t,r,n){let o=e.tasks[r]??Ut(),s=t.tasks[r];if(s?.retry){let m=o.retryCount+1;if(m<=s.retry.max_attempts){let p={...o,status:"not-started",retryCount:m,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:p},lastUpdated:new Date().toISOString()}}}let c={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},u=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&c.executionCount>=s.circuit_breaker.max_executions){let m=s.circuit_breaker.on_break;u=[...new Set([...u,...m])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:u,lastUpdated:new Date().toISOString()}}function sn(e,t,r,n){let o=e.tasks[t]??Ut(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function un(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Ut(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function St(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=dn();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function vo(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:nn(n,t.taskName,r)};case "task-completed":return {config:r,state:on(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:an(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:sn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:un(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Eo(n,t.action)};case "task-upsert":return Ao(e,t.taskName,t.taskConfig);case "task-removal":return xo(e,t.taskName);case "node-requires-add":return Io(e,t.nodeName,t.tokens);case "node-requires-remove":return To(e,t.nodeName,t.tokens);case "node-provides-add":return Po(e,t.nodeName,t.tokens);case "node-provides-remove":return _o(e,t.nodeName,t.tokens);default:return e}}function cn(e,t){return t.reduce((r,n)=>vo(r,n),e)}function Ao(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:dn()},lastUpdated:new Date().toISOString()}}}function xo(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function Io(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=yt(n),s=r.filter(c=>!o.includes(c));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function To(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=yt(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function Po(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=r.filter(c=>!o.includes(c));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function _o(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function ht(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Rt(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function dn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Eo(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function Pt(e){let{config:t,state:r}=e,n=Xr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=Bo(n),c=tn(t,r.tasks),u=new Set([...c,...r.availableOutputs]),m=[],p=[],R=[],S=[];for(let[B,x]of Object.entries(n)){let _=r.tasks[B],I=Zr(x,t.settings),y=I!=="once";if(_?.status===gt.RUNNING||Ar(_))continue;let d=en(x);if(d!==void 0&&_&&_.executionCount>=d||x.circuit_breaker&&_&&_.executionCount>=x.circuit_breaker.max_executions||!y&&_?.status===gt.COMPLETED)continue;if(y&&_?.status===gt.COMPLETED){let k=yt(x),v=false;switch(I){case "data-changed":{k.length>0&&k.some(M=>{for(let[D,J]of Object.entries(n))if(Ye(J).includes(M)){let ee=r.tasks[D];if(!ee)continue;let se=_.lastConsumedHashes?.[M];return ee.lastDataHash==null?ee.executionCount>_.lastEpoch:ee.lastDataHash!==se}return false})||(v=true);break}case "epoch-changed":{k.length>0&&k.some(M=>{for(let[D,J]of Object.entries(n))if(Ye(J).includes(M)){let ee=r.tasks[D];if(ee&&ee.executionCount>_.lastEpoch)return true}return false})||(v=true);break}case "time-based":{let O=x.refreshInterval??0;if(O<=0){v=true;break}let M=_.completedAt;if(!M){v=true;break}(Date.now()-Date.parse(M))/1e3<O&&(v=true);break}case "manual":v=true;break}if(v)continue}let i=yt(x);if(i.length===0){m.push(B);continue}let l=[],g=[],f=[];for(let k of i){if(u.has(k))continue;let v=s[k]||[];v.length===0?l.push(k):v.every(M=>Ar(r.tasks[M]))?f.push({token:k,failedProducer:v[0]}):g.push(k);}l.length>0?R.push({taskName:B,missingTokens:l}):f.length>0?S.push({taskName:B,failedTokens:f.map(k=>k.token),failedProducers:[...new Set(f.map(k=>k.failedProducer))]}):g.length>0?p.push({taskName:B,waitingOn:g}):m.push(B);}let A={};if(m.length>1){let B=rn(m,n);for(let[x,_]of Object.entries(B))_.length>1&&(A[x]=_);}return {eligible:m,pending:p,unresolved:R,blocked:S,conflicts:A}}function Bo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of Ye(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var _t=class{constructor(){Qr(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function xr(e){let t=Ir(e);return Oo(t)}function Ir(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Ir).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Ir(t[n])).join(",")+"}"}function Oo(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Fo(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function qo(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ln(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Fo(t)}function No(e){try{let t=JSON.parse(qo(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Kt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:s}=t,c=new _t,u="state"in e&&"config"in e?e:St(e),m=false,p=new Set,R=new Map(Object.entries(n)),S=new _t,A=false,B=false;function x(){if(!m){if(A){B=true;return}A=true;try{do B=!1,_();while(B)}finally{A=false;}}}function _(){let i=S.drain(),l=c.drain(),g=[...i,...l];if(g.length>0&&(u=cn(u,g),o)){for(let k of g)if(k.type==="task-removal")try{o(k.taskName);}catch(v){console.warn("[reactive] onNodeRemoved failed:",v instanceof Error?v.message:String(v));}}let f=Pt(u);g.length>0&&s?.(g,u,f);for(let k of f.eligible)d(k);for(let k of g)if(k.type==="task-progress"){let{taskName:v,update:O}=k;if(!u.config.tasks[v])continue;let D=u.state.tasks[v];if(!D||D.status!=="running")continue;let J=ln(v),ee=y(v,J,O).catch(se=>{m||(S.append({type:"task-failed",taskName:v,error:se.message??String(se),timestamp:new Date().toISOString()}),x());}).finally(()=>{p.delete(ee);});p.add(ee);}}function I(i){let g=u.config.tasks[i].requires??[],f=new Map;for(let[v,O]of Object.entries(u.config.tasks))for(let M of O.provides??[])f.set(M,v);let k={};for(let v of g){let O=f.get(v);O?k[v]=u.state.tasks[O]?.data:k[v]=void 0;}return k}async function y(i,l,g){let f=u.config.tasks[i],k=f.taskHandlers??[],v=I(i);for(let O of k){let M=R.get(O);if(!M)throw new Error(`Handler '${O}' not found in registry (task '${i}')`);let D={nodeId:i,state:v,taskState:u.state.tasks[i],config:f,callbackToken:l,update:g};if(await M(D)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${i}')`)}}function d(i){let g=u.config.tasks[i]?.taskHandlers;if(!g||g.length===0)return;S.append({type:"task-started",taskName:i,timestamp:new Date().toISOString()}),x();let f=ln(i),k=y(i,f).catch(v=>{m||(S.append({type:"task-failed",taskName:i,error:v.message??String(v),timestamp:new Date().toISOString()}),x());}).finally(()=>{p.delete(k);});p.add(k);}return {push(i){m||(i.type==="task-completed"&&i.data&&!i.dataHash&&(i={...i,dataHash:xr(i.data)}),c.append(i),x());},pushAll(i){if(!m){for(let l of i)l.type==="task-completed"&&l.data&&!l.dataHash?c.append({...l,dataHash:xr(l.data)}):c.append(l);x();}},resolveCallback(i,l,g){if(m)return;let f=No(i);if(!f)return;let{taskName:k}=f;if(u.config.tasks[k]){if(g&&g.length>0)c.append({type:"task-failed",taskName:k,error:g.join("; "),timestamp:new Date().toISOString()});else {let v=l&&Object.keys(l).length>0?xr(l):void 0;c.append({type:"task-completed",taskName:k,data:l,dataHash:v,timestamp:new Date().toISOString()});}x();}},addNode(i,l){m||(c.append({type:"task-upsert",taskName:i,taskConfig:l,timestamp:new Date().toISOString()}),x());},removeNode(i){m||(c.append({type:"task-removal",taskName:i,timestamp:new Date().toISOString()}),x());},addRequires(i,l){m||(c.append({type:"node-requires-add",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},removeRequires(i,l){m||(c.append({type:"node-requires-remove",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},addProvides(i,l){m||(c.append({type:"node-provides-add",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},removeProvides(i,l){m||(c.append({type:"node-provides-remove",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},registerHandler(i,l){R.set(i,l);},unregisterHandler(i){R.delete(i);},retrigger(i){m||u.config.tasks[i]&&(c.append({type:"task-restart",taskName:i,timestamp:new Date().toISOString()}),x());},retriggerAll(i){if(!m){for(let l of i)u.config.tasks[l]&&c.append({type:"task-restart",taskName:l,timestamp:new Date().toISOString()});x();}},snapshot(){return ht(u)},getState(){return u},getSchedule(){return Pt(u)},async waitForHandlers(){p.size>0&&await Promise.allSettled([...p]);},async dispose(i){i?.wait&&p.size>0&&await Promise.allSettled([...p]),m=true;}}}function Ht(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var jo=Ht();jo("./jsonata-sync.cjs");var Lo=Ht(),Jt=Lo("./jsonata-sync.cjs"),pn=Jt;function fn(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function gn(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Mo(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await Jt(o.expr).evaluate(n);gn(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Do(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let c=pn(s.expr).evaluate(n);gn(e.computed_values,s.bindTo,c),n.computed_values=e.computed_values;}catch(c){let u=c instanceof Error?c.message:String(c);o.push({bindTo:s.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function $o(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Jt(e).evaluate(n)}function Vo(e,t){return t.startsWith("fetched_sources.")?fn(e._sourcesData??{},t.slice(16)):fn(e,t)}var mn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Uo=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Ko(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Uo.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,c)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${c}]: must be an object`);else {let u=s;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${c}]: missing required "bindTo" property`):(n.has(u.bindTo)&&t.push(`source_defs[${c}]: bindTo "${u.bindTo}" is not unique across source_defs`),n.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${c}]: missing required "outputFile" property`):(o.has(u.outputFile)&&t.push(`source_defs[${c}]: outputFile "${u.outputFile}" is not unique across source_defs`),o.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${c}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):mn.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...mn].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Ho(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=await Jt(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Jo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=pn(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Ge={run:Mo,runSync:Do,eval:$o,resolve:Vo,validate:Ko,enrichSources:Ho,enrichSourcesSync:Jo};function Gt(e){return JSON.stringify(e)}function Qt(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function Wt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Tr(e,t){return Wt(e)?e.then(t):t(e)}function hn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Pr(e,t){return {readValues(n){let o=e(n);return Tr(o.listKeys(),s=>{let c=[...s].sort();if(c.length===0)return {version:null,values:{}};let u={},m=null;for(let p of c){let R=o.read(p);Wt(R)?m=(m??Promise.resolve()).then(async()=>{u[p]=await R;}):u[p]=R;}return m?m.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,s){let c=e(n),u=null;for(let m of s){let p=c.delete(m);Wt(p)&&(u=(u??Promise.resolve()).then(()=>p).then(()=>{}));}for(let[m,p]of Object.entries(o)){let R=c.write(m,p);Wt(R)&&(u=(u??Promise.resolve()).then(()=>R).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function zt(e,t){return {readSnapshot(r){return e.readValues(r)},commitSnapshot(r,n){if(n.schemaVersion!==t)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);return Tr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let s=hn(o.values,n);return Tr(e.writeValues(r,s,n.deleteKeys),c=>({ok:true,newVersion:c}))})}}}function yn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function Rn(e){return {readEntriesAfterCursor(t){let r=yn(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return yn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function kn(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function Yt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ut(e,t){return Yt(e)?e.then(t):t(e)}function _r(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);Yt(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function Go(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function Qo(e,t){let r=e.match(t);return r?r[1]:null}function Cn(e,t,r){let n={},o=_r(e,s=>{let c=r(s);if(c)return ut(t(s),u=>{n[c]=u;})});return Yt(o)?o.then(()=>n):n}function Xt(e,t){return {readSourceData(r,n){return ut(e.read(`${r}/${n}`),Go)},ingestSourceDataStaged(r,n,o,s){return ut(t(o),c=>e.write(`${r}/.staged/${s}/${n}`,c))},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,c=`${r}/${n}`;return e.renameKey(s,c)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return ut(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function Er(e,t){let r=(n,o)=>{try{let s=o(n);return Yt(s)?s.catch(c=>t(n,c instanceof Error?c.message:String(c))):void 0}catch(s){try{return t(n,s instanceof Error?s.message:String(s))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return ut(e.read(n),s=>e.write(n,[...s??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ut(e.read(n),s=>{let c=s;if(!(!c||c.length===0))return ut(_r(c,u=>r(u,o)),()=>e.delete(n))})}}}function Br(e,t,r){return {readRuntime(n){return ut(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function Zt(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return ut(e.listKeys("cards/"),t=>Cn(t,r=>e.read(r),r=>Qo(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return _r(Object.entries(t),([r,n])=>{if(r)return n===void 0?e.delete(`data-objects/${r}`):e.write(`data-objects/${r}`,n)})},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){return ut(e.listKeys("data-objects/"),t=>Cn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function Ft(e,t){function r(){return e.readIndex()??{}}function n(o,s,c){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let m={...o},p=m;for(let R=0;R<u.length-1;R++){let S=u[R],A=p[S],B=A&&typeof A=="object"&&!Array.isArray(A)?{...A}:{};p[S]=B,p=B;}return p[u[u.length-1]]=c,m}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,c]of Object.entries(r())){if(!e.cardExists(c.key))continue;let u=e.readCard(c.key);u?o.push(u):t?.(`[card-store] could not read card "${s}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,c]of Object.entries(r()))o[s]=c.checksum;return o},changedSince(o){let s=r(),c=[];for(let[u,m]of Object.entries(s))o[u]!==m.checksum&&c.push(u);for(let u of Object.keys(o))s[u]||c.push(u);return c},validateUpsert(o,s){let c=r(),u=c[o],m=Object.entries(c).find(([,p])=>p.key===s);return u&&u.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:m&&m[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${m[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,c){let u=r(),m=c??u[o]?.key??e.defaultCardKey(o),p=e.writeCard(m,s);u[o]={key:m,checksum:p,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,s,c){let u=r(),m=u[o];if(!m||!e.cardExists(m.key))throw new Error(`card "${o}" not found`);let p=e.readCard(m.key);if(!p||typeof p!="object"||Array.isArray(p))throw new Error(`card "${o}" is not patchable`);let R=n(p,s,c),S=e.writeCard(m.key,R);u[o]={key:m.key,checksum:S,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let s=r(),c=s[o];c&&(e.removeCard(c.key),delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function er(e,t){return Xt(e,t)}function bn(e){return Rn(e)}var tr="v1",ct="board/graph",Sn="board/lastJournalProcessedId";function wn(e){return `cards/${e}/runtime`}function vn(e){return zt(e,tr)}function rr(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Qt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Gt(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){e.write("board-runtime-store-ref",r);},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){e.write("queue-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){e.write("chat-store-ref",r);},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){e.write("artifacts-store-ref",r);},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){e.write("fetched-sources-store-ref",r);}}}function An(e){return Zt(e)}function Et(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Wo(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Bt(e,t){return e?.lastRequestedToken?Wo(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Or(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Ot(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function kt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=Pt(t),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let x of s.pending)u.set(x.taskName,x.waitingOn);for(let x of s.unresolved)u.set(x.taskName,x.missingTokens);for(let x of s.blocked)u.set(x.taskName,x.failedTokens);let m=new Map;for(let[x,_]of Object.entries(n))for(let I of _.requires??[]){let y=m.get(I)??[];y.push(x),m.set(I,y);}let p=o.sort().map(x=>{let _=r[x],I=n[x]??{requires:[],provides:[]};_.status==="completed"?c.completed+=1:_.status==="failed"?c.failed+=1:_.status==="in-progress"&&(c.in_progress+=1);let y=I.requires??[],d=I.provides??[],i=Object.keys(_.data??{}).sort(),l=y.filter(M=>t.state.availableOutputs.includes(M)),g=y.filter(M=>!t.state.availableOutputs.includes(M)),f=u.get(x)??g,k=new Set;for(let M of d)for(let D of m.get(M)??[])D!==x&&k.add(D);let v=_.failedAt,O=_.error?{message:_.error,code:"TASK_FAILED",at:v,source:"task-runtime"}:void 0;return {name:x,status:_.status,error:O,requires:y,requires_satisfied:l,requires_missing:g,provides_declared:d,provides_runtime:i,blocked_by:f,unblocks:Array.from(k).sort(),runtime:{attempt_count:_.executionCount??0,restart_count:_.retryCount??0,in_progress_since:_.status==="in-progress"?_.startedAt??null:null,last_transition_at:_.lastUpdated??null,last_completed_at:_.completedAt??null,last_restarted_at:_.startedAt??null,status_age_ms:_.lastUpdated?0:null}}});c.pending=s.pending.length,c.blocked=s.blocked.length,c.unresolved=s.unresolved.length;let R=p.map(x=>({name:x.name,fanOut:x.unblocks.length})).sort((x,_)=>_.fanOut-x.fanOut||x.name.localeCompare(_.name)),S=R.length>0?R[0]:{name:null,fanOut:0},A=new Set;for(let x of Object.values(n))for(let _ of x.requires??[])A.add(_);let B=0;for(let[x,_]of Object.entries(n)){let I=(_.requires??[]).length===0,d=(_.provides??[]).some(i=>(m.get(i)??[]).some(l=>l!==x));I&&!d&&(B+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:c.completed,eligible:s.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:B,topology:{edge_count:Array.from(A).length,max_fan_out_card:S.name,max_fan_out:S.fanOut}},cards:p}}function zo(){return new Date().toISOString()}function xn(e,t,r,n,o,s,c){return async u=>{let m=[],p=r.cardStore.readCard(u.nodeId);if(!p)return "task-initiate-failure";let R=p.id,S=p.card_data??{},A=p.source_defs??[],B=A.filter(G=>G.optionalForCompletionGating!==true),x=r.cardRuntimeStore.readRuntime(R),_=false,I=()=>{_&&(r.cardRuntimeStore.writeRuntime(R,x),_=false);},y=G=>Et(x._sources[G]),d=(G,T)=>{x._sources[G]=Et(T),_=true;},i=u.taskState?.executionCount??0;if(x._lastExecutionCount!==i&&(x._sources={},x._lastExecutionCount=i,_=true),u.update){let G=u.update,T=G.outputFile;if(T){let C=y(T);if(G.failure){let K=G.rqt??C.lastRequestedToken??C.queueRequestedToken;K&&d(T,Ot(C,K));}else {let K=G.rqt;if(!C.lastCompletedToken||K>C.lastCompletedToken){let j=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,w=false;j&&(w=r.fetchedSourcesStore.commitSourceData(R,T,j)),w?d(T,Or(C,K)):d(T,Ot(C,K));}}I();}}let g={};for(let G of A)if(G.outputFile){let T=r.fetchedSourcesStore.readSourceData(R,G.outputFile);T!==null&&(g[G.bindTo]=T);}let f={};for(let[G,T]of Object.entries(u.state??{}))if(T!==null&&typeof T=="object"&&!Array.isArray(T)){let C=T[G];f[G]=C!==void 0?C:T;}else f[G]=T;let k={id:R,card_data:{...S},requires:f,source_defs:A,compute:p.compute};k._sourcesData=g,p.compute&&Ge.runSync(k,{sourcesData:g}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(R,k.computed_values??{});let v={...p},O=Ge.enrichSourcesSync(Array.isArray(p.source_defs)?p.source_defs:void 0,{card_data:p.card_data,requires:f}),M=e.value;v.source_defs=Array.isArray(O)?O.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:M})):O;let D=zo(),J=u.update?void 0:D,ee=B.filter(G=>{let T=G.outputFile;if(typeof T!="string"||!T)return true;let C=y(T);J&&(C={...C,queueRequestedToken:J},d(T,C));let K=C.queueRequestedToken??C.lastRequestedToken??D,j=Bt(C,K);return j==="in-flight"?false:j==="dispatch"});if(I(),ee.length>0){let G=false,T=D;for(let C of ee){let K=C.outputFile;if(typeof K!="string"||!K)continue;let j=y(K),w=j.queueRequestedToken??D;d(K,{...j,lastRequestedToken:w}),T=w,G=true;}return G&&I(),G&&(m.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:v,callbackToken:u.callbackToken,rqt:T}}),r.executionRequestStore.appendEntries(t,m)),"task-initiated"}if(B.some(G=>{let T=G.outputFile;if(typeof T!="string"||!T)return false;let C=y(T),K=C.queueRequestedToken??C.lastRequestedToken??D;return Bt(C,K)==="in-flight"}))return "task-initiated";let te=p.provides??[],Z={};for(let{bindTo:G,ref:T}of te)Z[G]=Ge.resolve(k,T);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(Z),A.filter(G=>{if(G.optionalForCompletionGating!==true)return false;let T=y(G.outputFile);return !T.lastRequestedToken||!T.lastCompletedToken?true:T.lastCompletedToken<=T.lastRequestedToken}).length>0&&m.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:v,callbackToken:u.callbackToken,rqt:D}}),n(u.nodeId,Z),m.length>0&&r.executionRequestStore.appendEntries(t,m),"task-initiated"}}var qt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function nr(e){return {[ct]:e.graph,[Sn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function or(e){let t=e[ct],r=e[Sn],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ct}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function ar(e){let t=e.requires;return {provides:e.provides?.map(n=>n.bindTo)??[],taskHandlers:["card-handler"],description:e.meta?.title??e.id,...t&&t.length>0?{requires:t}:{}}}function sr(e,t={}){function r(p){return {status:"success",data:p}}function n(p){return {status:"fail",error:p}}function o(p){return {status:"error",error:p instanceof Error?p.message:String(p)}}async function s(p){let R=t.emitNotification;if(!R||p.length===0)return;let S=qe(p);if(S.length===1){await R(S[0]);return}await R(Ne({kind:"notification-batch",notifications:S}));}function c(p){let R=p.params?.id;if(R){let S=e.readCard(R);if(!S)throw new Error(`card "${R}" not found`);return [S]}return e.readAllCards()}function u(p){return Ne({kind:"notification-batch",notifications:qe(p.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function m(p){if(Array.isArray(p))return p;if(p&&typeof p=="object"){let R=p;return Array.isArray(R.files)?R.files:[p]}return null}return {get(p){try{return r({cards:c(p)})}catch(R){return o(R)}},buildNotificationBatch(p){try{return r(u(c(p)))}catch(R){return o(R)}},set(p){try{let R=p.body;if(R==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(R)?R:[R];for(let A of S){if(typeof A.id!="string")return n("each card must have a string `id` field");e.writeCard(A.id,A);}return s(S.map(A=>({kind:"card_refreshed",cardId:A.id,card:A}))),r({count:S.length})}catch(R){return o(R)}},del(p){try{let R=p.body?.ids??[],S=p.params?.id,A=S?[...R,S]:R;if(A.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of A)e.removeCard(B);return s(A.map(B=>({kind:"card_removed",cardId:B}))),r({count:A.length})}catch(R){return o(R)}},patch(p){try{let R=p.params?.id,S=p.params?.path;if(!R)return n("patch requires params.id");if(!S)return n("patch requires params.path");let A=p.body,B=A&&Object.prototype.hasOwnProperty.call(A,"value")?A.value:p.body;e.patchCard(R,S,B);let x=e.readCard(R);return x?(s([{kind:"card_refreshed",cardId:R,card:x}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},appendFiles(p){try{let R=p.params?.id;if(!R)return n("appendFiles requires params.id");let S=e.readCard(R);if(!S)return n(`card "${R}" not found`);let A=m(p.body);if(!A||A.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},x=Array.isArray(B.files)?B.files:[],_=[...x,...A],I=A.map((d,i)=>({idx:x.length+i,entry:d})),y=this.patch({params:{id:R,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:I})}catch(R){return o(R)}}}}function ge(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function de(e){return {status:"fail",error:e}}function Re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Yo(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Pn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function ir(e){try{let t=JSON.parse(Pn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function In(e){return Yo(JSON.stringify(e))}function Tn(e){try{let t=JSON.parse(Pn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Xe(){return new Date().toISOString()}function Xo(e){let t=new Map;return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.get(r)??[];t.set(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.get(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(c){try{e(s,c instanceof Error?c.message:String(c));}catch{}}t.delete(r);}}}}function _n(e,t,r={}){Vt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),s=ke(e),c=r.boardRuntimeStoreRef,u=r.scratchStoreRef,m=r.taskExecutorRef,p=r.chatHandlerFlow,R=r.emitNotification??(L=>{if(!t.publishBoardChangeNotifications)return;let h=L.kind==="notification-batch"?L.notifications:[L];return t.publishBoardChangeNotifications(h)});function S(){if(!c)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return c}function A(L){if(L.length!==0)try{let h=qe(L),q=Ne({kind:"notification-batch",notifications:h}),U=R(q);U&&typeof U.catch=="function"&&U.catch(ae=>o(`[board-live-cards-public] emitNotification failed: ${ae instanceof Error?ae.message:String(ae)}`));}catch(h){o(`[board-live-cards-public] emitNotification failed: ${h instanceof Error?h.message:String(h)}`);}}function B(){let L=_().readCardStoreRef();if(!L)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let h=t.kvStorageForRef(L);return {readIndex(){return h.read("_index")},writeIndex(q){h.write("_index",q);},readCard(q){return h.read(q)},writeCard(q,U){return h.write(q,U),t.hashFn(U)},removeCard(q){h.delete(q);},cardExists(q){return h.read(q)!==null},defaultCardKey(q){return q}}}let x={readValues(L){let h=t.kvStorageForRef(S()),q=h.listKeys().sort();if(q.length===0)return {version:null,values:{}};let U={};for(let ae of q)U[ae]=h.read(ae);return {version:t.hashFn(U),values:U}},writeValues(L,h,q){let U=t.kvStorageForRef(S());for(let ae of q)U.delete(ae);for(let[ae,ne]of Object.entries(h))U.write(ae,ne);return t.hashFn(h)}},_=()=>rr(t.kvStorageForRef(S())),I=()=>vn(x),y=()=>bn(t.journalAdapterForRef(S())),d=()=>Ft(B(),o),i=()=>{let L=_().readOutputsStoreRef();if(!L)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return An(t.kvStorageForRef(L))};function l(){return m??_().readTaskExecutorRef()}function g(){return !!I().readSnapshot(e.value).values[ct]}function f(){let L=I().readSnapshot(e.value);if(!L.values[ct])throw new Error(`Board not initialized at ${e.value}`);return or(L.values)}function k(L,h){let q=I().commitSnapshot(e.value,{schemaVersion:tr,expectedVersion:h,commitId:t.genId(),committedAt:Xe(),deleteKeys:[],shallowMerge:nr(L)});if(!q.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${h??"null"} current=${q.currentVersion??"null"}`)}function v(L){y().appendEvent(L);}async function O(){let h=Xo((z,a)=>{let b=z.payload,$=(b?.enrichedCard??{}).id??b?.cardId??"unknown";v({type:"task-failed",taskName:$,error:a,timestamp:Xe()});}),q=f(),U=Rt(q.graph),{events:ae,newCursor:ne}=y().readEntriesAfterCursor(q.lastDrainedJournalId),he=j(),fe=er(he,z=>t.resolveBlob(z)),be={...q.runtimeByCardId},Pe=new Map,He={readRuntime(z){return Pe.get(z)??be[z]??{_sources:{}}},writeRuntime(z,a){Pe.set(z,a),be[z]=a;}},Je=[],De=new Map,We={readSourceData(z,a){let b=`${z}/${a}`;return De.has(b)?De.get(b):fe.readSourceData(z,a)},ingestSourceDataStaged(z,a,b,E){fe.ingestSourceDataStaged(z,a,b,E);},commitSourceData(z,a,b){let E=`${z}/.staged/${b}/${a}`,$=he.read(E);if($==null){let Y=he.keyRef?.(E);Y&&($=t.resolveBlob(Y));}if($==null)return false;let H=`${z}/${a}`,re=$.trim();try{De.set(H,JSON.parse(re));}catch{De.set(H,re);}return Je.push({cardId:z,outputFile:a,deliveryToken:b}),true},hasSource(z,a){let b=`${z}/${a}`;return De.has(b)?true:fe.hasSource(z,a)},listSources(z){let a=fe.listSources(z),b=new Set;for(let $ of De.keys())$.startsWith(`${z}/`)&&b.add($.slice(`${z}/`.length));let E=new Set([...a,...b]);return Array.from(E)}},ze={cardStore:d(),cardRuntimeStore:He,fetchedSourcesStore:We,outputStore:i(),executionRequestStore:h},dt=[],At=[],xt=[],lt=new Map,It=new Set,jt=(z,a)=>{dt.push({type:"task-completed",taskName:z,data:a,timestamp:Xe()});},Lt=(z,a)=>{v({type:"task-failed",taskName:z,error:a,timestamp:Xe()});},bt=Kt(U,{handlers:{"card-handler":xn(e,ne,ze,jt,Lt,(z,a)=>{At.push({cardId:z,values:a});},z=>{xt.push(z);})},onNodeRemoved:z=>{lt.delete(z),Pe.delete(z),delete be[z],It.add(z);}});for(dt=ae;dt.length>0;){let z=dt;dt=[];for(let a of z)if(a.type==="task-restart"){let b=ze.cardStore.readCard(a.taskName);b&&lt.set(a.taskName,b);}bt.pushAll(z),await bt.waitForHandlers();}let hr=bt.getState();await bt.dispose({wait:true});let Rr=I().readSnapshot(e.value).version;k({lastDrainedJournalId:ne,graph:ht(hr),runtimeByCardId:be},Rr);for(let{cardId:z,values:a}of At)ze.outputStore.writeComputedValues(z,a);for(let z of xt)ze.outputStore.writeDataObjects(z);for(let{cardId:z,outputFile:a,deliveryToken:b}of Je)fe.commitSourceData(z,a,b);let Tt;try{Tt=kt(s,hr),ze.outputStore.writeStatusSnapshot(Tt);}catch(z){o(`[board-live-cards-public] status publish failed: ${z instanceof Error?z.message:String(z)}`);}let pt=[];for(let{cardId:z,values:a}of At)pt.push({kind:"computed_values",cardId:z,values:a});for(let z of xt)for(let[a,b]of Object.entries(z))a&&pt.push({kind:"data_object",key:a,payload:b});for(let[z,a]of lt)pt.push({kind:"card_refreshed",cardId:z,card:a});for(let z of It)pt.push({kind:"card_removed",cardId:z});Tt!==void 0&&pt.push({kind:"status",status:Tt}),A(pt);let Ct=l()??{howToRun:"built-in",whatToRun:ke({kind:"built-in",value:"source-cli-task-executor"})},Mt=t.supportsDirectSourceOutput?.(Ct)===true;h.dispatchEntriesForJournalId(ne,z=>{if(z.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${z.taskKind}" \u2014 skipping`);return}let a=z.payload,b=a.enrichedCard?.id??"unknown",E=a.enrichedCard?.source_defs??[];if(Ct.howToRun==="queue-storage"&&Mt){try{let $=t.queueStorageForRef(M(),"task-executor"),H=typeof Ct.extra?.boardId=="string"?Ct.extra.boardId:void 0,re=[];for(let Y of E){if(!Y.outputFile){o(`[dispatch] source "${Y.bindTo}" has no outputFile \u2014 skipping`);continue}let ce=t.genId(),Me=`${b}/.staged/${ce}/${Y.outputFile}`,Ae=he.keyRef?.(Me);if(!Ae)continue;let $e={ref:ke(Ae),deliveryToken:ce,outputFile:Y.outputFile,cardId:b},kr=In({cbk:a.callbackToken,rg:e.value,br:ke(e),cid:b,b:Y.bindTo,d:Y.outputFile,cs:void 0,rqt:a.rqt,dt:$e.deliveryToken});re.push({...H?{boardId:H}:{},ref:Ct,args:{source_def:Y,base_ref:ke(e),callback:n.createCallback(kr),output:$e}});}re.length>0&&$.enqueueMany(re);}catch($){Lt(b,$ instanceof Error?$.message:String($));}return}for(let $ of E){if(!$.outputFile){o(`[dispatch] source "${$.bindTo}" has no outputFile \u2014 skipping`);continue}let H;if(Mt){let Y=t.genId(),ce=`${b}/.staged/${Y}/${$.outputFile}`,Me=he.keyRef?.(ce);Me&&(H={ref:ke(Me),deliveryToken:Y,outputFile:$.outputFile,cardId:b});}let re=In({cbk:a.callbackToken,rg:e.value,br:ke(e),cid:b,b:$.bindTo,d:$.outputFile,cs:void 0,rqt:a.rqt,...H?{dt:H.deliveryToken}:{}});t.dispatchExecution(Ct,{source_def:$,base_ref:ke(e),callback:n.createCallback(re),...H?{output:H}:{}}).catch(Y=>Lt(b,Y instanceof Error?Y.message:String(Y)));}});}function M(){let L=_().readQueueStoreRef();if(!L)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);return L}function D(){let L=t.queueStorageForRef(M(),"process-accumulated");L.enqueueIfAbsent?L.enqueueIfAbsent({boardRef:ke(e)},`process-accumulated:${ke(e)}`):L.enqueue({boardRef:ke(e)}),t.requestProcessAccumulated?.();}function J(){let L=t.queueStorageForRef(M(),"process-accumulated");for(;;){let h=L.lease({max:64,visibilityMs:1e3});if(h.length<=0)return;for(let q of h)L.ack(q.id,q.leaseToken);if(h.length<64)return}}async function ee(){try{let L=()=>{let q=f(),{events:U}=y().readEntriesAfterCursor(q.lastDrainedJournalId);U.length<=0||D();},h=await Wr(t.lock,O,L);return ge({ran:h!==!1})}catch(L){return Re(L)}}function se(){D();}function te(L){try{let h=L.params?.cardStoreRef;if(!h)return de("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(c=L.params?.boardRuntimeStoreRef,!c)return de("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!g()){let be=St(qt);k({lastDrainedJournalId:"",graph:ht(be),runtimeByCardId:{}},null);}let q=L.params?.outputsStoreRef;if(!q)return de("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let U=L.params?.queueStoreRef;if(!U)return de("init requires params.queueStoreRef \u2014 pass the queue store ref here");let ae=L.params?.fetchedSourcesStoreRef;if(!ae)return de("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");u=L.params?.scratchStoreRef;let ne=L.params?.chatStoreRef;if(!ne)return de("init requires params.chatStoreRef \u2014 pass the chat store ref here");let he=L.params?.artifactsStoreRef;if(!he)return de("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let fe=_();fe.writeBoardRuntimeStoreRef(c),fe.writeCardStoreRef(h),fe.writeOutputsStoreRef(q),fe.writeQueueStoreRef(U),fe.writeFetchedSourcesStoreRef(ae),fe.writeChatStoreRef(ne),fe.writeArtifactsStoreRef(he);try{i().writeStatusSnapshot(kt(s,Rt(f().graph)));}catch{}return ge()}catch(h){return Re(h)}}function Z(L){try{let h=i().readStatusSnapshot();if(!h){h=kt(s,Rt(f().graph));try{i().writeStatusSnapshot(h);}catch{}}return ge(h)}catch(h){return Re(h)}}function ie(L){try{let h=L.params?.id;if(!h)return de("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(h);}catch{}return v({type:"task-removal",taskName:h,timestamp:Xe()}),se(),ge()}catch(h){return Re(h)}}function G(L){try{let h=L.params?.cardId;if(!h)return de("addCardFiles requires params.cardId");let q=sr(d(),{emitNotification:R}).appendFiles({params:{id:h},body:L.body});return q.status!=="success"?q:ge({cardId:h,files_added:q.data.files_added,notified:!0})}catch(h){return Re(h)}}function T(L){try{let h=L.params?.id;return h?(v({type:"task-restart",taskName:h,timestamp:Xe()}),se(),ge()):de("retrigger requires params.id")}catch(h){return Re(h)}}async function C(L){return J(),ee()}function K(){let L=_().readFetchedSourcesStoreRef();if(!L)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return L}function j(){return t.blobStorageForRef(K())}function w(L){try{let h=L.params?.cardId,q=L.params?.all,U=!!L.params?.restart;if(!h&&!q)return de("upsertCard requires --card-id <id> or --all");let ae=q?d().readAllCards().map(ne=>ne.id):[h];for(let ne of ae)if(!d().readCard(ne))return de(`Card "${ne}" not found in board at ${e.value}`);for(let ne of ae){let he=d().readCard(ne),fe=ar(he),be=t.hashFn(fe),Pe=t.kvStorage("card-upsert"),He=Pe.read(ne),Je=He?.taskConfigHash!==be;if(!(!Je&&!U)){if(Je){let De=He?.blobRef??d().readCardKey(ne)??ne;v({type:"task-upsert",taskName:ne,taskConfig:fe,timestamp:Xe()}),Pe.write(ne,{blobRef:De,taskConfigHash:be,updatedAt:Xe()});}U&&v({type:"task-restart",taskName:ne,timestamp:Xe()});}}return se(),ge()}catch(h){return Re(h)}}function P(L){try{let h=L.params?.token;if(!h)return de("taskFailed requires params.token");let q=L.params?.error??"unknown error",U=ir(h);return U?(v({type:"task-failed",taskName:U.taskName,error:q,timestamp:Xe()}),se(),ge()):de("Invalid callback token")}catch(h){return Re(h)}}function F(L){try{let h=L.params?.token;if(!h)return de("taskProgress requires params.token");let U=(L.body??{}).update??{},ae=ir(h);return ae?(v({type:"task-progress",taskName:ae.taskName,update:U,timestamp:Xe()}),se(),ge()):de("Invalid callback token")}catch(h){return Re(h)}}function N(L){try{let h=L.params?.token,q=L.params?.ref;if(!h)return de("sourceDataFetched requires params.token");if(!q)return de("sourceDataFetched requires params.ref");let U=Tn(h);if(!U)return de("Invalid source token");let{cbk:ae,cid:ne,b:he,d:fe,cs:be,rqt:Pe,dt:He}=U,Je=er(j(),dt=>t.resolveBlob(dt)),De=He||t.genId();He||Je.ingestSourceDataStaged(ne,fe,at(q),De);let We=ir(ae);if(!We)return de("Invalid callback token embedded in source token");let ze=Xe();return v({type:"task-progress",taskName:We.taskName,update:{bindTo:he,outputFile:fe,fetchedAt:ze,deliveryToken:De,sourceChecksum:be,rqt:Pe},timestamp:ze}),se(),ge()}catch(h){return Re(h)}}function V(L){try{let h=L.params?.token,q=L.params?.reason??"unknown";if(!h)return de("sourceDataFetchFailure requires params.token");let U=Tn(h);if(!U)return de("Invalid source token");let{cbk:ae,b:ne,d:he,cs:fe,rqt:be}=U,Pe=ir(ae);return Pe?(v({type:"task-progress",taskName:Pe.taskName,update:{bindTo:ne,outputFile:he,failure:!0,reason:q,sourceChecksum:fe,rqt:be},timestamp:Xe()}),se(),ge()):de("Invalid callback token embedded in source token")}catch(h){return Re(h)}}function W(L){try{let h=_().readCardStoreRef();return h?ge({storeRef:h}):de(`Board at ${e.value} has no card store configured`)}catch(h){return Re(h)}}function oe(L){try{return ge({storeRef:c??null})}catch(h){return Re(h)}}function ue(L){try{let h=_().readOutputsStoreRef();return h?ge({storeRef:h}):de(`Board at ${e.value} has no outputs store configured`)}catch(h){return Re(h)}}function Te(L){try{return ge({storeRef:u??null})}catch(h){return Re(h)}}function Be(L){try{let h=_().readChatStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function Ee(L){try{let h=_().readArtifactsStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function ye(L){try{let h=_().readFetchedSourcesStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function Ce(L){try{let h=L.params?.key;if(!h)return de("getConfig requires params.key");let q=_(),U;switch(h){case "task-executor":U=m??null;break;case "chat-handler-flow":U=p??null;break;case "board-runtime-store-ref":U=q.readBoardRuntimeStoreRef();break;case "card-store-ref":U=q.readCardStoreRef();break;case "outputs-store-ref":U=q.readOutputsStoreRef();break;case "scratch-store-ref":U=u??null;break;case "chat-store-ref":U=q.readChatStoreRef();break;case "artifacts-store-ref":U=q.readArtifactsStoreRef();break;case "fetched-sources-store-ref":U=q.readFetchedSourcesStoreRef();break;default:return de(`getConfig: unknown key "${h}"`)}return ge({value:U})}catch(h){return Re(h)}}function je(L){try{let h=L.params?.key;if(!h)return de("getOutputsDataObject requires params.key");let q=i().readDataObject(h);return ge(q)}catch(h){return Re(h)}}function Se(L){try{return ge(i().readAllDataObjects())}catch(h){return Re(h)}}function Fe(L){try{let h=L.params?.key;if(!h)return de("getOutputsComputedValues requires params.key");let q=i().readComputedValues(h);return ge(q)}catch(h){return Re(h)}}function Le(L){try{return ge(i().readAllComputedValues())}catch(h){return Re(h)}}function pe(){return er(j(),L=>t.resolveBlob(L))}function Ze(L){let h=j().keyRef?.(L);if(!h)throw new Error("configured fetched-sources store does not support keyRef");return ke(h)}function Ke(L){try{let h=L.params?.key;if(!h)return de("getOutputsFetchedSources requires params.key");let q=pe().listSources(h),U={};for(let ae of q)U[ae]=Ze(`${h}/${ae}`);return ge(U)}catch(h){return Re(h)}}function Ve(L){try{let h=pe(),q=new Set;for(let ae of j().listKeys()){let ne=ae.indexOf("/");ne>0&&!ae.includes("/.staged/")&&q.add(ae.slice(0,ne));}let U={};for(let ae of q){let ne=h.listSources(ae);if(ne.length>0){U[ae]={};for(let he of ne)U[ae][he]=Ze(`${ae}/${he}`);}}return ge(U)}catch(h){return Re(h)}}function et(L){try{let h=d().readAllCards(),q=Z({});if(q.status!=="success")return q;let U=Se({});if(U.status!=="success")return U;let ae=Le({});if(ae.status!=="success")return ae;let ne=ae.data,he={};for(let fe of h){let be=typeof fe?.id=="string"?fe.id:null;if(!be)continue;let Pe=fe.card_data&&typeof fe.card_data=="object"&&!Array.isArray(fe.card_data)?fe.card_data:{};he[be]={schema_version:"v1",card_id:be,card_data:{...Pe},computed_values:ne[be]&&typeof ne[be]=="object"?ne[be]:{}};}return ge({cardDefinitions:h,statusSnapshot:q.data,dataObjectsByToken:U.data,cardRuntimeById:he})}catch(h){return Re(h)}}return {init:te,status:Z,getBoardRuntimeStoreRef:oe,getCardStoreRef:W,getOutputsStoreRef:ue,getScratchStoreRef:Te,getChatStoreRef:Be,getArtifactsStoreRef:Ee,getFetchedSourcesStoreRef:ye,getConfig:Ce,getOutputsDataObject:je,getAllOutputsDataObjects:Se,getOutputsComputedValues:Fe,getAllOutputsComputedValues:Le,getOutputsFetchedSources:Ke,getAllOutputsFetchedSources:Ve,buildSseOneShotPayload:et,removeCard:ie,addCardFiles:G,retrigger:T,processAccumulatedEvents:C,upsertCard:w,taskFailed:P,taskProgress:F,sourceDataFetched:N,sourceDataFetchFailure:V}}function En(e,t,r){let n=r?.taskExecutorRef,o=()=>{if(r){if(!r.boardRuntimeStoreRef)throw new Error(`Board at ${e.value} requires boardRuntimeStoreRef for non-core runtime operations.`);return rr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return rr(t.kvStorage("config"))};function s(){let d=o().readCardStoreRef();if(!d)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let i=t.kvStorageForRef(d);return {readIndex(){return i.read("_index")},writeIndex(l){i.write("_index",l);},readCard(l){return i.read(l)},writeCard(l,g){return i.write(l,g),t.hashFn(g)},removeCard(l){i.delete(l);},cardExists(l){return i.read(l)!==null},defaultCardKey(l){return l}}}let c=()=>Ft(s(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function m(d,i){let l=t.validateSchema(i),g=[],f=u();if(f&&Array.isArray(i.source_defs))for(let v of i.source_defs){let O=typeof v.bindTo=="string"?v.bindTo:"(unknown)";try{let M;try{M=await t.invokeExecutor(f,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(v)});}catch(J){let ee=J;if(M=typeof ee?.stdout=="string"?ee.stdout:"",!M.trim()){g.push(`source "${O}": executor validate-source-def failed \u2014 ${J instanceof Error?J.message:String(J)}`);continue}}let D=JSON.parse(M.trim());if(!D.ok&&Array.isArray(D.errors))for(let J of D.errors)g.push(`source "${O}": ${J}`);}catch(M){g.push(`source "${O}": executor validate-source-def failed \u2014 ${M instanceof Error?M.message:String(M)}`);}}let k=[...l.errors,...g];return ge({cardId:d,isValid:k.length===0,issues:k})}function p(d,i){let l=d.params?.sourceIdx,g=d.params?.outRef;if(l===void 0)return de(`${i} requires params.sourceIdx`);if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return de(`${i} requires card JSON object in body`);let f=d.body,k=f["card-content"]??f,v=f["mock-projections"]??{},O=k.source_defs??[];if(l<0||l>=O.length)return de(`sourceIdx ${l} out of range (card has ${O.length} source(s))`);let M=O[l],D=typeof M.bindTo=="string"?M.bindTo:"source";return {src:M,bindTo:D,outRef:g,mockProjections:v}}async function R(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return de("validateCardPreflight requires card JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)";return await m(g,l)}catch(i){return Re(i)}}async function S(d){try{let i=p(d,"probeSourcePreflight");if("status"in i)return i;let l=u();if(!l)return de("No task-executor registered for this board");try{let g={...i.src,_projections:i.mockProjections},f=await t.invokeExecutor(l,"probe-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(g)}),k=JSON.parse(f.trim());return k.ok?ge({bindTo:i.bindTo,reachable:k.reachable,latencyMs:k.latencyMs,note:k.note}):de(k.error??"Preflight probe failed")}catch{return de("Executor does not support probe-source-preflight")}}catch(i){return Re(i)}}async function A(d){try{let i=p(d,"runSourcePreflight");if("status"in i)return i;let l=u();if(!l)return de("No task-executor registered for this board");try{let g={...i.src,_projections:i.mockProjections},f=await t.invokeExecutor(l,"run-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(g)}),k=JSON.parse(f.trim());if(!k.ok)return ge({bindTo:i.bindTo,ok:!1,result:null,issues:[k.error??"Preflight run failed"]});if(i.outRef){let v=at(i.outRef);t.absoluteBlob.write(v.value,JSON.stringify(k.resultValue,null,2));}return ge({bindTo:typeof k.bindTo=="string"?k.bindTo:i.bindTo,ok:!0,result:k.resultValue??null,issues:[]})}catch(g){let f=g instanceof Error?g.message:String(g);return ge({bindTo:i.bindTo,ok:!1,result:null,issues:[f]})}}catch(i){return Re(i)}}async function B(d){try{let i=u();if(!i)return de("No task-executor registered for this board");let l=await t.invokeExecutor(i,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return ge(JSON.parse(l.trim()))}catch(i){return Re(i)}}function x(d){try{let i=d.body;if(!i||!Array.isArray(i.ops))return de("updatesInCardStore requires body.ops array");let l=i.ops,g=c();for(let f of l){let k=f.op,v=f.id;if(!v)return de('op is missing "id"');if(k==="update"){let O=f["card-content"];if(!O)return de(`update op for "${v}" is missing "card-content"`);g.writeCard(v,O);}else return de(`Unknown op type: "${k??"(none)"}"`)}return ge()}catch(i){return Re(i)}}function _(d){try{let i=d.body;if(!i||!Array.isArray(i.ids))return de("readFromCardStore requires body.ids array");let l=i.ids,g=c(),f=l.map(k=>({id:k,"card-content":g.readCard(k)}));return ge({cards:f})}catch(i){return Re(i)}}function I(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return de("evalCardCompute requires a JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)",f=i["mock-fetched-sources"]??{},k=i["mock-requires"]??{},v=l.compute;if(!v||!Array.isArray(v)||v.length===0)return ge({cardId:g,ok:!0,computed_values:{},errors:[]});let O={id:g,card_data:l.card_data??{},requires:k,source_defs:l.source_defs,compute:v},M=Ge.runSync(O,{sourcesData:f}),D=M.node.computed_values??{},J=M.errors??[];return ge({cardId:g,ok:J.length===0,computed_values:D,errors:J})}catch(i){return Re(i)}}async function y(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return de("simulateCardCycle requires a JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)",f=i["mock-fetched-sources"]??{},k=i["mock-requires"]??{},v=await m(g,l),O=v.status==="success"?{isValid:v.data.isValid,issues:v.data.issues}:{isValid:!1,issues:[v.status==="fail"?v.error:"internal error"]},M=l.source_defs??[],D=l.card_data??{},J=[],ee=[];if(M.length>0){J=Ge.enrichSourcesSync(M,{card_data:D,requires:k});for(let j of J){let w=j.projections,P=j._projections;if(w&&P){for(let F of Object.keys(w))if(P[F]===void 0){let N=typeof j.bindTo=="string"?j.bindTo:"(unknown)";ee.push({bindTo:N,key:F,error:`Projection "${F}" resolved to undefined`});}}}}let se=[],te={...f},Z=i["task-executor-ref"],ie=(Z?.howToRun&&Z?.whatToRun?Z:void 0)??u();for(let j=0;j<J.length;j++){let w=J[j],P=typeof w.bindTo=="string"?w.bindTo:`source_${j}`;if(!ie){se.push({bindTo:P,skipped:!0,error:"No task executor configured"});continue}try{let F={...w},N=await t.invokeExecutor(ie,"run-source-preflight",{timeout:w.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(F)}),V=JSON.parse(N.trim());V.ok&&!Object.prototype.hasOwnProperty.call(f,P)&&Object.prototype.hasOwnProperty.call(V,"resultValue")&&(te[P]=V.resultValue),se.push({bindTo:P,reachable:V.reachable,latencyMs:V.latencyMs,error:V.ok?void 0:V.error});}catch{se.push({bindTo:P,skipped:!0,error:"Executor does not support run-source-preflight"});}}let G=l.compute,T={},C=[];if(G&&Array.isArray(G)&&G.length>0){let j={id:g,card_data:D,requires:k,source_defs:l.source_defs,compute:G},w=Ge.runSync(j,{sourcesData:te});T=w.node.computed_values??{},C=w.errors??[];}let K=O.isValid&&ee.length===0&&C.length===0&&se.every(j=>j.reachable!==!1);return ge({cardId:g,ok:K,validation:O,source_probes:se,projection_errors:ee,fetched_sources:te,computed_values:T,compute_errors:C})}catch(i){return Re(i)}}return {validateCardPreflight:R,probeSourcePreflight:S,runSourcePreflight:A,evalCardCompute:I,simulateCardCycle:y,describeTaskExecutorCapabilities:B,updatesInCardStore:x,readFromCardStore:_}}function ur(e,t={}){function r(p){return {status:"success",data:p}}function n(p){return {status:"fail",error:p}}function o(p){return {status:"error",error:p instanceof Error?p.message:String(p)}}async function s(p){let R=t.emitNotification;if(!R||p.length===0)return;let S=qe(p);if(S.length===1){await R(S[0]);return}await R(Ne({kind:"notification-batch",notifications:S}));}async function c(p){let R=p.params?.id;if(R){let S=await e.readCard(R);if(!S)throw new Error(`card "${R}" not found`);return [S]}return await e.readAllCards()}function u(p){return Ne({kind:"notification-batch",notifications:qe(p.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function m(p){if(Array.isArray(p))return p;if(p&&typeof p=="object"){let R=p;return Array.isArray(R.files)?R.files:[p]}return null}return {async get(p){try{return r({cards:await c(p)})}catch(R){return o(R)}},async buildNotificationBatch(p){try{return r(u(await c(p)))}catch(R){return o(R)}},async set(p){try{let R=p.body;if(R==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(R)?R:[R];for(let A of S){if(typeof A.id!="string")return n("each card must have a string `id` field");await e.writeCard(A.id,A);}return await s(S.map(A=>({kind:"card_refreshed",cardId:A.id,card:A}))),r({count:S.length})}catch(R){return o(R)}},async del(p){try{let R=p.body?.ids??[],S=p.params?.id,A=S?[...R,S]:R;if(A.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of A)await e.removeCard(B);return await s(A.map(B=>({kind:"card_removed",cardId:B}))),r({count:A.length})}catch(R){return o(R)}},async patch(p){try{let R=p.params?.id,S=p.params?.path;if(!R)return n("patch requires params.id");if(!S)return n("patch requires params.path");let A=p.body,B=A&&Object.prototype.hasOwnProperty.call(A,"value")?A.value:p.body;await e.patchCard(R,S,B);let x=await e.readCard(R);return x?(await s([{kind:"card_refreshed",cardId:R,card:x}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},async appendFiles(p){try{let R=p.params?.id;if(!R)return n("appendFiles requires params.id");let S=await e.readCard(R);if(!S)return n(`card "${R}" not found`);let A=m(p.body);if(!A||A.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},x=Array.isArray(B.files)?B.files:[],_=[...x,...A],I=A.map((d,i)=>({idx:x.length+i,entry:d})),y=await this.patch({params:{id:R,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:I})}catch(R){return o(R)}}}}async function Bn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Fr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function qr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Fr(r),leaseToken:r.leaseToken,leaseExpiresAt:r.leaseExpiresAt}))},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},async peekActive(){return (await e.peekActive()).map(Fr)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Fr(t),reason:t.reason}))}}}function On(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return Qt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Gt(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){return e.write("board-runtime-store-ref",r)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){return e.write("card-store-ref",r)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){return e.write("outputs-store-ref",r)},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){return e.write("queue-store-ref",r)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){return e.write("scratch-store-ref",r)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){return e.write("chat-store-ref",r)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){return e.write("artifacts-store-ref",r)},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){return e.write("fetched-sources-store-ref",r)}}}function Zo(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function cr(e,t){return Zo(e)?e.then(t):t(e)}function Fn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=Fn(r[n],o):r[n]=o;return r}function dr(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let s=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:dr(s,o,r)}}function qn(e){return {read:r=>e.read(r),get(r,n){return cr(e.read(r),o=>{if(o===null)return null;let s=o;for(let c of n.split(".").filter(Boolean)){if(s===null||typeof s!="object"||Array.isArray(s))return null;s=s[c]??null;}return s??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return cr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return cr(e.read(r),o=>e.write(r,Fn(o??{},n)))},patch(r,n,o){return cr(e.read(r),s=>{let c=n.split(".").filter(Boolean);return e.write(r,dr(s??{},c,o))})}}}function lr(e){return qn(e)}function fr(e,t){return {async readIndex(){return await e.read("_index")},writeIndex(r){return e.write("_index",r)},async readCard(r){return await e.read(r)},async writeCard(r,n){return await e.write(r,n),t(n)},removeCard(r){return e.delete(r)},async cardExists(r){return await e.read(r)!==null},defaultCardKey(r){return r}}}function mr(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,s]of Object.entries(await r())){if(!await e.cardExists(s.key))continue;let c=await e.readCard(s.key);c?n.push(c):t?.(`[card-store] could not read card "${o}" at key "${s.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,s]of Object.entries(await r()))n[o]=s.checksum;return n},async changedSince(n){let o=await r(),s=[];for(let[c,u]of Object.entries(o))n[c]!==u.checksum&&s.push(c);for(let c of Object.keys(n))o[c]||s.push(c);return s},async validateUpsert(n,o){let s=await r(),c=s[n],u=Object.entries(s).find(([,m])=>m.key===o);return c&&c.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${c.key}", cannot remap to "${o}"`}:u&&u[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,s){let c=await r(),u=s??c[n]?.key??e.defaultCardKey(n),m=await e.writeCard(u,o);c[n]={key:u,checksum:m,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async patchCard(n,o,s){let c=await r(),u=c[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let m=await e.readCard(u.key);if(!m||typeof m!="object"||Array.isArray(m))throw new Error(`card "${n}" is not patchable`);let p=String(o||"").split(".").filter(Boolean),R=dr(m,p,s),S=await e.writeCard(u.key,R);c[n]={key:u.key,checksum:S,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async removeCard(n){let o=await r(),s=o[n];s&&(await e.removeCard(s.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function xe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ve(e){return {status:"fail",error:e}}function Ie(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Ue(){return new Date().toISOString()}function ea(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Ln(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function pr(e){try{let t=JSON.parse(Ln(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Nn(e){return ea(JSON.stringify(e))}function jn(e){try{let t=JSON.parse(Ln(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ta(e){return Br(e,wn,()=>({_sources:{}}))}function ra(e,t){return Xt(e,t)}function na(e){return Zt(e)}function oa(e,t){return Er(e,t)}function aa(e,t,r,n,o,s){return async c=>{let u=[],m=await r.cardStore.readCard(c.nodeId);if(!m)return "task-initiate-failure";let p=m.id,R=m.card_data??{},S=m.source_defs??[],A=S.filter(te=>te.optionalForCompletionGating!==true),B=await r.cardRuntimeStore.readRuntime(p),x=false,_=async()=>{x&&(await r.cardRuntimeStore.writeRuntime(p,B),x=false);},I=te=>Et(B._sources[te]),y=(te,Z)=>{B._sources[te]=Et(Z),x=true;},d=c.taskState?.executionCount??0;if(B._lastExecutionCount!==d&&(B._sources={},B._lastExecutionCount=d,x=true),c.update){let te=c.update.outputFile;if(te){let Z=I(te);if(c.update.failure){let ie=c.update.rqt??Z.lastRequestedToken??Z.queueRequestedToken;ie&&y(te,Ot(Z,ie));}else {let ie=c.update.rqt;if(!Z.lastCompletedToken||ie>Z.lastCompletedToken){let G=typeof c.update.deliveryToken=="string"?c.update.deliveryToken:void 0,T=G?await r.fetchedSourcesStore.commitSourceData(p,te,G):false;y(te,T?Or(Z,ie):Ot(Z,ie));}}await _();}}let i={};for(let te of S){if(!te.outputFile)continue;let Z=await r.fetchedSourcesStore.readSourceData(p,te.outputFile);Z!==null&&(i[te.bindTo]=Z);}let l={};for(let[te,Z]of Object.entries(c.state??{}))if(Z!==null&&typeof Z=="object"&&!Array.isArray(Z)){let ie=Z[te];l[te]=ie!==void 0?ie:Z;}else l[te]=Z;let g={id:p,card_data:{...R},requires:l,source_defs:S,compute:m.compute};g._sourcesData=i,m.compute&&Ge.runSync(g,{sourcesData:i}),(o??(()=>{}))(p,g.computed_values??{});let f=Ge.enrichSourcesSync(Array.isArray(m.source_defs)?m.source_defs:void 0,{card_data:m.card_data,requires:l}),k={...m,source_defs:Array.isArray(f)?f.map(te=>({...te,boardDir:typeof te.boardDir=="string"&&te.boardDir?te.boardDir:e.value})):f},v=Ue(),O=c.update?void 0:v,M=A.filter(te=>{let Z=te.outputFile;if(typeof Z!="string"||!Z)return true;let ie=I(Z);O&&(ie={...ie,queueRequestedToken:O},y(Z,ie));let G=ie.queueRequestedToken??ie.lastRequestedToken??v;return Bt(ie,G)==="dispatch"});if(await _(),M.length>0){let te=false,Z=v;for(let ie of M){let G=ie.outputFile;if(typeof G!="string"||!G)continue;let T=I(G),C=T.queueRequestedToken??v;y(G,{...T,lastRequestedToken:C}),Z=C,te=true;}return te&&await _(),te&&(u.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:k,callbackToken:c.callbackToken,rqt:Z}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(A.some(te=>{let Z=te.outputFile;if(typeof Z!="string"||!Z)return false;let ie=I(Z),G=ie.queueRequestedToken??ie.lastRequestedToken??v;return Bt(ie,G)==="in-flight"}))return "task-initiated";let J=m.provides??[],ee={};for(let{bindTo:te,ref:Z}of J)ee[te]=Ge.resolve(g,Z);return (s??(()=>{}))(ee),S.filter(te=>{if(te.optionalForCompletionGating!==true)return false;let Z=I(te.outputFile);return !Z.lastRequestedToken||!Z.lastCompletedToken?true:Z.lastCompletedToken<=Z.lastRequestedToken}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:ke(e),enrichedCard:k,callbackToken:c.callbackToken,rqt:v}}),n(c.nodeId,ee),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Mn(e,t,r={}){Vt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),s=ke(e),c=r.emitNotification??(T=>{if(!t.publishBoardChangeNotifications)return;let C=T.kind==="notification-batch"?T.notifications:[T];return t.publishBoardChangeNotifications(C)}),u=null,m=r.boardRuntimeStoreRef,p=r.scratchStoreRef,R=r.taskExecutorRef,S=r.chatHandlerFlow;function A(){if(!m)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return m}function B(T){if(T.length!==0)try{let C=qe(T),K=Ne({kind:"notification-batch",notifications:C});return Promise.resolve(c(K)).catch(j=>{o(`[async-board-live-cards-public] emitNotification failed: ${j instanceof Error?j.message:String(j)}`);})}catch(C){o(`[async-board-live-cards-public] emitNotification failed: ${C instanceof Error?C.message:String(C)}`);return}}let x=()=>On(t.kvStorageForRef(A())),_=e.value,I=()=>zt(Pr(()=>t.kvStorageForRef(A()),t.hashFn),"v1"),y=async()=>{let T=await x().readOutputsStoreRef();if(!T)throw new Error(`Board at ${e.value} has no outputs store configured.`);return na(t.kvStorageForRef(T))},d=async()=>{let T=await x().readCardStoreRef();if(!T)throw new Error(`Board at ${e.value} has no card store configured.`);let C=t.kvStorageForRef(T);return mr(fr(lr(C),t.hashFn),o)};async function i(){return !!(await I().readSnapshot(_)).values[ct]}async function l(){let T=await I().readSnapshot(_);if(!T.values[ct])throw new Error(`Board not initialized at ${e.value}`);return or(T.values)}async function g(T,C){let K=await I().commitSnapshot(_,{schemaVersion:"v1",expectedVersion:C,deleteKeys:[],shallowMerge:nr(T)});if(!K.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${C??"null"} current=${K.currentVersion??"null"}`)}let f=()=>kn(t.journalStorageForRef(A()));async function k(){return R??await x().readTaskExecutorRef()}async function v(T){await f().appendEvent(T);}async function O(){let T=await x().readFetchedSourcesStoreRef();if(!T)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return T}async function M(){return t.blobStorageForRef(await O())}async function D(){return ra(await M(),T=>t.resolveBlob(T))}async function J(T){let C=(await M()).keyRef?.(T);if(!C)throw new Error("configured fetched-sources store does not support keyRef");let K=await Promise.resolve(C);return ke(K)}async function ee(){let T=oa(t.kvStorageForRef(A()),async(h,q)=>{let U=h.payload,ne=(U.enrichedCard??{}).id??U.cardId??"unknown";await v({type:"task-failed",taskName:ne,error:q,timestamp:Ue()});}),C=ta(t.kvStorageForRef(A())),K=await M(),j=await D(),w=await d(),P=await y(),F=new Map,N=new Map,V=[],W=[],oe=[],ue=new Map,Te=new Set,Be={async readRuntime(h){return F.get(h)??await C.readRuntime(h)},async writeRuntime(h,q){F.set(h,q),je[h]=q;}},Ee={async readSourceData(h,q){let U=`${h}/${q}`;return N.has(U)?N.get(U):await j.readSourceData(h,q)},ingestSourceDataStaged(h,q,U,ae){return j.ingestSourceDataStaged(h,q,U,ae)},async commitSourceData(h,q,U){let ae=`${h}/.staged/${U}/${q}`,ne=await K.read(ae);if(ne==null){let be=await Promise.resolve(K.keyRef?.(ae));be&&(ne=await t.resolveBlob(be));}if(ne==null)return false;let he=`${h}/${q}`,fe=ne.trim();try{N.set(he,JSON.parse(fe));}catch{N.set(he,fe);}return V.push({cardId:h,outputFile:q,deliveryToken:U}),true},async hasSource(h,q){let U=`${h}/${q}`;return N.has(U)||await j.hasSource(h,q)},async listSources(h){let q=await j.listSources(h),U=[...N.keys()].filter(ae=>ae.startsWith(`${h}/`)).map(ae=>ae.slice(`${h}/`.length));return [...new Set([...q,...U])]}},ye=await l(),Ce=Rt(ye.graph),je={...ye.runtimeByCardId},{events:Se,newCursor:Fe}=await f().readEntriesAfterCursor(ye.lastDrainedJournalId),Le=Se,pe=Kt(Ce,{handlers:{"card-handler":aa(e,Fe,{cardStore:w,cardRuntimeStore:Be,fetchedSourcesStore:Ee,executionRequestStore:T},(h,q)=>{Le.push({type:"task-completed",taskName:h,data:q,timestamp:Ue()});},(h,q)=>{W.push({cardId:h,values:q});},h=>{oe.push(h);})},onNodeRemoved:h=>{ue.delete(h),F.delete(h),delete je[h],Te.add(h);}});for(;Le.length>0;){let h=Le;Le=[];for(let q of h)if(q.type==="task-restart"){let U=await w.readCard(q.taskName);U&&ue.set(q.taskName,U);}pe.pushAll(h),await pe.waitForHandlers();}let Ze=pe.getState();await pe.dispose({wait:true}),await g({lastDrainedJournalId:Fe,graph:ht(Ze),runtimeByCardId:je},(await I().readSnapshot(_)).version);for(let{cardId:h,values:q}of W)await P.writeComputedValues(h,q);for(let h of oe)await P.writeDataObjects(h);for(let[h,q]of F)await C.writeRuntime(h,q);for(let h of V)await j.commitSourceData(h.cardId,h.outputFile,h.deliveryToken);let Ke=kt(s,Ze);await P.writeStatusSnapshot(Ke);let Ve=[];for(let{cardId:h,values:q}of W)Ve.push({kind:"computed_values",cardId:h,values:q});for(let h of oe)for(let[q,U]of Object.entries(h))Ve.push({kind:"data_object",key:q,payload:U});for(let[h,q]of ue)Ve.push({kind:"card_refreshed",cardId:h,card:q});for(let h of Te)Ve.push({kind:"card_removed",cardId:h});Ve.push({kind:"status",status:Ke}),await B(Ve);let et=await k();if(!et)return;let L=t.supportsDirectSourceOutput?.(et)===true;await T.dispatchEntriesForJournalId(Fe,async h=>{if(h.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${h.taskKind}" \u2014 skipping`);return}let q=h.payload,U=q.enrichedCard?.id??"unknown",ae=q.enrichedCard?.source_defs??[];if(et.howToRun==="queue-storage"&&L){try{let ne=await x().readQueueStoreRef();if(!ne)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let he=t.queueStorageForRef(ne,"task-executor"),fe=typeof et.extra?.boardId=="string"?et.extra.boardId:void 0,be=[];for(let Pe of ae){if(!Pe.outputFile)continue;let He=t.genId(),Je=`${U}/.staged/${He}/${Pe.outputFile}`,De=await Promise.resolve(K.keyRef?.(Je));if(!De)continue;let We={ref:ke(De),deliveryToken:He,outputFile:Pe.outputFile,cardId:U},ze=Nn({cbk:q.callbackToken,rg:e.value,br:ke(e),cid:U,b:Pe.bindTo,d:Pe.outputFile,cs:void 0,rqt:q.rqt,dt:We.deliveryToken});be.push({...fe?{boardId:fe}:{},ref:et,args:{source_def:Pe,base_ref:ke(e),callback:n.createCallback(ze),output:We}});}be.length>0&&await he.enqueueMany(be);}catch(ne){await v({type:"task-failed",taskName:U,error:ne instanceof Error?ne.message:String(ne),timestamp:Ue()});}return}for(let ne of ae){if(!ne.outputFile)continue;let he;if(L){let Pe=t.genId(),He=`${U}/.staged/${Pe}/${ne.outputFile}`,Je=await Promise.resolve(K.keyRef?.(He));Je&&(he={ref:ke(Je),deliveryToken:Pe,outputFile:ne.outputFile,cardId:U});}let fe=Nn({cbk:q.callbackToken,rg:e.value,br:ke(e),cid:U,b:ne.bindTo,d:ne.outputFile,cs:void 0,rqt:q.rqt,...he?{dt:he.deliveryToken}:{}}),be=await t.dispatchExecution(et,{source_def:ne,base_ref:ke(e),callback:n.createCallback(fe),...he?{output:he}:{}});be.dispatched||await v({type:"task-failed",taskName:U,error:be.error??"dispatch failed",timestamp:Ue()});}});}async function se(){try{let T=async()=>{let K=await l(),{events:j}=await f().readEntriesAfterCursor(K.lastDrainedJournalId);j.length>0&&await Z();},C=await Bn(t.lock,ee,T);return xe({ran:C!==!1})}catch(T){return Ie(T)}}async function te(){return u||(u=se().finally(()=>{u=null;}),u)}async function Z(){let T=await x().readQueueStoreRef();if(!T)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let C=t.queueStorageForRef(T,"process-accumulated");C.enqueueIfAbsent?await C.enqueueIfAbsent({boardRef:ke(e)},`process-accumulated:${ke(e)}`):await C.enqueue({boardRef:ke(e)}),await t.requestProcessAccumulated?.();}async function ie(){let T=await x().readQueueStoreRef();if(!T)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let C=t.queueStorageForRef(T,"process-accumulated");for(;;){let K=await C.lease({max:64,visibilityMs:1e3});if(K.length<=0)return;for(let j of K)await C.ack(j.id,j.leaseToken);if(K.length<64)return}}function G(){Z();}return {async init(T){try{let C=T.params?.cardStoreRef;if(!C)return ve("init requires params.cardStoreRef");if(m=T.params?.boardRuntimeStoreRef,!m)return ve("init requires params.boardRuntimeStoreRef");let K=T.params?.outputsStoreRef;if(!K)return ve("init requires params.outputsStoreRef");let j=T.params?.queueStoreRef;if(!j)return ve("init requires params.queueStoreRef");let w=T.params?.fetchedSourcesStoreRef;if(!w)return ve("init requires params.fetchedSourcesStoreRef");p=T.params?.scratchStoreRef;let P=T.params?.chatStoreRef;if(!P)return ve("init requires params.chatStoreRef");let F=T.params?.artifactsStoreRef;if(!F)return ve("init requires params.artifactsStoreRef");await i()||await g({lastDrainedJournalId:"",graph:ht(St(qt)),runtimeByCardId:{}},null);let N=x();return await N.writeBoardRuntimeStoreRef(m),await N.writeCardStoreRef(C),await N.writeOutputsStoreRef(K),await N.writeQueueStoreRef(j),await N.writeFetchedSourcesStoreRef(w),await N.writeChatStoreRef(P),await N.writeArtifactsStoreRef(F),await(await y()).writeStatusSnapshot(kt(s,Rt((await l()).graph))),xe()}catch(C){return Ie(C)}},async status(T){try{let C=await y(),K=await C.readStatusSnapshot();return K||(K=kt(s,Rt((await l()).graph)),await C.writeStatusSnapshot(K)),xe(K)}catch(C){return Ie(C)}},async getCardStoreRef(T){try{let C=await x().readCardStoreRef();return C?xe({storeRef:C}):ve(`Board at ${e.value} has no card store configured`)}catch(C){return Ie(C)}},async getBoardRuntimeStoreRef(T){try{return xe({storeRef:m??null})}catch(C){return Ie(C)}},async getOutputsStoreRef(T){try{let C=await x().readOutputsStoreRef();return C?xe({storeRef:C}):ve(`Board at ${e.value} has no outputs store configured`)}catch(C){return Ie(C)}},async getScratchStoreRef(T){try{return xe({storeRef:p??null})}catch(C){return Ie(C)}},async getChatStoreRef(T){try{return xe({storeRef:await x().readChatStoreRef()})}catch(C){return Ie(C)}},async getArtifactsStoreRef(T){try{return xe({storeRef:await x().readArtifactsStoreRef()})}catch(C){return Ie(C)}},async getFetchedSourcesStoreRef(T){try{return xe({storeRef:await x().readFetchedSourcesStoreRef()})}catch(C){return Ie(C)}},async getConfig(T){try{let C=T.params?.key;if(!C)return ve("getConfig requires params.key");let K=x(),j;switch(C){case "task-executor":j=R??null;break;case "chat-handler-flow":j=S??null;break;case "board-runtime-store-ref":j=await K.readBoardRuntimeStoreRef();break;case "card-store-ref":j=await K.readCardStoreRef();break;case "outputs-store-ref":j=await K.readOutputsStoreRef();break;case "scratch-store-ref":j=p??null;break;case "chat-store-ref":j=await K.readChatStoreRef();break;case "artifacts-store-ref":j=await K.readArtifactsStoreRef();break;case "fetched-sources-store-ref":j=await K.readFetchedSourcesStoreRef();break;default:return ve(`getConfig: unknown key "${C}"`)}return xe({value:j})}catch(C){return Ie(C)}},async getOutputsDataObject(T){try{let C=T.params?.key;return C?xe(await(await y()).readDataObject(C)):ve("getOutputsDataObject requires params.key")}catch(C){return Ie(C)}},async getAllOutputsDataObjects(T){try{return xe(await(await y()).readAllDataObjects())}catch(C){return Ie(C)}},async getOutputsComputedValues(T){try{let C=T.params?.key;return C?xe(await(await y()).readComputedValues(C)):ve("getOutputsComputedValues requires params.key")}catch(C){return Ie(C)}},async getAllOutputsComputedValues(T){try{return xe(await(await y()).readAllComputedValues())}catch(C){return Ie(C)}},async getOutputsFetchedSources(T){try{let C=T.params?.key;if(!C)return ve("getOutputsFetchedSources requires params.key");let K=await(await D()).listSources(C),j={};for(let w of K)j[w]=await J(`${C}/${w}`);return xe(j)}catch(C){return Ie(C)}},async getAllOutputsFetchedSources(T){try{let C=await D(),K=await(await M()).listKeys(),j=new Set;for(let P of K){let F=P.indexOf("/");F>0&&!P.includes("/.staged/")&&j.add(P.slice(0,F));}let w={};for(let P of j){let F=await C.listSources(P);if(F.length!==0){w[P]={};for(let N of F)w[P][N]=await J(`${P}/${N}`);}}return xe(w)}catch(C){return Ie(C)}},async buildSseOneShotPayload(T){try{let C=await(await d()).readAllCards(),K=await this.status({});if(K.status!=="success")return K;let j=await this.getAllOutputsDataObjects({});if(j.status!=="success")return j;let w=await this.getAllOutputsComputedValues({});if(w.status!=="success")return w;let P=w.data,F={};for(let N of C){let V=typeof N?.id=="string"?N.id:null;if(!V)continue;let W=N.card_data&&typeof N.card_data=="object"&&!Array.isArray(N.card_data)?N.card_data:{};F[V]={schema_version:"v1",card_id:V,card_data:{...W},computed_values:P[V]&&typeof P[V]=="object"?P[V]:{}};}return xe({cardDefinitions:C,statusSnapshot:K.data,dataObjectsByToken:j.data,cardRuntimeById:F})}catch(C){return Ie(C)}},async addCardFiles(T){try{let C=T.params?.cardId;if(!C)return ve("addCardFiles requires params.cardId");let j=await ur(await d(),{emitNotification:c}).appendFiles({params:{id:C},body:T.body});return j.status!=="success"?j:xe({cardId:C,files_added:j.data.files_added,notified:!0})}catch(C){return Ie(C)}},async removeCard(T){try{let C=T.params?.id;if(!C)return ve("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(C);}catch{}return await v({type:"task-removal",taskName:C,timestamp:Ue()}),G(),xe()}catch(C){return Ie(C)}},async retrigger(T){try{let C=T.params?.id;return C?(await v({type:"task-restart",taskName:C,timestamp:Ue()}),G(),xe()):ve("retrigger requires params.id")}catch(C){return Ie(C)}},async processAccumulatedEvents(T){return await ie(),te()},async upsertCard(T){try{let C=T.params?.cardId,K=T.params?.all,j=!!T.params?.restart;if(!C&&!K)return ve("upsertCard requires --card-id <id> or --all");let w=await d(),P=K?(await w.readAllCards()).map(N=>N.id):[C];for(let N of P)if(!await w.readCard(N))return ve(`Card "${N}" not found in board at ${e.value}`);let F=t.kvStorage("card-upsert");for(let N of P){let V=await w.readCard(N);if(!V)continue;let W=ar(V),oe=t.hashFn(W),ue=await F.read(N),Te=ue?.taskConfigHash!==oe;if(!(!Te&&!j)){if(Te){let Be=ue?.blobRef??await w.readCardKey(N)??N;await v({type:"task-upsert",taskName:N,taskConfig:W,timestamp:Ue()}),await F.write(N,{blobRef:Be,taskConfigHash:oe,updatedAt:Ue()});}j&&await v({type:"task-restart",taskName:N,timestamp:Ue()});}}return G(),xe()}catch(C){return Ie(C)}},async taskFailed(T){try{let C=T.params?.token;if(!C)return ve("taskFailed requires params.token");let K=T.params?.error??"unknown error",j=pr(C);return j?(await v({type:"task-failed",taskName:j.taskName,error:K,timestamp:Ue()}),G(),xe()):ve("Invalid callback token")}catch(C){return Ie(C)}},async taskProgress(T){try{let C=T.params?.token;if(!C)return ve("taskProgress requires params.token");let K=(T.body??{}).update??{},j=pr(C);return j?(await v({type:"task-progress",taskName:j.taskName,update:K,timestamp:Ue()}),G(),xe()):ve("Invalid callback token")}catch(C){return Ie(C)}},async sourceDataFetched(T){try{let C=T.params?.token,K=T.params?.ref;if(!C)return ve("sourceDataFetched requires params.token");if(!K)return ve("sourceDataFetched requires params.ref");let j=jn(C);if(!j)return ve("Invalid source token");let w=await D(),P=j.dt||t.genId();j.dt||await w.ingestSourceDataStaged(j.cid,j.d,at(K),P);let F=pr(j.cbk);return F?(await v({type:"task-progress",taskName:F.taskName,update:{bindTo:j.b,outputFile:j.d,fetchedAt:Ue(),deliveryToken:P,sourceChecksum:j.cs,rqt:j.rqt},timestamp:Ue()}),G(),xe()):ve("Invalid callback token embedded in source token")}catch(C){return Ie(C)}},async sourceDataFetchFailure(T){try{let C=T.params?.token,K=T.params?.reason??"unknown";if(!C)return ve("sourceDataFetchFailure requires params.token");let j=jn(C);if(!j)return ve("Invalid source token");let w=pr(j.cbk);return w?(await v({type:"task-progress",taskName:w.taskName,update:{bindTo:j.b,outputFile:j.d,failure:!0,reason:K,sourceChecksum:j.cs,rqt:j.rqt},timestamp:Ue()}),G(),xe()):ve("Invalid callback token embedded in source token")}catch(C){return Ie(C)}}}}async function sa(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Dn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=qe(n);if(s.length===1){await o(s[0]);return}await o(Ne({kind:"notification-batch",notifications:s}));}return {async enqueue(n){let o=await e.enqueue(n);return await r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},async enqueueMany(n){let o=await e.enqueueMany(n);return await r(o.map(s=>({kind:"message_enqueued",lane:t.lane,message:s}))),o},enqueueIfAbsent:e.enqueueIfAbsent?async(n,o)=>{let s=await e.enqueueIfAbsent(n,o);return s&&await r([{kind:"message_enqueued",lane:t.lane,message:s}]),s}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,s){return e.nack(n,o,s)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},async stage(n,o){return e.stage(n,o)},async commitStaged(n){let o=await e.commitStaged(n);if(o){let s=await sa(e,n);s&&await r([{kind:"message_enqueued",lane:t.lane,message:s}]);}return o},async discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Nr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ia(e){return {...Nr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function ua(e){return {...Nr(e),reason:e.reason}}function jr(e){return {enqueueRequest(t){return e.enqueue(t).id},enqueueRequestIfAbsent:e.enqueueIfAbsent?(t,r)=>{let n=e.enqueueIfAbsent(t,r);return n?n.id:null}:void 0,leaseRequests(t){return e.lease(t).map(ia)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(Nr)},peekDeadLetter(){return e.peekDeadLetter().map(ua)}}}function ca(e,t){return e.peekActive().find(r=>r.id===t)}function $n(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=qe(n);if(s.length===1){await o(s[0]);return}await o(Ne({kind:"notification-batch",notifications:s}));}return {enqueue(n){let o=e.enqueue(n);return r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},enqueueMany(n){let o=e.enqueueMany(n);return r(o.map(s=>({kind:"message_enqueued",lane:t.lane,message:s}))),o},enqueueIfAbsent:e.enqueueIfAbsent?(n,o)=>{let s=e.enqueueIfAbsent(n,o);return s&&r([{kind:"message_enqueued",lane:t.lane,message:s}]),s}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,s){return e.nack(n,o,s)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},stage(n,o){return e.stage(n,o)},commitStaged(n){let o=e.commitStaged(n);if(o){let s=ca(e,n);s&&r([{kind:"message_enqueued",lane:t.lane,message:s}]);}return o},discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Vn(){return new Date().toISOString()}function Un(e){return new TextEncoder().encode(e).byteLength}function da(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Kn(e){function t(r){let n=e.stat?da(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let o=e.read(r);return o===null?{key:r}:{key:r,size:Un(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Vn(),s.size=s.size??Un(n),s},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let c=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,c);}let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Vn(),s.size=s.size??n.byteLength,s},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function Hn(){function e(o,s){if(!Array.isArray(o))return [];let c=[];for(let u of o){if(!u||typeof u!="object")continue;let m=u;typeof m.stored_name=="string"&&c.push({name:typeof m.name=="string"?m.name:m.stored_name,stored_name:m.stored_name,size:typeof m.size=="number"&&Number.isFinite(m.size)?m.size:null,mime_type:typeof m.mime_type=="string"?m.mime_type:null,uploaded_at:typeof m.uploaded_at=="string"?m.uploaded_at:s||null,chat:m.chat===true});}return c}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let c=t(o);if(s.length===0)return o.files=c,c;let u=new Set(c.map(m=>m.stored_name));for(let m of s)u.has(m.stored_name)||(c.push(m),u.add(m.stored_name));return o.files=c,c}function n(o,s,c){let u=t(o);if(!Number.isInteger(s)||s<0||s>=u.length)return {ok:false,reason:"index_out_of_range"};let m=u[s];return !m||!m.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==m.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:m}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function Jn(e,t={}){let r=t.emitNotification;function n(y){let d=typeof y=="number"?y:Number(y);return Number.isInteger(d)&&d>0?d:null}function o(y,d){let i=d;for(let l=y.length-1;l>=0;l-=1)if(y[l]?.role==="user"&&(i-=1,i===0))return y.slice(l);return y}function s(y){return y.some(d=>typeof d?.turn=="string"&&d.turn!=="")}function c(y,d){if(d<=0)return [];if(!s(y))return o(y,d);let i=new Map,l=[];for(let f of y){let k=typeof f?.turn=="string"?f.turn:"";i.has(k)||(i.set(k,[]),l.push(k)),i.get(k).push(f);}return l.slice(Math.max(0,l.length-d)).flatMap(f=>i.get(f)??[])}function u(y){return {status:"success",data:y}}function m(y){return {status:"fail",error:y}}function p(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}function R(y){return {role:String(y.role||"system"),text:String(y.text||""),files:Array.isArray(y.files)?y.files:[],...typeof y.turn=="string"&&y.turn?{turn:y.turn}:{}}}async function S(y){if(!r||y.length===0)return;let d=qe(y);if(d.length===1){await r(d[0]);return}await r(Ne({kind:"notification-batch",notifications:d}));}async function A(y){let d=await e.readAll(y);return c(d,1).map(R)}async function B(y){let d=Date.now();return {kind:"card_chats",cardId:y,sentAt:new Date(d).toISOString(),sentAtMs:d,messages:await A(y),receiving:true,processing:await e.isProcessing(y)}}async function x(y,d="command envelope"){let i=typeof y.cardId=="string"?y.cardId:void 0;if(!y.command)return m(`chat-store: ${d} missing "command"`);if(!i)return m(`chat-store: ${d} missing "cardId"`);if(y.command==="append")return await I.append({params:{cardId:i},body:{role:y.role,text:y.text,files:y.files,turn:y.turn}});if(y.command==="read-all")return await I.readAll({params:{cardId:i},body:{lastUserTurns:y.lastUserTurns,tailTurns:y.tailTurns,turnId:y.turnId,allTurns:y.allTurns,tailTurnsBeforeId:y.tailTurnsBeforeId}});if(y.command==="read-after")return await I.readAfter({params:{cardId:i},body:{cursor:y.cursor??null}});if(y.command==="clear")return await I.clear({params:{cardId:i}});if(y.command==="set-processing")return await I.setProcessing({params:{cardId:i},body:{active:y.active}});if(y.command==="is-processing")return await I.isProcessing({params:{cardId:i}});if(y.command==="get-config")return await I.getConfig({params:{cardId:i}});if(y.command==="set-config"){let{command:l,cardId:g,...f}=y;return await I.setConfig({params:{cardId:i},body:f})}return m(`chat-store: unknown command "${String(y.command)}"`)}async function _(y){if(!Array.isArray(y.commands)||y.commands.length===0)return m('chat-store: command envelope must include a non-empty "commands" array');let d=[];for(let i=0;i<y.commands.length;i+=1){let l=y.commands[i];if(!l||typeof l!="object"||Array.isArray(l))return m(`chat-store: command envelope entry ${i} must be an object`);let g={cardId:y.cardId,...l},f=await x(g,`command envelope entry ${i}`);if(f.status!=="success")return f;d.push({index:i,command:String(g.command),data:f.data});}return u({results:d})}let I={async append(y){try{let d=y.params?.cardId;if(!d)return m("append requires params.cardId");let i=y.body??{},l=typeof i.role=="string"?i.role:"",g=typeof i.text=="string"?i.text:"",f=Array.isArray(i.files)?i.files:[],k=typeof i.turn=="string"?i.turn:"";if(!l)return m("append requires body.role");let v=await e.append(d,l,g,f,k);return await S([{kind:"chat_messages",cardId:d,messages:await A(d)}]),u({id:v})}catch(d){return p(d)}},async readAll(y){try{let d=y.params?.cardId;if(!d)return m("readAll requires params.cardId");let i=y.body??{},l=typeof i.turnId=="string"?i.turnId:"",g=i.allTurns===!0,f=typeof i.tailTurnsBeforeId=="string"?i.tailTurnsBeforeId:"",k=i.tailTurns===void 0?i.lastUserTurns:i.tailTurns,v=k===void 0?g||l?void 0:1:n(k);if(k!==void 0&&v===null)return m("readAll requires body.tailTurns (positive integer)");let O=await e.readAll(d),M=O.filter(D=>!l||String(D.turn||"")===l);if(f){let D=v;if(typeof D!="number"||!Number.isInteger(D)||D<=0)return m("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let J=new Map,ee=[];for(let ie of O){let G=String(ie.turn||"");J.has(G)||(J.set(G,[]),ee.push(G)),J.get(G).push(ie);}let se=ee.findIndex(ie=>ie===f),te=Math.max(0,se-D);return M=(se===-1?[]:ee.slice(te,se)).flatMap(ie=>J.get(ie)??[]),u({records:M})}return u(typeof v=="number"?{records:c(M,v)}:{records:M})}catch(d){return p(d)}},async buildSseOneShotBatch(y){try{let d=y.params?.cardId;if(!d)return m("buildSseOneShotBatch requires params.cardId");let i=y.body??{},l=typeof i.receiving=="boolean"?i.receiving:!0,g=await B(d);return u(Ne({kind:"notification-batch",notifications:[{...g,receiving:l}]}))}catch(d){return p(d)}},async readAfter(y){try{let d=y.params?.cardId;if(!d)return m("readAfter requires params.cardId");let l=(y.body??{}).cursor??null;return u(await e.readAfter(d,l))}catch(d){return p(d)}},async clear(y){try{let d=y.params?.cardId;return d?(await e.clear(d),u({ok:!0})):m("clear requires params.cardId")}catch(d){return p(d)}},async setProcessing(y){try{let d=y.params?.cardId;if(!d)return m("setProcessing requires params.cardId");let i=y.body??{};return typeof i.active!="boolean"?m("setProcessing requires body.active (boolean)"):(await e.setProcessing(d,i.active),await S([{kind:"chat_processing",cardId:d,active:i.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(d){return p(d)}},async isProcessing(y){try{let d=y.params?.cardId;return d?u({active:await e.isProcessing(d)}):m("isProcessing requires params.cardId")}catch(d){return p(d)}},async getConfig(y){try{let d=y.params?.cardId;return d?u({config:await e.getConfig(d)}):m("getConfig requires params.cardId")}catch(d){return p(d)}},async setConfig(y){try{let d=y.params?.cardId;if(!d)return m("setConfig requires params.cardId");let i=y.body??{};return await e.setConfig(d,i),u({ok:!0})}catch(d){return p(d)}},run:x,runBatch:_};return I}function wt(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function Gn(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(wt):[]:wt(e)?[e]:[]}function Qn(e,t,r){let n=0;return {accepted:e.filter(s=>{if(!wt(s))return n++,false;let c=s;return typeof c.sentAtMs=="number"&&t-c.sentAtMs>r?(n++,false):true}),rejected:n}}function zn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Lr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function la(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function Wn(e,t){if(t.kind==="status"){Lr(t.status)&&(e.status=t.status);return}if(t.kind==="computed_values"){e.computedValues[t.cardId]=t.values;return}if(t.kind==="data_object"){e.dataObjects[t.key]=t.payload;return}if(t.kind==="card_refreshed"){e.cards[t.cardId]=t.card;return}t.kind==="card_removed"&&(delete e.cards[t.cardId],delete e.computedValues[t.cardId]);}function Yn(e,t){if(la(t)){for(let r of t.notifications)wt(r)&&Wn(e,r);return}wt(t)&&Wn(e,t);}function Mr(e){let t=new Map,r=0;function n(d){let i=JSON.stringify(d);return r++,`id: ${r}
1
+ var ServerRuntimeControlface=(function(exports){'use strict';var Ro=Object.defineProperty;var Co=(e,t,r)=>t in e?Ro(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Gr=(e,t,r)=>Co(e,t+"",r);var Dt="b64:";function ko(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function bo(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function be(e){return `${Dt}${ko(JSON.stringify(e))}`}function at(e){if(!e.startsWith(Dt))throw new Error(`Invalid ref format (expected ${Dt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(bo(e.slice(Dt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function Wr(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function tt(e){return typeof e.journalStorage=="function"}function zr(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?at(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function ot(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wr(e){let t=e.reduce((o,s)=>o+s.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}function le(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function st(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function it(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function ft(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function $t(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let s=Number(o);if(Number.isFinite(s))return s}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Yr(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function mt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,c=s.status;if(c==="success")return Object.prototype.hasOwnProperty.call(s,"data")?o:{status:"success",data:{}};if(c==="fail"||c==="error")return o}return {status:"success",data:o}}function rt(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let s=n.data;if(s&&typeof s=="object"&&!Array.isArray(s)){let c=s.issues;if(Array.isArray(c)){let m=c.find(p=>typeof p=="string"&&p.trim());if(typeof m=="string")return `Validation failed: ${m}`}let u=s.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function vr(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,buildPublishedRuntimePayload:c,createMcpControlplaneToolRegistry:u,retriggerCard:m,applyCardAction:p,resolveChatHandlerTarget:R,sendCardFileDownloadResponse:b}=e;async function w(B,x,_){let I=B.method||"GET",y=_,d=y.pathname;try{if(I==="POST"&&d===`${t}/mcp-actions`){await s();let f=Date.now(),C=new Date(f).toISOString(),v=await n(B),O=typeof v.tool=="string"?v.tool.trim():"",M=v.args&&typeof v.args=="object"&&!Array.isArray(v.args)?v.args:{};if(!O)return r(x,400,{error:"tool is required"}),!0;let D=le(M,"card_id");if(!D)return r(x,400,{error:"MCP action requires card_id"}),!0;if(O==="retrigger-card"||O==="retrigger"){await m(D);let U=Date.now();return r(x,200,{status:"success",data:{ok:!0,cardId:D,actionType:O,requestReceivedAt:C,requestReceivedAtMs:f,responseSentAt:new Date(U).toISOString(),responseSentAtMs:U,responseStatus:200}}),!0}let J=it(M,"payload");if(O==="chat-send"&&!await R(D)){let U=Date.now();return r(x,409,{error:`chat handler is not configured for card: ${D}`,requestReceivedAt:C,requestReceivedAtMs:f,responseSentAt:new Date(U).toISOString(),responseSentAtMs:U,responseStatus:409}),!0}if(O==="chat-send"){let U=typeof J["turn-id"]=="string"?J["turn-id"]:typeof J.turnId=="string"?J.turnId:typeof J.turn=="string"?J.turn:"";if(!U||!String(U).trim()){let se=Date.now();return r(x,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${D}`,requestReceivedAt:C,requestReceivedAtMs:f,responseSentAt:new Date(se).toISOString(),responseSentAtMs:se,responseStatus:400}),!0}}await p(D,O,J);let te=Date.now();return r(x,200,{status:"success",data:{ok:!0,cardId:D,actionType:O,requestReceivedAt:C,requestReceivedAtMs:f,responseSentAt:new Date(te).toISOString(),responseSentAtMs:te,responseStatus:200}}),!0}if(I==="POST"&&d===`${t}/mcp-controlplane`){await s();let f=await n(B),C=typeof f.tool=="string"?f.tool.trim():"",v=f.args&&typeof f.args=="object"&&!Array.isArray(f.args)?f.args:{};if(!C)return r(x,400,{error:"tool is required"}),!0;try{let O=await mt(C,v,u());if(O&&typeof O=="object"&&!Array.isArray(O)){let M=O;if(M.status==="fail")return r(x,400,{error:rt(O,"Request failed")}),!0;if(M.status==="error")return r(x,500,{error:rt(O,"Internal error")}),!0}r(x,200,O);}catch(O){let M=typeof O?.statusCode=="number"?Number(O.statusCode):500,D=O instanceof Error?O.message:String(O);r(x,M,{error:D});}return !0}let i=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/retrigger$`));if(I==="POST"&&i){await s();let f=decodeURIComponent(i[1]);return await m(f),r(x,200,{ok:!0}),!0}let l=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/actions$`));if(I==="POST"&&l){await s();let f=decodeURIComponent(l[1]),C=Date.now(),v=new Date(C).toISOString(),O=await n(B),M=O?.actionType;if(M==="chat-send"&&!await R(f)){let J=Date.now();return r(x,409,{error:`chat handler is not configured for card: ${f}`,requestReceivedAt:v,requestReceivedAtMs:C,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:409}),!0}if(M==="chat-send"){let J=O?.payload??{},te=typeof J["turn-id"]=="string"?J["turn-id"]:typeof J.turnId=="string"?J.turnId:typeof J.turn=="string"?J.turn:"";if(!te||!String(te).trim()){let U=Date.now();return r(x,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${f}`,requestReceivedAt:v,requestReceivedAtMs:C,responseSentAt:new Date(U).toISOString(),responseSentAtMs:U,responseStatus:400}),!0}}await p(f,M,O?.payload);let D=Date.now();return r(x,200,{ok:!0,requestReceivedAt:v,requestReceivedAtMs:C,responseSentAt:new Date(D).toISOString(),responseSentAtMs:D,responseStatus:200}),!0}let g=d.match(new RegExp(`^${ot(t)}/cards/([^/]+)/files/(\\d+)$`));if(I==="GET"&&g){let f=decodeURIComponent(g[1]),C=parseInt(g[2],10),v=y.searchParams.get("sn");return await b(x,f,C,v),!0}return !1}catch(i){let l=i?.statusCode||500;return r(x,l,{error:String(i?.message||i)}),true}}return {handleRuntimeApi:w}}function Vt(e,t){if(!e||typeof e!="object")throw new Error(`${t}: adapter.callbackTransport is required`);if(typeof e.createCallback!="function")throw new Error(`${t}: adapter.callbackTransport.createCallback is required`)}function So(e){switch(e){case "computed_values":case "data_object":case "status":return "board-output";case "card_refreshed":case "card_removed":return "card-store";case "card_chats":case "chat_messages":return "chat-store";case "chat_processing":case "card_watchparty":return "hosted-runtime";case "message_enqueued":return "queue-storage"}}function wo(e){return e.category?e:{...e,category:So(e.kind)}}function qe(e){return e.map(t=>wo(t))}function Ne(e){return {...e,category:e.category??"batch",notifications:qe(e.notifications)}}var gt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ye(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function yt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Xr(e){return e.tasks??{}}function Ar(e){return e?e.status===gt.FAILED||e.status===gt.INACTIVATED:false}function Zr(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function en(e){return e.maxExecutions}function tn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===gt.COMPLETED){let s=e.tasks[n];s&&Ye(s).forEach(u=>r.add(u));}return Array.from(r)}function rn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Ye(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function nn(e,t,r){let n=e.tasks[t]??Ut(),o={};if(r){let c=r.tasks[t],u=yt(c);for(let m of u)for(let[p,R]of Object.entries(r.tasks))if(Ye(R).includes(m)){let b=e.tasks[p];b?.lastDataHash&&(o[m]=b.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function on(e,t,r,n,o,s){let c=e.tasks[r]??Ut(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let m;n&&u.on&&u.on[n]?m=u.on[n]:m=Ye(u);let p=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let w=u.requires??[];for(let B of w)for(let[x,_]of Object.entries(t.tasks))if(Ye(_).includes(B)){let I=e.tasks[x];I?.lastDataHash&&(p[B]=I.lastDataHash);break}}let R={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:p,error:void 0},b=[...new Set([...e.availableOutputs,...m])];return {...e,tasks:{...e.tasks,[r]:R},availableOutputs:b,lastUpdated:new Date().toISOString()}}function an(e,t,r,n){let o=e.tasks[r]??Ut(),s=t.tasks[r];if(s?.retry){let m=o.retryCount+1;if(m<=s.retry.max_attempts){let p={...o,status:"not-started",retryCount:m,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:p},lastUpdated:new Date().toISOString()}}}let c={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},u=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&c.executionCount>=s.circuit_breaker.max_executions){let m=s.circuit_breaker.on_break;u=[...new Set([...u,...m])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:u,lastUpdated:new Date().toISOString()}}function sn(e,t,r,n){let o=e.tasks[t]??Ut(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function un(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Ut(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function St(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=dn();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function vo(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:nn(n,t.taskName,r)};case "task-completed":return {config:r,state:on(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:an(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:sn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:un(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Eo(n,t.action)};case "task-upsert":return Ao(e,t.taskName,t.taskConfig);case "task-removal":return xo(e,t.taskName);case "node-requires-add":return Io(e,t.nodeName,t.tokens);case "node-requires-remove":return Po(e,t.nodeName,t.tokens);case "node-provides-add":return To(e,t.nodeName,t.tokens);case "node-provides-remove":return _o(e,t.nodeName,t.tokens);default:return e}}function cn(e,t){return t.reduce((r,n)=>vo(r,n),e)}function Ao(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:dn()},lastUpdated:new Date().toISOString()}}}function xo(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function Io(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=yt(n),s=r.filter(c=>!o.includes(c));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function Po(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=yt(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function To(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=r.filter(c=>!o.includes(c));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function _o(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ye(n),s=o.filter(c=>!r.includes(c));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function ht(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Rt(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function dn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Eo(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function Tt(e){let{config:t,state:r}=e,n=Xr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=Bo(n),c=tn(t,r.tasks),u=new Set([...c,...r.availableOutputs]),m=[],p=[],R=[],b=[];for(let[B,x]of Object.entries(n)){let _=r.tasks[B],I=Zr(x,t.settings),y=I!=="once";if(_?.status===gt.RUNNING||Ar(_))continue;let d=en(x);if(d!==void 0&&_&&_.executionCount>=d||x.circuit_breaker&&_&&_.executionCount>=x.circuit_breaker.max_executions||!y&&_?.status===gt.COMPLETED)continue;if(y&&_?.status===gt.COMPLETED){let C=yt(x),v=false;switch(I){case "data-changed":{C.length>0&&C.some(M=>{for(let[D,J]of Object.entries(n))if(Ye(J).includes(M)){let te=r.tasks[D];if(!te)continue;let U=_.lastConsumedHashes?.[M];return te.lastDataHash==null?te.executionCount>_.lastEpoch:te.lastDataHash!==U}return false})||(v=true);break}case "epoch-changed":{C.length>0&&C.some(M=>{for(let[D,J]of Object.entries(n))if(Ye(J).includes(M)){let te=r.tasks[D];if(te&&te.executionCount>_.lastEpoch)return true}return false})||(v=true);break}case "time-based":{let O=x.refreshInterval??0;if(O<=0){v=true;break}let M=_.completedAt;if(!M){v=true;break}(Date.now()-Date.parse(M))/1e3<O&&(v=true);break}case "manual":v=true;break}if(v)continue}let i=yt(x);if(i.length===0){m.push(B);continue}let l=[],g=[],f=[];for(let C of i){if(u.has(C))continue;let v=s[C]||[];v.length===0?l.push(C):v.every(M=>Ar(r.tasks[M]))?f.push({token:C,failedProducer:v[0]}):g.push(C);}l.length>0?R.push({taskName:B,missingTokens:l}):f.length>0?b.push({taskName:B,failedTokens:f.map(C=>C.token),failedProducers:[...new Set(f.map(C=>C.failedProducer))]}):g.length>0?p.push({taskName:B,waitingOn:g}):m.push(B);}let w={};if(m.length>1){let B=rn(m,n);for(let[x,_]of Object.entries(B))_.length>1&&(w[x]=_);}return {eligible:m,pending:p,unresolved:R,blocked:b,conflicts:w}}function Bo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of Ye(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var _t=class{constructor(){Gr(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function xr(e){let t=Ir(e);return Oo(t)}function Ir(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Ir).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Ir(t[n])).join(",")+"}"}function Oo(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Fo(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function qo(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ln(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Fo(t)}function No(e){try{let t=JSON.parse(qo(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Kt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:s}=t,c=new _t,u="state"in e&&"config"in e?e:St(e),m=false,p=new Set,R=new Map(Object.entries(n)),b=new _t,w=false,B=false;function x(){if(!m){if(w){B=true;return}w=true;try{do B=!1,_();while(B)}finally{w=false;}}}function _(){let i=b.drain(),l=c.drain(),g=[...i,...l];if(g.length>0&&(u=cn(u,g),o)){for(let C of g)if(C.type==="task-removal")try{o(C.taskName);}catch(v){console.warn("[reactive] onNodeRemoved failed:",v instanceof Error?v.message:String(v));}}let f=Tt(u);g.length>0&&s?.(g,u,f);for(let C of f.eligible)d(C);for(let C of g)if(C.type==="task-progress"){let{taskName:v,update:O}=C;if(!u.config.tasks[v])continue;let D=u.state.tasks[v];if(!D||D.status!=="running")continue;let J=ln(v),te=y(v,J,O).catch(U=>{m||(b.append({type:"task-failed",taskName:v,error:U.message??String(U),timestamp:new Date().toISOString()}),x());}).finally(()=>{p.delete(te);});p.add(te);}}function I(i){let g=u.config.tasks[i].requires??[],f=new Map;for(let[v,O]of Object.entries(u.config.tasks))for(let M of O.provides??[])f.set(M,v);let C={};for(let v of g){let O=f.get(v);O?C[v]=u.state.tasks[O]?.data:C[v]=void 0;}return C}async function y(i,l,g){let f=u.config.tasks[i],C=f.taskHandlers??[],v=I(i);for(let O of C){let M=R.get(O);if(!M)throw new Error(`Handler '${O}' not found in registry (task '${i}')`);let D={nodeId:i,state:v,taskState:u.state.tasks[i],config:f,callbackToken:l,update:g};if(await M(D)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${i}')`)}}function d(i){let g=u.config.tasks[i]?.taskHandlers;if(!g||g.length===0)return;b.append({type:"task-started",taskName:i,timestamp:new Date().toISOString()}),x();let f=ln(i),C=y(i,f).catch(v=>{m||(b.append({type:"task-failed",taskName:i,error:v.message??String(v),timestamp:new Date().toISOString()}),x());}).finally(()=>{p.delete(C);});p.add(C);}return {push(i){m||(i.type==="task-completed"&&i.data&&!i.dataHash&&(i={...i,dataHash:xr(i.data)}),c.append(i),x());},pushAll(i){if(!m){for(let l of i)l.type==="task-completed"&&l.data&&!l.dataHash?c.append({...l,dataHash:xr(l.data)}):c.append(l);x();}},resolveCallback(i,l,g){if(m)return;let f=No(i);if(!f)return;let{taskName:C}=f;if(u.config.tasks[C]){if(g&&g.length>0)c.append({type:"task-failed",taskName:C,error:g.join("; "),timestamp:new Date().toISOString()});else {let v=l&&Object.keys(l).length>0?xr(l):void 0;c.append({type:"task-completed",taskName:C,data:l,dataHash:v,timestamp:new Date().toISOString()});}x();}},addNode(i,l){m||(c.append({type:"task-upsert",taskName:i,taskConfig:l,timestamp:new Date().toISOString()}),x());},removeNode(i){m||(c.append({type:"task-removal",taskName:i,timestamp:new Date().toISOString()}),x());},addRequires(i,l){m||(c.append({type:"node-requires-add",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},removeRequires(i,l){m||(c.append({type:"node-requires-remove",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},addProvides(i,l){m||(c.append({type:"node-provides-add",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},removeProvides(i,l){m||(c.append({type:"node-provides-remove",nodeName:i,tokens:l,timestamp:new Date().toISOString()}),x());},registerHandler(i,l){R.set(i,l);},unregisterHandler(i){R.delete(i);},retrigger(i){m||u.config.tasks[i]&&(c.append({type:"task-restart",taskName:i,timestamp:new Date().toISOString()}),x());},retriggerAll(i){if(!m){for(let l of i)u.config.tasks[l]&&c.append({type:"task-restart",taskName:l,timestamp:new Date().toISOString()});x();}},snapshot(){return ht(u)},getState(){return u},getSchedule(){return Tt(u)},async waitForHandlers(){p.size>0&&await Promise.allSettled([...p]);},async dispose(i){i?.wait&&p.size>0&&await Promise.allSettled([...p]),m=true;}}}function Ht(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var jo=Ht();jo("./jsonata-sync.cjs");var Lo=Ht(),Jt=Lo("./jsonata-sync.cjs"),pn=Jt;function fn(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function gn(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Mo(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await Jt(o.expr).evaluate(n);gn(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Do(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let c=pn(s.expr).evaluate(n);gn(e.computed_values,s.bindTo,c),n.computed_values=e.computed_values;}catch(c){let u=c instanceof Error?c.message:String(c);o.push({bindTo:s.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function $o(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Jt(e).evaluate(n)}function Vo(e,t){return t.startsWith("fetched_sources.")?fn(e._sourcesData??{},t.slice(16)):fn(e,t)}var mn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Uo=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Ko(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Uo.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,c)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${c}]: must be an object`);else {let u=s;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${c}]: missing required "bindTo" property`):(n.has(u.bindTo)&&t.push(`source_defs[${c}]: bindTo "${u.bindTo}" is not unique across source_defs`),n.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${c}]: missing required "outputFile" property`):(o.has(u.outputFile)&&t.push(`source_defs[${c}]: outputFile "${u.outputFile}" is not unique across source_defs`),o.add(u.outputFile));}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):mn.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...mn].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Ho(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=await Jt(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Jo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[s]=pn(c).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Qe={run:Mo,runSync:Do,eval:$o,resolve:Vo,validate:Ko,enrichSources:Ho,enrichSourcesSync:Jo};function Qt(e){return JSON.stringify(e)}function Gt(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function Wt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Pr(e,t){return Wt(e)?e.then(t):t(e)}function hn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Tr(e,t){return {readValues(n){let o=e(n);return Pr(o.listKeys(),s=>{let c=[...s].sort();if(c.length===0)return {version:null,values:{}};let u={},m=null;for(let p of c){let R=o.read(p);Wt(R)?m=(m??Promise.resolve()).then(async()=>{u[p]=await R;}):u[p]=R;}return m?m.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,s){let c=e(n),u=null;for(let m of s){let p=c.delete(m);Wt(p)&&(u=(u??Promise.resolve()).then(()=>p).then(()=>{}));}for(let[m,p]of Object.entries(o)){let R=c.write(m,p);Wt(R)&&(u=(u??Promise.resolve()).then(()=>R).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function zt(e,t){return {readSnapshot(r){return e.readValues(r)},commitSnapshot(r,n){if(n.schemaVersion!==t)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);return Pr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let s=hn(o.values,n);return Pr(e.writeValues(r,s,n.deleteKeys),c=>({ok:true,newVersion:c}))})}}}function yn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function Rn(e){return {readEntriesAfterCursor(t){let r=yn(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return yn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function Cn(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function Yt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ut(e,t){return Yt(e)?e.then(t):t(e)}function _r(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);Yt(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function Qo(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function Go(e,t){let r=e.match(t);return r?r[1]:null}function kn(e,t,r){let n={},o=_r(e,s=>{let c=r(s);if(c)return ut(t(s),u=>{n[c]=u;})});return Yt(o)?o.then(()=>n):n}function Xt(e,t){return {readSourceData(r,n){return ut(e.read(`${r}/${n}`),Qo)},ingestSourceDataStaged(r,n,o,s){return ut(t(o),c=>e.write(`${r}/.staged/${s}/${n}`,c))},commitSourceData(r,n,o){let s=`${r}/.staged/${o}/${n}`,c=`${r}/${n}`;return e.renameKey(s,c)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return ut(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function Er(e,t){let r=(n,o)=>{try{let s=o(n);return Yt(s)?s.catch(c=>t(n,c instanceof Error?c.message:String(c))):void 0}catch(s){try{return t(n,s instanceof Error?s.message:String(s))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return ut(e.read(n),s=>e.write(n,[...s??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ut(e.read(n),s=>{let c=s;if(!(!c||c.length===0))return ut(_r(c,u=>r(u,o)),()=>e.delete(n))})}}}function Br(e,t,r){return {readRuntime(n){return ut(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function Zt(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return ut(e.listKeys("cards/"),t=>kn(t,r=>e.read(r),r=>Go(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return _r(Object.entries(t),([r,n])=>{if(r)return n===void 0?e.delete(`data-objects/${r}`):e.write(`data-objects/${r}`,n)})},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){return ut(e.listKeys("data-objects/"),t=>kn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function Ft(e,t){function r(){return e.readIndex()??{}}function n(o,s,c){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let m={...o},p=m;for(let R=0;R<u.length-1;R++){let b=u[R],w=p[b],B=w&&typeof w=="object"&&!Array.isArray(w)?{...w}:{};p[b]=B,p=B;}return p[u[u.length-1]]=c,m}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,c]of Object.entries(r())){if(!e.cardExists(c.key))continue;let u=e.readCard(c.key);u?o.push(u):t?.(`[card-store] could not read card "${s}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,c]of Object.entries(r()))o[s]=c.checksum;return o},changedSince(o){let s=r(),c=[];for(let[u,m]of Object.entries(s))o[u]!==m.checksum&&c.push(u);for(let u of Object.keys(o))s[u]||c.push(u);return c},validateUpsert(o,s){let c=r(),u=c[o],m=Object.entries(c).find(([,p])=>p.key===s);return u&&u.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:m&&m[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${m[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,c){let u=r(),m=c??u[o]?.key??e.defaultCardKey(o),p=e.writeCard(m,s);u[o]={key:m,checksum:p,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,s,c){let u=r(),m=u[o];if(!m||!e.cardExists(m.key))throw new Error(`card "${o}" not found`);let p=e.readCard(m.key);if(!p||typeof p!="object"||Array.isArray(p))throw new Error(`card "${o}" is not patchable`);let R=n(p,s,c),b=e.writeCard(m.key,R);u[o]={key:m.key,checksum:b,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let s=r(),c=s[o];c&&(e.removeCard(c.key),delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function er(e,t){return Xt(e,t)}function bn(e){return Rn(e)}var tr="v1",ct="board/graph",Sn="board/lastJournalProcessedId";function wn(e){return `cards/${e}/runtime`}function vn(e){return zt(e,tr)}function rr(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Gt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Qt(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){e.write("board-runtime-store-ref",r);},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){e.write("queue-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){e.write("chat-store-ref",r);},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){e.write("artifacts-store-ref",r);},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){e.write("fetched-sources-store-ref",r);}}}function An(e){return Zt(e)}function Et(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Wo(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function Bt(e,t){return e?.lastRequestedToken?Wo(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Or(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Ot(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function Ct(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=Tt(t),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let x of s.pending)u.set(x.taskName,x.waitingOn);for(let x of s.unresolved)u.set(x.taskName,x.missingTokens);for(let x of s.blocked)u.set(x.taskName,x.failedTokens);let m=new Map;for(let[x,_]of Object.entries(n))for(let I of _.requires??[]){let y=m.get(I)??[];y.push(x),m.set(I,y);}let p=o.sort().map(x=>{let _=r[x],I=n[x]??{requires:[],provides:[]};_.status==="completed"?c.completed+=1:_.status==="failed"?c.failed+=1:_.status==="in-progress"&&(c.in_progress+=1);let y=I.requires??[],d=I.provides??[],i=Object.keys(_.data??{}).sort(),l=y.filter(M=>t.state.availableOutputs.includes(M)),g=y.filter(M=>!t.state.availableOutputs.includes(M)),f=u.get(x)??g,C=new Set;for(let M of d)for(let D of m.get(M)??[])D!==x&&C.add(D);let v=_.failedAt,O=_.error?{message:_.error,code:"TASK_FAILED",at:v,source:"task-runtime"}:void 0;return {name:x,status:_.status,error:O,requires:y,requires_satisfied:l,requires_missing:g,provides_declared:d,provides_runtime:i,blocked_by:f,unblocks:Array.from(C).sort(),runtime:{attempt_count:_.executionCount??0,restart_count:_.retryCount??0,in_progress_since:_.status==="in-progress"?_.startedAt??null:null,last_transition_at:_.lastUpdated??null,last_completed_at:_.completedAt??null,last_restarted_at:_.startedAt??null,status_age_ms:_.lastUpdated?0:null}}});c.pending=s.pending.length,c.blocked=s.blocked.length,c.unresolved=s.unresolved.length;let R=p.map(x=>({name:x.name,fanOut:x.unblocks.length})).sort((x,_)=>_.fanOut-x.fanOut||x.name.localeCompare(_.name)),b=R.length>0?R[0]:{name:null,fanOut:0},w=new Set;for(let x of Object.values(n))for(let _ of x.requires??[])w.add(_);let B=0;for(let[x,_]of Object.entries(n)){let I=(_.requires??[]).length===0,d=(_.provides??[]).some(i=>(m.get(i)??[]).some(l=>l!==x));I&&!d&&(B+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:c.completed,eligible:s.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:B,topology:{edge_count:Array.from(w).length,max_fan_out_card:b.name,max_fan_out:b.fanOut}},cards:p}}function zo(){return new Date().toISOString()}function xn(e,t,r,n,o,s,c){return async u=>{let m=[],p=r.cardStore.readCard(u.nodeId);if(!p)return "task-initiate-failure";let R=p.id,b=p.card_data??{},w=p.source_defs??[],B=w,x=r.cardRuntimeStore.readRuntime(R),_=false,I=()=>{_&&(r.cardRuntimeStore.writeRuntime(R,x),_=false);},y=G=>Et(x._sources[G]),d=(G,Y)=>{x._sources[G]=Et(Y),_=true;},i=u.taskState?.executionCount??0;if(x._lastExecutionCount!==i&&(x._sources={},x._lastExecutionCount=i,_=true),u.update){let G=u.update,Y=G.outputFile;if(Y){let T=y(Y);if(G.failure){let S=G.rqt??T.lastRequestedToken??T.queueRequestedToken;S&&d(Y,Ot(T,S));}else {let S=G.rqt;if(!T.lastCompletedToken||S>T.lastCompletedToken){let Q=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,j=false;Q&&(j=r.fetchedSourcesStore.commitSourceData(R,Y,Q)),j?d(Y,Or(T,S)):d(Y,Ot(T,S));}}I();}}let g={};for(let G of w)if(G.outputFile){let Y=r.fetchedSourcesStore.readSourceData(R,G.outputFile);Y!==null&&(g[G.bindTo]=Y);}let f={};for(let[G,Y]of Object.entries(u.state??{}))if(Y!==null&&typeof Y=="object"&&!Array.isArray(Y)){let T=Y[G];f[G]=T!==void 0?T:Y;}else f[G]=Y;let C={id:R,card_data:{...b},requires:f,source_defs:w,compute:p.compute};C._sourcesData=g,p.compute&&Qe.runSync(C,{sourcesData:g}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(R,C.computed_values??{});let v={...p},O=Qe.enrichSourcesSync(Array.isArray(p.source_defs)?p.source_defs:void 0,{card_data:p.card_data,requires:f}),M=e.value;v.source_defs=Array.isArray(O)?O.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:M})):O;let D=zo(),J=u.update?void 0:D,te=B.filter(G=>{let Y=G.outputFile;if(typeof Y!="string"||!Y)return true;let T=y(Y);J&&(T={...T,queueRequestedToken:J},d(Y,T));let S=T.queueRequestedToken??T.lastRequestedToken??D,Q=Bt(T,S);return Q==="in-flight"?false:Q==="dispatch"});if(I(),te.length>0){let G=false,Y=D;for(let T of te){let S=T.outputFile;if(typeof S!="string"||!S)continue;let Q=y(S),j=Q.queueRequestedToken??D;d(S,{...Q,lastRequestedToken:j}),Y=j,G=true;}return G&&I(),G&&(m.push({taskKind:"source-fetch",payload:{boardRef:be(e),enrichedCard:v,callbackToken:u.callbackToken,rqt:Y}}),r.executionRequestStore.appendEntries(t,m)),"task-initiated"}if(B.some(G=>{let Y=G.outputFile;if(typeof Y!="string"||!Y)return false;let T=y(Y),S=T.queueRequestedToken??T.lastRequestedToken??D;return Bt(T,S)==="in-flight"}))return "task-initiated";let se=p.provides??[],de={};for(let{bindTo:G,ref:Y}of se)de[G]=Qe.resolve(C,Y);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(de),n(u.nodeId,de),m.length>0&&r.executionRequestStore.appendEntries(t,m),"task-initiated"}}var qt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function nr(e){return {[ct]:e.graph,[Sn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function or(e){let t=e[ct],r=e[Sn],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ct}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function ar(e){let t=e.requires;return {provides:e.provides?.map(n=>n.bindTo)??[],taskHandlers:["card-handler"],description:e.meta?.title??e.id,...t&&t.length>0?{requires:t}:{}}}function sr(e,t={}){function r(p){return {status:"success",data:p}}function n(p){return {status:"fail",error:p}}function o(p){return {status:"error",error:p instanceof Error?p.message:String(p)}}async function s(p){let R=t.emitNotification;if(!R||p.length===0)return;let b=qe(p);if(b.length===1){await R(b[0]);return}await R(Ne({kind:"notification-batch",notifications:b}));}function c(p){let R=p.params?.id;if(R){let b=e.readCard(R);if(!b)throw new Error(`card "${R}" not found`);return [b]}return e.readAllCards()}function u(p){return Ne({kind:"notification-batch",notifications:qe(p.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function m(p){if(Array.isArray(p))return p;if(p&&typeof p=="object"){let R=p;return Array.isArray(R.files)?R.files:[p]}return null}return {get(p){try{return r({cards:c(p)})}catch(R){return o(R)}},buildNotificationBatch(p){try{return r(u(c(p)))}catch(R){return o(R)}},set(p){try{let R=p.body;if(R==null)return n("set requires a body (card object or array of cards)");let b=Array.isArray(R)?R:[R];for(let w of b){if(typeof w.id!="string")return n("each card must have a string `id` field");e.writeCard(w.id,w);}return s(b.map(w=>({kind:"card_refreshed",cardId:w.id,card:w}))),r({count:b.length})}catch(R){return o(R)}},del(p){try{let R=p.body?.ids??[],b=p.params?.id,w=b?[...R,b]:R;if(w.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of w)e.removeCard(B);return s(w.map(B=>({kind:"card_removed",cardId:B}))),r({count:w.length})}catch(R){return o(R)}},patch(p){try{let R=p.params?.id,b=p.params?.path;if(!R)return n("patch requires params.id");if(!b)return n("patch requires params.path");let w=p.body,B=w&&Object.prototype.hasOwnProperty.call(w,"value")?w.value:p.body;e.patchCard(R,b,B);let x=e.readCard(R);return x?(s([{kind:"card_refreshed",cardId:R,card:x}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},appendFiles(p){try{let R=p.params?.id;if(!R)return n("appendFiles requires params.id");let b=e.readCard(R);if(!b)return n(`card "${R}" not found`);let w=m(p.body);if(!w||w.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},x=Array.isArray(B.files)?B.files:[],_=[...x,...w],I=w.map((d,i)=>({idx:x.length+i,entry:d})),y=this.patch({params:{id:R,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:I})}catch(R){return o(R)}}}}function ge(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ce(e){return {status:"fail",error:e}}function Re(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Yo(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Tn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function ir(e){try{let t=JSON.parse(Tn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function In(e){return Yo(JSON.stringify(e))}function Pn(e){try{let t=JSON.parse(Tn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Xe(){return new Date().toISOString()}function Xo(e){let t=new Map;return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.get(r)??[];t.set(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.get(r);if(!(!o||o.length===0)){for(let s of o)try{n(s);}catch(c){try{e(s,c instanceof Error?c.message:String(c));}catch{}}t.delete(r);}}}}function _n(e,t,r={}){Vt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),s=be(e),c=r.boardRuntimeStoreRef,u=r.scratchStoreRef,m=r.taskExecutorRef,p=r.chatHandlerFlow,R=r.emitNotification??(L=>{if(!t.publishBoardChangeNotifications)return;let h=L.kind==="notification-batch"?L.notifications:[L];return t.publishBoardChangeNotifications(h)});function b(){if(!c)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return c}function w(L){if(L.length!==0)try{let h=qe(L),q=Ne({kind:"notification-batch",notifications:h}),K=R(q);K&&typeof K.catch=="function"&&K.catch(ae=>o(`[board-live-cards-public] emitNotification failed: ${ae instanceof Error?ae.message:String(ae)}`));}catch(h){o(`[board-live-cards-public] emitNotification failed: ${h instanceof Error?h.message:String(h)}`);}}function B(){let L=_().readCardStoreRef();if(!L)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let h=t.kvStorageForRef(L);return {readIndex(){return h.read("_index")},writeIndex(q){h.write("_index",q);},readCard(q){return h.read(q)},writeCard(q,K){return h.write(q,K),t.hashFn(K)},removeCard(q){h.delete(q);},cardExists(q){return h.read(q)!==null},defaultCardKey(q){return q}}}let x={readValues(L){let h=t.kvStorageForRef(b()),q=h.listKeys().sort();if(q.length===0)return {version:null,values:{}};let K={};for(let ae of q)K[ae]=h.read(ae);return {version:t.hashFn(K),values:K}},writeValues(L,h,q){let K=t.kvStorageForRef(b());for(let ae of q)K.delete(ae);for(let[ae,ne]of Object.entries(h))K.write(ae,ne);return t.hashFn(h)}},_=()=>rr(t.kvStorageForRef(b())),I=()=>vn(x),y=()=>bn(t.journalAdapterForRef(b())),d=()=>Ft(B(),o),i=()=>{let L=_().readOutputsStoreRef();if(!L)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return An(t.kvStorageForRef(L))};function l(){return m??_().readTaskExecutorRef()}function g(){return !!I().readSnapshot(e.value).values[ct]}function f(){let L=I().readSnapshot(e.value);if(!L.values[ct])throw new Error(`Board not initialized at ${e.value}`);return or(L.values)}function C(L,h){let q=I().commitSnapshot(e.value,{schemaVersion:tr,expectedVersion:h,commitId:t.genId(),committedAt:Xe(),deleteKeys:[],shallowMerge:nr(L)});if(!q.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${h??"null"} current=${q.currentVersion??"null"}`)}function v(L){y().appendEvent(L);}async function O(){let h=Xo((X,a)=>{let k=X.payload,$=(k?.enrichedCard??{}).id??k?.cardId??"unknown";v({type:"task-failed",taskName:$,error:a,timestamp:Xe()});}),q=f(),K=Rt(q.graph),{events:ae,newCursor:ne}=y().readEntriesAfterCursor(q.lastDrainedJournalId),he=j(),fe=er(he,X=>t.resolveBlob(X)),ke={...q.runtimeByCardId},Te=new Map,He={readRuntime(X){return Te.get(X)??ke[X]??{_sources:{}}},writeRuntime(X,a){Te.set(X,a),ke[X]=a;}},Je=[],De=new Map,We={readSourceData(X,a){let k=`${X}/${a}`;return De.has(k)?De.get(k):fe.readSourceData(X,a)},ingestSourceDataStaged(X,a,k,E){fe.ingestSourceDataStaged(X,a,k,E);},commitSourceData(X,a,k){let E=`${X}/.staged/${k}/${a}`,$=he.read(E);if($==null){let Z=he.keyRef?.(E);Z&&($=t.resolveBlob(Z));}if($==null)return false;let H=`${X}/${a}`,re=$.trim();try{De.set(H,JSON.parse(re));}catch{De.set(H,re);}return Je.push({cardId:X,outputFile:a,deliveryToken:k}),true},hasSource(X,a){let k=`${X}/${a}`;return De.has(k)?true:fe.hasSource(X,a)},listSources(X){let a=fe.listSources(X),k=new Set;for(let $ of De.keys())$.startsWith(`${X}/`)&&k.add($.slice(`${X}/`.length));let E=new Set([...a,...k]);return Array.from(E)}},ze={cardStore:d(),cardRuntimeStore:He,fetchedSourcesStore:We,outputStore:i(),executionRequestStore:h},dt=[],At=[],xt=[],lt=new Map,It=new Set,jt=(X,a)=>{dt.push({type:"task-completed",taskName:X,data:a,timestamp:Xe()});},Lt=(X,a)=>{v({type:"task-failed",taskName:X,error:a,timestamp:Xe()});},bt=Kt(K,{handlers:{"card-handler":xn(e,ne,ze,jt,Lt,(X,a)=>{At.push({cardId:X,values:a});},X=>{xt.push(X);})},onNodeRemoved:X=>{lt.delete(X),Te.delete(X),delete ke[X],It.add(X);}});for(dt=ae;dt.length>0;){let X=dt;dt=[];for(let a of X)if(a.type==="task-restart"){let k=ze.cardStore.readCard(a.taskName);k&&lt.set(a.taskName,k);}bt.pushAll(X),await bt.waitForHandlers();}let hr=bt.getState();await bt.dispose({wait:true});let Rr=I().readSnapshot(e.value).version;C({lastDrainedJournalId:ne,graph:ht(hr),runtimeByCardId:ke},Rr);for(let{cardId:X,values:a}of At)ze.outputStore.writeComputedValues(X,a);for(let X of xt)ze.outputStore.writeDataObjects(X);for(let{cardId:X,outputFile:a,deliveryToken:k}of Je)fe.commitSourceData(X,a,k);let Pt;try{Pt=Ct(s,hr),ze.outputStore.writeStatusSnapshot(Pt);}catch(X){o(`[board-live-cards-public] status publish failed: ${X instanceof Error?X.message:String(X)}`);}let pt=[];for(let{cardId:X,values:a}of At)pt.push({kind:"computed_values",cardId:X,values:a});for(let X of xt)for(let[a,k]of Object.entries(X))a&&pt.push({kind:"data_object",key:a,payload:k});for(let[X,a]of lt)pt.push({kind:"card_refreshed",cardId:X,card:a});for(let X of It)pt.push({kind:"card_removed",cardId:X});Pt!==void 0&&pt.push({kind:"status",status:Pt}),w(pt);let kt=l()??{howToRun:"built-in",whatToRun:be({kind:"built-in",value:"source-cli-task-executor"})},Mt=t.supportsDirectSourceOutput?.(kt)===true;h.dispatchEntriesForJournalId(ne,X=>{if(X.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${X.taskKind}" \u2014 skipping`);return}let a=X.payload,k=a.enrichedCard?.id??"unknown",E=a.enrichedCard?.source_defs??[];if(kt.howToRun==="queue-storage"&&Mt){try{let $=t.queueStorageForRef(M(),"task-executor"),H=typeof kt.extra?.boardId=="string"?kt.extra.boardId:void 0,re=[];for(let Z of E){if(!Z.outputFile){o(`[dispatch] source "${Z.bindTo}" has no outputFile \u2014 skipping`);continue}let ue=t.genId(),Me=`${k}/.staged/${ue}/${Z.outputFile}`,Ae=he.keyRef?.(Me);if(!Ae)continue;let $e={ref:be(Ae),deliveryToken:ue,outputFile:Z.outputFile,cardId:k},Cr=In({cbk:a.callbackToken,rg:e.value,br:be(e),cid:k,b:Z.bindTo,d:Z.outputFile,cs:void 0,rqt:a.rqt,dt:$e.deliveryToken});re.push({...H?{boardId:H}:{},ref:kt,args:{source_def:Z,base_ref:be(e),callback:n.createCallback(Cr),output:$e}});}re.length>0&&$.enqueueMany(re);}catch($){Lt(k,$ instanceof Error?$.message:String($));}return}for(let $ of E){if(!$.outputFile){o(`[dispatch] source "${$.bindTo}" has no outputFile \u2014 skipping`);continue}let H;if(Mt){let Z=t.genId(),ue=`${k}/.staged/${Z}/${$.outputFile}`,Me=he.keyRef?.(ue);Me&&(H={ref:be(Me),deliveryToken:Z,outputFile:$.outputFile,cardId:k});}let re=In({cbk:a.callbackToken,rg:e.value,br:be(e),cid:k,b:$.bindTo,d:$.outputFile,cs:void 0,rqt:a.rqt,...H?{dt:H.deliveryToken}:{}});t.dispatchExecution(kt,{source_def:$,base_ref:be(e),callback:n.createCallback(re),...H?{output:H}:{}}).catch(Z=>Lt(k,Z instanceof Error?Z.message:String(Z)));}});}function M(){let L=_().readQueueStoreRef();if(!L)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);return L}function D(){let L=t.queueStorageForRef(M(),"process-accumulated");L.enqueueIfAbsent?L.enqueueIfAbsent({boardRef:be(e)},`process-accumulated:${be(e)}`):L.enqueue({boardRef:be(e)}),t.requestProcessAccumulated?.();}function J(){let L=t.queueStorageForRef(M(),"process-accumulated");for(;;){let h=L.lease({max:64,visibilityMs:1e3});if(h.length<=0)return;for(let q of h)L.ack(q.id,q.leaseToken);if(h.length<64)return}}async function te(){try{let L=()=>{let q=f(),{events:K}=y().readEntriesAfterCursor(q.lastDrainedJournalId);K.length<=0||D();},h=await Wr(t.lock,O,L);return ge({ran:h!==!1})}catch(L){return Re(L)}}function U(){D();}function se(L){try{let h=L.params?.cardStoreRef;if(!h)return ce("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(c=L.params?.boardRuntimeStoreRef,!c)return ce("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!g()){let ke=St(qt);C({lastDrainedJournalId:"",graph:ht(ke),runtimeByCardId:{}},null);}let q=L.params?.outputsStoreRef;if(!q)return ce("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let K=L.params?.queueStoreRef;if(!K)return ce("init requires params.queueStoreRef \u2014 pass the queue store ref here");let ae=L.params?.fetchedSourcesStoreRef;if(!ae)return ce("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");u=L.params?.scratchStoreRef;let ne=L.params?.chatStoreRef;if(!ne)return ce("init requires params.chatStoreRef \u2014 pass the chat store ref here");let he=L.params?.artifactsStoreRef;if(!he)return ce("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let fe=_();fe.writeBoardRuntimeStoreRef(c),fe.writeCardStoreRef(h),fe.writeOutputsStoreRef(q),fe.writeQueueStoreRef(K),fe.writeFetchedSourcesStoreRef(ae),fe.writeChatStoreRef(ne),fe.writeArtifactsStoreRef(he);try{i().writeStatusSnapshot(Ct(s,Rt(f().graph)));}catch{}return ge()}catch(h){return Re(h)}}function de(L){try{let h=i().readStatusSnapshot();if(!h){h=Ct(s,Rt(f().graph));try{i().writeStatusSnapshot(h);}catch{}}return ge(h)}catch(h){return Re(h)}}function G(L){try{let h=L.params?.id;if(!h)return ce("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(h);}catch{}return v({type:"task-removal",taskName:h,timestamp:Xe()}),U(),ge()}catch(h){return Re(h)}}function Y(L){try{let h=L.params?.cardId;if(!h)return ce("addCardFiles requires params.cardId");let q=sr(d(),{emitNotification:R}).appendFiles({params:{id:h},body:L.body});return q.status!=="success"?q:ge({cardId:h,files_added:q.data.files_added,notified:!0})}catch(h){return Re(h)}}function T(L){try{let h=L.params?.id;return h?(v({type:"task-restart",taskName:h,timestamp:Xe()}),U(),ge()):ce("retrigger requires params.id")}catch(h){return Re(h)}}async function S(L){return J(),te()}function Q(){let L=_().readFetchedSourcesStoreRef();if(!L)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return L}function j(){return t.blobStorageForRef(Q())}function A(L){try{let h=L.params?.cardId,q=L.params?.all,K=!!L.params?.restart;if(!h&&!q)return ce("upsertCard requires --card-id <id> or --all");let ae=q?d().readAllCards().map(ne=>ne.id):[h];for(let ne of ae)if(!d().readCard(ne))return ce(`Card "${ne}" not found in board at ${e.value}`);for(let ne of ae){let he=d().readCard(ne),fe=ar(he),ke=t.hashFn(fe),Te=t.kvStorage("card-upsert"),He=Te.read(ne),Je=He?.taskConfigHash!==ke;if(!(!Je&&!K)){if(Je){let De=He?.blobRef??d().readCardKey(ne)??ne;v({type:"task-upsert",taskName:ne,taskConfig:fe,timestamp:Xe()}),Te.write(ne,{blobRef:De,taskConfigHash:ke,updatedAt:Xe()});}K&&v({type:"task-restart",taskName:ne,timestamp:Xe()});}}return U(),ge()}catch(h){return Re(h)}}function P(L){try{let h=L.params?.token;if(!h)return ce("taskFailed requires params.token");let q=L.params?.error??"unknown error",K=ir(h);return K?(v({type:"task-failed",taskName:K.taskName,error:q,timestamp:Xe()}),U(),ge()):ce("Invalid callback token")}catch(h){return Re(h)}}function F(L){try{let h=L.params?.token;if(!h)return ce("taskProgress requires params.token");let K=(L.body??{}).update??{},ae=ir(h);return ae?(v({type:"task-progress",taskName:ae.taskName,update:K,timestamp:Xe()}),U(),ge()):ce("Invalid callback token")}catch(h){return Re(h)}}function N(L){try{let h=L.params?.token,q=L.params?.ref;if(!h)return ce("sourceDataFetched requires params.token");if(!q)return ce("sourceDataFetched requires params.ref");let K=Pn(h);if(!K)return ce("Invalid source token");let{cbk:ae,cid:ne,b:he,d:fe,cs:ke,rqt:Te,dt:He}=K,Je=er(j(),dt=>t.resolveBlob(dt)),De=He||t.genId();He||Je.ingestSourceDataStaged(ne,fe,at(q),De);let We=ir(ae);if(!We)return ce("Invalid callback token embedded in source token");let ze=Xe();return v({type:"task-progress",taskName:We.taskName,update:{bindTo:he,outputFile:fe,fetchedAt:ze,deliveryToken:De,sourceChecksum:ke,rqt:Te},timestamp:ze}),U(),ge()}catch(h){return Re(h)}}function V(L){try{let h=L.params?.token,q=L.params?.reason??"unknown";if(!h)return ce("sourceDataFetchFailure requires params.token");let K=Pn(h);if(!K)return ce("Invalid source token");let{cbk:ae,b:ne,d:he,cs:fe,rqt:ke}=K,Te=ir(ae);return Te?(v({type:"task-progress",taskName:Te.taskName,update:{bindTo:ne,outputFile:he,failure:!0,reason:q,sourceChecksum:fe,rqt:ke},timestamp:Xe()}),U(),ge()):ce("Invalid callback token embedded in source token")}catch(h){return Re(h)}}function z(L){try{let h=_().readCardStoreRef();return h?ge({storeRef:h}):ce(`Board at ${e.value} has no card store configured`)}catch(h){return Re(h)}}function oe(L){try{return ge({storeRef:c??null})}catch(h){return Re(h)}}function ie(L){try{let h=_().readOutputsStoreRef();return h?ge({storeRef:h}):ce(`Board at ${e.value} has no outputs store configured`)}catch(h){return Re(h)}}function Pe(L){try{return ge({storeRef:u??null})}catch(h){return Re(h)}}function Be(L){try{let h=_().readChatStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function Ee(L){try{let h=_().readArtifactsStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function ye(L){try{let h=_().readFetchedSourcesStoreRef();return ge({storeRef:h})}catch(h){return Re(h)}}function Ce(L){try{let h=L.params?.key;if(!h)return ce("getConfig requires params.key");let q=_(),K;switch(h){case "task-executor":K=m??null;break;case "chat-handler-flow":K=p??null;break;case "board-runtime-store-ref":K=q.readBoardRuntimeStoreRef();break;case "card-store-ref":K=q.readCardStoreRef();break;case "outputs-store-ref":K=q.readOutputsStoreRef();break;case "scratch-store-ref":K=u??null;break;case "chat-store-ref":K=q.readChatStoreRef();break;case "artifacts-store-ref":K=q.readArtifactsStoreRef();break;case "fetched-sources-store-ref":K=q.readFetchedSourcesStoreRef();break;default:return ce(`getConfig: unknown key "${h}"`)}return ge({value:K})}catch(h){return Re(h)}}function je(L){try{let h=L.params?.key;if(!h)return ce("getOutputsDataObject requires params.key");let q=i().readDataObject(h);return ge(q)}catch(h){return Re(h)}}function Se(L){try{return ge(i().readAllDataObjects())}catch(h){return Re(h)}}function Fe(L){try{let h=L.params?.key;if(!h)return ce("getOutputsComputedValues requires params.key");let q=i().readComputedValues(h);return ge(q)}catch(h){return Re(h)}}function Le(L){try{return ge(i().readAllComputedValues())}catch(h){return Re(h)}}function pe(){return er(j(),L=>t.resolveBlob(L))}function Ze(L){let h=j().keyRef?.(L);if(!h)throw new Error("configured fetched-sources store does not support keyRef");return be(h)}function Ke(L){try{let h=L.params?.key;if(!h)return ce("getOutputsFetchedSources requires params.key");let q=pe().listSources(h),K={};for(let ae of q)K[ae]=Ze(`${h}/${ae}`);return ge(K)}catch(h){return Re(h)}}function Ve(L){try{let h=pe(),q=new Set;for(let ae of j().listKeys()){let ne=ae.indexOf("/");ne>0&&!ae.includes("/.staged/")&&q.add(ae.slice(0,ne));}let K={};for(let ae of q){let ne=h.listSources(ae);if(ne.length>0){K[ae]={};for(let he of ne)K[ae][he]=Ze(`${ae}/${he}`);}}return ge(K)}catch(h){return Re(h)}}function et(L){try{let h=d().readAllCards(),q=de({});if(q.status!=="success")return q;let K=Se({});if(K.status!=="success")return K;let ae=Le({});if(ae.status!=="success")return ae;let ne=ae.data,he={};for(let fe of h){let ke=typeof fe?.id=="string"?fe.id:null;if(!ke)continue;let Te=fe.card_data&&typeof fe.card_data=="object"&&!Array.isArray(fe.card_data)?fe.card_data:{};he[ke]={schema_version:"v1",card_id:ke,card_data:{...Te},computed_values:ne[ke]&&typeof ne[ke]=="object"?ne[ke]:{}};}return ge({cardDefinitions:h,statusSnapshot:q.data,dataObjectsByToken:K.data,cardRuntimeById:he})}catch(h){return Re(h)}}return {init:se,status:de,getBoardRuntimeStoreRef:oe,getCardStoreRef:z,getOutputsStoreRef:ie,getScratchStoreRef:Pe,getChatStoreRef:Be,getArtifactsStoreRef:Ee,getFetchedSourcesStoreRef:ye,getConfig:Ce,getOutputsDataObject:je,getAllOutputsDataObjects:Se,getOutputsComputedValues:Fe,getAllOutputsComputedValues:Le,getOutputsFetchedSources:Ke,getAllOutputsFetchedSources:Ve,buildSseOneShotPayload:et,removeCard:G,addCardFiles:Y,retrigger:T,processAccumulatedEvents:S,upsertCard:A,taskFailed:P,taskProgress:F,sourceDataFetched:N,sourceDataFetchFailure:V}}function En(e,t,r){let n=r?.taskExecutorRef,o=()=>{if(r){if(!r.boardRuntimeStoreRef)throw new Error(`Board at ${e.value} requires boardRuntimeStoreRef for non-core runtime operations.`);return rr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return rr(t.kvStorage("config"))};function s(){let d=o().readCardStoreRef();if(!d)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let i=t.kvStorageForRef(d);return {readIndex(){return i.read("_index")},writeIndex(l){i.write("_index",l);},readCard(l){return i.read(l)},writeCard(l,g){return i.write(l,g),t.hashFn(g)},removeCard(l){i.delete(l);},cardExists(l){return i.read(l)!==null},defaultCardKey(l){return l}}}let c=()=>Ft(s(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function m(d,i){let l=t.validateSchema(i),g=[],f=u();if(f&&Array.isArray(i.source_defs))for(let v of i.source_defs){let O=typeof v.bindTo=="string"?v.bindTo:"(unknown)";try{let M;try{M=await t.invokeExecutor(f,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(v)});}catch(J){let te=J;if(M=typeof te?.stdout=="string"?te.stdout:"",!M.trim()){g.push(`source "${O}": executor validate-source-def failed \u2014 ${J instanceof Error?J.message:String(J)}`);continue}}let D=JSON.parse(M.trim());if(!D.ok&&Array.isArray(D.errors))for(let J of D.errors)g.push(`source "${O}": ${J}`);}catch(M){g.push(`source "${O}": executor validate-source-def failed \u2014 ${M instanceof Error?M.message:String(M)}`);}}let C=[...l.errors,...g];return ge({cardId:d,isValid:C.length===0,issues:C})}function p(d,i){let l=d.params?.sourceIdx,g=d.params?.outRef;if(l===void 0)return ce(`${i} requires params.sourceIdx`);if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return ce(`${i} requires card JSON object in body`);let f=d.body,C=f["card-content"]??f,v=f["mock-projections"]??{},O=C.source_defs??[];if(l<0||l>=O.length)return ce(`sourceIdx ${l} out of range (card has ${O.length} source(s))`);let M=O[l],D=typeof M.bindTo=="string"?M.bindTo:"source";return {src:M,bindTo:D,outRef:g,mockProjections:v}}async function R(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return ce("validateCardPreflight requires card JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)";return await m(g,l)}catch(i){return Re(i)}}async function b(d){try{let i=p(d,"probeSourcePreflight");if("status"in i)return i;let l=u();if(!l)return ce("No task-executor registered for this board");try{let g={...i.src,_projections:i.mockProjections},f=await t.invokeExecutor(l,"probe-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(g)}),C=JSON.parse(f.trim());return C.ok?ge({bindTo:i.bindTo,reachable:C.reachable,latencyMs:C.latencyMs,note:C.note}):ce(C.error??"Preflight probe failed")}catch{return ce("Executor does not support probe-source-preflight")}}catch(i){return Re(i)}}async function w(d){try{let i=p(d,"runSourcePreflight");if("status"in i)return i;let l=u();if(!l)return ce("No task-executor registered for this board");try{let g={...i.src,_projections:i.mockProjections},f=await t.invokeExecutor(l,"run-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(g)}),C=JSON.parse(f.trim());if(!C.ok)return ge({bindTo:i.bindTo,ok:!1,result:null,issues:[C.error??"Preflight run failed"]});if(i.outRef){let v=at(i.outRef);t.absoluteBlob.write(v.value,JSON.stringify(C.resultValue,null,2));}return ge({bindTo:typeof C.bindTo=="string"?C.bindTo:i.bindTo,ok:!0,result:C.resultValue??null,issues:[]})}catch(g){let f=g instanceof Error?g.message:String(g);return ge({bindTo:i.bindTo,ok:!1,result:null,issues:[f]})}}catch(i){return Re(i)}}async function B(d){try{let i=u();if(!i)return ce("No task-executor registered for this board");let l=await t.invokeExecutor(i,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return ge(JSON.parse(l.trim()))}catch(i){return Re(i)}}function x(d){try{let i=d.body;if(!i||!Array.isArray(i.ops))return ce("updatesInCardStore requires body.ops array");let l=i.ops,g=c();for(let f of l){let C=f.op,v=f.id;if(!v)return ce('op is missing "id"');if(C==="update"){let O=f["card-content"];if(!O)return ce(`update op for "${v}" is missing "card-content"`);g.writeCard(v,O);}else return ce(`Unknown op type: "${C??"(none)"}"`)}return ge()}catch(i){return Re(i)}}function _(d){try{let i=d.body;if(!i||!Array.isArray(i.ids))return ce("readFromCardStore requires body.ids array");let l=i.ids,g=c(),f=l.map(C=>({id:C,"card-content":g.readCard(C)}));return ge({cards:f})}catch(i){return Re(i)}}function I(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return ce("evalCardCompute requires a JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)",f=i["mock-fetched-sources"]??{},C=i["mock-requires"]??{},v=l.compute;if(!v||!Array.isArray(v)||v.length===0)return ge({cardId:g,ok:!0,computed_values:{},errors:[]});let O={id:g,card_data:l.card_data??{},requires:C,source_defs:l.source_defs,compute:v},M=Qe.runSync(O,{sourcesData:f}),D=M.node.computed_values??{},J=M.errors??[];return ge({cardId:g,ok:J.length===0,computed_values:D,errors:J})}catch(i){return Re(i)}}async function y(d){try{if(!d.body||typeof d.body!="object"||Array.isArray(d.body))return ce("simulateCardCycle requires a JSON object in body");let i=d.body,l=i["card-content"]??i,g=typeof l.id=="string"?l.id:"(unknown)",f=i["mock-fetched-sources"]??{},C=i["mock-requires"]??{},v=await m(g,l),O=v.status==="success"?{isValid:v.data.isValid,issues:v.data.issues}:{isValid:!1,issues:[v.status==="fail"?v.error:"internal error"]},M=l.source_defs??[],D=l.card_data??{},J=[],te=[];if(M.length>0){J=Qe.enrichSourcesSync(M,{card_data:D,requires:C});for(let j of J){let A=j.projections,P=j._projections;if(A&&P){for(let F of Object.keys(A))if(P[F]===void 0){let N=typeof j.bindTo=="string"?j.bindTo:"(unknown)";te.push({bindTo:N,key:F,error:`Projection "${F}" resolved to undefined`});}}}}let U=[],se={...f},de=i["task-executor-ref"],G=(de?.howToRun&&de?.whatToRun?de:void 0)??u();for(let j=0;j<J.length;j++){let A=J[j],P=typeof A.bindTo=="string"?A.bindTo:`source_${j}`;if(!G){U.push({bindTo:P,skipped:!0,error:"No task executor configured"});continue}try{let F={...A},N=await t.invokeExecutor(G,"run-source-preflight",{timeout:A.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(F)}),V=JSON.parse(N.trim());V.ok&&!Object.prototype.hasOwnProperty.call(f,P)&&Object.prototype.hasOwnProperty.call(V,"resultValue")&&(se[P]=V.resultValue),U.push({bindTo:P,reachable:V.reachable,latencyMs:V.latencyMs,error:V.ok?void 0:V.error});}catch{U.push({bindTo:P,skipped:!0,error:"Executor does not support run-source-preflight"});}}let Y=l.compute,T={},S=[];if(Y&&Array.isArray(Y)&&Y.length>0){let j={id:g,card_data:D,requires:C,source_defs:l.source_defs,compute:Y},A=Qe.runSync(j,{sourcesData:se});T=A.node.computed_values??{},S=A.errors??[];}let Q=O.isValid&&te.length===0&&S.length===0&&U.every(j=>j.reachable!==!1);return ge({cardId:g,ok:Q,validation:O,source_probes:U,projection_errors:te,fetched_sources:se,computed_values:T,compute_errors:S})}catch(i){return Re(i)}}return {validateCardPreflight:R,probeSourcePreflight:b,runSourcePreflight:w,evalCardCompute:I,simulateCardCycle:y,describeTaskExecutorCapabilities:B,updatesInCardStore:x,readFromCardStore:_}}function ur(e,t={}){function r(p){return {status:"success",data:p}}function n(p){return {status:"fail",error:p}}function o(p){return {status:"error",error:p instanceof Error?p.message:String(p)}}async function s(p){let R=t.emitNotification;if(!R||p.length===0)return;let b=qe(p);if(b.length===1){await R(b[0]);return}await R(Ne({kind:"notification-batch",notifications:b}));}async function c(p){let R=p.params?.id;if(R){let b=await e.readCard(R);if(!b)throw new Error(`card "${R}" not found`);return [b]}return await e.readAllCards()}function u(p){return Ne({kind:"notification-batch",notifications:qe(p.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function m(p){if(Array.isArray(p))return p;if(p&&typeof p=="object"){let R=p;return Array.isArray(R.files)?R.files:[p]}return null}return {async get(p){try{return r({cards:await c(p)})}catch(R){return o(R)}},async buildNotificationBatch(p){try{return r(u(await c(p)))}catch(R){return o(R)}},async set(p){try{let R=p.body;if(R==null)return n("set requires a body (card object or array of cards)");let b=Array.isArray(R)?R:[R];for(let w of b){if(typeof w.id!="string")return n("each card must have a string `id` field");await e.writeCard(w.id,w);}return await s(b.map(w=>({kind:"card_refreshed",cardId:w.id,card:w}))),r({count:b.length})}catch(R){return o(R)}},async del(p){try{let R=p.body?.ids??[],b=p.params?.id,w=b?[...R,b]:R;if(w.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of w)await e.removeCard(B);return await s(w.map(B=>({kind:"card_removed",cardId:B}))),r({count:w.length})}catch(R){return o(R)}},async patch(p){try{let R=p.params?.id,b=p.params?.path;if(!R)return n("patch requires params.id");if(!b)return n("patch requires params.path");let w=p.body,B=w&&Object.prototype.hasOwnProperty.call(w,"value")?w.value:p.body;await e.patchCard(R,b,B);let x=await e.readCard(R);return x?(await s([{kind:"card_refreshed",cardId:R,card:x}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},async appendFiles(p){try{let R=p.params?.id;if(!R)return n("appendFiles requires params.id");let b=await e.readCard(R);if(!b)return n(`card "${R}" not found`);let w=m(p.body);if(!w||w.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},x=Array.isArray(B.files)?B.files:[],_=[...x,...w],I=w.map((d,i)=>({idx:x.length+i,entry:d})),y=await this.patch({params:{id:R,path:"card_data.files"},body:{value:_}});return y.status!=="success"?y:r({files_added:I})}catch(R){return o(R)}}}}async function Bn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Fr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function qr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Fr(r),leaseToken:r.leaseToken,leaseExpiresAt:r.leaseExpiresAt}))},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},async peekActive(){return (await e.peekActive()).map(Fr)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Fr(t),reason:t.reason}))}}}function On(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return Gt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Qt(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){return e.write("board-runtime-store-ref",r)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){return e.write("card-store-ref",r)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){return e.write("outputs-store-ref",r)},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){return e.write("queue-store-ref",r)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){return e.write("scratch-store-ref",r)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){return e.write("chat-store-ref",r)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){return e.write("artifacts-store-ref",r)},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){return e.write("fetched-sources-store-ref",r)}}}function Zo(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function cr(e,t){return Zo(e)?e.then(t):t(e)}function Fn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=Fn(r[n],o):r[n]=o;return r}function dr(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let s=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:dr(s,o,r)}}function qn(e){return {read:r=>e.read(r),get(r,n){return cr(e.read(r),o=>{if(o===null)return null;let s=o;for(let c of n.split(".").filter(Boolean)){if(s===null||typeof s!="object"||Array.isArray(s))return null;s=s[c]??null;}return s??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return cr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return cr(e.read(r),o=>e.write(r,Fn(o??{},n)))},patch(r,n,o){return cr(e.read(r),s=>{let c=n.split(".").filter(Boolean);return e.write(r,dr(s??{},c,o))})}}}function lr(e){return qn(e)}function fr(e,t){return {async readIndex(){return await e.read("_index")},writeIndex(r){return e.write("_index",r)},async readCard(r){return await e.read(r)},async writeCard(r,n){return await e.write(r,n),t(n)},removeCard(r){return e.delete(r)},async cardExists(r){return await e.read(r)!==null},defaultCardKey(r){return r}}}function mr(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,s]of Object.entries(await r())){if(!await e.cardExists(s.key))continue;let c=await e.readCard(s.key);c?n.push(c):t?.(`[card-store] could not read card "${o}" at key "${s.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,s]of Object.entries(await r()))n[o]=s.checksum;return n},async changedSince(n){let o=await r(),s=[];for(let[c,u]of Object.entries(o))n[c]!==u.checksum&&s.push(c);for(let c of Object.keys(n))o[c]||s.push(c);return s},async validateUpsert(n,o){let s=await r(),c=s[n],u=Object.entries(s).find(([,m])=>m.key===o);return c&&c.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${c.key}", cannot remap to "${o}"`}:u&&u[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,s){let c=await r(),u=s??c[n]?.key??e.defaultCardKey(n),m=await e.writeCard(u,o);c[n]={key:u,checksum:m,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async patchCard(n,o,s){let c=await r(),u=c[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let m=await e.readCard(u.key);if(!m||typeof m!="object"||Array.isArray(m))throw new Error(`card "${n}" is not patchable`);let p=String(o||"").split(".").filter(Boolean),R=dr(m,p,s),b=await e.writeCard(u.key,R);c[n]={key:u.key,checksum:b,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async removeCard(n){let o=await r(),s=o[n];s&&(await e.removeCard(s.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function xe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ve(e){return {status:"fail",error:e}}function Ie(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Ue(){return new Date().toISOString()}function ea(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Ln(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function pr(e){try{let t=JSON.parse(Ln(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Nn(e){return ea(JSON.stringify(e))}function jn(e){try{let t=JSON.parse(Ln(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ta(e){return Br(e,wn,()=>({_sources:{}}))}function ra(e,t){return Xt(e,t)}function na(e){return Zt(e)}function oa(e,t){return Er(e,t)}function aa(e,t,r,n,o,s){return async c=>{let u=[],m=await r.cardStore.readCard(c.nodeId);if(!m)return "task-initiate-failure";let p=m.id,R=m.card_data??{},b=m.source_defs??[],w=b,B=await r.cardRuntimeStore.readRuntime(p),x=false,_=async()=>{x&&(await r.cardRuntimeStore.writeRuntime(p,B),x=false);},I=U=>Et(B._sources[U]),y=(U,se)=>{B._sources[U]=Et(se),x=true;},d=c.taskState?.executionCount??0;if(B._lastExecutionCount!==d&&(B._sources={},B._lastExecutionCount=d,x=true),c.update){let U=c.update.outputFile;if(U){let se=I(U);if(c.update.failure){let de=c.update.rqt??se.lastRequestedToken??se.queueRequestedToken;de&&y(U,Ot(se,de));}else {let de=c.update.rqt;if(!se.lastCompletedToken||de>se.lastCompletedToken){let G=typeof c.update.deliveryToken=="string"?c.update.deliveryToken:void 0,Y=G?await r.fetchedSourcesStore.commitSourceData(p,U,G):false;y(U,Y?Or(se,de):Ot(se,de));}}await _();}}let i={};for(let U of b){if(!U.outputFile)continue;let se=await r.fetchedSourcesStore.readSourceData(p,U.outputFile);se!==null&&(i[U.bindTo]=se);}let l={};for(let[U,se]of Object.entries(c.state??{}))if(se!==null&&typeof se=="object"&&!Array.isArray(se)){let de=se[U];l[U]=de!==void 0?de:se;}else l[U]=se;let g={id:p,card_data:{...R},requires:l,source_defs:b,compute:m.compute};g._sourcesData=i,m.compute&&Qe.runSync(g,{sourcesData:i}),(o??(()=>{}))(p,g.computed_values??{});let f=Qe.enrichSourcesSync(Array.isArray(m.source_defs)?m.source_defs:void 0,{card_data:m.card_data,requires:l}),C={...m,source_defs:Array.isArray(f)?f.map(U=>({...U,boardDir:typeof U.boardDir=="string"&&U.boardDir?U.boardDir:e.value})):f},v=Ue(),O=c.update?void 0:v,M=w.filter(U=>{let se=U.outputFile;if(typeof se!="string"||!se)return true;let de=I(se);O&&(de={...de,queueRequestedToken:O},y(se,de));let G=de.queueRequestedToken??de.lastRequestedToken??v;return Bt(de,G)==="dispatch"});if(await _(),M.length>0){let U=false,se=v;for(let de of M){let G=de.outputFile;if(typeof G!="string"||!G)continue;let Y=I(G),T=Y.queueRequestedToken??v;y(G,{...Y,lastRequestedToken:T}),se=T,U=true;}return U&&await _(),U&&(u.push({taskKind:"source-fetch",payload:{boardRef:be(e),enrichedCard:C,callbackToken:c.callbackToken,rqt:se}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(w.some(U=>{let se=U.outputFile;if(typeof se!="string"||!se)return false;let de=I(se),G=de.queueRequestedToken??de.lastRequestedToken??v;return Bt(de,G)==="in-flight"}))return "task-initiated";let J=m.provides??[],te={};for(let{bindTo:U,ref:se}of J)te[U]=Qe.resolve(g,se);return (s??(()=>{}))(te),n(c.nodeId,te),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Mn(e,t,r={}){Vt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),s=be(e),c=r.emitNotification??(T=>{if(!t.publishBoardChangeNotifications)return;let S=T.kind==="notification-batch"?T.notifications:[T];return t.publishBoardChangeNotifications(S)}),u=null,m=r.boardRuntimeStoreRef,p=r.scratchStoreRef,R=r.taskExecutorRef,b=r.chatHandlerFlow;function w(){if(!m)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return m}function B(T){if(T.length!==0)try{let S=qe(T),Q=Ne({kind:"notification-batch",notifications:S});return Promise.resolve(c(Q)).catch(j=>{o(`[async-board-live-cards-public] emitNotification failed: ${j instanceof Error?j.message:String(j)}`);})}catch(S){o(`[async-board-live-cards-public] emitNotification failed: ${S instanceof Error?S.message:String(S)}`);return}}let x=()=>On(t.kvStorageForRef(w())),_=e.value,I=()=>zt(Tr(()=>t.kvStorageForRef(w()),t.hashFn),"v1"),y=async()=>{let T=await x().readOutputsStoreRef();if(!T)throw new Error(`Board at ${e.value} has no outputs store configured.`);return na(t.kvStorageForRef(T))},d=async()=>{let T=await x().readCardStoreRef();if(!T)throw new Error(`Board at ${e.value} has no card store configured.`);let S=t.kvStorageForRef(T);return mr(fr(lr(S),t.hashFn),o)};async function i(){return !!(await I().readSnapshot(_)).values[ct]}async function l(){let T=await I().readSnapshot(_);if(!T.values[ct])throw new Error(`Board not initialized at ${e.value}`);return or(T.values)}async function g(T,S){let Q=await I().commitSnapshot(_,{schemaVersion:"v1",expectedVersion:S,deleteKeys:[],shallowMerge:nr(T)});if(!Q.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${S??"null"} current=${Q.currentVersion??"null"}`)}let f=()=>Cn(t.journalStorageForRef(w()));async function C(){return R??await x().readTaskExecutorRef()}async function v(T){await f().appendEvent(T);}async function O(){let T=await x().readFetchedSourcesStoreRef();if(!T)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return T}async function M(){return t.blobStorageForRef(await O())}async function D(){return ra(await M(),T=>t.resolveBlob(T))}async function J(T){let S=(await M()).keyRef?.(T);if(!S)throw new Error("configured fetched-sources store does not support keyRef");let Q=await Promise.resolve(S);return be(Q)}async function te(){let T=oa(t.kvStorageForRef(w()),async(h,q)=>{let K=h.payload,ne=(K.enrichedCard??{}).id??K.cardId??"unknown";await v({type:"task-failed",taskName:ne,error:q,timestamp:Ue()});}),S=ta(t.kvStorageForRef(w())),Q=await M(),j=await D(),A=await d(),P=await y(),F=new Map,N=new Map,V=[],z=[],oe=[],ie=new Map,Pe=new Set,Be={async readRuntime(h){return F.get(h)??await S.readRuntime(h)},async writeRuntime(h,q){F.set(h,q),je[h]=q;}},Ee={async readSourceData(h,q){let K=`${h}/${q}`;return N.has(K)?N.get(K):await j.readSourceData(h,q)},ingestSourceDataStaged(h,q,K,ae){return j.ingestSourceDataStaged(h,q,K,ae)},async commitSourceData(h,q,K){let ae=`${h}/.staged/${K}/${q}`,ne=await Q.read(ae);if(ne==null){let ke=await Promise.resolve(Q.keyRef?.(ae));ke&&(ne=await t.resolveBlob(ke));}if(ne==null)return false;let he=`${h}/${q}`,fe=ne.trim();try{N.set(he,JSON.parse(fe));}catch{N.set(he,fe);}return V.push({cardId:h,outputFile:q,deliveryToken:K}),true},async hasSource(h,q){let K=`${h}/${q}`;return N.has(K)||await j.hasSource(h,q)},async listSources(h){let q=await j.listSources(h),K=[...N.keys()].filter(ae=>ae.startsWith(`${h}/`)).map(ae=>ae.slice(`${h}/`.length));return [...new Set([...q,...K])]}},ye=await l(),Ce=Rt(ye.graph),je={...ye.runtimeByCardId},{events:Se,newCursor:Fe}=await f().readEntriesAfterCursor(ye.lastDrainedJournalId),Le=Se,pe=Kt(Ce,{handlers:{"card-handler":aa(e,Fe,{cardStore:A,cardRuntimeStore:Be,fetchedSourcesStore:Ee,executionRequestStore:T},(h,q)=>{Le.push({type:"task-completed",taskName:h,data:q,timestamp:Ue()});},(h,q)=>{z.push({cardId:h,values:q});},h=>{oe.push(h);})},onNodeRemoved:h=>{ie.delete(h),F.delete(h),delete je[h],Pe.add(h);}});for(;Le.length>0;){let h=Le;Le=[];for(let q of h)if(q.type==="task-restart"){let K=await A.readCard(q.taskName);K&&ie.set(q.taskName,K);}pe.pushAll(h),await pe.waitForHandlers();}let Ze=pe.getState();await pe.dispose({wait:true}),await g({lastDrainedJournalId:Fe,graph:ht(Ze),runtimeByCardId:je},(await I().readSnapshot(_)).version);for(let{cardId:h,values:q}of z)await P.writeComputedValues(h,q);for(let h of oe)await P.writeDataObjects(h);for(let[h,q]of F)await S.writeRuntime(h,q);for(let h of V)await j.commitSourceData(h.cardId,h.outputFile,h.deliveryToken);let Ke=Ct(s,Ze);await P.writeStatusSnapshot(Ke);let Ve=[];for(let{cardId:h,values:q}of z)Ve.push({kind:"computed_values",cardId:h,values:q});for(let h of oe)for(let[q,K]of Object.entries(h))Ve.push({kind:"data_object",key:q,payload:K});for(let[h,q]of ie)Ve.push({kind:"card_refreshed",cardId:h,card:q});for(let h of Pe)Ve.push({kind:"card_removed",cardId:h});Ve.push({kind:"status",status:Ke}),await B(Ve);let et=await C();if(!et)return;let L=t.supportsDirectSourceOutput?.(et)===true;await T.dispatchEntriesForJournalId(Fe,async h=>{if(h.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${h.taskKind}" \u2014 skipping`);return}let q=h.payload,K=q.enrichedCard?.id??"unknown",ae=q.enrichedCard?.source_defs??[];if(et.howToRun==="queue-storage"&&L){try{let ne=await x().readQueueStoreRef();if(!ne)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let he=t.queueStorageForRef(ne,"task-executor"),fe=typeof et.extra?.boardId=="string"?et.extra.boardId:void 0,ke=[];for(let Te of ae){if(!Te.outputFile)continue;let He=t.genId(),Je=`${K}/.staged/${He}/${Te.outputFile}`,De=await Promise.resolve(Q.keyRef?.(Je));if(!De)continue;let We={ref:be(De),deliveryToken:He,outputFile:Te.outputFile,cardId:K},ze=Nn({cbk:q.callbackToken,rg:e.value,br:be(e),cid:K,b:Te.bindTo,d:Te.outputFile,cs:void 0,rqt:q.rqt,dt:We.deliveryToken});ke.push({...fe?{boardId:fe}:{},ref:et,args:{source_def:Te,base_ref:be(e),callback:n.createCallback(ze),output:We}});}ke.length>0&&await he.enqueueMany(ke);}catch(ne){await v({type:"task-failed",taskName:K,error:ne instanceof Error?ne.message:String(ne),timestamp:Ue()});}return}for(let ne of ae){if(!ne.outputFile)continue;let he;if(L){let Te=t.genId(),He=`${K}/.staged/${Te}/${ne.outputFile}`,Je=await Promise.resolve(Q.keyRef?.(He));Je&&(he={ref:be(Je),deliveryToken:Te,outputFile:ne.outputFile,cardId:K});}let fe=Nn({cbk:q.callbackToken,rg:e.value,br:be(e),cid:K,b:ne.bindTo,d:ne.outputFile,cs:void 0,rqt:q.rqt,...he?{dt:he.deliveryToken}:{}}),ke=await t.dispatchExecution(et,{source_def:ne,base_ref:be(e),callback:n.createCallback(fe),...he?{output:he}:{}});ke.dispatched||await v({type:"task-failed",taskName:K,error:ke.error??"dispatch failed",timestamp:Ue()});}});}async function U(){try{let T=async()=>{let Q=await l(),{events:j}=await f().readEntriesAfterCursor(Q.lastDrainedJournalId);j.length>0&&await de();},S=await Bn(t.lock,te,T);return xe({ran:S!==!1})}catch(T){return Ie(T)}}async function se(){return u||(u=U().finally(()=>{u=null;}),u)}async function de(){let T=await x().readQueueStoreRef();if(!T)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let S=t.queueStorageForRef(T,"process-accumulated");S.enqueueIfAbsent?await S.enqueueIfAbsent({boardRef:be(e)},`process-accumulated:${be(e)}`):await S.enqueue({boardRef:be(e)}),await t.requestProcessAccumulated?.();}async function G(){let T=await x().readQueueStoreRef();if(!T)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let S=t.queueStorageForRef(T,"process-accumulated");for(;;){let Q=await S.lease({max:64,visibilityMs:1e3});if(Q.length<=0)return;for(let j of Q)await S.ack(j.id,j.leaseToken);if(Q.length<64)return}}function Y(){de();}return {async init(T){try{let S=T.params?.cardStoreRef;if(!S)return ve("init requires params.cardStoreRef");if(m=T.params?.boardRuntimeStoreRef,!m)return ve("init requires params.boardRuntimeStoreRef");let Q=T.params?.outputsStoreRef;if(!Q)return ve("init requires params.outputsStoreRef");let j=T.params?.queueStoreRef;if(!j)return ve("init requires params.queueStoreRef");let A=T.params?.fetchedSourcesStoreRef;if(!A)return ve("init requires params.fetchedSourcesStoreRef");p=T.params?.scratchStoreRef;let P=T.params?.chatStoreRef;if(!P)return ve("init requires params.chatStoreRef");let F=T.params?.artifactsStoreRef;if(!F)return ve("init requires params.artifactsStoreRef");await i()||await g({lastDrainedJournalId:"",graph:ht(St(qt)),runtimeByCardId:{}},null);let N=x();return await N.writeBoardRuntimeStoreRef(m),await N.writeCardStoreRef(S),await N.writeOutputsStoreRef(Q),await N.writeQueueStoreRef(j),await N.writeFetchedSourcesStoreRef(A),await N.writeChatStoreRef(P),await N.writeArtifactsStoreRef(F),await(await y()).writeStatusSnapshot(Ct(s,Rt((await l()).graph))),xe()}catch(S){return Ie(S)}},async status(T){try{let S=await y(),Q=await S.readStatusSnapshot();return Q||(Q=Ct(s,Rt((await l()).graph)),await S.writeStatusSnapshot(Q)),xe(Q)}catch(S){return Ie(S)}},async getCardStoreRef(T){try{let S=await x().readCardStoreRef();return S?xe({storeRef:S}):ve(`Board at ${e.value} has no card store configured`)}catch(S){return Ie(S)}},async getBoardRuntimeStoreRef(T){try{return xe({storeRef:m??null})}catch(S){return Ie(S)}},async getOutputsStoreRef(T){try{let S=await x().readOutputsStoreRef();return S?xe({storeRef:S}):ve(`Board at ${e.value} has no outputs store configured`)}catch(S){return Ie(S)}},async getScratchStoreRef(T){try{return xe({storeRef:p??null})}catch(S){return Ie(S)}},async getChatStoreRef(T){try{return xe({storeRef:await x().readChatStoreRef()})}catch(S){return Ie(S)}},async getArtifactsStoreRef(T){try{return xe({storeRef:await x().readArtifactsStoreRef()})}catch(S){return Ie(S)}},async getFetchedSourcesStoreRef(T){try{return xe({storeRef:await x().readFetchedSourcesStoreRef()})}catch(S){return Ie(S)}},async getConfig(T){try{let S=T.params?.key;if(!S)return ve("getConfig requires params.key");let Q=x(),j;switch(S){case "task-executor":j=R??null;break;case "chat-handler-flow":j=b??null;break;case "board-runtime-store-ref":j=await Q.readBoardRuntimeStoreRef();break;case "card-store-ref":j=await Q.readCardStoreRef();break;case "outputs-store-ref":j=await Q.readOutputsStoreRef();break;case "scratch-store-ref":j=p??null;break;case "chat-store-ref":j=await Q.readChatStoreRef();break;case "artifacts-store-ref":j=await Q.readArtifactsStoreRef();break;case "fetched-sources-store-ref":j=await Q.readFetchedSourcesStoreRef();break;default:return ve(`getConfig: unknown key "${S}"`)}return xe({value:j})}catch(S){return Ie(S)}},async getOutputsDataObject(T){try{let S=T.params?.key;return S?xe(await(await y()).readDataObject(S)):ve("getOutputsDataObject requires params.key")}catch(S){return Ie(S)}},async getAllOutputsDataObjects(T){try{return xe(await(await y()).readAllDataObjects())}catch(S){return Ie(S)}},async getOutputsComputedValues(T){try{let S=T.params?.key;return S?xe(await(await y()).readComputedValues(S)):ve("getOutputsComputedValues requires params.key")}catch(S){return Ie(S)}},async getAllOutputsComputedValues(T){try{return xe(await(await y()).readAllComputedValues())}catch(S){return Ie(S)}},async getOutputsFetchedSources(T){try{let S=T.params?.key;if(!S)return ve("getOutputsFetchedSources requires params.key");let Q=await(await D()).listSources(S),j={};for(let A of Q)j[A]=await J(`${S}/${A}`);return xe(j)}catch(S){return Ie(S)}},async getAllOutputsFetchedSources(T){try{let S=await D(),Q=await(await M()).listKeys(),j=new Set;for(let P of Q){let F=P.indexOf("/");F>0&&!P.includes("/.staged/")&&j.add(P.slice(0,F));}let A={};for(let P of j){let F=await S.listSources(P);if(F.length!==0){A[P]={};for(let N of F)A[P][N]=await J(`${P}/${N}`);}}return xe(A)}catch(S){return Ie(S)}},async buildSseOneShotPayload(T){try{let S=await(await d()).readAllCards(),Q=await this.status({});if(Q.status!=="success")return Q;let j=await this.getAllOutputsDataObjects({});if(j.status!=="success")return j;let A=await this.getAllOutputsComputedValues({});if(A.status!=="success")return A;let P=A.data,F={};for(let N of S){let V=typeof N?.id=="string"?N.id:null;if(!V)continue;let z=N.card_data&&typeof N.card_data=="object"&&!Array.isArray(N.card_data)?N.card_data:{};F[V]={schema_version:"v1",card_id:V,card_data:{...z},computed_values:P[V]&&typeof P[V]=="object"?P[V]:{}};}return xe({cardDefinitions:S,statusSnapshot:Q.data,dataObjectsByToken:j.data,cardRuntimeById:F})}catch(S){return Ie(S)}},async addCardFiles(T){try{let S=T.params?.cardId;if(!S)return ve("addCardFiles requires params.cardId");let j=await ur(await d(),{emitNotification:c}).appendFiles({params:{id:S},body:T.body});return j.status!=="success"?j:xe({cardId:S,files_added:j.data.files_added,notified:!0})}catch(S){return Ie(S)}},async removeCard(T){try{let S=T.params?.id;if(!S)return ve("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(S);}catch{}return await v({type:"task-removal",taskName:S,timestamp:Ue()}),Y(),xe()}catch(S){return Ie(S)}},async retrigger(T){try{let S=T.params?.id;return S?(await v({type:"task-restart",taskName:S,timestamp:Ue()}),Y(),xe()):ve("retrigger requires params.id")}catch(S){return Ie(S)}},async processAccumulatedEvents(T){return await G(),se()},async upsertCard(T){try{let S=T.params?.cardId,Q=T.params?.all,j=!!T.params?.restart;if(!S&&!Q)return ve("upsertCard requires --card-id <id> or --all");let A=await d(),P=Q?(await A.readAllCards()).map(N=>N.id):[S];for(let N of P)if(!await A.readCard(N))return ve(`Card "${N}" not found in board at ${e.value}`);let F=t.kvStorage("card-upsert");for(let N of P){let V=await A.readCard(N);if(!V)continue;let z=ar(V),oe=t.hashFn(z),ie=await F.read(N),Pe=ie?.taskConfigHash!==oe;if(!(!Pe&&!j)){if(Pe){let Be=ie?.blobRef??await A.readCardKey(N)??N;await v({type:"task-upsert",taskName:N,taskConfig:z,timestamp:Ue()}),await F.write(N,{blobRef:Be,taskConfigHash:oe,updatedAt:Ue()});}j&&await v({type:"task-restart",taskName:N,timestamp:Ue()});}}return Y(),xe()}catch(S){return Ie(S)}},async taskFailed(T){try{let S=T.params?.token;if(!S)return ve("taskFailed requires params.token");let Q=T.params?.error??"unknown error",j=pr(S);return j?(await v({type:"task-failed",taskName:j.taskName,error:Q,timestamp:Ue()}),Y(),xe()):ve("Invalid callback token")}catch(S){return Ie(S)}},async taskProgress(T){try{let S=T.params?.token;if(!S)return ve("taskProgress requires params.token");let Q=(T.body??{}).update??{},j=pr(S);return j?(await v({type:"task-progress",taskName:j.taskName,update:Q,timestamp:Ue()}),Y(),xe()):ve("Invalid callback token")}catch(S){return Ie(S)}},async sourceDataFetched(T){try{let S=T.params?.token,Q=T.params?.ref;if(!S)return ve("sourceDataFetched requires params.token");if(!Q)return ve("sourceDataFetched requires params.ref");let j=jn(S);if(!j)return ve("Invalid source token");let A=await D(),P=j.dt||t.genId();j.dt||await A.ingestSourceDataStaged(j.cid,j.d,at(Q),P);let F=pr(j.cbk);return F?(await v({type:"task-progress",taskName:F.taskName,update:{bindTo:j.b,outputFile:j.d,fetchedAt:Ue(),deliveryToken:P,sourceChecksum:j.cs,rqt:j.rqt},timestamp:Ue()}),Y(),xe()):ve("Invalid callback token embedded in source token")}catch(S){return Ie(S)}},async sourceDataFetchFailure(T){try{let S=T.params?.token,Q=T.params?.reason??"unknown";if(!S)return ve("sourceDataFetchFailure requires params.token");let j=jn(S);if(!j)return ve("Invalid source token");let A=pr(j.cbk);return A?(await v({type:"task-progress",taskName:A.taskName,update:{bindTo:j.b,outputFile:j.d,failure:!0,reason:Q,sourceChecksum:j.cs,rqt:j.rqt},timestamp:Ue()}),Y(),xe()):ve("Invalid callback token embedded in source token")}catch(S){return Ie(S)}}}}async function sa(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Dn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=qe(n);if(s.length===1){await o(s[0]);return}await o(Ne({kind:"notification-batch",notifications:s}));}return {async enqueue(n){let o=await e.enqueue(n);return await r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},async enqueueMany(n){let o=await e.enqueueMany(n);return await r(o.map(s=>({kind:"message_enqueued",lane:t.lane,message:s}))),o},enqueueIfAbsent:e.enqueueIfAbsent?async(n,o)=>{let s=await e.enqueueIfAbsent(n,o);return s&&await r([{kind:"message_enqueued",lane:t.lane,message:s}]),s}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,s){return e.nack(n,o,s)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},async stage(n,o){return e.stage(n,o)},async commitStaged(n){let o=await e.commitStaged(n);if(o){let s=await sa(e,n);s&&await r([{kind:"message_enqueued",lane:t.lane,message:s}]);}return o},async discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Nr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ia(e){return {...Nr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function ua(e){return {...Nr(e),reason:e.reason}}function jr(e){return {enqueueRequest(t){return e.enqueue(t).id},enqueueRequestIfAbsent:e.enqueueIfAbsent?(t,r)=>{let n=e.enqueueIfAbsent(t,r);return n?n.id:null}:void 0,leaseRequests(t){return e.lease(t).map(ia)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(Nr)},peekDeadLetter(){return e.peekDeadLetter().map(ua)}}}function ca(e,t){return e.peekActive().find(r=>r.id===t)}function $n(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let s=qe(n);if(s.length===1){await o(s[0]);return}await o(Ne({kind:"notification-batch",notifications:s}));}return {enqueue(n){let o=e.enqueue(n);return r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},enqueueMany(n){let o=e.enqueueMany(n);return r(o.map(s=>({kind:"message_enqueued",lane:t.lane,message:s}))),o},enqueueIfAbsent:e.enqueueIfAbsent?(n,o)=>{let s=e.enqueueIfAbsent(n,o);return s&&r([{kind:"message_enqueued",lane:t.lane,message:s}]),s}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,s){return e.nack(n,o,s)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},stage(n,o){return e.stage(n,o)},commitStaged(n){let o=e.commitStaged(n);if(o){let s=ca(e,n);s&&r([{kind:"message_enqueued",lane:t.lane,message:s}]);}return o},discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Vn(){return new Date().toISOString()}function Un(e){return new TextEncoder().encode(e).byteLength}function da(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Kn(e){function t(r){let n=e.stat?da(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let o=e.read(r);return o===null?{key:r}:{key:r,size:Un(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Vn(),s.size=s.size??Un(n),s},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let c=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,c);}let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??Vn(),s.size=s.size??n.byteLength,s},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function Hn(){function e(o,s){if(!Array.isArray(o))return [];let c=[];for(let u of o){if(!u||typeof u!="object")continue;let m=u;typeof m.stored_name=="string"&&c.push({name:typeof m.name=="string"?m.name:m.stored_name,stored_name:m.stored_name,size:typeof m.size=="number"&&Number.isFinite(m.size)?m.size:null,mime_type:typeof m.mime_type=="string"?m.mime_type:null,uploaded_at:typeof m.uploaded_at=="string"?m.uploaded_at:s||null,chat:m.chat===true});}return c}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let c=t(o);if(s.length===0)return o.files=c,c;let u=new Set(c.map(m=>m.stored_name));for(let m of s)u.has(m.stored_name)||(c.push(m),u.add(m.stored_name));return o.files=c,c}function n(o,s,c){let u=t(o);if(!Number.isInteger(s)||s<0||s>=u.length)return {ok:false,reason:"index_out_of_range"};let m=u[s];return !m||!m.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==m.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:m}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function Jn(e,t={}){let r=t.emitNotification;function n(y){let d=typeof y=="number"?y:Number(y);return Number.isInteger(d)&&d>0?d:null}function o(y,d){let i=d;for(let l=y.length-1;l>=0;l-=1)if(y[l]?.role==="user"&&(i-=1,i===0))return y.slice(l);return y}function s(y){return y.some(d=>typeof d?.turn=="string"&&d.turn!=="")}function c(y,d){if(d<=0)return [];if(!s(y))return o(y,d);let i=new Map,l=[];for(let f of y){let C=typeof f?.turn=="string"?f.turn:"";i.has(C)||(i.set(C,[]),l.push(C)),i.get(C).push(f);}return l.slice(Math.max(0,l.length-d)).flatMap(f=>i.get(f)??[])}function u(y){return {status:"success",data:y}}function m(y){return {status:"fail",error:y}}function p(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}function R(y){return {role:String(y.role||"system"),text:String(y.text||""),files:Array.isArray(y.files)?y.files:[],...typeof y.turn=="string"&&y.turn?{turn:y.turn}:{}}}async function b(y){if(!r||y.length===0)return;let d=qe(y);if(d.length===1){await r(d[0]);return}await r(Ne({kind:"notification-batch",notifications:d}));}async function w(y){let d=await e.readAll(y);return c(d,1).map(R)}async function B(y){let d=Date.now();return {kind:"card_chats",cardId:y,sentAt:new Date(d).toISOString(),sentAtMs:d,messages:await w(y),receiving:true,processing:await e.isProcessing(y)}}async function x(y,d="command envelope"){let i=typeof y.cardId=="string"?y.cardId:void 0;if(!y.command)return m(`chat-store: ${d} missing "command"`);if(!i)return m(`chat-store: ${d} missing "cardId"`);if(y.command==="append")return await I.append({params:{cardId:i},body:{role:y.role,text:y.text,files:y.files,turn:y.turn}});if(y.command==="read-all")return await I.readAll({params:{cardId:i},body:{lastUserTurns:y.lastUserTurns,tailTurns:y.tailTurns,turnId:y.turnId,allTurns:y.allTurns,tailTurnsBeforeId:y.tailTurnsBeforeId}});if(y.command==="read-after")return await I.readAfter({params:{cardId:i},body:{cursor:y.cursor??null}});if(y.command==="clear")return await I.clear({params:{cardId:i}});if(y.command==="set-processing")return await I.setProcessing({params:{cardId:i},body:{active:y.active}});if(y.command==="is-processing")return await I.isProcessing({params:{cardId:i}});if(y.command==="get-config")return await I.getConfig({params:{cardId:i}});if(y.command==="set-config"){let{command:l,cardId:g,...f}=y;return await I.setConfig({params:{cardId:i},body:f})}return m(`chat-store: unknown command "${String(y.command)}"`)}async function _(y){if(!Array.isArray(y.commands)||y.commands.length===0)return m('chat-store: command envelope must include a non-empty "commands" array');let d=[];for(let i=0;i<y.commands.length;i+=1){let l=y.commands[i];if(!l||typeof l!="object"||Array.isArray(l))return m(`chat-store: command envelope entry ${i} must be an object`);let g={cardId:y.cardId,...l},f=await x(g,`command envelope entry ${i}`);if(f.status!=="success")return f;d.push({index:i,command:String(g.command),data:f.data});}return u({results:d})}let I={async append(y){try{let d=y.params?.cardId;if(!d)return m("append requires params.cardId");let i=y.body??{},l=typeof i.role=="string"?i.role:"",g=typeof i.text=="string"?i.text:"",f=Array.isArray(i.files)?i.files:[],C=typeof i.turn=="string"?i.turn:"";if(!l)return m("append requires body.role");let v=await e.append(d,l,g,f,C);return await b([{kind:"chat_messages",cardId:d,messages:await w(d)}]),u({id:v})}catch(d){return p(d)}},async readAll(y){try{let d=y.params?.cardId;if(!d)return m("readAll requires params.cardId");let i=y.body??{},l=typeof i.turnId=="string"?i.turnId:"",g=i.allTurns===!0,f=typeof i.tailTurnsBeforeId=="string"?i.tailTurnsBeforeId:"",C=i.tailTurns===void 0?i.lastUserTurns:i.tailTurns,v=C===void 0?g||l?void 0:1:n(C);if(C!==void 0&&v===null)return m("readAll requires body.tailTurns (positive integer)");let O=await e.readAll(d),M=O.filter(D=>!l||String(D.turn||"")===l);if(f){let D=v;if(typeof D!="number"||!Number.isInteger(D)||D<=0)return m("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let J=new Map,te=[];for(let G of O){let Y=String(G.turn||"");J.has(Y)||(J.set(Y,[]),te.push(Y)),J.get(Y).push(G);}let U=te.findIndex(G=>G===f),se=Math.max(0,U-D);return M=(U===-1?[]:te.slice(se,U)).flatMap(G=>J.get(G)??[]),u({records:M})}return u(typeof v=="number"?{records:c(M,v)}:{records:M})}catch(d){return p(d)}},async buildSseOneShotBatch(y){try{let d=y.params?.cardId;if(!d)return m("buildSseOneShotBatch requires params.cardId");let i=y.body??{},l=typeof i.receiving=="boolean"?i.receiving:!0,g=await B(d);return u(Ne({kind:"notification-batch",notifications:[{...g,receiving:l}]}))}catch(d){return p(d)}},async readAfter(y){try{let d=y.params?.cardId;if(!d)return m("readAfter requires params.cardId");let l=(y.body??{}).cursor??null;return u(await e.readAfter(d,l))}catch(d){return p(d)}},async clear(y){try{let d=y.params?.cardId;return d?(await e.clear(d),u({ok:!0})):m("clear requires params.cardId")}catch(d){return p(d)}},async setProcessing(y){try{let d=y.params?.cardId;if(!d)return m("setProcessing requires params.cardId");let i=y.body??{};return typeof i.active!="boolean"?m("setProcessing requires body.active (boolean)"):(await e.setProcessing(d,i.active),await b([{kind:"chat_processing",cardId:d,active:i.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(d){return p(d)}},async isProcessing(y){try{let d=y.params?.cardId;return d?u({active:await e.isProcessing(d)}):m("isProcessing requires params.cardId")}catch(d){return p(d)}},async getConfig(y){try{let d=y.params?.cardId;return d?u({config:await e.getConfig(d)}):m("getConfig requires params.cardId")}catch(d){return p(d)}},async setConfig(y){try{let d=y.params?.cardId;if(!d)return m("setConfig requires params.cardId");let i=y.body??{};return await e.setConfig(d,i),u({ok:!0})}catch(d){return p(d)}},run:x,runBatch:_};return I}function wt(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function Qn(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(wt):[]:wt(e)?[e]:[]}function Gn(e,t,r){let n=0;return {accepted:e.filter(s=>{if(!wt(s))return n++,false;let c=s;return typeof c.sentAtMs=="number"&&t-c.sentAtMs>r?(n++,false):true}),rejected:n}}function zn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Lr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function la(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function Wn(e,t){if(t.kind==="status"){Lr(t.status)&&(e.status=t.status);return}if(t.kind==="computed_values"){e.computedValues[t.cardId]=t.values;return}if(t.kind==="data_object"){e.dataObjects[t.key]=t.payload;return}if(t.kind==="card_refreshed"){e.cards[t.cardId]=t.card;return}t.kind==="card_removed"&&(delete e.cards[t.cardId],delete e.computedValues[t.cardId]);}function Yn(e,t){if(la(t)){for(let r of t.notifications)wt(r)&&Wn(e,r);return}wt(t)&&Wn(e,t);}function Mr(e){let t=new Map,r=0;function n(d){let i=JSON.stringify(d);return r++,`id: ${r}
2
2
  data: ${i}
3
3
 
4
- `}function o(d){let i=d;try{i.flushHeaders?.();}catch{}try{i.flush?.();}catch{}try{i.socket?.setNoDelay?.(!0);}catch{}try{i.socket?.uncork?.();}catch{}}function s(d,i){let l=t.get(d);if(l&&!(i&&l.res!==i)){t.delete(d);try{e.onSseClientDisconnected?.(d);}catch{}try{l.res.end();}catch{}}}function c(d,i,l){let g=t.get(d);g&&s(d,g.res),t.set(d,{res:i,subscribedChatCardIds:l?.subscribedChatCardIds??new Set,subscribedChannelNames:l?.subscribedChannelNames??new Set,subscribedCardChannels:l?.subscribedCardChannels??new Map});}function u(d,i){let l=t.get(d);if(!l)return;let g=n(i);try{l.res.write(g),o(l.res);}catch{s(d,l.res);}}function m(d){return Ne({kind:"notification-batch",notifications:d})}async function p(d,i){let l=await e.buildChatOneShotBatch(d,i);return l.status==="success"?l.data:m([])}async function R(d,i){let l=t.get(d);return l?(l.subscribedChatCardIds.add(i),u(d,await p(i,true)),true):false}function S(d,i){let l=t.get(d);return l?(l.subscribedChatCardIds.delete(i),true):false}function A(d,i,l){let g=t.get(d);if(!g)return false;if(l){let f=g.subscribedCardChannels.get(l)??new Set;return f.add(i),g.subscribedCardChannels.set(l,f),true}return g.subscribedChannelNames.add(i),true}function B(d,i,l){let g=t.get(d);if(!g)return false;if(l){let f=g.subscribedCardChannels.get(l);return f&&(f.delete(i),f.size===0&&g.subscribedCardChannels.delete(l)),true}return g.subscribedChannelNames.delete(i),true}function x(d){return d.kind==="card_chats"||d.kind==="chat_messages"||d.kind==="chat_processing"}function _(d){return d.kind==="card_watchparty"}function I(d,i,l){return d.subscribedChannelNames.has(i)?true:!!d.subscribedCardChannels.get(l)?.has(i)}function y(d){if(!d||d.length===0)return;let i=[],l=new Map,g=new Map;for(let f of d)if(_(f)){let k=`${f.cardId}\0${f.channel}`,v=g.get(k)??[];v.push(f),g.set(k,v);}else if(x(f)){let k=l.get(f.cardId)??[];k.push(f),l.set(f.cardId,k);}else i.push(f);if(i.length>0){let f=m(i);for(let k of t.keys())u(k,f);}for(let[f,k]of l.entries()){let v=m(k);for(let[O,M]of t.entries())M.subscribedChatCardIds.has(f)&&u(O,v);}for(let[f,k]of g.entries()){let v=f.indexOf("\0"),O=v>=0?f.slice(0,v):"",M=v>=0?f.slice(v+1):f,D=m(k);for(let[J,ee]of t.entries())!O||!M||I(ee,M,O)&&u(J,D);}}return {size:()=>t.size,has:d=>t.has(d),get:d=>t.get(d),buildFrame:n,flushTransport:o,register:c,disconnect:s,writeFrame:u,subscribeChat:R,unsubscribeChat:S,subscribeChannel:A,unsubscribeChannel:B,broadcastNotificationBatch:y}}function Dr(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?Object.assign(new Error(e.error||`${t} failed`),{statusCode:400}):Object.assign(new Error(`${t} returned an unexpected response`),{statusCode:500})}async function $r(e,t){return Dr(await e,t)}function Vr(e){let t=le(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool requires a card private key with at least two identifier segments (e.g. chat.foundry_thread_id)"),{statusCode:400});return t}function Ur(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function Xn(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:s,getMcpFacade:c,getMcpCardStoreFacade:u}=e;function m(i){let l=le(i,"board_id");if(!l)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(l!==t)throw Object.assign(new Error(`Unknown board_id: ${l}`),{statusCode:400})}function p(i){let l=le(i,"client_id");if(!l)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return l}function R(i){m(i);let l=p(i),g=le(i,"channel_name"),f=le(i,"card_id")||void 0;if(!g)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:l,channelName:g,...f?{cardId:f}:{}}}function S(i){m(i);let l=le(i,"card_id");if(!l)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:l}}async function A(i){await r();let{cardId:l}=S(i),g=p(i);if(!await n.subscribeChat(g,l))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:g,subscribed:true}}}async function B(i){await r();let{cardId:l}=S(i),g=p(i);if(!n.unsubscribeChat(g,l))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:g,subscribed:false}}}async function x(i,l){await r();let{clientId:g,channelName:f,cardId:k}=R(i);if(!n.has(g))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return l?(n.subscribeChannel(g,f,k),o?.(g,f,k?{cardId:k}:{})):(n.unsubscribeChannel(g,f,k),s?.(g,f,k?{cardId:k}:{})),{status:"success",data:{boardId:t,clientId:g,channelName:f,subscribed:l,...k?{cardId:k}:{}}}}async function _(i,l){let{cardId:g}=S(i);return await c().setChatProcessing({cardId:g,active:l}),{status:"success",data:{boardId:t,cardId:g,active:l}}}async function I(i){let{cardId:l}=S(i),g=await c().getChatProcessing({cardId:l});return {status:"success",data:{boardId:t,cardId:l,active:g.active}}}async function y(i){let{cardId:l}=S(i),g=Vr(i);if(!Object.prototype.hasOwnProperty.call(i,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(g.split(".").includes("visible_controlplane_only")){let f=await $r(u().get({params:{id:l}}),"cardStore.get"),k=Array.isArray(f.cards)&&f.cards.length>0&&typeof f.cards[0]=="object"&&!Array.isArray(f.cards[0])?f.cards[0]:null,v=k?Ur(k,"visible_controlplane_only").value:void 0;if(i.value!==v)throw Object.assign(new Error("MCP tool cannot change the reserved private flag visible_controlplane_only"),{statusCode:403});return {status:"success",data:{boardId:t,cardId:l,key:g}}}return Dr(await u().patch({params:{id:l,path:`__private.${g}`},body:{value:i.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:l,key:g}}}async function d(i){let{cardId:l}=S(i),g=Vr(i),f=await $r(u().get({params:{id:l}}),"cardStore.get"),k=Array.isArray(f.cards)&&f.cards.length>0&&f.cards[0]&&typeof f.cards[0]=="object"&&!Array.isArray(f.cards[0])?f.cards[0]:null;if(!k)throw Object.assign(new Error(`Card "${l}" not found`),{statusCode:404});let v=Ur(k,g);return {status:"success",data:{boardId:t,cardId:l,key:g,exists:v.exists,value:v.value}}}return {requireCardArgs:S,subscribeChat:A,unsubscribeChat:B,watchChannel:x,setChatProcessing:_,getChatProcessing:I,setCardMeta:y,getCardMeta:d}}function Zn(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e;function s(S){if(S.length===0)return null;if(S.length===1)return S[0];let A=[],B=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],x={};for(let I of B)x[I]=0;for(let I of S){let y=I,d=Array.isArray(y.cards)?y.cards:[];A.push(...d);for(let i of B)x[i]+=Number(y?.summary?.[i]||0);}let _=S[0];return {..._,cards:A,summary:{..._.summary||{},card_count:A.length,...x}}}async function c(){let S=[];for(let A of r)try{let B=await A.boardOps.buildSseOneShotPayload({});B.status==="success"&&B.data&&S.push(B.data);}catch{}return S}async function u(){let A=(await c()).map(B=>B.statusSnapshot).filter(Boolean);if(A.length===0){let B=r.map(x=>x.notification.status).filter(Boolean);return s(B)}return s(A)}async function m(){let S={},A=await c();for(let B of A)Object.assign(S,B.cardRuntimeById||{});if(Object.keys(S).length>0)return S;for(let B of r)for(let[x,_]of Object.entries(B.notification.computedValues)){let I=B.notification.cards[x];S[x]={schema_version:"v1",card_id:x,card_data:I?.card_data??{},computed_values:_??{}};}return S}async function p(){let S={},A=await c();for(let B of A)Object.assign(S,B.dataObjectsByToken||{});if(Object.keys(S).length===0)for(let B of r)Object.assign(S,B.notification.dataObjects||{});return S}async function R(){let S=await c(),A=S.flatMap(I=>Array.isArray(I.cardDefinitions)?I.cardDefinitions:[]),B={},x={};for(let I of S)Object.assign(B,I.dataObjectsByToken||{}),Object.assign(x,I.cardRuntimeById||{});let _={};for(let I of A){if(!I?.id)continue;let y=I.id;try{let d=await n(y),i=await o(y);(d.length>0||i)&&(_[y]={messages:d.map(l=>({role:String(l.role||"system"),text:String(l.text||""),files:Array.isArray(l.files)?l.files:[]})),receiving:!1,processing:i});}catch{}}return {boardId:t,cardDefinitions:A,statusSnapshot:await u(),dataObjectsByToken:B,cardRuntimeById:x,cardChatsByCardId:_}}return {readStatusSnapshot:u,readCardRuntimeArtifacts:m,readDataObjectsByToken:p,buildPublishedRuntimePayload:R}}function fa(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function eo(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:s,writeChatRecord:c}=e;async function u(R){let S=[];try{let A=await o(R);if(!A)return S;let B=n().read(A.card_data&&typeof A.card_data=="object"?A.card_data:null);for(let x of B)S.push(String(x.stored_name??""));}catch{}return S}async function m(R,S,A,B){let x=t(R),_=r(R),I=fa(S),y=await u(R),i=`${String(y.length+1).padStart(3,"0")}-${I}`.slice(-36);if(!_.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${R}`),{statusCode:500});return await _.files.putBytes(`${x}/${i}`,new Uint8Array(B),A||"application/octet-stream"),{name:I,stored_name:i,size:B.length,mime_type:A||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function p(R,S,A,B,x){if(!B.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let _=x?.inChat===true,I=await m(R,S,A,B),y=null;if(await s(R,d=>{let i=new Date().toISOString(),l=d.card_data&&typeof d.card_data=="object"?d.card_data:{};d.card_data=l;let g=n().normalizeIncoming([{name:I.name,stored_name:I.stored_name,size:I.size,mime_type:I.mime_type,uploaded_at:I.uploaded_at||i,chat:_}],i);return y=n().merge(l,g).findIndex(k=>k.stored_name===I.stored_name),d}),_&&x?.suppressChatRecordWrite!==true){let d=typeof y=="number"&&y>=0?` #${y}`:"";await c(R,"system",`file uploaded: ${I.name} as ${I.stored_name}${d}`,[],x?.turnId??"");}return {ok:true,file:{...I,...typeof y=="number"&&y>=0?{file_idx:y}:{},chat:_},...typeof y=="number"&&y>=0?{file_idx:y}:{}}}return {uploadCardFile:p,readCardStoredFileNames:u}}function to(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:le(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=st(t,"tail_turns"),n=st(t,"tail"),o=le(t,"turn_id"),s=t.all_turns===true,c=le(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:le(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...s?{allTurns:true}:{},...c?{tailTurnsBeforeId:c}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:le(t,"card_id"),fileIdx:Number(st(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ft(t,"mock_requires","mock_requires"),mockFetchedSources:ft(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:it(t,"mock_projections"),sourceIdx:$t(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:it(t,"mock_projections"),sourceIdx:$t(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:le(t,"card_id"),sourceIdx:$t(t,"source_idx","source_idx"),mockRequires:ft(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:it(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:le(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=le(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:le(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"stage-ai-failure-message":t=>{let r=le(t,"turn_id"),n=le(t,"failure");if(!r)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty turn_id"),{statusCode:400});if(!n)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty failure"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:le(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:le(t,"card_id"),candidateCardContent:it(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:le(t,"card_id")})}}function ro(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:le(t,"token"),ref:le(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:le(t,"token"),reason:le(t,"reason")})}}function no(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(u,m){let p=le(u,"board_id");if(!p)throw Object.assign(new Error(`${m} requires board_id`),{statusCode:400});if(p!==t)throw Object.assign(new Error(`Unknown board_id: ${p}`),{statusCode:400})}function c(u,m){let{cardId:p}=o.requireCardArgs(u),R=le(u,"turn_id");return s(u,m),n().manageAddChatAttachment({cardId:p,role:le(u,"role")||"user",...R?{turn:R}:{},files:[{file_name:le(u,"file_name"),content_type:le(u,"content_type")||"application/octet-stream",...typeof u.text=="string"?{text:u.text}:{},...typeof u.base64=="string"?{base64:u.base64}:{},...Array.isArray(u.bytes)?{bytes:u.bytes}:{}}]})}return {"list-runtime-cards":u=>(s(u,"list-runtime-cards"),n().listRuntimeCards()),"sse.subscribe-chat":u=>o.subscribeChat(u),"sse.unsubscribe-chat":u=>o.unsubscribeChat(u),"sse.watch-channel":u=>o.watchChannel(u,true),"sse.unwatch-channel":u=>o.watchChannel(u,false),"getstate.is-chat-processing":u=>o.getChatProcessing(u),"setstate.chat-processing-started":u=>o.setChatProcessing(u,true),"setstate.chat-processing-done":u=>o.setChatProcessing(u,false),"getstate.card-private":u=>o.getCardMeta(u),"setstate.card-private":u=>o.setCardMeta(u),"manage.upload-card-file":u=>{let m=le(u,"card_id"),p=le(u,"file_name"),R=le(u,"content_type")||"application/octet-stream",S=Yr(u);if(s(u,"manage.upload-card-file"),!m)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!p)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!S)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(m,p,R,S,{inChat:false})},"manage.add-chat-attachment":u=>c(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>c(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:m}=o.requireCardArgs(u),p=le(u,"role")||"user",R=le(u,"turn_id");return s(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:m,role:p,...typeof u.text=="string"?{text:u.text}:{},...R?{turn:R}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.patch-card"),n().managePatchCard({cardId:m,patch:it(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.upsert-card"),n().manageUpsertCard({cardId:m,candidateCardContent:it(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.remove-card"),n().manageRemoveCard({cardId:m},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:m}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:m})}}},"manage.admin-upsert-card":u=>{let m=le(u,"board_id"),p=le(u,"card_id");if(!m)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!p)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(m!==t)throw Object.assign(new Error(`Unknown board_id: ${m}`),{statusCode:400});return n().adminUpsertCard({cardId:p,candidateCardContent:it(u,"candidate_card_content")})}}}function nt(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function oo(e,t){if(e?.status==="success"&&Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw e?.status==="success"?new Error(`${t} returned success without data`):e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function Q(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Oe(e){return Array.isArray(e)?e:[]}function Hr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=Q(e).fetched_sources,n=n.slice(16));for(let o of n.split(".")){if(r==null||typeof r!="object")return;r=r[o];}return r}function Kr(e,t){let r=Q(e.view),n=Oe(r.elements);return {layout:r.layout,features:r.features,elements:n.map((o,s)=>{let c=Q(o),u=Q(c.data),m=typeof c.visible=="string"?!!Hr(t,c.visible):true,p=typeof u.bind=="string"?u.bind:void 0,R=typeof u.maxRows=="number"?u.maxRows:void 0,S=p?Hr(t,p):void 0,A={id:typeof c.id=="string"&&c.id?c.id:`element-${s}`,kind:c.kind,label:c.label,visible:m};return S!==void 0&&(A.resolved=Array.isArray(S)&&typeof R=="number"?S.slice(0,R):S),A})}}function ao(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Oe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],s={};for(let c of o){let u=Q(c),m=typeof u.bindTo=="string"?u.bindTo:"",p=typeof u.ref=="string"?u.ref:"";if(!m||!p)continue;let R=Hr(t,p);R!==void 0&&(s[m]=R);}return s}function ma(e){if(typeof e!="string"||!e.trim())return null;let t=/^(file uploaded|AI generated|AI geneterated):\s*.*?#(\d+)\s*$/i.exec(e.trim());if(!t)return null;let r=Number.parseInt(t[2],10);return !Number.isInteger(r)||r<0?null:r}function pa(e){return {"card-content":e}}function gr(e){let t={...e};return delete t.__private,t}function ga(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function ya(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function ha(e,t){let r=ya(e);if(!t||Object.keys(t).length===0)return r;function n(o,s,c){let u=String(s||"").split(".").filter(Boolean);if(!u.length)return;let m=o;for(let p=0;p<u.length-1;p+=1){let R=u[p];(!m[R]||typeof m[R]!="object")&&(m[R]={}),m=m[R];}m[u[u.length-1]]=c;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=Q(r.view),c=Oe(s.elements);for(let u of c){let m=Q(Q(u).data);if(typeof m.writeTo=="string"&&m.writeTo){o=m.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...Q(r.card_data),...t.fieldValues}),r}if(Array.isArray(t._stagedFiles)&&t._stagedFiles.length>0)return r;for(let[o,s]of Object.entries(t))o!=="_stagedFiles"&&(s!==null&&typeof s=="object"&&!Array.isArray(s)&&r[o]!==null&&typeof r[o]=="object"&&!Array.isArray(r[o])?r[o]={...r[o],...s}:r[o]=s);return r}function yr(e){return Q(e.__private).visible_controlplane_only===true}async function vt(e,t){let r=await Qe(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function so(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:s,sourceFetchDone:c,sourceFetchFailed:u,uploadCardFile:m,buildFileDownloadUrl:p,readFetchedSourceJsonByRef:R}=e;function S(w,P){if(typeof w=="function")return w;throw new Error(`${P} is not configured for this MCP facade`)}async function A(){let w=await Qe(n.get({}),"cardStore.get");return Array.isArray(w.cards)?w.cards.map(P=>Q(P)).filter(P=>!yr(P)):[]}function B(w){if(Array.isArray(w.bytes))return new Uint8Array(w.bytes.map(P=>Math.max(0,Math.min(255,Number(P)||0))));if(typeof w.text=="string")return new TextEncoder().encode(w.text);if(typeof w.base64=="string"){let P=String(w.base64).replace(/-/g,"+").replace(/_/g,"/"),F=P+"=".repeat((4-P.length%4)%4),N=atob(F);return Uint8Array.from(N,V=>V.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function x(){let w=Q(await Qe(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:w.version,commonSourceFields:Q(w.commonSourceDefFields),sourceKinds:Q(w.sourceKinds)}}async function _(){let w=Q(await Qe(t.status({}),"status")),P=Q(w.summary),F=Oe(w.cards),N=await Qe(n.get({}),"cardStore.get"),V=new Set((Array.isArray(N.cards)?N.cards.map(Q):[]).filter(yr).map(oe=>typeof oe.id=="string"?oe.id:"").filter(Boolean)),W=F.filter(oe=>!V.has(String(Q(oe).name??"")));return {meta:Q(w.meta),summary:{card_count:typeof P.card_count=="number"?P.card_count:0,completed:typeof P.completed=="number"?P.completed:0,eligible:typeof P.eligible=="number"?P.eligible:0,pending:typeof P.pending=="number"?P.pending:0,blocked:typeof P.blocked=="number"?P.blocked:0,in_progress:typeof P.in_progress=="number"?P.in_progress:0,failed:typeof P.failed=="number"?P.failed:0,unresolved:typeof P.unresolved=="number"?P.unresolved:0},cards:W.map(oe=>{let ue=Q(oe);return {"card-id":typeof ue.name=="string"?ue.name:null,status:ue.status??null,error:ue.error??null,requires:Oe(ue.requires),requires_satisfied:Oe(ue.requires_satisfied),requires_missing:Oe(ue.requires_missing),provides_declared:Oe(ue.provides_declared),provides_runtime:Oe(ue.provides_runtime)}})}}async function I(w){let P=String(w.cardId||"").trim();if(!P)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let F=Q(await Qe(t.status({}),"status")),V=Oe(F.cards).map(Q).find(pe=>pe.name===P);if(!V)throw new Error(`card "${P}" not found in board status`);let W=Q(await vt(n,P)),oe=gr(W),ue=Oe(V.requires_satisfied).filter(pe=>typeof pe=="string"&&!!pe),Te=Oe(V.provides_runtime).filter(pe=>typeof pe=="string"&&!!pe),Be=Object.fromEntries(await Promise.all(ue.map(async pe=>[pe,await Qe(t.getOutputsDataObject({params:{key:pe}}),`getOutputsDataObject(${pe})`)]))),Ee=Object.fromEntries(await Promise.all(Te.map(async pe=>[pe,await Qe(t.getOutputsDataObject({params:{key:pe}}),`getOutputsDataObject(${pe})`)]))),ye=Q(await Qe(t.getOutputsComputedValues({params:{key:P}}),"getOutputsComputedValues")),Ce=await Qe(t.getOutputsFetchedSources({params:{key:P}}),"getOutputsFetchedSources"),je=Oe(W.source_defs).map(Q),Se={};for(let pe of je)typeof pe.bindTo=="string"&&typeof pe.outputFile=="string"&&(Se[pe.outputFile]=pe.bindTo);let Fe={};for(let[pe,Ze]of Object.entries(Ce)){let Ke=Se[pe]??pe;if(!R||typeof Ze!="string"){Fe[Ke]=null;continue}try{Fe[Ke]=R({cardId:P,ref:Ze});}catch{Fe[Ke]=null;}}let Le={card_data:Q(W.card_data),requires:Be,fetched_sources:Fe,computed_values:ye};return {cardId:P,card_status_in_board:V,card_definition_and_static_data:oe,refs_for_fetched_source_files:Ce,runtime_data:{requires:Be,provides:Ee,computed_values:ye,rendered_view:Kr(W,Le)}}}async function y(w){let P=String(w.cardId||"").trim();if(!P)throw new Error("inspectChatMessagesOnCards requires cardId");let F=typeof w.turnId=="string"?w.turnId:"",N=w.allTurns===true,V=typeof w.tailTurnsBeforeId=="string"?w.tailTurnsBeforeId:"",W=N?void 0:w.lastUserTurns??(F?void 0:1),oe=w.tail,ue={...W===void 0?{}:{tailTurns:W},...F?{turnId:F}:{},...N?{allTurns:true}:{},...V?{tailTurnsBeforeId:V}:{}},Te=Object.keys(ue).length>0?{params:{cardId:P},body:ue}:{params:{cardId:P}},Be=nt(await o.readAll(Te),"chatStore.readAll"),Ee=Q(await vt(n,P)),ye=Oe(Q(Ee.card_data).files).map((Se,Fe)=>({idx:Fe,stored_name:Q(Se).stored_name})).filter(Se=>typeof Se.stored_name=="string"&&Se.stored_name.length>0),je=(Array.isArray(Be.records)?Be.records:[]).map(Se=>{let Le=Q(Se.payload),pe={...Se},Ze=typeof Se?.role=="string"?Se.role:typeof Le.role=="string"?String(Le.role):"",Ke=typeof Se?.text=="string"?Se.text:typeof Le.text=="string"?String(Le.text):"";if(Ze==="system"){let Ve=ma(Ke);if(Ve!==null&&ye.some(L=>L.idx===Ve)){let L=`Retrieve using inspect-file-contents --card-id ${P} --file-idx ${Ve}`;pe.retrieval_hint=L,Object.keys(Le).length>0&&typeof Se.role!="string"&&(pe.payload={...Le,retrieval_hint:L});}}return pe});return {cardId:P,messages:typeof oe=="number"&&oe>=0?je.slice(-oe):je}}async function d(w){let P=String(w.cardId||"").trim(),F=Number(w.fileIdx);if(!P)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 N=Q(await vt(n,P)),V=Oe(Q(N.card_data).files).map(Q);if(F>=V.length)throw new Error(`attachment index ${F} is out of range for card "${P}"`);let W=V[F],oe=typeof W.stored_name=="string"?W.stored_name:null;return {cardId:P,fileIdx:F,downloadUrl:p({cardId:P,fileIdx:F,storedName:oe}),...typeof W.name=="string"?{name:W.name}:{},...typeof W.stored_name=="string"?{stored_name:W.stored_name}:{},...typeof W.mime_type=="string"?{mime_type:W.mime_type}:{},...typeof W.size=="number"?{size:W.size}:{},...typeof W.uploaded_at=="string"?{uploaded_at:W.uploaded_at}:{}}}async function i(w){return await r.validateCardPreflight({body:pa(w.candidateCardContent)})}function l(w){if(!w.mockRequires||typeof w.mockRequires!="object"||Array.isArray(w.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!w.mockFetchedSources||typeof w.mockFetchedSources!="object"||Array.isArray(w.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let P=r.evalCardCompute({body:{"card-content":w.candidateCardContent,"mock-requires":w.mockRequires,"mock-fetched-sources":w.mockFetchedSources}});if(P.status!=="success")return P;let F=Q(oo(P,"evalCardCompute")),N=Q(w.candidateCardContent),V={card_data:Q(N.card_data),requires:Q(w.mockRequires),fetched_sources:Q(w.mockFetchedSources),computed_values:Q(F.computed_values)};return {status:"success",data:{cardId:typeof F.cardId=="string"?F.cardId:typeof N.id=="string"?N.id:"(unknown)",ok:F.ok===true,computed_values:Q(F.computed_values),errors:Oe(F.errors).map(W=>{let oe=Q(W);return {bindTo:typeof oe.bindTo=="string"?oe.bindTo:"",error:typeof oe.error=="string"?oe.error:""}}),provides_outputs:ao(N,V),rendered_view:Kr(N,V)}}}async function g(w){return await r.probeSourcePreflight({params:{sourceIdx:w.sourceIdx},body:{"card-content":w.candidateCardContent,"mock-projections":w.mockProjections}})}async function f(w){return await r.runSourcePreflight({params:{sourceIdx:w.sourceIdx},body:{"card-content":w.candidateCardContent,"mock-projections":w.mockProjections}})}async function k(w){let P=String(w.cardId||"").trim();if(!P)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!w.mockRequires||typeof w.mockRequires!="object"||Array.isArray(w.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let F=Q(await vt(n,P)),N=Oe(F.source_defs).filter(W=>!!W&&typeof W=="object"&&!Array.isArray(W)),V={};if(w.sourceIdx>=0&&w.sourceIdx<N.length){let W=N[w.sourceIdx],oe=Ge.enrichSourcesSync([W],{card_data:Q(F.card_data),requires:w.mockRequires});Array.isArray(oe)&&oe.length>0&&(V=Q(oe[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:w.sourceIdx},body:{"card-content":F,"mock-requires":w.mockRequires,"mock-projections":V}})}async function v(w){let P=Q(await Qe(r.simulateCardCycle({body:{"card-content":w.candidateCardContent,"mock-requires":w.mockRequires}}),"simulateCardCycle")),F=Q(w.candidateCardContent),N=Q(P.validation),V=Oe(P.source_probes),W=Oe(P.projection_errors),oe=Q(P.fetched_sources),ue=Oe(P.compute_errors),Te=Q(P.computed_values),Be={card_data:Q(F.card_data),requires:w.mockRequires,fetched_sources:oe,computed_values:Te},Ee=[];for(let ye of Oe(N.issues))typeof ye=="string"&&ye&&Ee.push(ye);for(let ye of V){let Ce=Q(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"source",Se=typeof Ce.error=="string"?Ce.error:"";Se&&Ee.push(`${je}: ${Se}`);}for(let ye of W){let Ce=Q(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"source",Se=typeof Ce.key=="string"?Ce.key:"projection",Fe=typeof Ce.error=="string"?Ce.error:"projection failed";Ee.push(`${je}.${Se}: ${Fe}`);}for(let ye of ue){let Ce=Q(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"compute",Se=typeof Ce.error=="string"?Ce.error:"compute failed";Ee.push(`${je}: ${Se}`);}return {status:"success",data:{cardId:typeof P.cardId=="string"?P.cardId:"(unknown)",ok:P.ok===true,issues:Ee,provides_outputs:ao(F,Be),rendered_view:Kr(F,Be)}}}async function O(w){let P=String(w.cardId||"").trim();if(!P)throw new Error("manageReadCard requires cardId");let F=await Qe(n.get({params:{id:P}}),"cardStore.get");return (Array.isArray(F.cards)?F.cards.map(Q):[]).map(V=>gr(V))}async function M(w){let P=await Promise.all(Oe(w.files).map(async F=>{let N=Q(F),V=String(N.file_name??N.fileName??N.name??"").trim(),W=String(N.content_type??N.contentType??"application/octet-stream");if(!V)throw new Error("file entry requires file_name");return await m({cardId:w.cardId,fileName:V,contentType:W,bytes:B(N),suppressChatRecordWrite:true})}));for(let[F,N]of P.entries()){let V=Q(N.file),W=typeof N.file_idx=="number"&&Number.isInteger(N.file_idx)&&N.file_idx>=0?N.file_idx:F,oe=w.role==="assistant"?`AI generated: ${String(V.name||"")} as ${String(V.stored_name||"")} #${W}`:`file uploaded: ${String(V.name||"")} as ${String(V.stored_name||"")} #${W}`;nt(await o.append({params:{cardId:w.cardId},body:{role:"system",text:oe,files:[],turn:w.turn}}),"chatStore.append(system attachment message)");}return P.map(F=>F.file)}async function D(w){let P=String(w.cardId||"").trim(),F=String(w.role||"user").trim()||"user",N=typeof w.turn=="string"?w.turn:"";if(!P)throw new Error("manageAddChatAttachment requires cardId");let V=await M({cardId:P,role:F,turn:N,files:w.files});return {status:"success",data:{cardId:P,turn:N,files:V}}}async function J(w){let P=String(w.cardId||"").trim(),F=String(w.role||"").trim(),N=typeof w.text=="string"?w.text:"",V=typeof w.turn=="string"?w.turn:"";if(!P)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!F)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(F==="assistant"&&V){let ue=nt(await o.readAll({params:{cardId:P},body:{turnId:V}}),"chatStore.readAll(existing turn messages)"),Te=Array.isArray(ue.records)?ue.records.find(Be=>Be.role==="assistant"&&String(Be.turn||"")===V):void 0;if(Te)return {status:"success",data:{cardId:P,id:String(Te.id),role:F,turn:V,files:Array.isArray(Te.files)?Te.files:[]}}}let W=await M({cardId:P,role:F,turn:V,files:w.files}),oe=nt(await o.append({params:{cardId:P},body:{role:F,text:N,files:W,turn:V}}),"chatStore.append");return {status:"success",data:{cardId:P,id:String(oe.id),role:F,turn:V,files:W}}}async function ee(w,P={}){let F=String(w.cardId||"").trim(),N=Q(w.patch);if(!F)throw new Error("managePatchCard requires cardId");let V=await O({cardId:F}),W=Q(V[0]),oe=ha(W,N);return se({cardId:F,candidateCardContent:oe},P)}async function se(w,P={}){let F=String(w.cardId||"").trim(),N=Q(w.candidateCardContent),V=gr(N);if(!F)throw new Error("manageUpsertCard requires cardId");if(typeof V.id!="string"||!V.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(V.id!==F)throw new Error(`candidateCardContent.id must match cardId (${F})`);let W=null;try{W=await i({candidateCardContent:V});}catch(ye){let Ce=ye instanceof Error?ye.message:String(ye);if(!/non-core adapter is not configured/i.test(Ce))throw ye;W=null;}if(W!==null){let ye=Q(W),Ce=Q(ye.data);if(ye.status!=="success"||Ce.isValid!==true)return {status:"fail",step:"validate",validation:W}}let oe=null;try{oe=await vt(n,F);}catch{oe=null;}let ue=oe?Q(oe):null;if(ue&&yr(ue)&&!P.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404});let Te={...V,...ue&&ga(ue,"__private")?{__private:ue.__private}:{}},Be=await n.set({body:Te});nt(Be,"cardStore.set");let Ee;try{Ee=await t.upsertCard({params:{cardId:F,restart:!0}}),nt(Ee,"upsertCard");}catch(ye){try{oe&&await n.set({body:oe});}catch{}throw ye}return {status:"success",data:{validation:W,card_saved:null,board_result:Ee}}}async function te(w,P={}){let F=String(w.cardId||"").trim();if(!F)throw new Error("manageRemoveCard requires cardId");if(!P.allowControlplaneOnlyCards){let W=await Qe(n.get({params:{id:F}}),"cardStore.get");if((Array.isArray(W.cards)?W.cards.map(Q):[]).some(yr))throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404})}let N=await t.removeCard({params:{id:F}});nt(N,"removeCard");let V=await n.del({params:{id:F}});return nt(V,"cardStore.del"),{status:"success",data:{board_result:N,store_result:V}}}async function Z(w){let P=String(w.cardId||"").trim();if(!P)throw new Error("adminReadCard requires cardId");let F=await Qe(n.get({params:{id:P}}),"cardStore.get");return Array.isArray(F.cards)?F.cards.map(N=>Q(N)):[]}async function ie(w){let P=String(w.cardId||"").trim(),F=Q(w.candidateCardContent),N=gr(F);if(!P)throw new Error("adminUpsertCard requires cardId");if(typeof N.id!="string"||!N.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(N.id!==P)throw new Error(`candidateCardContent.id must match cardId (${P})`);let V=await i({candidateCardContent:N}),W=Q(V),oe=Q(W.data);if(W.status!=="success"||oe.isValid!==true)return {status:"fail",step:"validate",validation:V};let ue=null;try{ue=await vt(n,P);}catch{ue=null;}let Te=ue?Q(Q(ue).__private):{},Be={...N,__private:{...Te,visible_controlplane_only:true}},Ee=await n.set({body:Be});nt(Ee,"cardStore.set");let ye;try{ye=await t.upsertCard({params:{cardId:P,restart:!0}}),nt(ye,"upsertCard");}catch(Ce){try{ue&&await n.set({body:ue});}catch{}throw Ce}return {status:"success",data:{validation:V,card_saved:null,board_result:ye}}}async function G(w){let P=String(w.cardId||"").trim();if(!P)throw new Error("getChatProcessing requires cardId");let F=oo(await o.isProcessing({params:{cardId:P}}),"chatStore.isProcessing");return {cardId:P,active:!!F.active}}async function T(w){let P=String(w.cardId||"").trim();if(!P)throw new Error("setChatProcessing requires cardId");if(typeof w.active!="boolean")throw new Error("setChatProcessing requires boolean active");return nt(await o.setProcessing({params:{cardId:P},body:{active:w.active}}),"chatStore.setProcessing"),{cardId:P,active:w.active}}async function C(){let w=await S(s,"webhook.process-accumulated")();return w?.status==="fail"||w?.status==="error"?w:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(w??{},"data")?w.data??null:null}}}async function K(w){let P=String(w.token||"").trim(),F=String(w.ref||"").trim();if(!P)throw new Error("webhookSourceFetchDone requires token");if(!F)throw new Error("webhookSourceFetchDone requires ref");let N=await S(c,"webhook.source-fetch-done")({token:P,ref:F});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:P,ref:F,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}async function j(w){let P=String(w.token||"").trim(),F=String(w.reason||"").trim();if(!P)throw new Error("webhookSourceFetchFailed requires token");if(!F)throw new Error("webhookSourceFetchFailed requires reason");let N=await S(u,"webhook.source-fetch-failed")({token:P,reason:F});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:P,reason:F,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}return {listRuntimeCards:A,discoverSourceKinds:x,inspectBoardRuntimeStatus:_,inspectCardDefinitionAndRuntime:I,inspectChatMessagesOnCards:y,inspectFileContents:d,preflightValidateCandidateCardDefinition:i,preflightMaterializeCandidateCard:l,preflightProbeSingleSourceInCandidateCard:g,preflightRunSingleSourceInCandidateCard:f,preflightRunSingleSourceInLiveCard:k,preflightRunOneCycleWithCandidateCard:v,manageReadCard:O,manageAddChatAttachment:D,manageAddChatEntryAndAnyAttachments:J,managePatchCard:ee,manageUpsertCard:se,manageRemoveCard:te,adminReadCard:Z,adminUpsertCard:ie,getChatProcessing:G,setChatProcessing:T,webhookProcessAccumulated:C,webhookSourceFetchDone:K,webhookSourceFetchFailed:j}}async function Qe(e,t){return nt(await e,t)}function io(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:s,readCardRuntimeArtifacts:c,readCardFromStore:u,readCardDefinitions:m,processAccumulatedLaneInternal:p,reportSourceFetched:R,reportSourceFetchFailure:S,uploadCardFile:A,chatStorePublic:B,serverUrl:x,apiBasePath:_}=e;function I(){return t[0]??null}function y(){return {async status(){let g=await o();return g==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:g}},async getOutputsDataObject(g){let f=g?.params?.key;return f?{status:"success",data:(await s())[f]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(g){let f=g?.params?.key;return f?{status:"success",data:(await c())[f]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(g){let f=g?.params?.key;if(!f)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let k=n(f)??I();return k?k.boardOps.getOutputsFetchedSources({params:{key:f}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(g){let f=g?.params?.id;if(!f)return {status:"fail",error:"removeCard requires params.id"};let k=n(f)??I();return k?k.boardOps.removeCard({params:{id:f}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(g){let f=g?.params?.cardId;if(!f)return {status:"fail",error:"upsertCard requires params.cardId"};let k=n(f)??I();if(!k)return {status:"fail",error:"Board context is unavailable"};let v=await k.boardOps.upsertCard({params:{cardId:f,restart:g.params.restart===true}});if(v.status!=="success")return v;if(tt(k.boardAdapter)){let O=await p(true);if(O.status!=="success")return O}return v}}}function d(){let g=()=>{let f=I();if(!f?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return f.nonCore};return {describeTaskExecutorCapabilities(f){return g().describeTaskExecutorCapabilities(f)},validateCardPreflight(f){return g().validateCardPreflight(f)},evalCardCompute(f){return g().evalCardCompute(f)},probeSourcePreflight(f){return g().probeSourcePreflight(f)},runSourcePreflight(f){return g().runSourcePreflight(f)},simulateCardCycle(f){return g().simulateCardCycle(f)}}}function i(){return {async get(g){let f=typeof g.params?.id=="string"?g.params.id:void 0;if(f){let k=await u(f);return k?{status:"success",data:{cards:[k]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await m()}}},async set(g){let f=g.body;if(f==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let k=Array.isArray(f)?f:[f];for(let v of k){let O=v,M=typeof O.id=="string"?O.id:"";if(!M)return {status:"fail",error:"each card must have a string `id` field"};let D=r.get(M)??0,J=t[D]??I();if(!J)return {status:"fail",error:"Board context is unavailable"};let ee=await J.cardStoreOps.set({body:O});if(ee.status!=="success")return ee;r.set(M,D);}return {status:"success",data:{count:k.length}}},async del(g){let f=[g.params?.id,...g.body?.ids??[]].filter(k=>typeof k=="string"&&!!k);if(f.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let k of f){let v=n(k)??I();if(!v)return {status:"fail",error:"Board context is unavailable"};let O=await v.cardStoreOps.del({params:{id:k}});if(O.status!=="success")return O;r.delete(k);}return {status:"success",data:{count:f.length}}},async patch(g){let f=typeof g.params?.id=="string"?g.params.id:void 0,k=typeof g.params?.path=="string"?g.params.path:void 0;if(!f||!k)return {status:"fail",error:"patch requires params.id and params.path"};let v=n(f)??I();return v?v.cardStoreOps.patch(g):{status:"fail",error:"Board context is unavailable"}},async appendFiles(g){let f=typeof g.params?.id=="string"?g.params.id:void 0;if(!f)return {status:"fail",error:"appendFiles requires params.id"};let k=n(f)??I();return k?k.cardStoreOps.appendFiles(g):{status:"fail",error:"Board context is unavailable"}}}}function l(){return so({board:y(),nonCore:d(),cardStore:i(),chatStore:B,processAccumulated:()=>p(true),sourceFetchDone:({token:g,ref:f})=>R(g,f),sourceFetchFailed:({token:g,reason:f})=>S(g,f),uploadCardFile({cardId:g,fileName:f,contentType:k,bytes:v,suppressChatRecordWrite:O}){return A(g,f,k,v,{inChat:true,...O===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:g,fileIdx:f,storedName:k}){let v=`${x||""}${_}/cards/${encodeURIComponent(g)}/files/${f}`;return k?`${v}?sn=${encodeURIComponent(k)}`:v},readFetchedSourceJsonByRef({cardId:g,ref:f}){let k=n(g)??I();if(!k||tt(k.boardAdapter))return null;let M=k.boardAdapter.resolveBlob(at(f)).trim();return M?JSON.parse(M):null}})}return {mcpBoardFacade:y,mcpNonCoreFacade:d,mcpCardStoreFacade:i,createMcpFacade:l}}function uo(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:s,createMcpToolRegistry:c,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:m,sliceTextByLines:p}=e;async function R(S,A,B){let x=S.method||"GET",_=B,I=_.pathname;try{if(x==="POST"&&I===`${t}/mcp`){await o();let y=await n(S),d=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!d)return r(A,400,{error:"tool is required"}),!0;if(d==="inspect.file-contents")return r(A,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let l=await mt(d,i,c(s()));if(l&&typeof l=="object"&&!Array.isArray(l)){let g=l;if(g.status==="fail")return r(A,400,{error:rt(l,"Request failed")}),!0;if(g.status==="error")return r(A,500,{error:rt(l,"Internal error")}),!0}r(A,200,l);}catch(l){let g=typeof l?.statusCode=="number"?Number(l.statusCode):500,f=l instanceof Error?l.message:String(l);r(A,g,{error:f});}return !0}if(x==="POST"&&I===`${t}/mcp-raw`){await o();let y=await n(S),d=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!d)return r(A,400,{error:"tool is required"}),!0;if(d!=="inspect.file-contents")return r(A,400,{error:`Tool does not support raw response: ${d}`}),!0;let l=le(i,"card_id","cardId"),g=st(i,"file_idx","fileIdx"),f=st(i,"head-lines","headLines"),k=st(i,"tail-lines","tailLines"),v=st(i,"head-bytes","headBytes"),O=st(i,"tail-bytes","tailBytes");if(!l)return r(A,400,{error:"inspect.file-contents requires card_id"}),!0;if(g===void 0||!Number.isInteger(g)||g<0)return r(A,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([f,k,v,O].filter(C=>C!==void 0).length>1)return r(A,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[C,K]of [["head-lines",f],["tail-lines",k],["head-bytes",v],["tail-bytes",O]])if(K!==void 0&&(!Number.isInteger(K)||K<0))return r(A,400,{error:`inspect.file-contents requires ${C} to be a non-negative integer`}),!0;let D=await s().inspectFileContents({cardId:l,fileIdx:g}),J=typeof D?.stored_name=="string"?D.stored_name:null,{fileRecord:ee,bytes:se}=await u(l,g,J),te=String(ee.name||ee.stored_name||"download.bin"),Z=String(ee.mime_type||"application/octet-stream"),ie=(_.searchParams.get("resp")||"").trim().toLowerCase();if(ie&&ie!=="json-b64")return r(A,400,{error:`unsupported resp mode: ${ie}`}),!0;let G=ie==="json-b64",T;if(f!==void 0||k!==void 0){if(!m(Z))return r(A,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let C=new TextDecoder().decode(se),K=f!==void 0?p(C,"head",f):p(C,"tail",k);T=typeof Buffer<"u"?Buffer.from(K,"utf8"):new TextEncoder().encode(K);}else if(v!==void 0||O!==void 0){let C=v??O;T=v!==void 0?se.slice(0,C):se.slice(Math.max(0,se.length-C));}else T=se;if(G){let C=typeof Buffer<"u"?Buffer.from(T).toString("base64"):btoa(String.fromCharCode(...T));return r(A,200,{bodyBase64:C,mimeType:Z,filename:te,byteLength:T.length}),!0}return A.writeHead(200,{"Content-Type":Z,"Content-Disposition":`attachment; filename="${te}"`,"Content-Length":T.length}),A.end(T),!0}return !1}catch(y){let d=y?.statusCode||500;return r(A,d,{error:String(y?.message||y)}),true}}return {handleAgentfaceApi:R}}function co(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function c(u,m,p){let R=u.method||"GET",S=p.pathname;try{if(R==="POST"&&S===`${t}/mcp-webhooks`){await o();let A=await n(u),B=typeof A.tool=="string"?A.tool.trim():"",x=A.args&&typeof A.args=="object"&&!Array.isArray(A.args)?A.args:{};if(!B)return r(m,400,{error:"tool is required"}),!0;try{let _=await mt(B,x,s());if(_&&typeof _=="object"&&!Array.isArray(_)){let I=_;if(I.status==="fail")return r(m,400,{error:rt(_,"Request failed")}),!0;if(I.status==="error")return r(m,500,{error:rt(_,"Internal error")}),!0}r(m,200,_);}catch(_){let I=typeof _?.statusCode=="number"?Number(_.statusCode):500,y=_ instanceof Error?_.message:String(_);r(m,I,{error:y});}return !0}return !1}catch(A){let B=A?.statusCode||500;return r(m,B,{error:String(A?.message||A)}),true}}return {handleWebhooksApi:c}}function Jr(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:s,onChannelSubscribed:c,onChannelUnsubscribed:u}=e;function m(R,S,A,B,x){if(!t.has(S)){n(R,404,{error:`SSE client not connected: ${S}`});return}x?(t.subscribeChannel(S,A,B.cardId),c?.(S,A,B)):(t.unsubscribeChannel(S,A,B.cardId),u?.(S,A,B)),n(R,200,{ok:true,clientId:S,channelName:A,...B.cardId?{cardId:B.cardId}:{},subscribed:x});}async function p(R,S,A,B){let x=B?.oneShot===true,_=B?.bootstrapPayload!==false,I=!x&&A?t.get(A):null,y=I?new Set(I.subscribedChatCardIds):new Set,d=I?new Set(I.subscribedChannelNames):new Set,i=I?new Map(Array.from(I.subscribedCardChannels.entries(),([g,f])=>[g,new Set(f)])):new Map;if(S.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(S),_){let g=await o(),f=t.buildFrame(g);S.write(f);}if(x){S.end();return}if(!A)throw new Error("clientId is required for streaming SSE");t.register(A,S,{subscribedChatCardIds:y,subscribedChannelNames:d,subscribedCardChannels:i});try{s?.(A,g=>{t.writeFrame(A,g);});}catch{}let l=setInterval(()=>{try{S.write(`: keepalive
4
+ `}function o(d){let i=d;try{i.flushHeaders?.();}catch{}try{i.flush?.();}catch{}try{i.socket?.setNoDelay?.(!0);}catch{}try{i.socket?.uncork?.();}catch{}}function s(d,i){let l=t.get(d);if(l&&!(i&&l.res!==i)){t.delete(d);try{e.onSseClientDisconnected?.(d);}catch{}try{l.res.end();}catch{}}}function c(d,i,l){let g=t.get(d);g&&s(d,g.res),t.set(d,{res:i,subscribedChatCardIds:l?.subscribedChatCardIds??new Set,subscribedChannelNames:l?.subscribedChannelNames??new Set,subscribedCardChannels:l?.subscribedCardChannels??new Map});}function u(d,i){let l=t.get(d);if(!l)return;let g=n(i);try{l.res.write(g),o(l.res);}catch{s(d,l.res);}}function m(d){return Ne({kind:"notification-batch",notifications:d})}async function p(d,i){let l=await e.buildChatOneShotBatch(d,i);return l.status==="success"?l.data:m([])}async function R(d,i){let l=t.get(d);return l?(l.subscribedChatCardIds.add(i),u(d,await p(i,true)),true):false}function b(d,i){let l=t.get(d);return l?(l.subscribedChatCardIds.delete(i),true):false}function w(d,i,l){let g=t.get(d);if(!g)return false;if(l){let f=g.subscribedCardChannels.get(l)??new Set;return f.add(i),g.subscribedCardChannels.set(l,f),true}return g.subscribedChannelNames.add(i),true}function B(d,i,l){let g=t.get(d);if(!g)return false;if(l){let f=g.subscribedCardChannels.get(l);return f&&(f.delete(i),f.size===0&&g.subscribedCardChannels.delete(l)),true}return g.subscribedChannelNames.delete(i),true}function x(d){return d.kind==="card_chats"||d.kind==="chat_messages"||d.kind==="chat_processing"}function _(d){return d.kind==="card_watchparty"}function I(d,i,l){return d.subscribedChannelNames.has(i)?true:!!d.subscribedCardChannels.get(l)?.has(i)}function y(d){if(!d||d.length===0)return;let i=[],l=new Map,g=new Map;for(let f of d)if(_(f)){let C=`${f.cardId}\0${f.channel}`,v=g.get(C)??[];v.push(f),g.set(C,v);}else if(x(f)){let C=l.get(f.cardId)??[];C.push(f),l.set(f.cardId,C);}else i.push(f);if(i.length>0){let f=m(i);for(let C of t.keys())u(C,f);}for(let[f,C]of l.entries()){let v=m(C);for(let[O,M]of t.entries())M.subscribedChatCardIds.has(f)&&u(O,v);}for(let[f,C]of g.entries()){let v=f.indexOf("\0"),O=v>=0?f.slice(0,v):"",M=v>=0?f.slice(v+1):f,D=m(C);for(let[J,te]of t.entries())!O||!M||I(te,M,O)&&u(J,D);}}return {size:()=>t.size,has:d=>t.has(d),get:d=>t.get(d),buildFrame:n,flushTransport:o,register:c,disconnect:s,writeFrame:u,subscribeChat:R,unsubscribeChat:b,subscribeChannel:w,unsubscribeChannel:B,broadcastNotificationBatch:y}}function Dr(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?Object.assign(new Error(e.error||`${t} failed`),{statusCode:400}):Object.assign(new Error(`${t} returned an unexpected response`),{statusCode:500})}async function $r(e,t){return Dr(await e,t)}function Vr(e){let t=le(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool requires a card private key with at least two identifier segments (e.g. chat.foundry_thread_id)"),{statusCode:400});return t}function Ur(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function Xn(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:s,getMcpFacade:c,getMcpCardStoreFacade:u}=e;function m(i){let l=le(i,"board_id");if(!l)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(l!==t)throw Object.assign(new Error(`Unknown board_id: ${l}`),{statusCode:400})}function p(i){let l=le(i,"client_id");if(!l)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return l}function R(i){m(i);let l=p(i),g=le(i,"channel_name"),f=le(i,"card_id")||void 0;if(!g)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:l,channelName:g,...f?{cardId:f}:{}}}function b(i){m(i);let l=le(i,"card_id");if(!l)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:l}}async function w(i){await r();let{cardId:l}=b(i),g=p(i);if(!await n.subscribeChat(g,l))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:g,subscribed:true}}}async function B(i){await r();let{cardId:l}=b(i),g=p(i);if(!n.unsubscribeChat(g,l))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:g,subscribed:false}}}async function x(i,l){await r();let{clientId:g,channelName:f,cardId:C}=R(i);if(!n.has(g))throw Object.assign(new Error(`SSE client not connected: ${g}`),{statusCode:404});return l?(n.subscribeChannel(g,f,C),o?.(g,f,C?{cardId:C}:{})):(n.unsubscribeChannel(g,f,C),s?.(g,f,C?{cardId:C}:{})),{status:"success",data:{boardId:t,clientId:g,channelName:f,subscribed:l,...C?{cardId:C}:{}}}}async function _(i,l){let{cardId:g}=b(i);return await c().setChatProcessing({cardId:g,active:l}),{status:"success",data:{boardId:t,cardId:g,active:l}}}async function I(i){let{cardId:l}=b(i),g=await c().getChatProcessing({cardId:l});return {status:"success",data:{boardId:t,cardId:l,active:g.active}}}async function y(i){let{cardId:l}=b(i),g=Vr(i);if(!Object.prototype.hasOwnProperty.call(i,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(g.split(".").includes("visible_controlplane_only")){let f=await $r(u().get({params:{id:l}}),"cardStore.get"),C=Array.isArray(f.cards)&&f.cards.length>0&&typeof f.cards[0]=="object"&&!Array.isArray(f.cards[0])?f.cards[0]:null,v=C?Ur(C,"visible_controlplane_only").value:void 0;if(i.value!==v)throw Object.assign(new Error("MCP tool cannot change the reserved private flag visible_controlplane_only"),{statusCode:403});return {status:"success",data:{boardId:t,cardId:l,key:g}}}return Dr(await u().patch({params:{id:l,path:`__private.${g}`},body:{value:i.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:l,key:g}}}async function d(i){let{cardId:l}=b(i),g=Vr(i),f=await $r(u().get({params:{id:l}}),"cardStore.get"),C=Array.isArray(f.cards)&&f.cards.length>0&&f.cards[0]&&typeof f.cards[0]=="object"&&!Array.isArray(f.cards[0])?f.cards[0]:null;if(!C)throw Object.assign(new Error(`Card "${l}" not found`),{statusCode:404});let v=Ur(C,g);return {status:"success",data:{boardId:t,cardId:l,key:g,exists:v.exists,value:v.value}}}return {requireCardArgs:b,subscribeChat:w,unsubscribeChat:B,watchChannel:x,setChatProcessing:_,getChatProcessing:I,setCardMeta:y,getCardMeta:d}}function Zn(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e;function s(b){if(b.length===0)return null;if(b.length===1)return b[0];let w=[],B=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],x={};for(let I of B)x[I]=0;for(let I of b){let y=I,d=Array.isArray(y.cards)?y.cards:[];w.push(...d);for(let i of B)x[i]+=Number(y?.summary?.[i]||0);}let _=b[0];return {..._,cards:w,summary:{..._.summary||{},card_count:w.length,...x}}}async function c(){let b=[];for(let w of r)try{let B=await w.boardOps.buildSseOneShotPayload({});B.status==="success"&&B.data&&b.push(B.data);}catch{}return b}async function u(){let w=(await c()).map(B=>B.statusSnapshot).filter(Boolean);if(w.length===0){let B=r.map(x=>x.notification.status).filter(Boolean);return s(B)}return s(w)}async function m(){let b={},w=await c();for(let B of w)Object.assign(b,B.cardRuntimeById||{});if(Object.keys(b).length>0)return b;for(let B of r)for(let[x,_]of Object.entries(B.notification.computedValues)){let I=B.notification.cards[x];b[x]={schema_version:"v1",card_id:x,card_data:I?.card_data??{},computed_values:_??{}};}return b}async function p(){let b={},w=await c();for(let B of w)Object.assign(b,B.dataObjectsByToken||{});if(Object.keys(b).length===0)for(let B of r)Object.assign(b,B.notification.dataObjects||{});return b}async function R(){let b=await c(),w=b.flatMap(I=>Array.isArray(I.cardDefinitions)?I.cardDefinitions:[]),B={},x={};for(let I of b)Object.assign(B,I.dataObjectsByToken||{}),Object.assign(x,I.cardRuntimeById||{});let _={};for(let I of w){if(!I?.id)continue;let y=I.id;try{let d=await n(y),i=await o(y);(d.length>0||i)&&(_[y]={messages:d.map(l=>({role:String(l.role||"system"),text:String(l.text||""),files:Array.isArray(l.files)?l.files:[]})),receiving:!1,processing:i});}catch{}}return {boardId:t,cardDefinitions:w,statusSnapshot:await u(),dataObjectsByToken:B,cardRuntimeById:x,cardChatsByCardId:_}}return {readStatusSnapshot:u,readCardRuntimeArtifacts:m,readDataObjectsByToken:p,buildPublishedRuntimePayload:R}}function fa(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function eo(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:s,writeChatRecord:c}=e;async function u(R){let b=[];try{let w=await o(R);if(!w)return b;let B=n().read(w.card_data&&typeof w.card_data=="object"?w.card_data:null);for(let x of B)b.push(String(x.stored_name??""));}catch{}return b}async function m(R,b,w,B){let x=t(R),_=r(R),I=fa(b),y=await u(R),i=`${String(y.length+1).padStart(3,"0")}-${I}`.slice(-36);if(!_.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${R}`),{statusCode:500});return await _.files.putBytes(`${x}/${i}`,new Uint8Array(B),w||"application/octet-stream"),{name:I,stored_name:i,size:B.length,mime_type:w||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function p(R,b,w,B,x){if(!B.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let _=x?.inChat===true,I=await m(R,b,w,B),y=null;if(await s(R,d=>{let i=new Date().toISOString(),l=d.card_data&&typeof d.card_data=="object"?d.card_data:{};d.card_data=l;let g=n().normalizeIncoming([{name:I.name,stored_name:I.stored_name,size:I.size,mime_type:I.mime_type,uploaded_at:I.uploaded_at||i,chat:_}],i);return y=n().merge(l,g).findIndex(C=>C.stored_name===I.stored_name),d}),_&&x?.suppressChatRecordWrite!==true){let d=typeof y=="number"&&y>=0?` #${y}`:"";await c(R,"system",`file uploaded: ${I.name} as ${I.stored_name}${d}`,[],x?.turnId??"");}return {ok:true,file:{...I,...typeof y=="number"&&y>=0?{file_idx:y}:{},chat:_},...typeof y=="number"&&y>=0?{file_idx:y}:{}}}return {uploadCardFile:p,readCardStoredFileNames:u}}function to(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:le(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=st(t,"tail_turns"),n=st(t,"tail"),o=le(t,"turn_id"),s=t.all_turns===true,c=le(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:le(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...s?{allTurns:true}:{},...c?{tailTurnsBeforeId:c}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:le(t,"card_id"),fileIdx:Number(st(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ft(t,"mock_requires","mock_requires"),mockFetchedSources:ft(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:it(t,"mock_projections"),sourceIdx:$t(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:it(t,"mock_projections"),sourceIdx:$t(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:le(t,"card_id"),sourceIdx:$t(t,"source_idx","source_idx"),mockRequires:ft(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:it(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:le(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=le(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:le(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"stage-ai-failure-message":t=>{let r=le(t,"turn_id"),n=le(t,"failure");if(!r)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty turn_id"),{statusCode:400});if(!n)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty failure"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:le(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:le(t,"card_id"),candidateCardContent:it(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:le(t,"card_id")})}}function ro(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:le(t,"token"),ref:le(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:le(t,"token"),reason:le(t,"reason")})}}function no(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(u,m){let p=le(u,"board_id");if(!p)throw Object.assign(new Error(`${m} requires board_id`),{statusCode:400});if(p!==t)throw Object.assign(new Error(`Unknown board_id: ${p}`),{statusCode:400})}function c(u,m){let{cardId:p}=o.requireCardArgs(u),R=le(u,"turn_id");return s(u,m),n().manageAddChatAttachment({cardId:p,role:le(u,"role")||"user",...R?{turn:R}:{},files:[{file_name:le(u,"file_name"),content_type:le(u,"content_type")||"application/octet-stream",...typeof u.text=="string"?{text:u.text}:{},...typeof u.base64=="string"?{base64:u.base64}:{},...Array.isArray(u.bytes)?{bytes:u.bytes}:{}}]})}return {"list-runtime-cards":u=>(s(u,"list-runtime-cards"),n().listRuntimeCards()),"sse.subscribe-chat":u=>o.subscribeChat(u),"sse.unsubscribe-chat":u=>o.unsubscribeChat(u),"sse.watch-channel":u=>o.watchChannel(u,true),"sse.unwatch-channel":u=>o.watchChannel(u,false),"getstate.is-chat-processing":u=>o.getChatProcessing(u),"setstate.chat-processing-started":u=>o.setChatProcessing(u,true),"setstate.chat-processing-done":u=>o.setChatProcessing(u,false),"getstate.card-private":u=>o.getCardMeta(u),"setstate.card-private":u=>o.setCardMeta(u),"manage.upload-card-file":u=>{let m=le(u,"card_id"),p=le(u,"file_name"),R=le(u,"content_type")||"application/octet-stream",b=Yr(u);if(s(u,"manage.upload-card-file"),!m)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!p)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(m,p,R,b,{inChat:false})},"manage.add-chat-attachment":u=>c(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>c(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:m}=o.requireCardArgs(u),p=le(u,"role")||"user",R=le(u,"turn_id");return s(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:m,role:p,...typeof u.text=="string"?{text:u.text}:{},...R?{turn:R}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.patch-card"),n().managePatchCard({cardId:m,patch:it(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.upsert-card"),n().manageUpsertCard({cardId:m,candidateCardContent:it(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:m}=o.requireCardArgs(u);return s(u,"manage.remove-card"),n().manageRemoveCard({cardId:m},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:m}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:m})}}},"manage.admin-upsert-card":u=>{let m=le(u,"board_id"),p=le(u,"card_id");if(!m)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!p)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(m!==t)throw Object.assign(new Error(`Unknown board_id: ${m}`),{statusCode:400});return n().adminUpsertCard({cardId:p,candidateCardContent:it(u,"candidate_card_content")})}}}function nt(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function oo(e,t){if(e?.status==="success"&&Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw e?.status==="success"?new Error(`${t} returned success without data`):e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function W(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Oe(e){return Array.isArray(e)?e:[]}function Hr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=W(e).fetched_sources,n=n.slice(16));for(let o of n.split(".")){if(r==null||typeof r!="object")return;r=r[o];}return r}function Kr(e,t){let r=W(e.view),n=Oe(r.elements);return {layout:r.layout,features:r.features,elements:n.map((o,s)=>{let c=W(o),u=W(c.data),m=typeof c.visible=="string"?!!Hr(t,c.visible):true,p=typeof u.bind=="string"?u.bind:void 0,R=typeof u.maxRows=="number"?u.maxRows:void 0,b=p?Hr(t,p):void 0,w={id:typeof c.id=="string"&&c.id?c.id:`element-${s}`,kind:c.kind,label:c.label,visible:m};return b!==void 0&&(w.resolved=Array.isArray(b)&&typeof R=="number"?b.slice(0,R):b),w})}}function ao(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Oe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],s={};for(let c of o){let u=W(c),m=typeof u.bindTo=="string"?u.bindTo:"",p=typeof u.ref=="string"?u.ref:"";if(!m||!p)continue;let R=Hr(t,p);R!==void 0&&(s[m]=R);}return s}function ma(e){if(typeof e!="string"||!e.trim())return null;let t=/^(file uploaded|AI generated|AI geneterated):\s*.*?#(\d+)\s*$/i.exec(e.trim());if(!t)return null;let r=Number.parseInt(t[2],10);return !Number.isInteger(r)||r<0?null:r}function pa(e){return {"card-content":e}}function gr(e){let t={...e};return delete t.__private,t}function ga(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function ya(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function ha(e,t){let r=ya(e);if(!t||Object.keys(t).length===0)return r;function n(o,s,c){let u=String(s||"").split(".").filter(Boolean);if(!u.length)return;let m=o;for(let p=0;p<u.length-1;p+=1){let R=u[p];(!m[R]||typeof m[R]!="object")&&(m[R]={}),m=m[R];}m[u[u.length-1]]=c;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=W(r.view),c=Oe(s.elements);for(let u of c){let m=W(W(u).data);if(typeof m.writeTo=="string"&&m.writeTo){o=m.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...W(r.card_data),...t.fieldValues}),r}if(Array.isArray(t._stagedFiles)&&t._stagedFiles.length>0)return r;for(let[o,s]of Object.entries(t))o!=="_stagedFiles"&&(s!==null&&typeof s=="object"&&!Array.isArray(s)&&r[o]!==null&&typeof r[o]=="object"&&!Array.isArray(r[o])?r[o]={...r[o],...s}:r[o]=s);return r}function yr(e){return W(e.__private).visible_controlplane_only===true}async function vt(e,t){let r=await Ge(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function so(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:s,sourceFetchDone:c,sourceFetchFailed:u,uploadCardFile:m,buildFileDownloadUrl:p,readFetchedSourceJsonByRef:R}=e;function b(A,P){if(typeof A=="function")return A;throw new Error(`${P} is not configured for this MCP facade`)}async function w(){let A=await Ge(n.get({}),"cardStore.get");return Array.isArray(A.cards)?A.cards.map(P=>W(P)).filter(P=>!yr(P)):[]}function B(A){if(Array.isArray(A.bytes))return new Uint8Array(A.bytes.map(P=>Math.max(0,Math.min(255,Number(P)||0))));if(typeof A.text=="string")return new TextEncoder().encode(A.text);if(typeof A.base64=="string"){let P=String(A.base64).replace(/-/g,"+").replace(/_/g,"/"),F=P+"=".repeat((4-P.length%4)%4),N=atob(F);return Uint8Array.from(N,V=>V.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function x(){let A=W(await Ge(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:A.version,commonSourceFields:W(A.commonSourceDefFields),sourceKinds:W(A.sourceKinds)}}async function _(){let A=W(await Ge(t.status({}),"status")),P=W(A.summary),F=Oe(A.cards),N=await Ge(n.get({}),"cardStore.get"),V=new Set((Array.isArray(N.cards)?N.cards.map(W):[]).filter(yr).map(oe=>typeof oe.id=="string"?oe.id:"").filter(Boolean)),z=F.filter(oe=>!V.has(String(W(oe).name??"")));return {meta:W(A.meta),summary:{card_count:typeof P.card_count=="number"?P.card_count:0,completed:typeof P.completed=="number"?P.completed:0,eligible:typeof P.eligible=="number"?P.eligible:0,pending:typeof P.pending=="number"?P.pending:0,blocked:typeof P.blocked=="number"?P.blocked:0,in_progress:typeof P.in_progress=="number"?P.in_progress:0,failed:typeof P.failed=="number"?P.failed:0,unresolved:typeof P.unresolved=="number"?P.unresolved:0},cards:z.map(oe=>{let ie=W(oe);return {"card-id":typeof ie.name=="string"?ie.name:null,status:ie.status??null,error:ie.error??null,requires:Oe(ie.requires),requires_satisfied:Oe(ie.requires_satisfied),requires_missing:Oe(ie.requires_missing),provides_declared:Oe(ie.provides_declared),provides_runtime:Oe(ie.provides_runtime)}})}}async function I(A){let P=String(A.cardId||"").trim();if(!P)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let F=W(await Ge(t.status({}),"status")),V=Oe(F.cards).map(W).find(pe=>pe.name===P);if(!V)throw new Error(`card "${P}" not found in board status`);let z=W(await vt(n,P)),oe=gr(z),ie=Oe(V.requires_satisfied).filter(pe=>typeof pe=="string"&&!!pe),Pe=Oe(V.provides_runtime).filter(pe=>typeof pe=="string"&&!!pe),Be=Object.fromEntries(await Promise.all(ie.map(async pe=>[pe,await Ge(t.getOutputsDataObject({params:{key:pe}}),`getOutputsDataObject(${pe})`)]))),Ee=Object.fromEntries(await Promise.all(Pe.map(async pe=>[pe,await Ge(t.getOutputsDataObject({params:{key:pe}}),`getOutputsDataObject(${pe})`)]))),ye=W(await Ge(t.getOutputsComputedValues({params:{key:P}}),"getOutputsComputedValues")),Ce=await Ge(t.getOutputsFetchedSources({params:{key:P}}),"getOutputsFetchedSources"),je=Oe(z.source_defs).map(W),Se={};for(let pe of je)typeof pe.bindTo=="string"&&typeof pe.outputFile=="string"&&(Se[pe.outputFile]=pe.bindTo);let Fe={};for(let[pe,Ze]of Object.entries(Ce)){let Ke=Se[pe]??pe;if(!R||typeof Ze!="string"){Fe[Ke]=null;continue}try{Fe[Ke]=R({cardId:P,ref:Ze});}catch{Fe[Ke]=null;}}let Le={card_data:W(z.card_data),requires:Be,fetched_sources:Fe,computed_values:ye};return {cardId:P,card_status_in_board:V,card_definition_and_static_data:oe,refs_for_fetched_source_files:Ce,runtime_data:{requires:Be,provides:Ee,computed_values:ye,rendered_view:Kr(z,Le)}}}async function y(A){let P=String(A.cardId||"").trim();if(!P)throw new Error("inspectChatMessagesOnCards requires cardId");let F=typeof A.turnId=="string"?A.turnId:"",N=A.allTurns===true,V=typeof A.tailTurnsBeforeId=="string"?A.tailTurnsBeforeId:"",z=N?void 0:A.lastUserTurns??(F?void 0:1),oe=A.tail,ie={...z===void 0?{}:{tailTurns:z},...F?{turnId:F}:{},...N?{allTurns:true}:{},...V?{tailTurnsBeforeId:V}:{}},Pe=Object.keys(ie).length>0?{params:{cardId:P},body:ie}:{params:{cardId:P}},Be=nt(await o.readAll(Pe),"chatStore.readAll"),Ee=W(await vt(n,P)),ye=Oe(W(Ee.card_data).files).map((Se,Fe)=>({idx:Fe,stored_name:W(Se).stored_name})).filter(Se=>typeof Se.stored_name=="string"&&Se.stored_name.length>0),je=(Array.isArray(Be.records)?Be.records:[]).map(Se=>{let Le=W(Se.payload),pe={...Se},Ze=typeof Se?.role=="string"?Se.role:typeof Le.role=="string"?String(Le.role):"",Ke=typeof Se?.text=="string"?Se.text:typeof Le.text=="string"?String(Le.text):"";if(Ze==="system"){let Ve=ma(Ke);if(Ve!==null&&ye.some(L=>L.idx===Ve)){let L=`Retrieve using inspect-file-contents --card-id ${P} --file-idx ${Ve}`;pe.retrieval_hint=L,Object.keys(Le).length>0&&typeof Se.role!="string"&&(pe.payload={...Le,retrieval_hint:L});}}return pe});return {cardId:P,messages:typeof oe=="number"&&oe>=0?je.slice(-oe):je}}async function d(A){let P=String(A.cardId||"").trim(),F=Number(A.fileIdx);if(!P)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 N=W(await vt(n,P)),V=Oe(W(N.card_data).files).map(W);if(F>=V.length)throw new Error(`attachment index ${F} is out of range for card "${P}"`);let z=V[F],oe=typeof z.stored_name=="string"?z.stored_name:null;return {cardId:P,fileIdx:F,downloadUrl:p({cardId:P,fileIdx:F,storedName:oe}),...typeof z.name=="string"?{name:z.name}:{},...typeof z.stored_name=="string"?{stored_name:z.stored_name}:{},...typeof z.mime_type=="string"?{mime_type:z.mime_type}:{},...typeof z.size=="number"?{size:z.size}:{},...typeof z.uploaded_at=="string"?{uploaded_at:z.uploaded_at}:{}}}async function i(A){return await r.validateCardPreflight({body:pa(A.candidateCardContent)})}function l(A){if(!A.mockRequires||typeof A.mockRequires!="object"||Array.isArray(A.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!A.mockFetchedSources||typeof A.mockFetchedSources!="object"||Array.isArray(A.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let P=r.evalCardCompute({body:{"card-content":A.candidateCardContent,"mock-requires":A.mockRequires,"mock-fetched-sources":A.mockFetchedSources}});if(P.status!=="success")return P;let F=W(oo(P,"evalCardCompute")),N=W(A.candidateCardContent),V={card_data:W(N.card_data),requires:W(A.mockRequires),fetched_sources:W(A.mockFetchedSources),computed_values:W(F.computed_values)};return {status:"success",data:{cardId:typeof F.cardId=="string"?F.cardId:typeof N.id=="string"?N.id:"(unknown)",ok:F.ok===true,computed_values:W(F.computed_values),errors:Oe(F.errors).map(z=>{let oe=W(z);return {bindTo:typeof oe.bindTo=="string"?oe.bindTo:"",error:typeof oe.error=="string"?oe.error:""}}),provides_outputs:ao(N,V),rendered_view:Kr(N,V)}}}async function g(A){return await r.probeSourcePreflight({params:{sourceIdx:A.sourceIdx},body:{"card-content":A.candidateCardContent,"mock-projections":A.mockProjections}})}async function f(A){return await r.runSourcePreflight({params:{sourceIdx:A.sourceIdx},body:{"card-content":A.candidateCardContent,"mock-projections":A.mockProjections}})}async function C(A){let P=String(A.cardId||"").trim();if(!P)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!A.mockRequires||typeof A.mockRequires!="object"||Array.isArray(A.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let F=W(await vt(n,P)),N=Oe(F.source_defs).filter(z=>!!z&&typeof z=="object"&&!Array.isArray(z)),V={};if(A.sourceIdx>=0&&A.sourceIdx<N.length){let z=N[A.sourceIdx],oe=Qe.enrichSourcesSync([z],{card_data:W(F.card_data),requires:A.mockRequires});Array.isArray(oe)&&oe.length>0&&(V=W(oe[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:A.sourceIdx},body:{"card-content":F,"mock-requires":A.mockRequires,"mock-projections":V}})}async function v(A){let P=W(await Ge(r.simulateCardCycle({body:{"card-content":A.candidateCardContent,"mock-requires":A.mockRequires}}),"simulateCardCycle")),F=W(A.candidateCardContent),N=W(P.validation),V=Oe(P.source_probes),z=Oe(P.projection_errors),oe=W(P.fetched_sources),ie=Oe(P.compute_errors),Pe=W(P.computed_values),Be={card_data:W(F.card_data),requires:A.mockRequires,fetched_sources:oe,computed_values:Pe},Ee=[];for(let ye of Oe(N.issues))typeof ye=="string"&&ye&&Ee.push(ye);for(let ye of V){let Ce=W(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"source",Se=typeof Ce.error=="string"?Ce.error:"";Se&&Ee.push(`${je}: ${Se}`);}for(let ye of z){let Ce=W(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"source",Se=typeof Ce.key=="string"?Ce.key:"projection",Fe=typeof Ce.error=="string"?Ce.error:"projection failed";Ee.push(`${je}.${Se}: ${Fe}`);}for(let ye of ie){let Ce=W(ye),je=typeof Ce.bindTo=="string"?Ce.bindTo:"compute",Se=typeof Ce.error=="string"?Ce.error:"compute failed";Ee.push(`${je}: ${Se}`);}return {status:"success",data:{cardId:typeof P.cardId=="string"?P.cardId:"(unknown)",ok:P.ok===true,issues:Ee,provides_outputs:ao(F,Be),rendered_view:Kr(F,Be)}}}async function O(A){let P=String(A.cardId||"").trim();if(!P)throw new Error("manageReadCard requires cardId");let F=await Ge(n.get({params:{id:P}}),"cardStore.get");return (Array.isArray(F.cards)?F.cards.map(W):[]).map(V=>gr(V))}async function M(A){let P=await Promise.all(Oe(A.files).map(async F=>{let N=W(F),V=String(N.file_name??N.fileName??N.name??"").trim(),z=String(N.content_type??N.contentType??"application/octet-stream");if(!V)throw new Error("file entry requires file_name");return await m({cardId:A.cardId,fileName:V,contentType:z,bytes:B(N),suppressChatRecordWrite:true})}));for(let[F,N]of P.entries()){let V=W(N.file),z=typeof N.file_idx=="number"&&Number.isInteger(N.file_idx)&&N.file_idx>=0?N.file_idx:F,oe=A.role==="assistant"?`AI generated: ${String(V.name||"")} as ${String(V.stored_name||"")} #${z}`:`file uploaded: ${String(V.name||"")} as ${String(V.stored_name||"")} #${z}`;nt(await o.append({params:{cardId:A.cardId},body:{role:"system",text:oe,files:[],turn:A.turn}}),"chatStore.append(system attachment message)");}return P.map(F=>F.file)}async function D(A){let P=String(A.cardId||"").trim(),F=String(A.role||"user").trim()||"user",N=typeof A.turn=="string"?A.turn:"";if(!P)throw new Error("manageAddChatAttachment requires cardId");let V=await M({cardId:P,role:F,turn:N,files:A.files});return {status:"success",data:{cardId:P,turn:N,files:V}}}async function J(A){let P=String(A.cardId||"").trim(),F=String(A.role||"").trim(),N=typeof A.text=="string"?A.text:"",V=typeof A.turn=="string"?A.turn:"";if(!P)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!F)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(F==="assistant"&&V){let ie=nt(await o.readAll({params:{cardId:P},body:{turnId:V}}),"chatStore.readAll(existing turn messages)"),Pe=Array.isArray(ie.records)?ie.records.find(Be=>Be.role==="assistant"&&String(Be.turn||"")===V):void 0;if(Pe)return {status:"success",data:{cardId:P,id:String(Pe.id),role:F,turn:V,files:Array.isArray(Pe.files)?Pe.files:[]}}}let z=await M({cardId:P,role:F,turn:V,files:A.files}),oe=nt(await o.append({params:{cardId:P},body:{role:F,text:N,files:z,turn:V}}),"chatStore.append");return {status:"success",data:{cardId:P,id:String(oe.id),role:F,turn:V,files:z}}}async function te(A,P={}){let F=String(A.cardId||"").trim(),N=W(A.patch);if(!F)throw new Error("managePatchCard requires cardId");let V=await O({cardId:F}),z=W(V[0]),oe=ha(z,N);return U({cardId:F,candidateCardContent:oe},P)}async function U(A,P={}){let F=String(A.cardId||"").trim(),N=W(A.candidateCardContent),V=gr(N);if(!F)throw new Error("manageUpsertCard requires cardId");if(typeof V.id!="string"||!V.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(V.id!==F)throw new Error(`candidateCardContent.id must match cardId (${F})`);let z=null;try{z=await i({candidateCardContent:V});}catch(ye){let Ce=ye instanceof Error?ye.message:String(ye);if(!/non-core adapter is not configured/i.test(Ce))throw ye;z=null;}if(z!==null){let ye=W(z),Ce=W(ye.data);if(ye.status!=="success"||Ce.isValid!==true)return {status:"fail",step:"validate",validation:z}}let oe=null;try{oe=await vt(n,F);}catch{oe=null;}let ie=oe?W(oe):null;if(ie&&yr(ie)&&!P.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404});let Pe={...V,...ie&&ga(ie,"__private")?{__private:ie.__private}:{}},Be=await n.set({body:Pe});nt(Be,"cardStore.set");let Ee;try{Ee=await t.upsertCard({params:{cardId:F,restart:!0}}),nt(Ee,"upsertCard");}catch(ye){try{oe&&await n.set({body:oe});}catch{}throw ye}return {status:"success",data:{validation:z,card_saved:null,board_result:Ee}}}async function se(A,P={}){let F=String(A.cardId||"").trim();if(!F)throw new Error("manageRemoveCard requires cardId");if(!P.allowControlplaneOnlyCards){let z=await Ge(n.get({params:{id:F}}),"cardStore.get");if((Array.isArray(z.cards)?z.cards.map(W):[]).some(yr))throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404})}let N=await t.removeCard({params:{id:F}});nt(N,"removeCard");let V=await n.del({params:{id:F}});return nt(V,"cardStore.del"),{status:"success",data:{board_result:N,store_result:V}}}async function de(A){let P=String(A.cardId||"").trim();if(!P)throw new Error("adminReadCard requires cardId");let F=await Ge(n.get({params:{id:P}}),"cardStore.get");return Array.isArray(F.cards)?F.cards.map(N=>W(N)):[]}async function G(A){let P=String(A.cardId||"").trim(),F=W(A.candidateCardContent),N=gr(F);if(!P)throw new Error("adminUpsertCard requires cardId");if(typeof N.id!="string"||!N.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(N.id!==P)throw new Error(`candidateCardContent.id must match cardId (${P})`);let V=await i({candidateCardContent:N}),z=W(V),oe=W(z.data);if(z.status!=="success"||oe.isValid!==true)return {status:"fail",step:"validate",validation:V};let ie=null;try{ie=await vt(n,P);}catch{ie=null;}let Pe=ie?W(W(ie).__private):{},Be={...N,__private:{...Pe,visible_controlplane_only:true}},Ee=await n.set({body:Be});nt(Ee,"cardStore.set");let ye;try{ye=await t.upsertCard({params:{cardId:P,restart:!0}}),nt(ye,"upsertCard");}catch(Ce){try{ie&&await n.set({body:ie});}catch{}throw Ce}return {status:"success",data:{validation:V,card_saved:null,board_result:ye}}}async function Y(A){let P=String(A.cardId||"").trim();if(!P)throw new Error("getChatProcessing requires cardId");let F=oo(await o.isProcessing({params:{cardId:P}}),"chatStore.isProcessing");return {cardId:P,active:!!F.active}}async function T(A){let P=String(A.cardId||"").trim();if(!P)throw new Error("setChatProcessing requires cardId");if(typeof A.active!="boolean")throw new Error("setChatProcessing requires boolean active");return nt(await o.setProcessing({params:{cardId:P},body:{active:A.active}}),"chatStore.setProcessing"),{cardId:P,active:A.active}}async function S(){let A=await b(s,"webhook.process-accumulated")();return A?.status==="fail"||A?.status==="error"?A:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(A??{},"data")?A.data??null:null}}}async function Q(A){let P=String(A.token||"").trim(),F=String(A.ref||"").trim();if(!P)throw new Error("webhookSourceFetchDone requires token");if(!F)throw new Error("webhookSourceFetchDone requires ref");let N=await b(c,"webhook.source-fetch-done")({token:P,ref:F});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:P,ref:F,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}async function j(A){let P=String(A.token||"").trim(),F=String(A.reason||"").trim();if(!P)throw new Error("webhookSourceFetchFailed requires token");if(!F)throw new Error("webhookSourceFetchFailed requires reason");let N=await b(u,"webhook.source-fetch-failed")({token:P,reason:F});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:P,reason:F,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}return {listRuntimeCards:w,discoverSourceKinds:x,inspectBoardRuntimeStatus:_,inspectCardDefinitionAndRuntime:I,inspectChatMessagesOnCards:y,inspectFileContents:d,preflightValidateCandidateCardDefinition:i,preflightMaterializeCandidateCard:l,preflightProbeSingleSourceInCandidateCard:g,preflightRunSingleSourceInCandidateCard:f,preflightRunSingleSourceInLiveCard:C,preflightRunOneCycleWithCandidateCard:v,manageReadCard:O,manageAddChatAttachment:D,manageAddChatEntryAndAnyAttachments:J,managePatchCard:te,manageUpsertCard:U,manageRemoveCard:se,adminReadCard:de,adminUpsertCard:G,getChatProcessing:Y,setChatProcessing:T,webhookProcessAccumulated:S,webhookSourceFetchDone:Q,webhookSourceFetchFailed:j}}async function Ge(e,t){return nt(await e,t)}function io(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:s,readCardRuntimeArtifacts:c,readCardFromStore:u,readCardDefinitions:m,processAccumulatedLaneInternal:p,reportSourceFetched:R,reportSourceFetchFailure:b,uploadCardFile:w,chatStorePublic:B,serverUrl:x,apiBasePath:_}=e;function I(){return t[0]??null}function y(){return {async status(){let g=await o();return g==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:g}},async getOutputsDataObject(g){let f=g?.params?.key;return f?{status:"success",data:(await s())[f]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(g){let f=g?.params?.key;return f?{status:"success",data:(await c())[f]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(g){let f=g?.params?.key;if(!f)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let C=n(f)??I();return C?C.boardOps.getOutputsFetchedSources({params:{key:f}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(g){let f=g?.params?.id;if(!f)return {status:"fail",error:"removeCard requires params.id"};let C=n(f)??I();return C?C.boardOps.removeCard({params:{id:f}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(g){let f=g?.params?.cardId;if(!f)return {status:"fail",error:"upsertCard requires params.cardId"};let C=n(f)??I();if(!C)return {status:"fail",error:"Board context is unavailable"};let v=await C.boardOps.upsertCard({params:{cardId:f,restart:g.params.restart===true}});if(v.status!=="success")return v;if(tt(C.boardAdapter)){let O=await p(true);if(O.status!=="success")return O}return v}}}function d(){let g=()=>{let f=I();if(!f?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return f.nonCore};return {describeTaskExecutorCapabilities(f){return g().describeTaskExecutorCapabilities(f)},validateCardPreflight(f){return g().validateCardPreflight(f)},evalCardCompute(f){return g().evalCardCompute(f)},probeSourcePreflight(f){return g().probeSourcePreflight(f)},runSourcePreflight(f){return g().runSourcePreflight(f)},simulateCardCycle(f){return g().simulateCardCycle(f)}}}function i(){return {async get(g){let f=typeof g.params?.id=="string"?g.params.id:void 0;if(f){let C=await u(f);return C?{status:"success",data:{cards:[C]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await m()}}},async set(g){let f=g.body;if(f==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let C=Array.isArray(f)?f:[f];for(let v of C){let O=v,M=typeof O.id=="string"?O.id:"";if(!M)return {status:"fail",error:"each card must have a string `id` field"};let D=r.get(M)??0,J=t[D]??I();if(!J)return {status:"fail",error:"Board context is unavailable"};let te=await J.cardStoreOps.set({body:O});if(te.status!=="success")return te;r.set(M,D);}return {status:"success",data:{count:C.length}}},async del(g){let f=[g.params?.id,...g.body?.ids??[]].filter(C=>typeof C=="string"&&!!C);if(f.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let C of f){let v=n(C)??I();if(!v)return {status:"fail",error:"Board context is unavailable"};let O=await v.cardStoreOps.del({params:{id:C}});if(O.status!=="success")return O;r.delete(C);}return {status:"success",data:{count:f.length}}},async patch(g){let f=typeof g.params?.id=="string"?g.params.id:void 0,C=typeof g.params?.path=="string"?g.params.path:void 0;if(!f||!C)return {status:"fail",error:"patch requires params.id and params.path"};let v=n(f)??I();return v?v.cardStoreOps.patch(g):{status:"fail",error:"Board context is unavailable"}},async appendFiles(g){let f=typeof g.params?.id=="string"?g.params.id:void 0;if(!f)return {status:"fail",error:"appendFiles requires params.id"};let C=n(f)??I();return C?C.cardStoreOps.appendFiles(g):{status:"fail",error:"Board context is unavailable"}}}}function l(){return so({board:y(),nonCore:d(),cardStore:i(),chatStore:B,processAccumulated:()=>p(true),sourceFetchDone:({token:g,ref:f})=>R(g,f),sourceFetchFailed:({token:g,reason:f})=>b(g,f),uploadCardFile({cardId:g,fileName:f,contentType:C,bytes:v,suppressChatRecordWrite:O}){return w(g,f,C,v,{inChat:true,...O===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:g,fileIdx:f,storedName:C}){let v=`${x||""}${_}/cards/${encodeURIComponent(g)}/files/${f}`;return C?`${v}?sn=${encodeURIComponent(C)}`:v},readFetchedSourceJsonByRef({cardId:g,ref:f}){let C=n(g)??I();if(!C||tt(C.boardAdapter))return null;let M=C.boardAdapter.resolveBlob(at(f)).trim();return M?JSON.parse(M):null}})}return {mcpBoardFacade:y,mcpNonCoreFacade:d,mcpCardStoreFacade:i,createMcpFacade:l}}function uo(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:s,createMcpToolRegistry:c,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:m,sliceTextByLines:p}=e;async function R(b,w,B){let x=b.method||"GET",_=B,I=_.pathname;try{if(x==="POST"&&I===`${t}/mcp`){await o();let y=await n(b),d=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!d)return r(w,400,{error:"tool is required"}),!0;if(d==="inspect.file-contents")return r(w,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let l=await mt(d,i,c(s()));if(l&&typeof l=="object"&&!Array.isArray(l)){let g=l;if(g.status==="fail")return r(w,400,{error:rt(l,"Request failed")}),!0;if(g.status==="error")return r(w,500,{error:rt(l,"Internal error")}),!0}r(w,200,l);}catch(l){let g=typeof l?.statusCode=="number"?Number(l.statusCode):500,f=l instanceof Error?l.message:String(l);r(w,g,{error:f});}return !0}if(x==="POST"&&I===`${t}/mcp-raw`){await o();let y=await n(b),d=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!d)return r(w,400,{error:"tool is required"}),!0;if(d!=="inspect.file-contents")return r(w,400,{error:`Tool does not support raw response: ${d}`}),!0;let l=le(i,"card_id","cardId"),g=st(i,"file_idx","fileIdx"),f=st(i,"head-lines","headLines"),C=st(i,"tail-lines","tailLines"),v=st(i,"head-bytes","headBytes"),O=st(i,"tail-bytes","tailBytes");if(!l)return r(w,400,{error:"inspect.file-contents requires card_id"}),!0;if(g===void 0||!Number.isInteger(g)||g<0)return r(w,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([f,C,v,O].filter(S=>S!==void 0).length>1)return r(w,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[S,Q]of [["head-lines",f],["tail-lines",C],["head-bytes",v],["tail-bytes",O]])if(Q!==void 0&&(!Number.isInteger(Q)||Q<0))return r(w,400,{error:`inspect.file-contents requires ${S} to be a non-negative integer`}),!0;let D=await s().inspectFileContents({cardId:l,fileIdx:g}),J=typeof D?.stored_name=="string"?D.stored_name:null,{fileRecord:te,bytes:U}=await u(l,g,J),se=String(te.name||te.stored_name||"download.bin"),de=String(te.mime_type||"application/octet-stream"),G=(_.searchParams.get("resp")||"").trim().toLowerCase();if(G&&G!=="json-b64")return r(w,400,{error:`unsupported resp mode: ${G}`}),!0;let Y=G==="json-b64",T;if(f!==void 0||C!==void 0){if(!m(de))return r(w,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let S=new TextDecoder().decode(U),Q=f!==void 0?p(S,"head",f):p(S,"tail",C);T=typeof Buffer<"u"?Buffer.from(Q,"utf8"):new TextEncoder().encode(Q);}else if(v!==void 0||O!==void 0){let S=v??O;T=v!==void 0?U.slice(0,S):U.slice(Math.max(0,U.length-S));}else T=U;if(Y){let S=typeof Buffer<"u"?Buffer.from(T).toString("base64"):btoa(String.fromCharCode(...T));return r(w,200,{bodyBase64:S,mimeType:de,filename:se,byteLength:T.length}),!0}return w.writeHead(200,{"Content-Type":de,"Content-Disposition":`attachment; filename="${se}"`,"Content-Length":T.length}),w.end(T),!0}return !1}catch(y){let d=y?.statusCode||500;return r(w,d,{error:String(y?.message||y)}),true}}return {handleAgentfaceApi:R}}function co(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function c(u,m,p){let R=u.method||"GET",b=p.pathname;try{if(R==="POST"&&b===`${t}/mcp-webhooks`){await o();let w=await n(u),B=typeof w.tool=="string"?w.tool.trim():"",x=w.args&&typeof w.args=="object"&&!Array.isArray(w.args)?w.args:{};if(!B)return r(m,400,{error:"tool is required"}),!0;try{let _=await mt(B,x,s());if(_&&typeof _=="object"&&!Array.isArray(_)){let I=_;if(I.status==="fail")return r(m,400,{error:rt(_,"Request failed")}),!0;if(I.status==="error")return r(m,500,{error:rt(_,"Internal error")}),!0}r(m,200,_);}catch(_){let I=typeof _?.statusCode=="number"?Number(_.statusCode):500,y=_ instanceof Error?_.message:String(_);r(m,I,{error:y});}return !0}return !1}catch(w){let B=w?.statusCode||500;return r(m,B,{error:String(w?.message||w)}),true}}return {handleWebhooksApi:c}}function Jr(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:s,onChannelSubscribed:c,onChannelUnsubscribed:u}=e;function m(R,b,w,B,x){if(!t.has(b)){n(R,404,{error:`SSE client not connected: ${b}`});return}x?(t.subscribeChannel(b,w,B.cardId),c?.(b,w,B)):(t.unsubscribeChannel(b,w,B.cardId),u?.(b,w,B)),n(R,200,{ok:true,clientId:b,channelName:w,...B.cardId?{cardId:B.cardId}:{},subscribed:x});}async function p(R,b,w,B){let x=B?.oneShot===true,_=B?.bootstrapPayload!==false,I=!x&&w?t.get(w):null,y=I?new Set(I.subscribedChatCardIds):new Set,d=I?new Set(I.subscribedChannelNames):new Set,i=I?new Map(Array.from(I.subscribedCardChannels.entries(),([g,f])=>[g,new Set(f)])):new Map;if(b.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(b),_){let g=await o(),f=t.buildFrame(g);b.write(f);}if(x){b.end();return}if(!w)throw new Error("clientId is required for streaming SSE");t.register(w,b,{subscribedChatCardIds:y,subscribedChannelNames:d,subscribedCardChannels:i});try{s?.(w,g=>{t.writeFrame(w,g);});}catch{}let l=setInterval(()=>{try{b.write(`: keepalive
5
5
 
6
- `);}catch{}},15e3);R.on("close",()=>{clearInterval(l),t.disconnect(A,S);});}return {handleChannelSubscription:m,handleSse:p}}function lo(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,boardContexts:c,publishPersistedStateSnapshot:u,upsertCardsFromSource:m,sseHub:p,queueSseHub:R}=e,{handleSse:S,handleChannelSubscription:A}=Jr(e),{handleSse:B}=Jr({...e,sseHub:R,buildPublishedRuntimePayload:async()=>null});async function x(_,I,y){let d=_.method||"GET",i=y,l=i.pathname;try{if(d==="GET"&&l===`${t}/sse`){let O=i.searchParams.has("one-shot");await o();let M=String(i.searchParams.get("clientId")||"").trim();if(!O&&!M)return r(I,400,{error:"clientId query param is required for SSE"}),!0;if(await S(_,I,M||void 0,{oneShot:O}),O)return !0;for(let D=0;D<c.length;D++)await u(c[D]),await m(c[D],D),await u(c[D]);return !0}if(d==="GET"&&l===`${t}/sse-q`){let O=String(i.searchParams.get("clientId")||"").trim();return O?(await B(_,I,O,{bootstrapPayload:!1}),!0):(r(I,400,{error:"clientId query param is required for SSE"}),!0)}let g=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(d==="POST"&&g){await s();let O=decodeURIComponent(g[1]),M=await n(_),D=typeof M?.clientId=="string"?M.clientId.trim():"";return D?await p.subscribeChat(D,O)?(r(I,200,{ok:!0,clientId:D,cardId:O,subscribed:!0}),!0):(r(I,404,{error:`SSE client not connected: ${D}`}),!0):(r(I,400,{error:"clientId is required"}),!0)}let f=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(d==="POST"&&f){await s();let O=decodeURIComponent(f[1]),M=await n(_),D=typeof M?.clientId=="string"?M.clientId.trim():"";return D?p.unsubscribeChat(D,O)?(r(I,200,{ok:!0,clientId:D,cardId:O,subscribed:!1}),!0):(r(I,404,{error:`SSE client not connected: ${D}`}),!0):(r(I,400,{error:"clientId is required"}),!0)}let k=l.match(new RegExp(`^${ot(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(d==="POST"&&k){await s();let O=decodeURIComponent(k[1]),M=k[2]==="subscribe",D=await n(_),J=typeof D?.clientId=="string"?D.clientId.trim():"";return J?(A(I,J,O,{},M),!0):(r(I,400,{error:"clientId is required"}),!0)}let v=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(d==="POST"&&v){await s();let O=decodeURIComponent(v[1]),M=decodeURIComponent(v[2]),D=v[3]==="subscribe",J=await n(_),ee=typeof J?.clientId=="string"?J.clientId.trim():"";return ee?(A(I,ee,M,{cardId:O},D),!0):(r(I,400,{error:"clientId is required"}),!0)}return !1}catch(g){let f=g?.statusCode||500;return r(I,f,{error:String(g?.message||g)}),true}}return {handleWatchersRoutes:x,handleSse:S,handleChannelSubscription:A}}var Ra=3e4;function ka(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function fo(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,s=`${t}/notify-q`;async function c(u,m,p){if(p.pathname!==s)return false;if((u.method??"").toUpperCase()!=="POST")return o(m,405,{status:"error",error:"Method not allowed"}),true;if(!ka(u))return o(m,403,{status:"error",error:"Forbidden"}),true;let R;try{R=await n(u);}catch{return o(m,400,{status:"error",error:"Invalid JSON body"}),true}if(!R||typeof R!="object"||!Array.isArray(R.notifications))return o(m,400,{status:"error",error:"body.notifications must be an array"}),true;let S=R.notifications,{accepted:A,rejected:B}=Qn(S,Date.now(),Ra);return A.length>0&&r(A),o(m,200,{status:"success",data:{accepted:A.length,rejected:B}}),true}return {handleNotifyRoute:c}}var po={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},mo="chat-handler-flow-queue",Nt="__probe__echo__probe__";function Ca(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...po,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},c=e.invocationAdapter,u=e.chatFlowRunner||null,m=e.notificationTransport||null,p=e.serverUrl||null,R=e.executionExtra||{},S=e.onSseClientConnected,A=e.onSseClientDisconnected,B=e.onChannelSubscribed,x=e.onChannelUnsubscribed,_=Mr({buildChatOneShotBatch:async(a,b)=>await ue.buildSseOneShotBatch({params:{cardId:a},body:{receiving:b}}),onSseClientDisconnected:A}),I=Mr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function y(a){function b(X){return {...X,queueStorageForRef(me,_e){return $n(X.queueStorageForRef(me,_e),{lane:_e,emitNotification:Y})}}}function E(X){return {...X,queueStorageForRef(me,_e){return Dn(X.queueStorageForRef(me,_e),{lane:_e,emitNotification:Y})}}}function $(X){return {async get(me){return X.get(me)},async set(me){return X.set(me)},async del(me){return X.del(me)},async patch(me){return X.patch(me)},async appendFiles(me){return X.appendFiles(me)}}}function H(X){return {async get(me){return await X.get(me)},async set(me){return await X.set(me)},async del(me){return await X.del(me)},async patch(me){return await X.patch(me)},async appendFiles(me){return await X.appendFiles(me)}}}let re=null;function Y(X){if(X.kind==="notification-batch"){se(X.notifications,re??void 0);return}se([X],re??void 0);}let ce=tt(a.boardAdapter)?E(a.boardAdapter):b(a.boardAdapter),Me=a.nonCoreAdapter??(!tt(ce)&&k(ce)?ce:null),Ae=tt(ce)?Mn(a.baseRef,ce,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:Y}):_n(a.baseRef,ce,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:Y}),$e=a.nonCore??(Me?En(a.baseRef,Me,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,taskExecutorRef:a.taskExecutorRef}):null),kr=ce.chatStorageForRef(a.chatStoreRef),Cr,yo=tt(ce)?(()=>{let X=mr(fr(lr(ce.kvStorageForRef(a.cardStoreRef)),ce.hashFn),s.warn),me=ur(X,{emitNotification:Y}),_e=H(me);return Cr={get(we){return _e.get(we)},set(we){return _e.set(we)}},_e})():(()=>{let X=ce.kvStorageForRef(a.cardStoreRef),_e=sr(Ft({readIndex:()=>X.read("_index"),writeIndex:we=>X.write("_index",we),readCard:we=>X.read(we),writeCard:(we,Sr)=>(X.write(we,Sr),we),removeCard:we=>{X.delete(we);},cardExists:we=>X.read(we)!==null,defaultCardKey:we=>we},s.warn),{emitNotification:Y});return Cr=_e,$(_e)})(),br;if(tt(ce)){let X=ce.blobStorageForRef(a.artifactsStoreRef);br={async putBytes(me,_e){if(X.writeBytes){await X.writeBytes(me,_e);return}let we=JSON.stringify({__kind:"bytes-array",data:[..._e]});await X.write(me,we);},async getBytes(me){if(X.readBytes){let we=await X.readBytes(me);if(we!==null)return we}let _e=await X.read(me);if(_e===null)return null;try{let we=JSON.parse(_e);if(we&&we.__kind==="bytes-array"&&Array.isArray(we.data))return new Uint8Array(we.data)}catch{}return new TextEncoder().encode(_e)},async listKeys(me){return await X.listKeys(me)}};}else {let X=ce.blobStorageForRef(a.artifactsStoreRef),me=Kn(X);br={putBytes(_e,we,Sr){me.putBytes(_e,we,Sr);},getBytes(_e){return me.getBytes(_e)},listKeys(_e){return me.list(_e).map(we=>we.key)}};}let ho={async init(X){return Ae.init(X)},async status(X){return Ae.status(X)},async getConfig(X){return Ae.getConfig(X)},async getAllOutputsDataObjects(X){return Ae.getAllOutputsDataObjects(X)},async getAllOutputsComputedValues(X){return Ae.getAllOutputsComputedValues(X)},async getOutputsFetchedSources(X){return Ae.getOutputsFetchedSources(X)},async buildSseOneShotPayload(X){return Ae.buildSseOneShotPayload(X)},async upsertCard(X){return Ae.upsertCard(X)},async removeCard(X){return Ae.removeCard(X)},async sourceDataFetched(X){return Ae.sourceDataFetched(X)},async sourceDataFetchFailure(X){return Ae.sourceDataFetchFailure(X)}};return re={label:a.label,board:Ae,nonCore:$e,publicCardStore:Cr,boardOps:ho,cardStoreOps:yo,get filesArtifacts(){return br},get chatStorage(){return kr},boardAdapter:ce,boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,artifactsStoreRef:a.artifactsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:zn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},re}let d=e.boards.map(y),i=new Map;function l(a){return i.get(a)??0}function g(a){return a.queueStoreRef}function f(a,b){if(tt(a.boardAdapter)){let $=a.boardAdapter.queueStorageForRef(g(a),b);return qr($)}let E=a.boardAdapter.queueStorageForRef(g(a),b);return jr(E)}function k(a){let b=a;return typeof b.invokeExecutor=="function"&&typeof b.validateSchema=="function"}function v(a){let b=d[l(a)];return {files:b?b.filesArtifacts:null}}function O(){return Hn()}function M(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function D(a){return "cardId"in a&&typeof a.cardId=="string"?j(a.cardId)??void 0:d[0]??void 0}function J(a){for(let b of a){let E=D(b);if(E)return E}return d[0]??void 0}function ee(a,b={}){if(!a||a.length===0)return;let E=qe(a),$={kind:"notification-batch",notifications:E},H=b.ctx??J(E);if(b.appendState!==false&&H&&Yn(H.notification,$),b.broadcastSse!==false){let re=E.filter(ce=>ce.kind==="message_enqueued"),Y=E.filter(ce=>ce.kind!=="message_enqueued");Y.length>0&&_.broadcastNotificationBatch(Y),re.length>0&&I.broadcastNotificationBatch(re);}if(!(b.mirrorExternal===false||!H?.boardAdapter.publishBoardChangeNotifications))try{let re=E.filter(Y=>Y.category==="board-output"||Y.category==="card-store");re.length>0&&H.boardAdapter.publishBoardChangeNotifications(re);}catch{}}function se(a,b){ee(a,{ctx:b,appendState:true,broadcastSse:true,mirrorExternal:true});}async function te(a){if(!a||a.notificationTeardown||!m||!a.notifyRef)return;let b=await m.subscribe(a.notifyRef,E=>{let $=Gn(E);ee($,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});});a.notificationTeardown=b;}async function Z(a){if(!a||a.initialized)return;let b={boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,artifactsStoreRef:a.artifactsStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef},E={};a.taskExecutorRef&&(E["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=a.chatHandlerFlow);let $=await a.boardOps.init({params:b,body:E});if($.status!=="success")throw Object.assign(new Error($.error||`init failed for ${a.label}`),{statusCode:500});if(await te(a),!a.chatHandlerFlow&&a.chatHandlerRef&&c.describe)try{let H=await c.describe(a.chatHandlerRef);H&&H.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${H.kind}", expected "chat-handler" for ${a.label}`):H&&s.info(`[init] chat-handler validated: ${H.name} (protocol ${H.protocolVersion}) for ${a.label}`);}catch(H){s.warn(`[init] chat-handler describe failed for ${a.label}: ${H?.message||String(H)}`);}a.initialized=true;}async function ie(a){let b=[],E=await a.boardOps.status({});E.status==="success"&&E.data!=null&&Lr(E.data)&&b.push({kind:"status",status:E.data});let $=await a.boardOps.getAllOutputsDataObjects({});if($.status==="success"&&$.data!=null)for(let[re,Y]of Object.entries($.data))re&&b.push({kind:"data_object",key:re,payload:Y});let H=await a.boardOps.getAllOutputsComputedValues({});if(H.status==="success"&&H.data!=null)for(let[re,Y]of Object.entries(H.data))re&&Y&&typeof Y=="object"&&!Array.isArray(Y)&&b.push({kind:"computed_values",cardId:re,values:Y});b.length>0&&ee(b,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});}async function G(a,b){if(!a||a.cardsBootstrapped)return;let E=await a.cardStoreOps.get({}),$=E.status==="success"&&Array.isArray(E.data?.cards)?E.data.cards:[];for(let H of $)typeof H.id=="string"&&(i.set(H.id,b),await a.boardOps.upsertCard({params:{cardId:H.id}}));a.cardsBootstrapped=true;}async function T(){for(let a of d)await Z(a);}async function C(){await T();for(let a=0;a<d.length;a++)await ie(d[a]),await G(d[a],a),await ie(d[a]);}async function K(a=false){a||await T();for(let b of d){let E=await b.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}function j(a){return d[l(a)]??null}async function w(a){let b=j(a);if(!b)return null;let E=await b.cardStoreOps.get({params:{id:a}});if(E.status!=="success")return null;let $=Array.isArray(E.data?.cards)?E.data.cards:[];return $.length>0?$[0]:null}async function P(){let a=async E=>{if(!E)return [];let $=await E.cardStoreOps.get({});return $.status!=="success"||!Array.isArray($.data?.cards)?[]:$.data.cards},b=[];for(let E of d)b.push(...await a(E));return b}function F(){return d[0]??null}function N(a){return j(a)??F()}function V(a){let b=N(a);if(!b)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${a}`),{statusCode:404});return b.chatStorage}async function W(a){return await V(a).isProcessing(a)}async function oe(a,b){let E=await ue.setProcessing({params:{cardId:a},body:{active:b}});if(E.status!=="success")throw Object.assign(new Error(E.error||`Failed to set chat processing for card: ${a}`),{statusCode:500})}let ue=Jn({append(a,b,E,$,H){return V(a).append(a,b,E,$,H)},readAll(a){return V(a).readAll(a)},readAfter(a,b){return V(a).readAfter(a,b)},clear(a){return V(a).clear(a)},setProcessing(a,b){return V(a).setProcessing(a,b)},isProcessing(a){return V(a).isProcessing(a)},getConfig(a){return V(a).getConfig(a)},setConfig(a,b){return V(a).setConfig(a,b)}},{emitNotification(a){if(a.kind==="notification-batch"){se(a.notifications);return}se([a]);}}),Te=io({boardContexts:d,cardOwnerIndex:i,cardContextForCard:a=>j(a),readStatusSnapshot:()=>Le(),readDataObjectsByToken:()=>Ze(),readCardRuntimeArtifacts:()=>pe(),readCardFromStore:a=>w(a),readCardDefinitions:()=>P(),processAccumulatedLaneInternal:a=>K(a),reportSourceFetched:(a,b)=>It(a,{ref:b}),reportSourceFetchFailure:(a,b)=>jt(a,{reason:b}),uploadCardFile:(a,b,E,$,H)=>he(a,b,E,$,H),chatStorePublic:ue,serverUrl:p,apiBasePath:t}),Be=Te.mcpCardStoreFacade,Ee=Te.createMcpFacade,ye=Xn({boardId:o,bootstrapBoard:()=>C(),sseHub:_,onChannelSubscribed:B,onChannelUnsubscribed:x,getMcpFacade:()=>Ee(),getMcpCardStoreFacade:()=>Be()});function Ce(a){return to(a)}function je(){return ro(Ee())}function Se(){return no({boardId:o,uploadCardFile:he,getMcpFacade:()=>Ee(),controlplane:ye})}let Fe=Zn({boardId:o,boardContexts:d,readChatRecords:a=>ae(a),getChatProcessing:a=>W(a)}),Le=Fe.readStatusSnapshot,pe=Fe.readCardRuntimeArtifacts,Ze=Fe.readDataObjectsByToken,Ke=Fe.buildPublishedRuntimePayload;async function Ve(a,b,E){let $=E?.syncBoard!==false,H=E?.restartOnlyIfChanged===true,re=j(a);if(!re)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let Y=await w(a);if(!Y)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let ce=H?JSON.stringify(Y):null,Me=b(Y)||Y;if(H&&JSON.stringify(Me)===ce)return;let Ae=await re.cardStoreOps.set({body:Me});if(Ae.status!=="success")throw Object.assign(new Error(Ae.error||`Failed to persist card: ${a}`),{statusCode:500});if($){let $e=await re.boardOps.upsertCard({params:{cardId:a,restart:true}});if($e.status!=="success")throw Object.assign(new Error($e.error||`Failed to upsert card: ${a}`),{statusCode:500})}}async function et(a,b){await Ve(a,b,{syncBoard:true});}async function L(a,b){await Ve(a,b,{syncBoard:false});}async function h(a){let b=j(a);if(!b)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});if(!await w(a))throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let $=await b.boardOps.upsertCard({params:{cardId:a,restart:true}});if($.status!=="success")throw Object.assign(new Error($.error||`Failed to retrigger card: ${a}`),{statusCode:500})}async function q(a){let b=await ue.clear({params:{cardId:a}});if(b.status!=="success")throw Object.assign(new Error(b.error||`Failed to clear chat records for card: ${a}`),{statusCode:500});try{await oe(a,!1);}catch{}}async function U(a,b,E,$,H=""){let re=typeof E=="string"?E.trim():"",Y=await ue.append({params:{cardId:a},body:{role:b||"system",text:re,files:$,turn:H}});if(Y.status!=="success")throw Object.assign(new Error(Y.error||`Failed to append chat record for card: ${a}`),{statusCode:500});return String(Y.data?.id||"")}async function ae(a){return await V(a).readAll(a)}let he=eo({safeCardId:a=>M(a),artifactsStores:a=>v(a),cardFileMetadataStore:()=>O(),readCardFromStore:a=>w(a),updateCardLocalOnly:(a,b)=>L(a,b),writeChatRecord:(a,b,E,$,H)=>U(a,b,E,$,H)}).uploadCardFile;async function fe(a){let b=j(a);if(!b)return null;let E=await b.boardOps.getConfig({params:{key:"chat-handler-flow"}}),H=(E.status==="success"?E.data?.value:null)??b.chatHandlerFlow??null,re=b.chatHandlerRef;return H==null&&(!re||typeof re!="object")?null:{ctx:b,handlerFlow:H,handlerRef:re}}function be(a){let b=typeof a=="string"?a.trim():"";if(b.length<Nt.length*2||!b.startsWith(Nt)||!b.endsWith(Nt))return null;let E=b.slice(Nt.length,b.length-Nt.length).trim(),$=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(E);return $?{assistant:$[1].trim().toLowerCase(),text:$[2].trim()}:{assistant:"echo",text:E}}async function Pe(a,b,E=false,$="",H=""){try{let re=await fe(a);if(!re){try{await oe(a,!1);}catch{}return}let{ctx:Y,handlerFlow:ce,handlerRef:Me}=re;if(!E)try{await oe(a,!0);}catch{}let Ae={boardId:o,cardId:String(a),lastChatEntryId:b,...$?{turnId:$}:{},...typeof H=="string"&&H.trim()?{probe:H.trim()}:{},...R,...p?{serverUrl:p}:{}},$e=ce!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:mo}}:Me;tt(Y.boardAdapter)?await f(Y,"chat-agent").enqueueRequest({boardId:o,ref:$e,args:ce!=null?{...Ae,__chatHandlerFlow:ce}:Ae}):f(Y,"chat-agent").enqueueRequest({boardId:o,ref:$e,args:ce!=null?{...Ae,__chatHandlerFlow:ce}:Ae}),await Promise.resolve(Y.boardAdapter.requestProcessAccumulated?.());}catch(re){try{await oe(a,!1);}catch{}s.warn(`[chat-handler] queue failed for card "${a}": ${re instanceof Error?re.message:String(re)}`);}}async function He(a,b,E){if(b.howToRun==="built-in"&&zr(b)===mo){let $=u,H=E.__chatHandlerFlow,re={...E};return delete re.__chatHandlerFlow,$?$.run(H,re,{boardId:o,cardId:String(re.cardId||""),label:a.label,logger:s,serverUrl:p,executionExtra:R}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return c.invoke(b,E)}async function Je(a,b=false){b||await T();let E=typeof a.args?.cardId=="string"?a.args.cardId:"",$=E?j(E):F();if(!$)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let H=await He($,a.ref,a.args);if(!H.dispatched){if(E)try{await oe(E,!1);}catch{}throw new Error(H.error||`chat-agent dispatch failed for card "${E||"unknown"}"`)}}async function De(a,b,E){if(b==="chat-send"){let H=E&&typeof E["turn-id"]=="string"?E["turn-id"]:E&&typeof E.turnId=="string"?E.turnId:E&&typeof E.turn=="string"?E.turn:"";if(E&&"files"in E&&E.files!==void 0&&E.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let re=Se(),Y=be(E?.text),ce=Y?Y.text:E?.text,Me=await mt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:a,role:"user",text:ce,turn_id:H,files:[]},re);if(Me?.status!=="success")throw new Error(rt(Me,`chat-send append failed for card ${a}`));let Ae=Me?.data?.id;if(typeof Ae!="string"||!Ae)throw new Error(`chat-send did not return an append id for card ${a}`);let $e=await mt("setstate.chat-processing-started",{board_id:o,card_id:a},re);if($e?.status!=="success")throw new Error(rt($e,`chat-send processing update failed for card ${a}`));Pe(a,Ae,true,H,Y?.assistant||"");return}await et(a,H=>{let re=new Date().toISOString(),Y=H.card_data&&typeof H.card_data=="object"?H.card_data:{};if(H.card_data=Y,b==="file-upload"){let ce=O().normalizeIncoming(E?.files,re);return ce.length>0&&O().merge(Y,ce),H}if(b==="action"){let ce=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!ce)return H;Y.lastAction={buttonId:ce,at:re},Y.lastActionText=`${ce} @ ${re}`;}return H});}function We(a,b,E){let $=JSON.stringify(E),H=typeof Buffer<"u"?Buffer.byteLength($):new TextEncoder().encode($).length;a.writeHead(b,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":H}),a.end($);}async function ze(a,b,E){let $=await w(a);if(!$)throw Object.assign(new Error("Card not found"),{statusCode:404});let H=O().resolve($.card_data,b,E);if(!H.ok&&H.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!H.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let re=H.file,Y=M(a),ce=v(a),Me=String(re.stored_name||""),Ae=`${Y}/${Me}`,$e=ce.files?await ce.files.getBytes(Ae):null;if(!$e)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:re,bytes:$e}}async function dt(a,b,E,$){let{fileRecord:H,bytes:re}=await ze(b,E,$),Y=String(H.name||H.stored_name||"download.bin"),ce=String(H.mime_type||"application/octet-stream");a.writeHead(200,{"Content-Type":ce,"Content-Disposition":`attachment; filename="${Y}"`,"Content-Length":re.length}),a.end(re);}function At(a){let b=String(a||"").toLowerCase();return b.startsWith("text/")||b.includes("json")||b.includes("xml")||b.includes("javascript")||b.includes("typescript")||b.includes("yaml")||b.includes("csv")}function xt(a,b,E){let $=a.split(/\r?\n/);return (b==="head"?$.slice(0,E):$.slice(-E)).join(`
7
- `)}async function lt(a){let b=[];for await(let $ of a)b.push($);let E=typeof Buffer<"u"?Buffer.concat(b).toString("utf-8").trim():new TextDecoder().decode(wr(b)).trim();return E?JSON.parse(E):{}}async function It(a,b){let E=typeof b.ref=="string"?b.ref.trim():"";if(!E)return {status:"fail",error:"board-worker success callback requires body.ref"};let $=d[0];return $?$.boardOps.sourceDataFetched({params:{token:a,ref:E}}):{status:"fail",error:"no board context"}}async function jt(a,b){let E=typeof b.reason=="string"&&b.reason.trim()?b.reason:"unknown",$=d[0];return $?$.boardOps.sourceDataFetchFailure({params:{token:a,reason:E}}):{status:"fail",error:"no board context"}}let Gr=lo({sseHub:_,queueSseHub:I,corsHeaders:r,json:We,buildPublishedRuntimePayload:()=>Ke(),onSseClientConnected:S,onChannelSubscribed:B,onChannelUnsubscribed:x,apiBasePath:t,readJsonBody:a=>lt(a),initBoardAndSetup:()=>T(),bootstrapBoard:()=>C(),boardContexts:d,publishPersistedStateSnapshot:a=>ie(a),upsertCardsFromSource:(a,b)=>G(a,b)}).handleWatchersRoutes,bt=uo({apiBasePath:t,json:We,readJsonBody:a=>lt(a),bootstrapBoard:()=>C(),createMcpFacade:()=>Ee(),createMcpToolRegistry:a=>Ce(a),resolveCardFileDownloadPayload:(a,b,E)=>ze(a,b,E),isLikelyTextMimeType:a=>At(a),sliceTextByLines:(a,b,E)=>xt(a,b,E)}).handleAgentfaceApi,Rr=co({apiBasePath:t,json:We,readJsonBody:a=>lt(a),initBoardAndSetup:()=>T(),createMcpWebhookToolRegistry:()=>je()}).handleWebhooksApi,pt=vr({apiBasePath:t,json:We,readJsonBody:a=>lt(a),initBoardAndSetup:()=>T(),bootstrapBoard:()=>C(),buildPublishedRuntimePayload:()=>Ke(),createMcpControlplaneToolRegistry:()=>Se(),retriggerCard:a=>h(a),applyCardAction:(a,b,E)=>De(a,b,E),resolveChatHandlerTarget:a=>fe(a),sendCardFileDownloadResponse:(a,b,E,$)=>dt(a,b,E,$)}).handleRuntimeApi,Mt=fo({apiBasePath:t,emitNotifications:a=>se(a),readJsonBody:a=>lt(a),json:(a,b,E)=>We(a,b,E)}).handleNotifyRoute;async function z(a,b,E){return !!(await bt(a,b,E)||await Rr(a,b,E)||await Gr(a,b,E)||await Mt(a,b,E)||await pt(a,b,E))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:z,emitNotification(a){if(a.kind==="notification-batch"){se(a.notifications);return}se([a]);},buildPublishedRuntimePayload:Ke,__drainProcessAccumulatedLane:K,handleChatAgentRequest:Je,clearChatRecords:q,reportSourceFetched(a,b){return It(a,{ref:b})},reportSourceFetchFailure(a,b){return jt(a,{reason:b})},get cardStore(){return d[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function ba(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...po,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,s=new Map,c="boards-config.json";function u(){let I=n.getText(c);if(!I)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(I)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function m(I){n.putText(c,JSON.stringify(I,null,2));}function p(I){let y=String(I||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return y.length>0&&y.length<=64?y:null}function R(I){if(s.has(I))return s.get(I);let d=u().boards.find(l=>l.id===I)||{},i=o(I,d);return s.set(I,i),i}function S(I,y,d){let i=JSON.stringify(d),l=typeof Buffer<"u"?Buffer.byteLength(i):new TextEncoder().encode(i).length;I.writeHead(y,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":l}),I.end(i);}async function A(I,y,d){let i=I.method||"GET",l=d.pathname;if(i==="GET"&&l===t)return S(y,200,{ok:true,boards:u().boards}),true;if(i==="POST"&&l===t){let g=[];for await(let J of I)g.push(J);let f=typeof Buffer<"u"?Buffer.concat(g).toString("utf-8").trim():new TextDecoder().decode(wr(g)).trim(),k={};try{k=f?JSON.parse(f):{};}catch{k={};}let v=p(k.id);if(!v)return S(y,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let O=u();if(O.boards.some(J=>J.id===v))return S(y,409,{error:`Board "${v}" is already registered`}),true;let M=typeof k.label=="string"&&k.label.trim()?k.label.trim():v,D={id:v,label:M};for(let[J,ee]of Object.entries(k))J==="id"||J==="label"||ee!=null&&(D[J]=ee);return O.boards.push(D),m(O),S(y,200,{ok:true,board:D}),true}return false}async function B(I,y,d){let l=d.pathname.match(new RegExp(`^${ot(t)}/([^/]+)(/|$)`));if(!l)return false;let g=p(decodeURIComponent(l[1]));return g?u().boards.some(v=>v.id===g)?!!await R(g).handleRuntimeApi(I,y,d):(S(y,404,{error:`Board "${g}" not registered. POST ${t} with {id} to register it first.`}),true):(S(y,400,{error:"Invalid board id"}),true)}async function x(I,y,d){return !!(await A(I,y,d)||await B(I,y,d))}function _(I){if(!u().boards.some(d=>d.id===I))throw Object.assign(new Error(`Board "${I}" not registered`),{statusCode:404});return {service:R(I)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:x,requireBoardService:_}}exports.createMultiBoardServerRuntime=ba;exports.createRoutesRuntimeApi=vr;exports.createSingleBoardServerRuntime=Ca;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
6
+ `);}catch{}},15e3);R.on("close",()=>{clearInterval(l),t.disconnect(w,b);});}return {handleChannelSubscription:m,handleSse:p}}function lo(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,boardContexts:c,publishPersistedStateSnapshot:u,upsertCardsFromSource:m,sseHub:p,queueSseHub:R}=e,{handleSse:b,handleChannelSubscription:w}=Jr(e),{handleSse:B}=Jr({...e,sseHub:R,buildPublishedRuntimePayload:async()=>null});async function x(_,I,y){let d=_.method||"GET",i=y,l=i.pathname;try{if(d==="GET"&&l===`${t}/sse`){let O=i.searchParams.has("one-shot");await o();let M=String(i.searchParams.get("clientId")||"").trim();if(!O&&!M)return r(I,400,{error:"clientId query param is required for SSE"}),!0;if(await b(_,I,M||void 0,{oneShot:O}),O)return !0;for(let D=0;D<c.length;D++)await u(c[D]),await m(c[D],D),await u(c[D]);return !0}if(d==="GET"&&l===`${t}/sse-q`){let O=String(i.searchParams.get("clientId")||"").trim();return O?(await B(_,I,O,{bootstrapPayload:!1}),!0):(r(I,400,{error:"clientId query param is required for SSE"}),!0)}let g=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(d==="POST"&&g){await s();let O=decodeURIComponent(g[1]),M=await n(_),D=typeof M?.clientId=="string"?M.clientId.trim():"";return D?await p.subscribeChat(D,O)?(r(I,200,{ok:!0,clientId:D,cardId:O,subscribed:!0}),!0):(r(I,404,{error:`SSE client not connected: ${D}`}),!0):(r(I,400,{error:"clientId is required"}),!0)}let f=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(d==="POST"&&f){await s();let O=decodeURIComponent(f[1]),M=await n(_),D=typeof M?.clientId=="string"?M.clientId.trim():"";return D?p.unsubscribeChat(D,O)?(r(I,200,{ok:!0,clientId:D,cardId:O,subscribed:!1}),!0):(r(I,404,{error:`SSE client not connected: ${D}`}),!0):(r(I,400,{error:"clientId is required"}),!0)}let C=l.match(new RegExp(`^${ot(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(d==="POST"&&C){await s();let O=decodeURIComponent(C[1]),M=C[2]==="subscribe",D=await n(_),J=typeof D?.clientId=="string"?D.clientId.trim():"";return J?(w(I,J,O,{},M),!0):(r(I,400,{error:"clientId is required"}),!0)}let v=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(d==="POST"&&v){await s();let O=decodeURIComponent(v[1]),M=decodeURIComponent(v[2]),D=v[3]==="subscribe",J=await n(_),te=typeof J?.clientId=="string"?J.clientId.trim():"";return te?(w(I,te,M,{cardId:O},D),!0):(r(I,400,{error:"clientId is required"}),!0)}return !1}catch(g){let f=g?.statusCode||500;return r(I,f,{error:String(g?.message||g)}),true}}return {handleWatchersRoutes:x,handleSse:b,handleChannelSubscription:w}}var Ra=3e4;function Ca(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function fo(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,s=`${t}/notify-q`;async function c(u,m,p){if(p.pathname!==s)return false;if((u.method??"").toUpperCase()!=="POST")return o(m,405,{status:"error",error:"Method not allowed"}),true;if(!Ca(u))return o(m,403,{status:"error",error:"Forbidden"}),true;let R;try{R=await n(u);}catch{return o(m,400,{status:"error",error:"Invalid JSON body"}),true}if(!R||typeof R!="object"||!Array.isArray(R.notifications))return o(m,400,{status:"error",error:"body.notifications must be an array"}),true;let b=R.notifications,{accepted:w,rejected:B}=Gn(b,Date.now(),Ra);return w.length>0&&r(w),o(m,200,{status:"success",data:{accepted:w.length,rejected:B}}),true}return {handleNotifyRoute:c}}var po={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},mo="chat-handler-flow-queue",Nt="__probe__echo__probe__";function ka(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...po,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},c=e.invocationAdapter,u=e.chatFlowRunner||null,m=e.notificationTransport||null,p=e.serverUrl||null,R=e.executionExtra||{},b=e.onSseClientConnected,w=e.onSseClientDisconnected,B=e.onChannelSubscribed,x=e.onChannelUnsubscribed,_=Mr({buildChatOneShotBatch:async(a,k)=>await ie.buildSseOneShotBatch({params:{cardId:a},body:{receiving:k}}),onSseClientDisconnected:w}),I=Mr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function y(a){function k(ee){return {...ee,queueStorageForRef(me,_e){return $n(ee.queueStorageForRef(me,_e),{lane:_e,emitNotification:Z})}}}function E(ee){return {...ee,queueStorageForRef(me,_e){return Dn(ee.queueStorageForRef(me,_e),{lane:_e,emitNotification:Z})}}}function $(ee){return {async get(me){return ee.get(me)},async set(me){return ee.set(me)},async del(me){return ee.del(me)},async patch(me){return ee.patch(me)},async appendFiles(me){return ee.appendFiles(me)}}}function H(ee){return {async get(me){return await ee.get(me)},async set(me){return await ee.set(me)},async del(me){return await ee.del(me)},async patch(me){return await ee.patch(me)},async appendFiles(me){return await ee.appendFiles(me)}}}let re=null;function Z(ee){if(ee.kind==="notification-batch"){U(ee.notifications,re??void 0);return}U([ee],re??void 0);}let ue=tt(a.boardAdapter)?E(a.boardAdapter):k(a.boardAdapter),Me=a.nonCoreAdapter??(!tt(ue)&&C(ue)?ue:null),Ae=tt(ue)?Mn(a.baseRef,ue,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:Z}):_n(a.baseRef,ue,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,scratchStoreRef:a.scratchStoreRef,taskExecutorRef:a.taskExecutorRef,chatHandlerFlow:a.chatHandlerFlow,emitNotification:Z}),$e=a.nonCore??(Me?En(a.baseRef,Me,{boardRuntimeStoreRef:a.boardRuntimeStoreRef,taskExecutorRef:a.taskExecutorRef}):null),Cr=ue.chatStorageForRef(a.chatStoreRef),kr,yo=tt(ue)?(()=>{let ee=mr(fr(lr(ue.kvStorageForRef(a.cardStoreRef)),ue.hashFn),s.warn),me=ur(ee,{emitNotification:Z}),_e=H(me);return kr={get(we){return _e.get(we)},set(we){return _e.set(we)}},_e})():(()=>{let ee=ue.kvStorageForRef(a.cardStoreRef),_e=sr(Ft({readIndex:()=>ee.read("_index"),writeIndex:we=>ee.write("_index",we),readCard:we=>ee.read(we),writeCard:(we,Sr)=>(ee.write(we,Sr),we),removeCard:we=>{ee.delete(we);},cardExists:we=>ee.read(we)!==null,defaultCardKey:we=>we},s.warn),{emitNotification:Z});return kr=_e,$(_e)})(),br;if(tt(ue)){let ee=ue.blobStorageForRef(a.artifactsStoreRef);br={async putBytes(me,_e){if(ee.writeBytes){await ee.writeBytes(me,_e);return}let we=JSON.stringify({__kind:"bytes-array",data:[..._e]});await ee.write(me,we);},async getBytes(me){if(ee.readBytes){let we=await ee.readBytes(me);if(we!==null)return we}let _e=await ee.read(me);if(_e===null)return null;try{let we=JSON.parse(_e);if(we&&we.__kind==="bytes-array"&&Array.isArray(we.data))return new Uint8Array(we.data)}catch{}return new TextEncoder().encode(_e)},async listKeys(me){return await ee.listKeys(me)}};}else {let ee=ue.blobStorageForRef(a.artifactsStoreRef),me=Kn(ee);br={putBytes(_e,we,Sr){me.putBytes(_e,we,Sr);},getBytes(_e){return me.getBytes(_e)},listKeys(_e){return me.list(_e).map(we=>we.key)}};}let ho={async init(ee){return Ae.init(ee)},async status(ee){return Ae.status(ee)},async getConfig(ee){return Ae.getConfig(ee)},async getAllOutputsDataObjects(ee){return Ae.getAllOutputsDataObjects(ee)},async getAllOutputsComputedValues(ee){return Ae.getAllOutputsComputedValues(ee)},async getOutputsFetchedSources(ee){return Ae.getOutputsFetchedSources(ee)},async buildSseOneShotPayload(ee){return Ae.buildSseOneShotPayload(ee)},async upsertCard(ee){return Ae.upsertCard(ee)},async removeCard(ee){return Ae.removeCard(ee)},async sourceDataFetched(ee){return Ae.sourceDataFetched(ee)},async sourceDataFetchFailure(ee){return Ae.sourceDataFetchFailure(ee)}};return re={label:a.label,board:Ae,nonCore:$e,publicCardStore:kr,boardOps:ho,cardStoreOps:yo,get filesArtifacts(){return br},get chatStorage(){return Cr},boardAdapter:ue,boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,artifactsStoreRef:a.artifactsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:zn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},re}let d=e.boards.map(y),i=new Map;function l(a){return i.get(a)??0}function g(a){return a.queueStoreRef}function f(a,k){if(tt(a.boardAdapter)){let $=a.boardAdapter.queueStorageForRef(g(a),k);return qr($)}let E=a.boardAdapter.queueStorageForRef(g(a),k);return jr(E)}function C(a){let k=a;return typeof k.invokeExecutor=="function"&&typeof k.validateSchema=="function"}function v(a){let k=d[l(a)];return {files:k?k.filesArtifacts:null}}function O(){return Hn()}function M(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function D(a){return "cardId"in a&&typeof a.cardId=="string"?j(a.cardId)??void 0:d[0]??void 0}function J(a){for(let k of a){let E=D(k);if(E)return E}return d[0]??void 0}function te(a,k={}){if(!a||a.length===0)return;let E=qe(a),$={kind:"notification-batch",notifications:E},H=k.ctx??J(E);if(k.appendState!==false&&H&&Yn(H.notification,$),k.broadcastSse!==false){let re=E.filter(ue=>ue.kind==="message_enqueued"),Z=E.filter(ue=>ue.kind!=="message_enqueued");Z.length>0&&_.broadcastNotificationBatch(Z),re.length>0&&I.broadcastNotificationBatch(re);}if(!(k.mirrorExternal===false||!H?.boardAdapter.publishBoardChangeNotifications))try{let re=E.filter(Z=>Z.category==="board-output"||Z.category==="card-store");re.length>0&&H.boardAdapter.publishBoardChangeNotifications(re);}catch{}}function U(a,k){te(a,{ctx:k,appendState:true,broadcastSse:true,mirrorExternal:true});}async function se(a){if(!a||a.notificationTeardown||!m||!a.notifyRef)return;let k=await m.subscribe(a.notifyRef,E=>{let $=Qn(E);te($,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});});a.notificationTeardown=k;}async function de(a){if(!a||a.initialized)return;let k={boardRuntimeStoreRef:a.boardRuntimeStoreRef,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,fetchedSourcesStoreRef:a.fetchedSourcesStoreRef,artifactsStoreRef:a.artifactsStoreRef,queueStoreRef:a.queueStoreRef,chatStoreRef:a.chatStoreRef,scratchStoreRef:a.scratchStoreRef},E={};a.taskExecutorRef&&(E["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=a.chatHandlerFlow);let $=await a.boardOps.init({params:k,body:E});if($.status!=="success")throw Object.assign(new Error($.error||`init failed for ${a.label}`),{statusCode:500});if(await se(a),!a.chatHandlerFlow&&a.chatHandlerRef&&c.describe)try{let H=await c.describe(a.chatHandlerRef);H&&H.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${H.kind}", expected "chat-handler" for ${a.label}`):H&&s.info(`[init] chat-handler validated: ${H.name} (protocol ${H.protocolVersion}) for ${a.label}`);}catch(H){s.warn(`[init] chat-handler describe failed for ${a.label}: ${H?.message||String(H)}`);}a.initialized=true;}async function G(a){let k=[],E=await a.boardOps.status({});E.status==="success"&&E.data!=null&&Lr(E.data)&&k.push({kind:"status",status:E.data});let $=await a.boardOps.getAllOutputsDataObjects({});if($.status==="success"&&$.data!=null)for(let[re,Z]of Object.entries($.data))re&&k.push({kind:"data_object",key:re,payload:Z});let H=await a.boardOps.getAllOutputsComputedValues({});if(H.status==="success"&&H.data!=null)for(let[re,Z]of Object.entries(H.data))re&&Z&&typeof Z=="object"&&!Array.isArray(Z)&&k.push({kind:"computed_values",cardId:re,values:Z});k.length>0&&te(k,{ctx:a,appendState:true,broadcastSse:true,mirrorExternal:false});}async function Y(a,k){if(!a||a.cardsBootstrapped)return;let E=await a.cardStoreOps.get({}),$=E.status==="success"&&Array.isArray(E.data?.cards)?E.data.cards:[];for(let H of $)typeof H.id=="string"&&(i.set(H.id,k),await a.boardOps.upsertCard({params:{cardId:H.id}}));a.cardsBootstrapped=true;}async function T(){for(let a of d)await de(a);}async function S(){await T();for(let a=0;a<d.length;a++)await G(d[a]),await Y(d[a],a),await G(d[a]);}async function Q(a=false){a||await T();for(let k of d){let E=await k.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}function j(a){return d[l(a)]??null}async function A(a){let k=j(a);if(!k)return null;let E=await k.cardStoreOps.get({params:{id:a}});if(E.status!=="success")return null;let $=Array.isArray(E.data?.cards)?E.data.cards:[];return $.length>0?$[0]:null}async function P(){let a=async E=>{if(!E)return [];let $=await E.cardStoreOps.get({});return $.status!=="success"||!Array.isArray($.data?.cards)?[]:$.data.cards},k=[];for(let E of d)k.push(...await a(E));return k}function F(){return d[0]??null}function N(a){return j(a)??F()}function V(a){let k=N(a);if(!k)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${a}`),{statusCode:404});return k.chatStorage}async function z(a){return await V(a).isProcessing(a)}async function oe(a,k){let E=await ie.setProcessing({params:{cardId:a},body:{active:k}});if(E.status!=="success")throw Object.assign(new Error(E.error||`Failed to set chat processing for card: ${a}`),{statusCode:500})}let ie=Jn({append(a,k,E,$,H){return V(a).append(a,k,E,$,H)},readAll(a){return V(a).readAll(a)},readAfter(a,k){return V(a).readAfter(a,k)},clear(a){return V(a).clear(a)},setProcessing(a,k){return V(a).setProcessing(a,k)},isProcessing(a){return V(a).isProcessing(a)},getConfig(a){return V(a).getConfig(a)},setConfig(a,k){return V(a).setConfig(a,k)}},{emitNotification(a){if(a.kind==="notification-batch"){U(a.notifications);return}U([a]);}}),Pe=io({boardContexts:d,cardOwnerIndex:i,cardContextForCard:a=>j(a),readStatusSnapshot:()=>Le(),readDataObjectsByToken:()=>Ze(),readCardRuntimeArtifacts:()=>pe(),readCardFromStore:a=>A(a),readCardDefinitions:()=>P(),processAccumulatedLaneInternal:a=>Q(a),reportSourceFetched:(a,k)=>It(a,{ref:k}),reportSourceFetchFailure:(a,k)=>jt(a,{reason:k}),uploadCardFile:(a,k,E,$,H)=>he(a,k,E,$,H),chatStorePublic:ie,serverUrl:p,apiBasePath:t}),Be=Pe.mcpCardStoreFacade,Ee=Pe.createMcpFacade,ye=Xn({boardId:o,bootstrapBoard:()=>S(),sseHub:_,onChannelSubscribed:B,onChannelUnsubscribed:x,getMcpFacade:()=>Ee(),getMcpCardStoreFacade:()=>Be()});function Ce(a){return to(a)}function je(){return ro(Ee())}function Se(){return no({boardId:o,uploadCardFile:he,getMcpFacade:()=>Ee(),controlplane:ye})}let Fe=Zn({boardId:o,boardContexts:d,readChatRecords:a=>ae(a),getChatProcessing:a=>z(a)}),Le=Fe.readStatusSnapshot,pe=Fe.readCardRuntimeArtifacts,Ze=Fe.readDataObjectsByToken,Ke=Fe.buildPublishedRuntimePayload;async function Ve(a,k,E){let $=E?.syncBoard!==false,H=E?.restartOnlyIfChanged===true,re=j(a);if(!re)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let Z=await A(a);if(!Z)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let ue=H?JSON.stringify(Z):null,Me=k(Z)||Z;if(H&&JSON.stringify(Me)===ue)return;let Ae=await re.cardStoreOps.set({body:Me});if(Ae.status!=="success")throw Object.assign(new Error(Ae.error||`Failed to persist card: ${a}`),{statusCode:500});if($){let $e=await re.boardOps.upsertCard({params:{cardId:a,restart:true}});if($e.status!=="success")throw Object.assign(new Error($e.error||`Failed to upsert card: ${a}`),{statusCode:500})}}async function et(a,k){await Ve(a,k,{syncBoard:true});}async function L(a,k){await Ve(a,k,{syncBoard:false});}async function h(a){let k=j(a);if(!k)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});if(!await A(a))throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let $=await k.boardOps.upsertCard({params:{cardId:a,restart:true}});if($.status!=="success")throw Object.assign(new Error($.error||`Failed to retrigger card: ${a}`),{statusCode:500})}async function q(a){let k=await ie.clear({params:{cardId:a}});if(k.status!=="success")throw Object.assign(new Error(k.error||`Failed to clear chat records for card: ${a}`),{statusCode:500});try{await oe(a,!1);}catch{}}async function K(a,k,E,$,H=""){let re=typeof E=="string"?E.trim():"",Z=await ie.append({params:{cardId:a},body:{role:k||"system",text:re,files:$,turn:H}});if(Z.status!=="success")throw Object.assign(new Error(Z.error||`Failed to append chat record for card: ${a}`),{statusCode:500});return String(Z.data?.id||"")}async function ae(a){return await V(a).readAll(a)}let he=eo({safeCardId:a=>M(a),artifactsStores:a=>v(a),cardFileMetadataStore:()=>O(),readCardFromStore:a=>A(a),updateCardLocalOnly:(a,k)=>L(a,k),writeChatRecord:(a,k,E,$,H)=>K(a,k,E,$,H)}).uploadCardFile;async function fe(a){let k=j(a);if(!k)return null;let E=await k.boardOps.getConfig({params:{key:"chat-handler-flow"}}),H=(E.status==="success"?E.data?.value:null)??k.chatHandlerFlow??null,re=k.chatHandlerRef;return H==null&&(!re||typeof re!="object")?null:{ctx:k,handlerFlow:H,handlerRef:re}}function ke(a){let k=typeof a=="string"?a.trim():"";if(k.length<Nt.length*2||!k.startsWith(Nt)||!k.endsWith(Nt))return null;let E=k.slice(Nt.length,k.length-Nt.length).trim(),$=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(E);return $?{assistant:$[1].trim().toLowerCase(),text:$[2].trim()}:{assistant:"echo",text:E}}async function Te(a,k,E=false,$="",H=""){try{let re=await fe(a);if(!re){try{await oe(a,!1);}catch{}return}let{ctx:Z,handlerFlow:ue,handlerRef:Me}=re;if(!E)try{await oe(a,!0);}catch{}let Ae={boardId:o,cardId:String(a),lastChatEntryId:k,...$?{turnId:$}:{},...typeof H=="string"&&H.trim()?{probe:H.trim()}:{},...R,...p?{serverUrl:p}:{}},$e=ue!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:mo}}:Me;tt(Z.boardAdapter)?await f(Z,"chat-agent").enqueueRequest({boardId:o,ref:$e,args:ue!=null?{...Ae,__chatHandlerFlow:ue}:Ae}):f(Z,"chat-agent").enqueueRequest({boardId:o,ref:$e,args:ue!=null?{...Ae,__chatHandlerFlow:ue}:Ae}),await Promise.resolve(Z.boardAdapter.requestProcessAccumulated?.());}catch(re){try{await oe(a,!1);}catch{}s.warn(`[chat-handler] queue failed for card "${a}": ${re instanceof Error?re.message:String(re)}`);}}async function He(a,k,E){if(k.howToRun==="built-in"&&zr(k)===mo){let $=u,H=E.__chatHandlerFlow,re={...E};return delete re.__chatHandlerFlow,$?$.run(H,re,{boardId:o,cardId:String(re.cardId||""),label:a.label,logger:s,serverUrl:p,executionExtra:R}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return c.invoke(k,E)}async function Je(a,k=false){k||await T();let E=typeof a.args?.cardId=="string"?a.args.cardId:"",$=E?j(E):F();if(!$)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let H=await He($,a.ref,a.args);if(!H.dispatched){if(E)try{await oe(E,!1);}catch{}throw new Error(H.error||`chat-agent dispatch failed for card "${E||"unknown"}"`)}}async function De(a,k,E){if(k==="chat-send"){let H=E&&typeof E["turn-id"]=="string"?E["turn-id"]:E&&typeof E.turnId=="string"?E.turnId:E&&typeof E.turn=="string"?E.turn:"";if(E&&"files"in E&&E.files!==void 0&&E.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let re=Se(),Z=ke(E?.text),ue=Z?Z.text:E?.text,Me=await mt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:a,role:"user",text:ue,turn_id:H,files:[]},re);if(Me?.status!=="success")throw new Error(rt(Me,`chat-send append failed for card ${a}`));let Ae=Me?.data?.id;if(typeof Ae!="string"||!Ae)throw new Error(`chat-send did not return an append id for card ${a}`);let $e=await mt("setstate.chat-processing-started",{board_id:o,card_id:a},re);if($e?.status!=="success")throw new Error(rt($e,`chat-send processing update failed for card ${a}`));Te(a,Ae,true,H,Z?.assistant||"");return}await et(a,H=>{let re=new Date().toISOString(),Z=H.card_data&&typeof H.card_data=="object"?H.card_data:{};if(H.card_data=Z,k==="file-upload"){let ue=O().normalizeIncoming(E?.files,re);return ue.length>0&&O().merge(Z,ue),H}if(k==="action"){let ue=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!ue)return H;Z.lastAction={buttonId:ue,at:re},Z.lastActionText=`${ue} @ ${re}`;}return H});}function We(a,k,E){let $=JSON.stringify(E),H=typeof Buffer<"u"?Buffer.byteLength($):new TextEncoder().encode($).length;a.writeHead(k,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":H}),a.end($);}async function ze(a,k,E){let $=await A(a);if(!$)throw Object.assign(new Error("Card not found"),{statusCode:404});let H=O().resolve($.card_data,k,E);if(!H.ok&&H.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!H.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let re=H.file,Z=M(a),ue=v(a),Me=String(re.stored_name||""),Ae=`${Z}/${Me}`,$e=ue.files?await ue.files.getBytes(Ae):null;if(!$e)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:re,bytes:$e}}async function dt(a,k,E,$){let{fileRecord:H,bytes:re}=await ze(k,E,$),Z=String(H.name||H.stored_name||"download.bin"),ue=String(H.mime_type||"application/octet-stream");a.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${Z}"`,"Content-Length":re.length}),a.end(re);}function At(a){let k=String(a||"").toLowerCase();return k.startsWith("text/")||k.includes("json")||k.includes("xml")||k.includes("javascript")||k.includes("typescript")||k.includes("yaml")||k.includes("csv")}function xt(a,k,E){let $=a.split(/\r?\n/);return (k==="head"?$.slice(0,E):$.slice(-E)).join(`
7
+ `)}async function lt(a){let k=[];for await(let $ of a)k.push($);let E=typeof Buffer<"u"?Buffer.concat(k).toString("utf-8").trim():new TextDecoder().decode(wr(k)).trim();return E?JSON.parse(E):{}}async function It(a,k){let E=typeof k.ref=="string"?k.ref.trim():"";if(!E)return {status:"fail",error:"board-worker success callback requires body.ref"};let $=d[0];return $?$.boardOps.sourceDataFetched({params:{token:a,ref:E}}):{status:"fail",error:"no board context"}}async function jt(a,k){let E=typeof k.reason=="string"&&k.reason.trim()?k.reason:"unknown",$=d[0];return $?$.boardOps.sourceDataFetchFailure({params:{token:a,reason:E}}):{status:"fail",error:"no board context"}}let Qr=lo({sseHub:_,queueSseHub:I,corsHeaders:r,json:We,buildPublishedRuntimePayload:()=>Ke(),onSseClientConnected:b,onChannelSubscribed:B,onChannelUnsubscribed:x,apiBasePath:t,readJsonBody:a=>lt(a),initBoardAndSetup:()=>T(),bootstrapBoard:()=>S(),boardContexts:d,publishPersistedStateSnapshot:a=>G(a),upsertCardsFromSource:(a,k)=>Y(a,k)}).handleWatchersRoutes,bt=uo({apiBasePath:t,json:We,readJsonBody:a=>lt(a),bootstrapBoard:()=>S(),createMcpFacade:()=>Ee(),createMcpToolRegistry:a=>Ce(a),resolveCardFileDownloadPayload:(a,k,E)=>ze(a,k,E),isLikelyTextMimeType:a=>At(a),sliceTextByLines:(a,k,E)=>xt(a,k,E)}).handleAgentfaceApi,Rr=co({apiBasePath:t,json:We,readJsonBody:a=>lt(a),initBoardAndSetup:()=>T(),createMcpWebhookToolRegistry:()=>je()}).handleWebhooksApi,pt=vr({apiBasePath:t,json:We,readJsonBody:a=>lt(a),initBoardAndSetup:()=>T(),bootstrapBoard:()=>S(),buildPublishedRuntimePayload:()=>Ke(),createMcpControlplaneToolRegistry:()=>Se(),retriggerCard:a=>h(a),applyCardAction:(a,k,E)=>De(a,k,E),resolveChatHandlerTarget:a=>fe(a),sendCardFileDownloadResponse:(a,k,E,$)=>dt(a,k,E,$)}).handleRuntimeApi,Mt=fo({apiBasePath:t,emitNotifications:a=>U(a),readJsonBody:a=>lt(a),json:(a,k,E)=>We(a,k,E)}).handleNotifyRoute;async function X(a,k,E){return !!(await bt(a,k,E)||await Rr(a,k,E)||await Qr(a,k,E)||await Mt(a,k,E)||await pt(a,k,E))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:X,emitNotification(a){if(a.kind==="notification-batch"){U(a.notifications);return}U([a]);},buildPublishedRuntimePayload:Ke,__drainProcessAccumulatedLane:Q,handleChatAgentRequest:Je,clearChatRecords:q,reportSourceFetched(a,k){return It(a,{ref:k})},reportSourceFetchFailure(a,k){return jt(a,{reason:k})},get cardStore(){return d[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function ba(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...po,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,s=new Map,c="boards-config.json";function u(){let I=n.getText(c);if(!I)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(I)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function m(I){n.putText(c,JSON.stringify(I,null,2));}function p(I){let y=String(I||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return y.length>0&&y.length<=64?y:null}function R(I){if(s.has(I))return s.get(I);let d=u().boards.find(l=>l.id===I)||{},i=o(I,d);return s.set(I,i),i}function b(I,y,d){let i=JSON.stringify(d),l=typeof Buffer<"u"?Buffer.byteLength(i):new TextEncoder().encode(i).length;I.writeHead(y,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":l}),I.end(i);}async function w(I,y,d){let i=I.method||"GET",l=d.pathname;if(i==="GET"&&l===t)return b(y,200,{ok:true,boards:u().boards}),true;if(i==="POST"&&l===t){let g=[];for await(let J of I)g.push(J);let f=typeof Buffer<"u"?Buffer.concat(g).toString("utf-8").trim():new TextDecoder().decode(wr(g)).trim(),C={};try{C=f?JSON.parse(f):{};}catch{C={};}let v=p(C.id);if(!v)return b(y,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let O=u();if(O.boards.some(J=>J.id===v))return b(y,409,{error:`Board "${v}" is already registered`}),true;let M=typeof C.label=="string"&&C.label.trim()?C.label.trim():v,D={id:v,label:M};for(let[J,te]of Object.entries(C))J==="id"||J==="label"||te!=null&&(D[J]=te);return O.boards.push(D),m(O),b(y,200,{ok:true,board:D}),true}return false}async function B(I,y,d){let l=d.pathname.match(new RegExp(`^${ot(t)}/([^/]+)(/|$)`));if(!l)return false;let g=p(decodeURIComponent(l[1]));return g?u().boards.some(v=>v.id===g)?!!await R(g).handleRuntimeApi(I,y,d):(b(y,404,{error:`Board "${g}" not registered. POST ${t} with {id} to register it first.`}),true):(b(y,400,{error:"Invalid board id"}),true)}async function x(I,y,d){return !!(await w(I,y,d)||await B(I,y,d))}function _(I){if(!u().boards.some(d=>d.id===I))throw Object.assign(new Error(`Board "${I}" not registered`),{statusCode:404});return {service:R(I)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:x,requireBoardService:_}}exports.createMultiBoardServerRuntime=ba;exports.createRoutesRuntimeApi=vr;exports.createSingleBoardServerRuntime=ka;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
8
8
  //# sourceMappingURL=server-runtime-controlface.js.map