yaml-flow 8.11.2 → 8.11.4

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 (71) hide show
  1. package/browser/adapters/firestore-storage.js +2 -2
  2. package/browser/adapters/localstorage-storage.js +3 -3
  3. package/browser/asset-integrity.json +5 -5
  4. package/browser/server-runtime-controlface.js +5 -5
  5. package/examples/board/test/server-http-test-browser.ts +9 -1
  6. package/examples/board/test/server-http-test.js +15 -19
  7. package/lib/board-live-cards-node.cjs +2 -2
  8. package/lib/board-live-cards-node.d.cts +2 -2
  9. package/lib/board-live-cards-node.d.ts +2 -2
  10. package/lib/board-live-cards-node.js +2 -2
  11. package/lib/board-live-cards-public.cjs +1 -1
  12. package/lib/board-live-cards-public.js +1 -1
  13. package/lib/board-live-cards-server-runtime.cjs +1 -1
  14. package/lib/board-live-cards-server-runtime.d.cts +1 -1
  15. package/lib/board-live-cards-server-runtime.d.ts +1 -1
  16. package/lib/board-live-cards-server-runtime.js +1 -1
  17. package/lib/board-livegraph-runtime/index.cjs +1 -1
  18. package/lib/board-livegraph-runtime/index.d.cts +1 -0
  19. package/lib/board-livegraph-runtime/index.d.ts +1 -0
  20. package/lib/board-livegraph-runtime/index.js +1 -1
  21. package/lib/chunk-37JSBRZO.js +2 -0
  22. package/lib/{chunk-ZCU5O2LR.js → chunk-4BEQXKRF.js} +2 -2
  23. package/lib/chunk-5VTIOM2U.js +3 -0
  24. package/lib/chunk-BAG7MHZP.cjs +3 -0
  25. package/lib/chunk-EZOXABJ2.js +3 -0
  26. package/lib/chunk-HVLWVMG6.cjs +3 -0
  27. package/lib/chunk-LRO5AL75.cjs +2 -0
  28. package/lib/chunk-MQAVZUXB.cjs +3 -0
  29. package/lib/chunk-WHKT5HN4.js +3 -0
  30. package/lib/{chunk-FFHG3CFU.cjs → chunk-Z26U6RSG.cjs} +2 -2
  31. package/lib/cloud-storage.cjs +1 -1
  32. package/lib/cloud-storage.js +1 -1
  33. package/lib/firestore-storage/index.cjs +1 -1
  34. package/lib/firestore-storage/index.js +1 -1
  35. package/lib/index.cjs +2 -2
  36. package/lib/index.js +1 -1
  37. package/lib/localstorage-storage/index.cjs +1 -1
  38. package/lib/localstorage-storage/index.js +1 -1
  39. package/lib/server-jobs-queue-runner/index.d.cts +1 -1
  40. package/lib/server-jobs-queue-runner/index.d.ts +1 -1
  41. package/lib/server-runtime/index.cjs +1 -1
  42. package/lib/server-runtime/index.d.cts +2 -2
  43. package/lib/server-runtime/index.d.ts +2 -2
  44. package/lib/server-runtime/index.js +1 -1
  45. package/lib/server-runtime-agentface/index.d.cts +1 -1
  46. package/lib/server-runtime-agentface/index.d.ts +1 -1
  47. package/lib/server-runtime-controlface/index.cjs +1 -1
  48. package/lib/server-runtime-controlface/index.d.cts +1 -1
  49. package/lib/server-runtime-controlface/index.d.ts +1 -1
  50. package/lib/server-runtime-controlface/index.js +1 -1
  51. package/lib/server-runtime-core/index.cjs +1 -1
  52. package/lib/server-runtime-core/index.d.cts +7 -4
  53. package/lib/server-runtime-core/index.d.ts +7 -4
  54. package/lib/server-runtime-core/index.js +1 -1
  55. package/lib/server-runtime-watchers/index.d.cts +3 -3
  56. package/lib/server-runtime-watchers/index.d.ts +3 -3
  57. package/lib/server-runtime-webhooks/index.d.cts +1 -1
  58. package/lib/server-runtime-webhooks/index.d.ts +1 -1
  59. package/lib/{sse-hub-D_94fV87.d.ts → sse-hub-D_QHswxL.d.ts} +1 -1
  60. package/lib/{sse-hub-BRBvymHR.d.cts → sse-hub-XO6crN9o.d.cts} +1 -1
  61. package/lib/{types-BsqzUZNl.d.ts → types-B8Yieskx.d.ts} +2 -0
  62. package/lib/{types-DxhB6Toz.d.cts → types-gTf9pAyC.d.cts} +2 -0
  63. package/package.json +1 -1
  64. package/lib/chunk-42ZOYXEV.cjs +0 -3
  65. package/lib/chunk-AHW6EMUO.js +0 -3
  66. package/lib/chunk-CZ6ZFWFT.js +0 -2
  67. package/lib/chunk-EYBDAEVO.cjs +0 -3
  68. package/lib/chunk-HFI2NAZJ.js +0 -3
  69. package/lib/chunk-LDVJPFIW.js +0 -3
  70. package/lib/chunk-NMOUBZXX.cjs +0 -2
  71. package/lib/chunk-ZOZ7ZDGA.cjs +0 -3
@@ -1,8 +1,8 @@
1
- var ServerRuntimeControlface=(function(exports){'use strict';var Co=Object.defineProperty;var bo=(e,t,r)=>t in e?Co(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Wr=(e,t,r)=>bo(e,t+"",r);var Kt="b64:";function So(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let a of t)o+=String.fromCharCode(a);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function wo(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let a=0;a<n.length;a+=1)o[a]=n.charCodeAt(a);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Se(e){return `${Kt}${So(JSON.stringify(e))}`}function st(e){if(!e.startsWith(Kt))throw new Error(`Invalid ref format (expected ${Kt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(wo(e.slice(Kt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function zr(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function Ze(e){return typeof e.journalStorage=="function"}function Yr(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?st(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function ot(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Sr(e){let t=e.reduce((o,a)=>o+a.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}function ce(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function it(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function ut(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function ft(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Ht(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let a=Number(o);if(Number.isFinite(a))return a}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Xr(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function mt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o,d=a.status;if(d==="success")return Object.prototype.hasOwnProperty.call(a,"data")?o:{status:"success",data:{}};if(d==="fail"||d==="error")return o}return {status:"success",data:o}}function et(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let a=n.data;if(a&&typeof a=="object"&&!Array.isArray(a)){let d=a.issues;if(Array.isArray(d)){let p=d.find(y=>typeof y=="string"&&y.trim());if(typeof p=="string")return `Validation failed: ${p}`}let u=a.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function wr(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpControlplaneToolRegistry:a,retriggerCard:d,applyCardAction:u,resolveChatHandlerTarget:p,sendCardFileDownloadResponse:y}=e;async function C(v,S,B){let T=v.method||"GET",_=B,x=_.pathname;try{if(T==="POST"&&x===`${t}/mcp-actions`){await o();let l=Date.now(),m=new Date(l).toISOString(),g=await n(v),k=typeof g.tool=="string"?g.tool.trim():"",I=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!k)return r(S,400,{error:"tool is required"}),!0;let q=ce(I,"card_id");if(!q)return r(S,400,{error:"MCP action requires card_id"}),!0;if(k==="retrigger-card"||k==="retrigger"){await d(q);let J=Date.now();return r(S,200,{status:"success",data:{ok:!0,cardId:q,actionType:k,requestReceivedAt:m,requestReceivedAtMs:l,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:200}}),!0}let L=ut(I,"payload");if(k==="chat-send"&&!await p(q)){let J=Date.now();return r(S,409,{error:`chat handler is not configured for card: ${q}`,requestReceivedAt:m,requestReceivedAtMs:l,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:409}),!0}if(k==="chat-send"){let J=typeof L["turn-id"]=="string"?L["turn-id"]:typeof L.turnId=="string"?L.turnId:typeof L.turn=="string"?L.turn:"";if(!J||!String(J).trim()){let X=Date.now();return r(S,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${q}`,requestReceivedAt:m,requestReceivedAtMs:l,responseSentAt:new Date(X).toISOString(),responseSentAtMs:X,responseStatus:400}),!0}}await u(q,k,L);let V=Date.now();return r(S,200,{status:"success",data:{ok:!0,cardId:q,actionType:k,requestReceivedAt:m,requestReceivedAtMs:l,responseSentAt:new Date(V).toISOString(),responseSentAtMs:V,responseStatus:200}}),!0}if(T==="POST"&&x===`${t}/mcp-controlplane`){await o();let l=await n(v),m=typeof l.tool=="string"?l.tool.trim():"",g=l.args&&typeof l.args=="object"&&!Array.isArray(l.args)?l.args:{};if(!m)return r(S,400,{error:"tool is required"}),!0;try{let k=await mt(m,g,a());if(k&&typeof k=="object"&&!Array.isArray(k)){let I=k;if(I.status==="fail")return r(S,400,{error:et(k,"Request failed")}),!0;if(I.status==="error")return r(S,500,{error:et(k,"Internal error")}),!0}r(S,200,k);}catch(k){let I=typeof k?.statusCode=="number"?Number(k.statusCode):500,q=k instanceof Error?k.message:String(k);r(S,I,{error:q});}return !0}let h=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/retrigger$`));if(T==="POST"&&h){await o();let l=decodeURIComponent(h[1]);return await d(l),r(S,200,{ok:!0}),!0}let f=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/actions$`));if(T==="POST"&&f){await o();let l=decodeURIComponent(f[1]),m=Date.now(),g=new Date(m).toISOString(),k=await n(v),I=k?.actionType;if(I==="chat-send"&&!await p(l)){let L=Date.now();return r(S,409,{error:`chat handler is not configured for card: ${l}`,requestReceivedAt:g,requestReceivedAtMs:m,responseSentAt:new Date(L).toISOString(),responseSentAtMs:L,responseStatus:409}),!0}if(I==="chat-send"){let L=k?.payload??{},V=typeof L["turn-id"]=="string"?L["turn-id"]:typeof L.turnId=="string"?L.turnId:typeof L.turn=="string"?L.turn:"";if(!V||!String(V).trim()){let J=Date.now();return r(S,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${l}`,requestReceivedAt:g,requestReceivedAtMs:m,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:400}),!0}}await u(l,I,k?.payload);let q=Date.now();return r(S,200,{ok:!0,requestReceivedAt:g,requestReceivedAtMs:m,responseSentAt:new Date(q).toISOString(),responseSentAtMs:q,responseStatus:200}),!0}let s=x.match(new RegExp(`^${ot(t)}/cards/([^/]+)/files/(\\d+)$`));if(T==="GET"&&s){let l=decodeURIComponent(s[1]),m=parseInt(s[2],10),g=_.searchParams.get("sn");return await y(S,l,m,g),!0}return !1}catch(h){let f=h?.statusCode||500;return r(S,f,{error:String(h?.message||h)}),true}}return {handleRuntimeApi:C}}function Jt(e,t){if(!e||typeof e!="object")throw new Error(`${t}: adapter.callbackTransport is required`);if(typeof e.createCallback!="function")throw new Error(`${t}: adapter.callbackTransport.createCallback is required`)}function vo(e){switch(e){case "computed_values":case "data_object":case "status":return "board-output";case "card_refreshed":case "card_removed":return "card-store";case "card_chats":case "chat_messages":return "chat-store";case "chat_processing":case "card_watchparty":return "hosted-runtime";case "message_enqueued":return "queue-storage"}}function Ao(e){return e.category?e:{...e,category:vo(e.kind)}}function Fe(e){return e.map(t=>Ao(t))}function qe(e){return {...e,category:e.category??"batch",notifications:Fe(e.notifications)}}var yt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function We(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function ht(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Zr(e){return e.tasks??{}}function vr(e){return e?e.status===yt.FAILED||e.status===yt.INACTIVATED:false}function en(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function tn(e){return e.maxExecutions}function rn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===yt.COMPLETED){let a=e.tasks[n];a&&We(a).forEach(u=>r.add(u));}return Array.from(r)}function nn(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;We(o).forEach(d=>{r[d]||(r[d]=[]),r[d].push(n);});}),r}function on(e,t,r){let n=e.tasks[t]??Qt(),o={};if(r){let d=r.tasks[t],u=ht(d);for(let p of u)for(let[y,C]of Object.entries(r.tasks))if(We(C).includes(p)){let v=e.tasks[y];v?.lastDataHash&&(o[p]=v.lastDataHash);break}}let a={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:a},lastUpdated:new Date().toISOString()}}function an(e,t,r,n,o,a){let d=e.tasks[r]??Qt(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let p;n&&u.on&&u.on[n]?p=u.on[n]:p=We(u);let y=d.startConsumedHashes?{...d.startConsumedHashes}:{...d.lastConsumedHashes};if(!d.startConsumedHashes){let S=u.requires??[];for(let B of S)for(let[T,_]of Object.entries(t.tasks))if(We(_).includes(B)){let x=e.tasks[T];x?.lastDataHash&&(y[B]=x.lastDataHash);break}}let C={...d,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:d.executionCount+1,lastEpoch:d.executionCount+1,lastDataHash:o,data:a,lastConsumedHashes:y,error:void 0},v=[...new Set([...e.availableOutputs,...p])];return {...e,tasks:{...e.tasks,[r]:C},availableOutputs:v,lastUpdated:new Date().toISOString()}}function sn(e,t,r,n){let o=e.tasks[r]??Qt(),a=t.tasks[r];if(a?.retry){let p=o.retryCount+1;if(p<=a.retry.max_attempts){let y={...o,status:"not-started",retryCount:p,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:y},lastUpdated:new Date().toISOString()}}}let d={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},u=e.availableOutputs;if(a?.on_failure&&a.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&d.executionCount>=a.circuit_breaker.max_executions){let p=a.circuit_breaker.on_break;u=[...new Set([...u,...p])];}return {...e,tasks:{...e.tasks,[r]:d},availableOutputs:u,lastUpdated:new Date().toISOString()}}function un(e,t,r,n){let o=e.tasks[t]??Qt(),a={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:a},lastUpdated:new Date().toISOString()}}function cn(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Qt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function xt(e,t){let r=`live-${Date.now()}`,n={};for(let a of Object.keys(e.tasks))n[a]=ln();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function xo(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:on(n,t.taskName,r)};case "task-completed":return {config:r,state:an(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:sn(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:un(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:cn(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Oo(n,t.action)};case "task-upsert":return Io(e,t.taskName,t.taskConfig);case "task-removal":return Po(e,t.taskName);case "node-requires-add":return To(e,t.nodeName,t.tokens);case "node-requires-remove":return _o(e,t.nodeName,t.tokens);case "node-provides-add":return Eo(e,t.nodeName,t.tokens);case "node-provides-remove":return Bo(e,t.nodeName,t.tokens);default:return e}}function dn(e,t){return t.reduce((r,n)=>xo(r,n),e)}function Io(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:ln()},lastUpdated:new Date().toISOString()}}}function Po(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...a}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:a,lastUpdated:new Date().toISOString()}}}function To(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ht(n),a=r.filter(d=>!o.includes(d));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...a]}}},state:e.state}}function _o(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=ht(n),a=o.filter(d=>!r.includes(d));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:a}}},state:e.state}}function Eo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=We(n),a=r.filter(d=>!o.includes(d));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...a]}}},state:e.state}}function Bo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=We(n),a=o.filter(d=>!r.includes(d));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:a}}},state:e.state}}function Rt(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function kt(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function ln(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Oo(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function Bt(e){let{config:t,state:r}=e,n=Zr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=Fo(n),d=rn(t,r.tasks),u=new Set([...d,...r.availableOutputs]),p=[],y=[],C=[],v=[];for(let[B,T]of Object.entries(n)){let _=r.tasks[B],x=en(T,t.settings),h=x!=="once";if(_?.status===yt.RUNNING||vr(_))continue;let f=tn(T);if(f!==void 0&&_&&_.executionCount>=f||T.circuit_breaker&&_&&_.executionCount>=T.circuit_breaker.max_executions||!h&&_?.status===yt.COMPLETED)continue;if(h&&_?.status===yt.COMPLETED){let k=ht(T),I=false;switch(x){case "data-changed":{k.length>0&&k.some(L=>{for(let[V,J]of Object.entries(n))if(We(J).includes(L)){let X=r.tasks[V];if(!X)continue;let H=_.lastConsumedHashes?.[L];return X.lastDataHash==null?X.executionCount>_.lastEpoch:X.lastDataHash!==H}return false})||(I=true);break}case "epoch-changed":{k.length>0&&k.some(L=>{for(let[V,J]of Object.entries(n))if(We(J).includes(L)){let X=r.tasks[V];if(X&&X.executionCount>_.lastEpoch)return true}return false})||(I=true);break}case "time-based":{let q=T.refreshInterval??0;if(q<=0){I=true;break}let L=_.completedAt;if(!L){I=true;break}(Date.now()-Date.parse(L))/1e3<q&&(I=true);break}case "manual":I=true;break}if(I)continue}let s=ht(T);if(s.length===0){p.push(B);continue}let l=[],m=[],g=[];for(let k of s){if(u.has(k))continue;let I=a[k]||[];I.length===0?l.push(k):I.every(L=>vr(r.tasks[L]))?g.push({token:k,failedProducer:I[0]}):m.push(k);}l.length>0?C.push({taskName:B,missingTokens:l}):g.length>0?v.push({taskName:B,failedTokens:g.map(k=>k.token),failedProducers:[...new Set(g.map(k=>k.failedProducer))]}):m.length>0?y.push({taskName:B,waitingOn:m}):p.push(B);}let S={};if(p.length>1){let B=nn(p,n);for(let[T,_]of Object.entries(B))_.length>1&&(S[T]=_);}return {eligible:p,pending:y,unresolved:C,blocked:v,conflicts:S}}function Fo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of We(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let a of o)t[a]||(t[a]=[]),t[a].includes(r)||t[a].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var Ot=class{constructor(){Wr(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Ar(e){let t=xr(e);return qo(t)}function xr(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(xr).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+xr(t[n])).join(",")+"}"}function qo(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function No(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function jo(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let a=0;a<n.length;a++)o[a]=n.charCodeAt(a);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function fn(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return No(t)}function Lo(e){try{let t=JSON.parse(jo(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Gt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:a}=t,d=new Ot,u="state"in e&&"config"in e?e:xt(e),p=false,y=new Set,C=new Map(Object.entries(n)),v=new Ot,S=false,B=false;function T(){if(!p){if(S){B=true;return}S=true;try{do B=!1,_();while(B)}finally{S=false;}}}function _(){let s=v.drain(),l=d.drain(),m=[...s,...l];if(m.length>0&&(u=dn(u,m),o)){for(let k of m)if(k.type==="task-removal")try{o(k.taskName);}catch(I){console.warn("[reactive] onNodeRemoved failed:",I instanceof Error?I.message:String(I));}}let g=Bt(u);m.length>0&&a?.(m,u,g);for(let k of g.eligible)f(k);for(let k of m)if(k.type==="task-progress"){let{taskName:I,update:q}=k;if(!u.config.tasks[I])continue;let V=u.state.tasks[I];if(!V||V.status!=="running")continue;let J=fn(I),X=h(I,J,q).catch(H=>{p||(v.append({type:"task-failed",taskName:I,error:H.message??String(H),timestamp:new Date().toISOString()}),T());}).finally(()=>{y.delete(X);});y.add(X);}}function x(s){let m=u.config.tasks[s].requires??[],g=new Map;for(let[I,q]of Object.entries(u.config.tasks))for(let L of q.provides??[])g.set(L,I);let k={};for(let I of m){let q=g.get(I);q?k[I]=u.state.tasks[q]?.data:k[I]=void 0;}return k}async function h(s,l,m){let g=u.config.tasks[s],k=g.taskHandlers??[],I=x(s);for(let q of k){let L=C.get(q);if(!L)throw new Error(`Handler '${q}' not found in registry (task '${s}')`);let V={nodeId:s,state:I,taskState:u.state.tasks[s],config:g,callbackToken:l,update:m};if(await L(V)==="task-initiate-failure")throw new Error(`Handler '${q}' returned task-initiate-failure (task '${s}')`)}}function f(s){let m=u.config.tasks[s]?.taskHandlers;if(!m||m.length===0)return;v.append({type:"task-started",taskName:s,timestamp:new Date().toISOString()}),T();let g=fn(s),k=h(s,g).catch(I=>{p||(v.append({type:"task-failed",taskName:s,error:I.message??String(I),timestamp:new Date().toISOString()}),T());}).finally(()=>{y.delete(k);});y.add(k);}return {push(s){p||(s.type==="task-completed"&&s.data&&!s.dataHash&&(s={...s,dataHash:Ar(s.data)}),d.append(s),T());},pushAll(s){if(!p){for(let l of s)l.type==="task-completed"&&l.data&&!l.dataHash?d.append({...l,dataHash:Ar(l.data)}):d.append(l);T();}},resolveCallback(s,l,m){if(p)return;let g=Lo(s);if(!g)return;let{taskName:k}=g;if(u.config.tasks[k]){if(m&&m.length>0)d.append({type:"task-failed",taskName:k,error:m.join("; "),timestamp:new Date().toISOString()});else {let I=l&&Object.keys(l).length>0?Ar(l):void 0;d.append({type:"task-completed",taskName:k,data:l,dataHash:I,timestamp:new Date().toISOString()});}T();}},addNode(s,l){p||(d.append({type:"task-upsert",taskName:s,taskConfig:l,timestamp:new Date().toISOString()}),T());},removeNode(s){p||(d.append({type:"task-removal",taskName:s,timestamp:new Date().toISOString()}),T());},addRequires(s,l){p||(d.append({type:"node-requires-add",nodeName:s,tokens:l,timestamp:new Date().toISOString()}),T());},removeRequires(s,l){p||(d.append({type:"node-requires-remove",nodeName:s,tokens:l,timestamp:new Date().toISOString()}),T());},addProvides(s,l){p||(d.append({type:"node-provides-add",nodeName:s,tokens:l,timestamp:new Date().toISOString()}),T());},removeProvides(s,l){p||(d.append({type:"node-provides-remove",nodeName:s,tokens:l,timestamp:new Date().toISOString()}),T());},registerHandler(s,l){C.set(s,l);},unregisterHandler(s){C.delete(s);},retrigger(s){p||u.config.tasks[s]&&(d.append({type:"task-restart",taskName:s,timestamp:new Date().toISOString()}),T());},retriggerAll(s){if(!p){for(let l of s)u.config.tasks[l]&&d.append({type:"task-restart",taskName:l,timestamp:new Date().toISOString()});T();}},snapshot(){return Rt(u)},getState(){return u},getSchedule(){return Bt(u)},async waitForHandlers(){y.size>0&&await Promise.allSettled([...y]);},async dispose(s){s?.wait&&y.size>0&&await Promise.allSettled([...y]),p=true;}}}function Wt(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var Mo=Wt();Mo("./jsonata-sync.cjs");var Do=Wt(),zt=Do("./jsonata-sync.cjs"),gn=zt;function mn(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function yn(e,t,r){let n=t.split("."),o=e;for(let a=0;a<n.length-1;a++)(o[n[a]]==null||typeof o[n[a]]!="object")&&(o[n[a]]={}),o=o[n[a]];o[n[n.length-1]]=r;}async function $o(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let a=await zt(o.expr).evaluate(n);yn(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch{}return e}function Vo(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let a of e.compute)try{let d=gn(a.expr).evaluate(n);yn(e.computed_values,a.bindTo,d),n.computed_values=e.computed_values;}catch(d){let u=d instanceof Error?d.message:String(d);o.push({bindTo:a.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Uo(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return zt(e).evaluate(n)}function Ko(e,t){return t.startsWith("fetched_sources.")?mn(e._sourcesData??{},t.slice(16)):mn(e,t)}var pn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Ho=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Jo(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Ho.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof a.ref!="string"||!a.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof a.expr!="string"||!a.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((a,d)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`source_defs[${d}]: must be an object`);else {let u=a;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${d}]: missing required "bindTo" property`):(n.has(u.bindTo)&&t.push(`source_defs[${d}]: bindTo "${u.bindTo}" is not unique across source_defs`),n.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${d}]: missing required "outputFile" property`):(o.has(u.outputFile)&&t.push(`source_defs[${d}]: outputFile "${u.outputFile}" is not unique across source_defs`),o.add(u.outputFile));}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,a)=>{if(!o||typeof o!="object"){t.push(`view.elements[${a}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${a}].kind: required, must be a string`):pn.has(o.kind)||t.push(`view.elements[${a}].kind: unknown kind "${o.kind}". Valid: ${[...pn].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${a}].data: must be an object`);});}return {ok:t.length===0,errors:t}}async function Qo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[a,d]of Object.entries(n.projections))if(typeof d=="string"&&d.trim().length>0)try{o[a]=await zt(d).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}}))}function Go(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[a,d]of Object.entries(n.projections))if(typeof d=="string"&&d.trim().length>0)try{o[a]=gn(d).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}})}var Je={run:$o,runSync:Vo,eval:Uo,resolve:Ko,validate:Jo,enrichSources:Qo,enrichSourcesSync:Go};function Yt(e){return JSON.stringify(e)}function Xt(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function Zt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Ir(e,t){return Zt(e)?e.then(t):t(e)}function Rn(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Pr(e,t){return {readValues(n){let o=e(n);return Ir(o.listKeys(),a=>{let d=[...a].sort();if(d.length===0)return {version:null,values:{}};let u={},p=null;for(let y of d){let C=o.read(y);Zt(C)?p=(p??Promise.resolve()).then(async()=>{u[y]=await C;}):u[y]=C;}return p?p.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,a){let d=e(n),u=null;for(let p of a){let y=d.delete(p);Zt(y)&&(u=(u??Promise.resolve()).then(()=>y).then(()=>{}));}for(let[p,y]of Object.entries(o)){let C=d.write(p,y);Zt(C)&&(u=(u??Promise.resolve()).then(()=>C).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function er(e,t){return {readSnapshot(r){return e.readValues(r)},commitSnapshot(r,n){if(n.schemaVersion!==t)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);return Ir(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let a=Rn(o.values,n);return Ir(e.writeValues(r,a,n.deleteKeys),d=>({ok:true,newVersion:d}))})}}}function hn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function kn(e){return {readEntriesAfterCursor(t){let r=hn(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return hn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function Cn(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function tr(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function ct(e,t){return tr(e)?e.then(t):t(e)}function Tr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);tr(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function Wo(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function zo(e,t){let r=e.match(t);return r?r[1]:null}function bn(e,t,r){let n={},o=Tr(e,a=>{let d=r(a);if(d)return ct(t(a),u=>{n[d]=u;})});return tr(o)?o.then(()=>n):n}function rr(e,t){return {readSourceData(r,n){return ct(e.read(`${r}/${n}`),Wo)},ingestSourceDataStaged(r,n,o,a){return ct(t(o),d=>e.write(`${r}/.staged/${a}/${n}`,d))},commitSourceData(r,n,o){let a=`${r}/.staged/${o}/${n}`,d=`${r}/${n}`;return e.renameKey(a,d)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return ct(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function _r(e,t){let r=(n,o)=>{try{let a=o(n);return tr(a)?a.catch(d=>t(n,d instanceof Error?d.message:String(d))):void 0}catch(a){try{return t(n,a instanceof Error?a.message:String(a))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return ct(e.read(n),a=>e.write(n,[...a??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return ct(e.read(n),a=>{let d=a;if(!(!d||d.length===0))return ct(Tr(d,u=>r(u,o)),()=>e.delete(n))})}}}function Er(e,t,r){return {readRuntime(n){return ct(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function nr(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return ct(e.listKeys("cards/"),t=>bn(t,r=>e.read(r),r=>zo(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return Tr(Object.entries(t),([r,n])=>{if(r)return n===void 0?e.delete(`data-objects/${r}`):e.write(`data-objects/${r}`,n)})},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){return ct(e.listKeys("data-objects/"),t=>bn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function jt(e,t){function r(){return e.readIndex()??{}}function n(o,a,d){let u=String(a||"").split(".").filter(Boolean);if(u.length===0)return d&&typeof d=="object"&&!Array.isArray(d)?d:{value:d};let p={...o},y=p;for(let C=0;C<u.length-1;C++){let v=u[C],S=y[v],B=S&&typeof S=="object"&&!Array.isArray(S)?{...S}:{};y[v]=B,y=B;}return y[u[u.length-1]]=d,p}return {readCard(o){let a=r()[o];return !a||!e.cardExists(a.key)?null:e.readCard(a.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[a,d]of Object.entries(r())){if(!e.cardExists(d.key))continue;let u=e.readCard(d.key);u?o.push(u):t?.(`[card-store] could not read card "${a}" at key "${d.key}"`);}return o},readChecksumIndex(){let o={};for(let[a,d]of Object.entries(r()))o[a]=d.checksum;return o},changedSince(o){let a=r(),d=[];for(let[u,p]of Object.entries(a))o[u]!==p.checksum&&d.push(u);for(let u of Object.keys(o))a[u]||d.push(u);return d},validateUpsert(o,a){let d=r(),u=d[o],p=Object.entries(d).find(([,y])=>y.key===a);return u&&u.key!==a?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${a}"`}:p&&p[0]!==o?{ok:false,error:`Key "${a}" is already mapped to card id "${p[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,a,d){let u=r(),p=d??u[o]?.key??e.defaultCardKey(o),y=e.writeCard(p,a);u[o]={key:p,checksum:y,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,a,d){let u=r(),p=u[o];if(!p||!e.cardExists(p.key))throw new Error(`card "${o}" not found`);let y=e.readCard(p.key);if(!y||typeof y!="object"||Array.isArray(y))throw new Error(`card "${o}" is not patchable`);let C=n(y,a,d),v=e.writeCard(p.key,C);u[o]={key:p.key,checksum:v,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let a=r(),d=a[o];d&&(e.removeCard(d.key),delete a[o],e.writeIndex(a));},readIndex(){return r()}}}function or(e,t){return rr(e,t)}function Sn(e){return kn(e)}var ar="v1",dt="board/graph",wn="board/lastJournalProcessedId";function vn(e){return `cards/${e}/runtime`}function An(e){return er(e,ar)}function sr(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Xt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Yt(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){e.write("board-runtime-store-ref",r);},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){e.write("queue-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){e.write("chat-store-ref",r);},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){e.write("artifacts-store-ref",r);},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){e.write("fetched-sources-store-ref",r);}}}function xn(e){return nr(e)}function Ft(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Yo(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function qt(e,t){return e?.lastRequestedToken?Yo(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Br(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Nt(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function Ct(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),a=Bt(t),d={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let T of a.pending)u.set(T.taskName,T.waitingOn);for(let T of a.unresolved)u.set(T.taskName,T.missingTokens);for(let T of a.blocked)u.set(T.taskName,T.failedTokens);let p=new Map;for(let[T,_]of Object.entries(n))for(let x of _.requires??[]){let h=p.get(x)??[];h.push(T),p.set(x,h);}let y=o.sort().map(T=>{let _=r[T],x=n[T]??{requires:[],provides:[]};_.status==="completed"?d.completed+=1:_.status==="failed"?d.failed+=1:_.status==="in-progress"&&(d.in_progress+=1);let h=x.requires??[],f=x.provides??[],s=Object.keys(_.data??{}).sort(),l=h.filter(L=>t.state.availableOutputs.includes(L)),m=h.filter(L=>!t.state.availableOutputs.includes(L)),g=u.get(T)??m,k=new Set;for(let L of f)for(let V of p.get(L)??[])V!==T&&k.add(V);let I=_.failedAt,q=_.error?{message:_.error,code:"TASK_FAILED",at:I,source:"task-runtime"}:void 0;return {name:T,status:_.status,error:q,requires:h,requires_satisfied:l,requires_missing:m,provides_declared:f,provides_runtime:s,blocked_by:g,unblocks:Array.from(k).sort(),runtime:{attempt_count:_.executionCount??0,restart_count:_.retryCount??0,in_progress_since:_.status==="in-progress"?_.startedAt??null:null,last_transition_at:_.lastUpdated??null,last_completed_at:_.completedAt??null,last_restarted_at:_.startedAt??null,status_age_ms:_.lastUpdated?0:null}}});d.pending=a.pending.length,d.blocked=a.blocked.length,d.unresolved=a.unresolved.length;let C=y.map(T=>({name:T.name,fanOut:T.unblocks.length})).sort((T,_)=>_.fanOut-T.fanOut||T.name.localeCompare(_.name)),v=C.length>0?C[0]:{name:null,fanOut:0},S=new Set;for(let T of Object.values(n))for(let _ of T.requires??[])S.add(_);let B=0;for(let[T,_]of Object.entries(n)){let x=(_.requires??[]).length===0,f=(_.provides??[]).some(s=>(p.get(s)??[]).some(l=>l!==T));x&&!f&&(B+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:d.completed,eligible:a.eligible.length,pending:d.pending,blocked:d.blocked,unresolved:d.unresolved,failed:d.failed,in_progress:d.in_progress,orphan_cards:B,topology:{edge_count:Array.from(S).length,max_fan_out_card:v.name,max_fan_out:v.fanOut}},cards:y}}function Xo(){return new Date().toISOString()}function In(e,t,r,n,o,a,d){return async u=>{let p=[],y=r.cardStore.readCard(u.nodeId);if(!y)return "task-initiate-failure";let C=y.id,v=y.card_data??{},S=y.source_defs??[],B=S,T=r.cardRuntimeStore.readRuntime(C),_=false,x=()=>{_&&(r.cardRuntimeStore.writeRuntime(C,T),_=false);},h=Q=>Ft(T._sources[Q]),f=(Q,Z)=>{T._sources[Q]=Ft(Z),_=true;},s=u.taskState?.executionCount??0;if(T._lastExecutionCount!==s&&(T._sources={},T._lastExecutionCount=s,_=true),u.update){let Q=u.update,Z=Q.outputFile;if(Z){let ae=h(Z);if(Q.failure){let de=Q.rqt??ae.lastRequestedToken??ae.queueRequestedToken;de&&f(Z,Nt(ae,de));}else {let de=Q.rqt;if(!ae.lastCompletedToken||de>ae.lastCompletedToken){let ke=typeof Q.deliveryToken=="string"?Q.deliveryToken:void 0,E=false;ke&&(E=r.fetchedSourcesStore.commitSourceData(C,Z,ke)),E?f(Z,Br(ae,de)):f(Z,Nt(ae,de));}}x();}}let m={};for(let Q of S)if(Q.outputFile){let Z=r.fetchedSourcesStore.readSourceData(C,Q.outputFile);Z!==null&&(m[Q.bindTo]=Z);}let g={};for(let[Q,Z]of Object.entries(u.state??{}))if(Z!==null&&typeof Z=="object"&&!Array.isArray(Z)){let ae=Z[Q];g[Q]=ae!==void 0?ae:Z;}else g[Q]=Z;let k={id:C,card_data:{...v},requires:g,source_defs:S,compute:y.compute};k._sourcesData=m,y.compute&&Je.runSync(k,{sourcesData:m}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(C,k.computed_values??{});let I={...y},q=Je.enrichSourcesSync(Array.isArray(y.source_defs)?y.source_defs:void 0,{card_data:y.card_data,requires:g}),L=e.value;I.source_defs=Array.isArray(q)?q.map(Q=>({...Q,boardDir:typeof Q.boardDir=="string"&&Q.boardDir?Q.boardDir:L})):q;let V=Xo(),J=u.update?void 0:V,X=B.filter(Q=>{let Z=Q.outputFile;if(typeof Z!="string"||!Z)return true;let ae=h(Z);J&&(ae={...ae,queueRequestedToken:J},f(Z,ae));let de=ae.queueRequestedToken??ae.lastRequestedToken??V,ke=qt(ae,de);return ke==="in-flight"?false:ke==="dispatch"});if(x(),X.length>0){let Q=false,Z=V;for(let ae of X){let de=ae.outputFile;if(typeof de!="string"||!de)continue;let ke=h(de),E=ke.queueRequestedToken??V;f(de,{...ke,lastRequestedToken:E}),Z=E,Q=true;}return Q&&x(),Q&&(p.push({taskKind:"source-fetch",payload:{boardRef:Se(e),enrichedCard:I,callbackToken:u.callbackToken,rqt:Z}}),r.executionRequestStore.appendEntries(t,p)),"task-initiated"}if(B.some(Q=>{let Z=Q.outputFile;if(typeof Z!="string"||!Z)return false;let ae=h(Z),de=ae.queueRequestedToken??ae.lastRequestedToken??V;return qt(ae,de)==="in-flight"}))return "task-initiated";let re=y.provides??[],ie={};for(let{bindTo:Q,ref:Z}of re)ie[Q]=Je.resolve(k,Z);return (d??r.outputStore.writeDataObjects.bind(r.outputStore))(ie),n(u.nodeId,ie),p.length>0&&r.executionRequestStore.appendEntries(t,p),"task-initiated"}}var Lt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function ir(e){return {[dt]:e.graph,[wn]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function ur(e){let t=e[dt],r=e[wn],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${dt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function cr(e){let t=e.requires;return {provides:e.provides?.map(n=>n.bindTo)??[],taskHandlers:["card-handler"],description:e.meta?.title??e.id,...t&&t.length>0?{requires:t}:{}}}function dr(e,t={}){function r(y){return {status:"success",data:y}}function n(y){return {status:"fail",error:y}}function o(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}async function a(y){let C=t.emitNotification;if(!C||y.length===0)return;let v=Fe(y);if(v.length===1){await C(v[0]);return}await C(qe({kind:"notification-batch",notifications:v}));}function d(y){let C=y.params?.id;if(C){let v=e.readCard(C);if(!v)throw new Error(`card "${C}" not found`);return [v]}return e.readAllCards()}function u(y){return qe({kind:"notification-batch",notifications:Fe(y.map(C=>({kind:"card_refreshed",cardId:C.id,card:C})))})}function p(y){if(Array.isArray(y))return y;if(y&&typeof y=="object"){let C=y;return Array.isArray(C.files)?C.files:[y]}return null}return {get(y){try{return r({cards:d(y)})}catch(C){return o(C)}},buildNotificationBatch(y){try{return r(u(d(y)))}catch(C){return o(C)}},set(y){try{let C=y.body;if(C==null)return n("set requires a body (card object or array of cards)");let v=Array.isArray(C)?C:[C];for(let S of v){if(typeof S.id!="string")return n("each card must have a string `id` field");e.writeCard(S.id,S);}return a(v.map(S=>({kind:"card_refreshed",cardId:S.id,card:S}))),r({count:v.length})}catch(C){return o(C)}},del(y){try{let C=y.body?.ids??[],v=y.params?.id,S=v?[...C,v]:C;if(S.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of S)e.removeCard(B);return a(S.map(B=>({kind:"card_removed",cardId:B}))),r({count:S.length})}catch(C){return o(C)}},patch(y){try{let C=y.params?.id,v=y.params?.path;if(!C)return n("patch requires params.id");if(!v)return n("patch requires params.path");let S=y.body,B=S&&Object.prototype.hasOwnProperty.call(S,"value")?S.value:y.body;e.patchCard(C,v,B);let T=e.readCard(C);return T?(a([{kind:"card_refreshed",cardId:C,card:T}]),r({count:1})):n(`card "${C}" not found`)}catch(C){return o(C)}},appendFiles(y){try{let C=y.params?.id;if(!C)return n("appendFiles requires params.id");let v=e.readCard(C);if(!v)return n(`card "${C}" not found`);let S=p(y.body);if(!S||S.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=v.card_data&&typeof v.card_data=="object"&&!Array.isArray(v.card_data)?v.card_data:{},T=Array.isArray(B.files)?B.files:[],_=[...T,...S],x=S.map((f,s)=>({idx:T.length+s,entry:f})),h=this.patch({params:{id:C,path:"card_data.files"},body:{value:_}});return h.status!=="success"?h:r({files_added:x})}catch(C){return o(C)}}}}function pe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function se(e){return {status:"fail",error:e}}function he(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}var Pn="sys_keys_board_state";function Zo(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function En(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function lr(e){try{let t=JSON.parse(En(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Tn(e){return Zo(JSON.stringify(e))}function _n(e){try{let t=JSON.parse(En(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function ze(){return new Date().toISOString()}function ea(e){let t=new Map;return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.get(r)??[];t.set(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.get(r);if(!(!o||o.length===0)){for(let a of o)try{n(a);}catch(d){try{e(a,d instanceof Error?d.message:String(d));}catch{}}t.delete(r);}}}}function Bn(e,t,r={}){Jt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),a=Se(e),d=r.boardRuntimeStoreRef,u=r.scratchStoreRef,p=r.taskExecutorRef,y=r.chatHandlerFlow,C=r.emitNotification??(j=>{if(!t.publishBoardChangeNotifications)return;let R=j.kind==="notification-batch"?j.notifications:[j];return t.publishBoardChangeNotifications(R)});function v(){if(!d)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return d}function S(j){if(j.length!==0)try{let R=Fe(j),F=qe({kind:"notification-batch",notifications:R}),$=C(F);$&&typeof $.catch=="function"&&$.catch(te=>o(`[board-live-cards-public] emitNotification failed: ${te instanceof Error?te.message:String(te)}`));}catch(R){o(`[board-live-cards-public] emitNotification failed: ${R instanceof Error?R.message:String(R)}`);}}function B(){let j=_().readCardStoreRef();if(!j)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let R=t.kvStorageForRef(j);return {readIndex(){return R.read("_index")},writeIndex(F){R.write("_index",F);},readCard(F){return R.read(F)},writeCard(F,$){return R.write(F,$),t.hashFn($)},removeCard(F){R.delete(F);},cardExists(F){return R.read(F)!==null},defaultCardKey(F){return F}}}let T={readValues(j){let R=t.kvStorageForRef(v()),F=R.listKeys().sort();if(F.length===0)return {version:null,values:{}};let $={};for(let te of F)$[te]=R.read(te);return {version:t.hashFn($),values:$}},writeValues(j,R,F){let $=t.kvStorageForRef(v());for(let te of F)$.delete(te);for(let[te,ee]of Object.entries(R))$.write(te,ee);return t.hashFn(R)}},_=()=>sr(t.kvStorageForRef(v())),x=()=>An(T),h=()=>Sn(t.journalAdapterForRef(v())),f=()=>jt(B(),o),s=()=>{let j=_().readOutputsStoreRef();if(!j)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return xn(t.kvStorageForRef(j))};function l(){return p??_().readTaskExecutorRef()}function m(){return !!x().readSnapshot(e.value).values[dt]}function g(){let j=x().readSnapshot(e.value);if(!j.values[dt])throw new Error(`Board not initialized at ${e.value}`);return ur(j.values)}function k(j,R){let F=x().commitSnapshot(e.value,{schemaVersion:ar,expectedVersion:R,commitId:t.genId(),committedAt:ze(),deleteKeys:[],shallowMerge:ir(j)});if(!F.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${R??"null"} current=${F.currentVersion??"null"}`)}function I(j){h().appendEvent(j);}async function q(){let R=ea((b,O)=>{let D=b.payload,G=(D?.enrichedCard??{}).id??D?.cardId??"unknown";I({type:"task-failed",taskName:G,error:O,timestamp:ze()});}),F=g(),$=kt(F.graph),{events:te,newCursor:ee}=h().readEntriesAfterCursor(F.lastDrainedJournalId),Re=E(),fe=or(Re,b=>t.resolveBlob(b)),Ce={...F.runtimeByCardId},_e=new Map,je={readRuntime(b){return _e.get(b)??Ce[b]??{_sources:{}}},writeRuntime(b,O){_e.set(b,O),Ce[b]=O;}},Ue=[],Ve=new Map,lt={readSourceData(b,O){let D=`${b}/${O}`;return Ve.has(D)?Ve.get(D):fe.readSourceData(b,O)},ingestSourceDataStaged(b,O,D,Y){fe.ingestSourceDataStaged(b,O,D,Y);},commitSourceData(b,O,D){let Y=`${b}/.staged/${D}/${O}`,G=Re.read(Y);if(G==null){let ue=Re.keyRef?.(Y);ue&&(G=t.resolveBlob(ue));}if(G==null)return false;let oe=`${b}/${O}`,Be=G.trim();try{Ve.set(oe,JSON.parse(Be));}catch{Ve.set(oe,Be);}return Ue.push({cardId:b,outputFile:O,deliveryToken:D}),true},hasSource(b,O){let D=`${b}/${O}`;return Ve.has(D)?true:fe.hasSource(b,O)},listSources(b){let O=fe.listSources(b),D=new Set;for(let G of Ve.keys())G.startsWith(`${b}/`)&&D.add(G.slice(`${b}/`.length));let Y=new Set([...O,...D]);return Array.from(Y)}},Xe={cardStore:f(),cardRuntimeStore:je,fetchedSourcesStore:lt,outputStore:s(),executionRequestStore:R},Ge=[],bt=[],St=[],Dt=new Map,$t=new Set,Jr=(b,O)=>{Ge.push({type:"task-completed",taskName:b,data:O,timestamp:ze()});},Tt=(b,O)=>{I({type:"task-failed",taskName:b,error:O,timestamp:ze()});},_t=Gt($,{handlers:{"card-handler":In(e,ee,Xe,Jr,Tt,(b,O)=>{bt.push({cardId:b,values:O});},b=>{St.push(b);})},onNodeRemoved:b=>{Dt.delete(b),_e.delete(b),delete Ce[b],$t.add(b);}});for(Ge=te;Ge.length>0;){let b=Ge;Ge=[];for(let O of b)if(O.type==="task-restart"){let D=Xe.cardStore.readCard(O.taskName);D&&Dt.set(O.taskName,D);}_t.pushAll(b),await _t.waitForHandlers();}let Vt=_t.getState();await _t.dispose({wait:true});let Gr=x().readSnapshot(e.value).version;k({lastDrainedJournalId:ee,graph:Rt(Vt),runtimeByCardId:Ce},Gr);for(let{cardId:b,values:O}of bt)Xe.outputStore.writeComputedValues(b,O);for(let b of St)Xe.outputStore.writeDataObjects(b);for(let{cardId:b,outputFile:O,deliveryToken:D}of Ue)fe.commitSourceData(b,O,D);let wt;try{wt=Ct(a,Vt),Xe.outputStore.writeStatusSnapshot(wt);}catch(b){o(`[board-live-cards-public] status publish failed: ${b instanceof Error?b.message:String(b)}`);}let gt=[];for(let{cardId:b,values:O}of bt)gt.push({kind:"computed_values",cardId:b,values:O});for(let b of St)for(let[O,D]of Object.entries(b))O&&gt.push({kind:"data_object",key:O,payload:D});for(let[b,O]of Dt)gt.push({kind:"card_refreshed",cardId:b,card:O});for(let b of $t)gt.push({kind:"card_removed",cardId:b});wt!==void 0&&gt.push({kind:"status",status:wt}),S(gt);let i=l()??{howToRun:"built-in",whatToRun:Se({kind:"built-in",value:"source-cli-task-executor"})},P=t.supportsDirectSourceOutput?.(i)===true;R.dispatchEntriesForJournalId(ee,b=>{if(b.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${b.taskKind}" \u2014 skipping`);return}let O=b.payload,D=O.enrichedCard?.id??"unknown",Y=O.enrichedCard?.source_defs??[];if(i.howToRun==="queue-storage"&&P){try{let G=t.queueStorageForRef(L(),"task-executor"),oe=typeof i.extra?.boardId=="string"?i.extra.boardId:void 0,Be=[];for(let ue of Y){if(!ue.outputFile){o(`[dispatch] source "${ue.bindTo}" has no outputFile \u2014 skipping`);continue}let Le=t.genId(),vt=`${D}/.staged/${Le}/${ue.outputFile}`,At=Re.keyRef?.(vt);if(!At)continue;let Ut={ref:Se(At),deliveryToken:Le,outputFile:ue.outputFile,cardId:D},Et=Tn({cbk:O.callbackToken,rg:e.value,br:Se(e),cid:D,b:ue.bindTo,d:ue.outputFile,cs:void 0,rqt:O.rqt,dt:Ut.deliveryToken});Be.push({...oe?{boardId:oe}:{},ref:i,args:{source_def:ue,base_ref:Se(e),callback:n.createCallback(Et),output:Ut}});}Be.length>0&&G.enqueueMany(Be);}catch(G){Tt(D,G instanceof Error?G.message:String(G));}return}for(let G of Y){if(!G.outputFile){o(`[dispatch] source "${G.bindTo}" has no outputFile \u2014 skipping`);continue}let oe;if(P){let ue=t.genId(),Le=`${D}/.staged/${ue}/${G.outputFile}`,vt=Re.keyRef?.(Le);vt&&(oe={ref:Se(vt),deliveryToken:ue,outputFile:G.outputFile,cardId:D});}let Be=Tn({cbk:O.callbackToken,rg:e.value,br:Se(e),cid:D,b:G.bindTo,d:G.outputFile,cs:void 0,rqt:O.rqt,...oe?{dt:oe.deliveryToken}:{}});t.dispatchExecution(i,{source_def:G,base_ref:Se(e),callback:n.createCallback(Be),...oe?{output:oe}:{}}).catch(ue=>Tt(D,ue instanceof Error?ue.message:String(ue)));}});}function L(){let j=_().readQueueStoreRef();if(!j)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);return j}function V(){let j=t.queueStorageForRef(L(),"process-accumulated");j.enqueueIfAbsent?j.enqueueIfAbsent({boardRef:Se(e)},`process-accumulated:${Se(e)}`):j.enqueue({boardRef:Se(e)}),t.requestProcessAccumulated?.();}function J(){let j=t.queueStorageForRef(L(),"process-accumulated");for(;;){let R=j.lease({max:64,visibilityMs:1e3});if(R.length<=0)return;for(let F of R)j.ack(F.id,F.leaseToken);if(R.length<64)return}}async function X(){try{let j=()=>{let F=g(),{events:$}=h().readEntriesAfterCursor(F.lastDrainedJournalId);$.length<=0||V();},R=await zr(t.lock,q,j);return pe({ran:R!==!1})}catch(j){return he(j)}}function H(){V();}function re(j){try{let R=j.params?.cardStoreRef;if(!R)return se("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(d=j.params?.boardRuntimeStoreRef,!d)return se("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!m()){let Ce=xt(Lt);k({lastDrainedJournalId:"",graph:Rt(Ce),runtimeByCardId:{}},null);}let F=j.params?.outputsStoreRef;if(!F)return se("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let $=j.params?.queueStoreRef;if(!$)return se("init requires params.queueStoreRef \u2014 pass the queue store ref here");let te=j.params?.fetchedSourcesStoreRef;if(!te)return se("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");u=j.params?.scratchStoreRef;let ee=j.params?.chatStoreRef;if(!ee)return se("init requires params.chatStoreRef \u2014 pass the chat store ref here");let Re=j.params?.artifactsStoreRef;if(!Re)return se("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let fe=_();fe.writeBoardRuntimeStoreRef(d),fe.writeCardStoreRef(R),fe.writeOutputsStoreRef(F),fe.writeQueueStoreRef($),fe.writeFetchedSourcesStoreRef(te),fe.writeChatStoreRef(ee),fe.writeArtifactsStoreRef(Re);try{s().writeStatusSnapshot(Ct(a,kt(g().graph)));}catch{}return pe()}catch(R){return he(R)}}function ie(j){try{let R=s().readStatusSnapshot();if(!R){R=Ct(a,kt(g().graph));try{s().writeStatusSnapshot(R);}catch{}}return pe(R)}catch(R){return he(R)}}function Q(j){try{let R=j.params?.id;if(!R)return se("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(R);}catch{}return I({type:"task-removal",taskName:R,timestamp:ze()}),H(),pe()}catch(R){return he(R)}}function Z(j){try{let R=j.params?.cardId;if(!R)return se("addCardFiles requires params.cardId");let F=dr(f(),{emitNotification:C}).appendFiles({params:{id:R},body:j.body});return F.status!=="success"?F:pe({cardId:R,files_added:F.data.files_added,notified:!0})}catch(R){return he(R)}}function ae(j){try{let R=j.params?.id;return R?(I({type:"task-restart",taskName:R,timestamp:ze()}),H(),pe()):se("retrigger requires params.id")}catch(R){return he(R)}}async function de(j){return J(),X()}function ke(){let j=_().readFetchedSourcesStoreRef();if(!j)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return j}function E(){return t.blobStorageForRef(ke())}function c(j){try{let R=j.params?.cardId,F=j.params?.all,$=!!j.params?.restart;if(!R&&!F)return se("upsertCard requires --card-id <id> or --all");let te=F?f().readAllCards().map(ee=>ee.id):[R];for(let ee of te)if(!f().readCard(ee))return se(`Card "${ee}" not found in board at ${e.value}`);for(let ee of te){let Re=f().readCard(ee),fe=cr(Re),Ce=t.hashFn(fe),_e=t.kvStorage("card-upsert"),je=_e.read(ee),Ue=je?.taskConfigHash!==Ce;if(!(!Ue&&!$)){if(Ue){let Ve=je?.blobRef??f().readCardKey(ee)??ee;I({type:"task-upsert",taskName:ee,taskConfig:fe,timestamp:ze()}),_e.write(ee,{blobRef:Ve,taskConfigHash:Ce,updatedAt:ze()});}$&&I({type:"task-restart",taskName:ee,timestamp:ze()});}}return H(),pe()}catch(R){return he(R)}}function w(j){try{let R=j.params?.token;if(!R)return se("taskFailed requires params.token");let F=j.params?.error??"unknown error",$=lr(R);return $?(I({type:"task-failed",taskName:$.taskName,error:F,timestamp:ze()}),H(),pe()):se("Invalid callback token")}catch(R){return he(R)}}function A(j){try{let R=j.params?.token;if(!R)return se("taskProgress requires params.token");let $=(j.body??{}).update??{},te=lr(R);return te?(I({type:"task-progress",taskName:te.taskName,update:$,timestamp:ze()}),H(),pe()):se("Invalid callback token")}catch(R){return he(R)}}function N(j){try{let R=j.params?.token,F=j.params?.ref;if(!R)return se("sourceDataFetched requires params.token");if(!F)return se("sourceDataFetched requires params.ref");let $=_n(R);if(!$)return se("Invalid source token");let{cbk:te,cid:ee,b:Re,d:fe,cs:Ce,rqt:_e,dt:je}=$,Ue=or(E(),Ge=>t.resolveBlob(Ge)),Ve=je||t.genId();je||Ue.ingestSourceDataStaged(ee,fe,st(F),Ve);let lt=lr(te);if(!lt)return se("Invalid callback token embedded in source token");let Xe=ze();return I({type:"task-progress",taskName:lt.taskName,update:{bindTo:Re,outputFile:fe,fetchedAt:Xe,deliveryToken:Ve,sourceChecksum:Ce,rqt:_e},timestamp:Xe}),H(),pe()}catch(R){return he(R)}}function M(j){try{let R=j.params?.token,F=j.params?.reason??"unknown";if(!R)return se("sourceDataFetchFailure requires params.token");let $=_n(R);if(!$)return se("Invalid source token");let{cbk:te,b:ee,d:Re,cs:fe,rqt:Ce}=$,_e=lr(te);return _e?(I({type:"task-progress",taskName:_e.taskName,update:{bindTo:ee,outputFile:Re,failure:!0,reason:F,sourceChecksum:fe,rqt:Ce},timestamp:ze()}),H(),pe()):se("Invalid callback token embedded in source token")}catch(R){return he(R)}}function K(j){try{let R=_().readCardStoreRef();return R?pe({storeRef:R}):se(`Board at ${e.value} has no card store configured`)}catch(R){return he(R)}}function U(j){try{return pe({storeRef:d??null})}catch(R){return he(R)}}function ne(j){try{let R=_().readOutputsStoreRef();return R?pe({storeRef:R}):se(`Board at ${e.value} has no outputs store configured`)}catch(R){return he(R)}}function xe(j){try{return pe({storeRef:u??null})}catch(R){return he(R)}}function Ie(j){try{let R=_().readChatStoreRef();return pe({storeRef:R})}catch(R){return he(R)}}function Ae(j){try{let R=_().readArtifactsStoreRef();return pe({storeRef:R})}catch(R){return he(R)}}function le(j){try{let R=_().readFetchedSourcesStoreRef();return pe({storeRef:R})}catch(R){return he(R)}}function ge(j){try{let R=j.params?.key;if(!R)return se("getConfig requires params.key");let F=_(),$;switch(R){case "task-executor":$=p??null;break;case "chat-handler-flow":$=y??null;break;case "board-runtime-store-ref":$=F.readBoardRuntimeStoreRef();break;case "card-store-ref":$=F.readCardStoreRef();break;case "outputs-store-ref":$=F.readOutputsStoreRef();break;case "scratch-store-ref":$=u??null;break;case "chat-store-ref":$=F.readChatStoreRef();break;case "artifacts-store-ref":$=F.readArtifactsStoreRef();break;case "fetched-sources-store-ref":$=F.readFetchedSourcesStoreRef();break;default:return se(`getConfig: unknown key "${R}"`)}return pe({value:$})}catch(R){return he(R)}}function $e(j){try{let R=j.params?.key;if(!R)return se("getOutputsDataObject requires params.key");let F=Me()[R]??null;return pe(F)}catch(R){return he(R)}}function be(j){if(!j||typeof j!="object"||Array.isArray(j))return false;let R=j.__private;return !!R&&typeof R=="object"&&!Array.isArray(R)&&R.visible_controlplane_only===true}function Ne(j){let R=[...new Set(f().readAllCards().filter($=>!be($)).map($=>$.id).filter($=>typeof $=="string"&&$.length>0))].sort(),F=[...new Set(Object.keys(j).filter($=>$&&$!==Pn))].sort();return {card_ids:R,data_object_keys:F}}function Me(){let j=s().readAllDataObjects();return {...j,[Pn]:Ne(j)}}function ye(j){try{return pe(Me())}catch(R){return he(R)}}function Ye(j){try{let R=j.params?.key;if(!R)return se("getOutputsComputedValues requires params.key");let F=s().readComputedValues(R);return pe(F)}catch(R){return he(R)}}function De(j){try{return pe(s().readAllComputedValues())}catch(R){return he(R)}}function He(){return or(E(),j=>t.resolveBlob(j))}function pt(j){let R=E().keyRef?.(j);if(!R)throw new Error("configured fetched-sources store does not support keyRef");return Se(R)}function rt(j){try{let R=j.params?.key;if(!R)return se("getOutputsFetchedSources requires params.key");let F=He().listSources(R),$={};for(let te of F)$[te]=pt(`${R}/${te}`);return pe($)}catch(R){return he(R)}}function at(j){try{let R=He(),F=new Set;for(let te of E().listKeys()){let ee=te.indexOf("/");ee>0&&!te.includes("/.staged/")&&F.add(te.slice(0,ee));}let $={};for(let te of F){let ee=R.listSources(te);if(ee.length>0){$[te]={};for(let Re of ee)$[te][Re]=pt(`${te}/${Re}`);}}return pe($)}catch(R){return he(R)}}function nt(j){try{let R=f().readAllCards(),F=ie({});if(F.status!=="success")return F;let $=ye({});if($.status!=="success")return $;let te=De({});if(te.status!=="success")return te;let ee=te.data,Re={};for(let fe of R){let Ce=typeof fe?.id=="string"?fe.id:null;if(!Ce)continue;let _e=fe.card_data&&typeof fe.card_data=="object"&&!Array.isArray(fe.card_data)?fe.card_data:{};Re[Ce]={schema_version:"v1",card_id:Ce,card_data:{..._e},computed_values:ee[Ce]&&typeof ee[Ce]=="object"?ee[Ce]:{}};}return pe({cardDefinitions:R,statusSnapshot:F.data,dataObjectsByToken:$.data,cardRuntimeById:Re})}catch(R){return he(R)}}return {init:re,status:ie,getBoardRuntimeStoreRef:U,getCardStoreRef:K,getOutputsStoreRef:ne,getScratchStoreRef:xe,getChatStoreRef:Ie,getArtifactsStoreRef:Ae,getFetchedSourcesStoreRef:le,getConfig:ge,getOutputsDataObject:$e,getAllOutputsDataObjects:ye,getOutputsComputedValues:Ye,getAllOutputsComputedValues:De,getOutputsFetchedSources:rt,getAllOutputsFetchedSources:at,buildSseOneShotPayload:nt,removeCard:Q,addCardFiles:Z,retrigger:ae,processAccumulatedEvents:de,upsertCard:c,taskFailed:w,taskProgress:A,sourceDataFetched:N,sourceDataFetchFailure:M}}function On(e,t,r){let n=r?.taskExecutorRef,o=()=>{if(r){if(!r.boardRuntimeStoreRef)throw new Error(`Board at ${e.value} requires boardRuntimeStoreRef for non-core runtime operations.`);return sr(t.kvStorageForRef(r.boardRuntimeStoreRef))}return sr(t.kvStorage("config"))};function a(){let f=o().readCardStoreRef();if(!f)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let s=t.kvStorageForRef(f);return {readIndex(){return s.read("_index")},writeIndex(l){s.write("_index",l);},readCard(l){return s.read(l)},writeCard(l,m){return s.write(l,m),t.hashFn(m)},removeCard(l){s.delete(l);},cardExists(l){return s.read(l)!==null},defaultCardKey(l){return l}}}let d=()=>jt(a(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function p(f,s){let l=t.validateSchema(s),m=[],g=u();if(g&&Array.isArray(s.source_defs))for(let I of s.source_defs){let q=typeof I.bindTo=="string"?I.bindTo:"(unknown)";try{let L;try{L=await t.invokeExecutor(g,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(I)});}catch(J){let X=J;if(L=typeof X?.stdout=="string"?X.stdout:"",!L.trim()){m.push(`source "${q}": executor validate-source-def failed \u2014 ${J instanceof Error?J.message:String(J)}`);continue}}let V=JSON.parse(L.trim());if(!V.ok&&Array.isArray(V.errors))for(let J of V.errors)m.push(`source "${q}": ${J}`);}catch(L){m.push(`source "${q}": executor validate-source-def failed \u2014 ${L instanceof Error?L.message:String(L)}`);}}let k=[...l.errors,...m];return pe({cardId:f,isValid:k.length===0,issues:k})}function y(f,s){let l=f.params?.sourceIdx,m=f.params?.outRef;if(l===void 0)return se(`${s} requires params.sourceIdx`);if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return se(`${s} requires card JSON object in body`);let g=f.body,k=g["card-content"]??g,I=g["mock-projections"]??{},q=k.source_defs??[];if(l<0||l>=q.length)return se(`sourceIdx ${l} out of range (card has ${q.length} source(s))`);let L=q[l],V=typeof L.bindTo=="string"?L.bindTo:"source";return {src:L,bindTo:V,outRef:m,mockProjections:I}}async function C(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return se("validateCardPreflight requires card JSON object in body");let s=f.body,l=s["card-content"]??s,m=typeof l.id=="string"?l.id:"(unknown)";return await p(m,l)}catch(s){return he(s)}}async function v(f){try{let s=y(f,"probeSourcePreflight");if("status"in s)return s;let l=u();if(!l)return se("No task-executor registered for this board");try{let m={...s.src,_projections:s.mockProjections},g=await t.invokeExecutor(l,"probe-source-preflight",{timeout:s.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(m)}),k=JSON.parse(g.trim());return k.ok?pe({bindTo:s.bindTo,reachable:k.reachable,latencyMs:k.latencyMs,note:k.note}):se(k.error??"Preflight probe failed")}catch{return se("Executor does not support probe-source-preflight")}}catch(s){return he(s)}}async function S(f){try{let s=y(f,"runSourcePreflight");if("status"in s)return s;let l=u();if(!l)return se("No task-executor registered for this board");try{let m={...s.src,_projections:s.mockProjections},g=await t.invokeExecutor(l,"run-source-preflight",{timeout:s.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(m)}),k=JSON.parse(g.trim());if(!k.ok)return pe({bindTo:s.bindTo,ok:!1,result:null,issues:[k.error??"Preflight run failed"]});if(s.outRef){let I=st(s.outRef);t.absoluteBlob.write(I.value,JSON.stringify(k.resultValue,null,2));}return pe({bindTo:typeof k.bindTo=="string"?k.bindTo:s.bindTo,ok:!0,result:k.resultValue??null,issues:[]})}catch(m){let g=m instanceof Error?m.message:String(m);return pe({bindTo:s.bindTo,ok:!1,result:null,issues:[g]})}}catch(s){return he(s)}}async function B(f){try{let s=u();if(!s)return se("No task-executor registered for this board");let l=await t.invokeExecutor(s,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return pe(JSON.parse(l.trim()))}catch(s){return he(s)}}function T(f){try{let s=f.body;if(!s||!Array.isArray(s.ops))return se("updatesInCardStore requires body.ops array");let l=s.ops,m=d();for(let g of l){let k=g.op,I=g.id;if(!I)return se('op is missing "id"');if(k==="update"){let q=g["card-content"];if(!q)return se(`update op for "${I}" is missing "card-content"`);m.writeCard(I,q);}else return se(`Unknown op type: "${k??"(none)"}"`)}return pe()}catch(s){return he(s)}}function _(f){try{let s=f.body;if(!s||!Array.isArray(s.ids))return se("readFromCardStore requires body.ids array");let l=s.ids,m=d(),g=l.map(k=>({id:k,"card-content":m.readCard(k)}));return pe({cards:g})}catch(s){return he(s)}}function x(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return se("evalCardCompute requires a JSON object in body");let s=f.body,l=s["card-content"]??s,m=typeof l.id=="string"?l.id:"(unknown)",g=s["mock-fetched-sources"]??{},k=s["mock-requires"]??{},I=l.compute;if(!I||!Array.isArray(I)||I.length===0)return pe({cardId:m,ok:!0,computed_values:{},errors:[]});let q={id:m,card_data:l.card_data??{},requires:k,source_defs:l.source_defs,compute:I},L=Je.runSync(q,{sourcesData:g}),V=L.node.computed_values??{},J=L.errors??[];return pe({cardId:m,ok:J.length===0,computed_values:V,errors:J})}catch(s){return he(s)}}async function h(f){try{if(!f.body||typeof f.body!="object"||Array.isArray(f.body))return se("simulateCardCycle requires a JSON object in body");let s=f.body,l=s["card-content"]??s,m=typeof l.id=="string"?l.id:"(unknown)",g=s["mock-fetched-sources"]??{},k=s["mock-requires"]??{},I=await p(m,l),q=I.status==="success"?{isValid:I.data.isValid,issues:I.data.issues}:{isValid:!1,issues:[I.status==="fail"?I.error:"internal error"]},L=l.source_defs??[],V=l.card_data??{},J=[],X=[];if(L.length>0){J=Je.enrichSourcesSync(L,{card_data:V,requires:k});for(let E of J){let c=E.projections,w=E._projections;if(c&&w){for(let A of Object.keys(c))if(w[A]===void 0){let N=typeof E.bindTo=="string"?E.bindTo:"(unknown)";X.push({bindTo:N,key:A,error:`Projection "${A}" resolved to undefined`});}}}}let H=[],re={...g},ie=s["task-executor-ref"],Q=(ie?.howToRun&&ie?.whatToRun?ie:void 0)??u();for(let E=0;E<J.length;E++){let c=J[E],w=typeof c.bindTo=="string"?c.bindTo:`source_${E}`;if(!Q){H.push({bindTo:w,skipped:!0,error:"No task executor configured"});continue}try{let A={...c},N=await t.invokeExecutor(Q,"run-source-preflight",{timeout:c.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(A)}),M=JSON.parse(N.trim());M.ok&&!Object.prototype.hasOwnProperty.call(g,w)&&Object.prototype.hasOwnProperty.call(M,"resultValue")&&(re[w]=M.resultValue),H.push({bindTo:w,reachable:M.reachable,latencyMs:M.latencyMs,error:M.ok?void 0:M.error});}catch{H.push({bindTo:w,skipped:!0,error:"Executor does not support run-source-preflight"});}}let Z=l.compute,ae={},de=[];if(Z&&Array.isArray(Z)&&Z.length>0){let E={id:m,card_data:V,requires:k,source_defs:l.source_defs,compute:Z},c=Je.runSync(E,{sourcesData:re});ae=c.node.computed_values??{},de=c.errors??[];}let ke=q.isValid&&X.length===0&&de.length===0&&H.every(E=>E.reachable!==!1);return pe({cardId:m,ok:ke,validation:q,source_probes:H,projection_errors:X,fetched_sources:re,computed_values:ae,compute_errors:de})}catch(s){return he(s)}}return {validateCardPreflight:C,probeSourcePreflight:v,runSourcePreflight:S,evalCardCompute:x,simulateCardCycle:h,describeTaskExecutorCapabilities:B,updatesInCardStore:T,readFromCardStore:_}}function fr(e,t={}){function r(y){return {status:"success",data:y}}function n(y){return {status:"fail",error:y}}function o(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}async function a(y){let C=t.emitNotification;if(!C||y.length===0)return;let v=Fe(y);if(v.length===1){await C(v[0]);return}await C(qe({kind:"notification-batch",notifications:v}));}async function d(y){let C=y.params?.id;if(C){let v=await e.readCard(C);if(!v)throw new Error(`card "${C}" not found`);return [v]}return await e.readAllCards()}function u(y){return qe({kind:"notification-batch",notifications:Fe(y.map(C=>({kind:"card_refreshed",cardId:C.id,card:C})))})}function p(y){if(Array.isArray(y))return y;if(y&&typeof y=="object"){let C=y;return Array.isArray(C.files)?C.files:[y]}return null}return {async get(y){try{return r({cards:await d(y)})}catch(C){return o(C)}},async buildNotificationBatch(y){try{return r(u(await d(y)))}catch(C){return o(C)}},async set(y){try{let C=y.body;if(C==null)return n("set requires a body (card object or array of cards)");let v=Array.isArray(C)?C:[C];for(let S of v){if(typeof S.id!="string")return n("each card must have a string `id` field");await e.writeCard(S.id,S);}return await a(v.map(S=>({kind:"card_refreshed",cardId:S.id,card:S}))),r({count:v.length})}catch(C){return o(C)}},async del(y){try{let C=y.body?.ids??[],v=y.params?.id,S=v?[...C,v]:C;if(S.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of S)await e.removeCard(B);return await a(S.map(B=>({kind:"card_removed",cardId:B}))),r({count:S.length})}catch(C){return o(C)}},async patch(y){try{let C=y.params?.id,v=y.params?.path;if(!C)return n("patch requires params.id");if(!v)return n("patch requires params.path");let S=y.body,B=S&&Object.prototype.hasOwnProperty.call(S,"value")?S.value:y.body;await e.patchCard(C,v,B);let T=await e.readCard(C);return T?(await a([{kind:"card_refreshed",cardId:C,card:T}]),r({count:1})):n(`card "${C}" not found`)}catch(C){return o(C)}},async appendFiles(y){try{let C=y.params?.id;if(!C)return n("appendFiles requires params.id");let v=await e.readCard(C);if(!v)return n(`card "${C}" not found`);let S=p(y.body);if(!S||S.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=v.card_data&&typeof v.card_data=="object"&&!Array.isArray(v.card_data)?v.card_data:{},T=Array.isArray(B.files)?B.files:[],_=[...T,...S],x=S.map((f,s)=>({idx:T.length+s,entry:f})),h=await this.patch({params:{id:C,path:"card_data.files"},body:{value:_}});return h.status!=="success"?h:r({files_added:x})}catch(C){return o(C)}}}}async function Fn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Or(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Fr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Or(r),leaseToken:r.leaseToken,leaseExpiresAt:r.leaseExpiresAt}))},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},async peekActive(){return (await e.peekActive()).map(Or)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Or(t),reason:t.reason}))}}}function qn(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return Xt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Yt(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){return e.write("board-runtime-store-ref",r)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){return e.write("card-store-ref",r)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){return e.write("outputs-store-ref",r)},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){return e.write("queue-store-ref",r)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){return e.write("scratch-store-ref",r)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){return e.write("chat-store-ref",r)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){return e.write("artifacts-store-ref",r)},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){return e.write("fetched-sources-store-ref",r)}}}function ta(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function mr(e,t){return ta(e)?e.then(t):t(e)}function Nn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=Nn(r[n],o):r[n]=o;return r}function pr(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let a=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:pr(a,o,r)}}function jn(e){return {read:r=>e.read(r),get(r,n){return mr(e.read(r),o=>{if(o===null)return null;let a=o;for(let d of n.split(".").filter(Boolean)){if(a===null||typeof a!="object"||Array.isArray(a))return null;a=a[d]??null;}return a??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return mr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return mr(e.read(r),o=>e.write(r,Nn(o??{},n)))},patch(r,n,o){return mr(e.read(r),a=>{let d=n.split(".").filter(Boolean);return e.write(r,pr(a??{},d,o))})}}}function gr(e){return jn(e)}function yr(e,t){return {async readIndex(){return await e.read("_index")},writeIndex(r){return e.write("_index",r)},async readCard(r){return await e.read(r)},async writeCard(r,n){return await e.write(r,n),t(n)},removeCard(r){return e.delete(r)},async cardExists(r){return await e.read(r)!==null},defaultCardKey(r){return r}}}function hr(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,a]of Object.entries(await r())){if(!await e.cardExists(a.key))continue;let d=await e.readCard(a.key);d?n.push(d):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,a]of Object.entries(await r()))n[o]=a.checksum;return n},async changedSince(n){let o=await r(),a=[];for(let[d,u]of Object.entries(o))n[d]!==u.checksum&&a.push(d);for(let d of Object.keys(n))o[d]||a.push(d);return a},async validateUpsert(n,o){let a=await r(),d=a[n],u=Object.entries(a).find(([,p])=>p.key===o);return d&&d.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${d.key}", cannot remap to "${o}"`}:u&&u[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,a){let d=await r(),u=a??d[n]?.key??e.defaultCardKey(n),p=await e.writeCard(u,o);d[n]={key:u,checksum:p,updatedAt:new Date().toISOString()},await e.writeIndex(d);},async patchCard(n,o,a){let d=await r(),u=d[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let p=await e.readCard(u.key);if(!p||typeof p!="object"||Array.isArray(p))throw new Error(`card "${n}" is not patchable`);let y=String(o||"").split(".").filter(Boolean),C=pr(p,y,a),v=await e.writeCard(u.key,C);d[n]={key:u.key,checksum:v,updatedAt:new Date().toISOString()},await e.writeIndex(d);},async removeCard(n){let o=await r(),a=o[n];a&&(await e.removeCard(a.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function Pe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ve(e){return {status:"fail",error:e}}function Te(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}var Ln="sys_keys_board_state";function Ke(){return new Date().toISOString()}function ra(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function $n(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function Rr(e){try{let t=JSON.parse($n(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Mn(e){return ra(JSON.stringify(e))}function Dn(e){try{let t=JSON.parse($n(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function na(e){return Er(e,vn,()=>({_sources:{}}))}function oa(e,t){return rr(e,t)}function aa(e){return nr(e)}function sa(e,t){return _r(e,t)}function ia(e,t,r,n,o,a){return async d=>{let u=[],p=await r.cardStore.readCard(d.nodeId);if(!p)return "task-initiate-failure";let y=p.id,C=p.card_data??{},v=p.source_defs??[],S=v,B=await r.cardRuntimeStore.readRuntime(y),T=false,_=async()=>{T&&(await r.cardRuntimeStore.writeRuntime(y,B),T=false);},x=H=>Ft(B._sources[H]),h=(H,re)=>{B._sources[H]=Ft(re),T=true;},f=d.taskState?.executionCount??0;if(B._lastExecutionCount!==f&&(B._sources={},B._lastExecutionCount=f,T=true),d.update){let H=d.update.outputFile;if(H){let re=x(H);if(d.update.failure){let ie=d.update.rqt??re.lastRequestedToken??re.queueRequestedToken;ie&&h(H,Nt(re,ie));}else {let ie=d.update.rqt;if(!re.lastCompletedToken||ie>re.lastCompletedToken){let Q=typeof d.update.deliveryToken=="string"?d.update.deliveryToken:void 0,Z=Q?await r.fetchedSourcesStore.commitSourceData(y,H,Q):false;h(H,Z?Br(re,ie):Nt(re,ie));}}await _();}}let s={};for(let H of v){if(!H.outputFile)continue;let re=await r.fetchedSourcesStore.readSourceData(y,H.outputFile);re!==null&&(s[H.bindTo]=re);}let l={};for(let[H,re]of Object.entries(d.state??{}))if(re!==null&&typeof re=="object"&&!Array.isArray(re)){let ie=re[H];l[H]=ie!==void 0?ie:re;}else l[H]=re;let m={id:y,card_data:{...C},requires:l,source_defs:v,compute:p.compute};m._sourcesData=s,p.compute&&Je.runSync(m,{sourcesData:s}),(o??(()=>{}))(y,m.computed_values??{});let g=Je.enrichSourcesSync(Array.isArray(p.source_defs)?p.source_defs:void 0,{card_data:p.card_data,requires:l}),k={...p,source_defs:Array.isArray(g)?g.map(H=>({...H,boardDir:typeof H.boardDir=="string"&&H.boardDir?H.boardDir:e.value})):g},I=Ke(),q=d.update?void 0:I,L=S.filter(H=>{let re=H.outputFile;if(typeof re!="string"||!re)return true;let ie=x(re);q&&(ie={...ie,queueRequestedToken:q},h(re,ie));let Q=ie.queueRequestedToken??ie.lastRequestedToken??I;return qt(ie,Q)==="dispatch"});if(await _(),L.length>0){let H=false,re=I;for(let ie of L){let Q=ie.outputFile;if(typeof Q!="string"||!Q)continue;let Z=x(Q),ae=Z.queueRequestedToken??I;h(Q,{...Z,lastRequestedToken:ae}),re=ae,H=true;}return H&&await _(),H&&(u.push({taskKind:"source-fetch",payload:{boardRef:Se(e),enrichedCard:k,callbackToken:d.callbackToken,rqt:re}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(S.some(H=>{let re=H.outputFile;if(typeof re!="string"||!re)return false;let ie=x(re),Q=ie.queueRequestedToken??ie.lastRequestedToken??I;return qt(ie,Q)==="in-flight"}))return "task-initiated";let J=p.provides??[],X={};for(let{bindTo:H,ref:re}of J)X[H]=Je.resolve(m,re);return (a??(()=>{}))(X),n(d.nodeId,X),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Vn(e,t,r={}){Jt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),a=Se(e),d=r.emitNotification??(E=>{if(!t.publishBoardChangeNotifications)return;let c=E.kind==="notification-batch"?E.notifications:[E];return t.publishBoardChangeNotifications(c)}),u=null,p=r.boardRuntimeStoreRef,y=r.scratchStoreRef,C=r.taskExecutorRef,v=r.chatHandlerFlow;function S(){if(!p)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return p}function B(E){if(E.length!==0)try{let c=Fe(E),w=qe({kind:"notification-batch",notifications:c});return Promise.resolve(d(w)).catch(A=>{o(`[async-board-live-cards-public] emitNotification failed: ${A instanceof Error?A.message:String(A)}`);})}catch(c){o(`[async-board-live-cards-public] emitNotification failed: ${c instanceof Error?c.message:String(c)}`);return}}let T=()=>qn(t.kvStorageForRef(S())),_=e.value,x=()=>er(Pr(()=>t.kvStorageForRef(S()),t.hashFn),"v1"),h=async()=>{let E=await T().readOutputsStoreRef();if(!E)throw new Error(`Board at ${e.value} has no outputs store configured.`);return aa(t.kvStorageForRef(E))},f=async()=>{let E=await T().readCardStoreRef();if(!E)throw new Error(`Board at ${e.value} has no card store configured.`);let c=t.kvStorageForRef(E);return hr(yr(gr(c),t.hashFn),o)};async function s(){return !!(await x().readSnapshot(_)).values[dt]}async function l(){let E=await x().readSnapshot(_);if(!E.values[dt])throw new Error(`Board not initialized at ${e.value}`);return ur(E.values)}async function m(E,c){let w=await x().commitSnapshot(_,{schemaVersion:"v1",expectedVersion:c,deleteKeys:[],shallowMerge:ir(E)});if(!w.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${c??"null"} current=${w.currentVersion??"null"}`)}let g=()=>Cn(t.journalStorageForRef(S()));async function k(){return C??await T().readTaskExecutorRef()}function I(E){if(!E||typeof E!="object"||Array.isArray(E))return false;let c=E.__private;return !!c&&typeof c=="object"&&!Array.isArray(c)&&c.visible_controlplane_only===true}async function q(E){let c=await(await f()).readAllCards(),w=[...new Set(c.filter(N=>!I(N)).map(N=>N.id).filter(N=>typeof N=="string"&&N.length>0))].sort(),A=[...new Set(Object.keys(E).filter(N=>N&&N!==Ln))].sort();return {card_ids:w,data_object_keys:A}}async function L(){let E=await(await h()).readAllDataObjects();return {...E,[Ln]:await q(E)}}async function V(E){await g().appendEvent(E);}async function J(){let E=await T().readFetchedSourcesStoreRef();if(!E)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return E}async function X(){return t.blobStorageForRef(await J())}async function H(){return oa(await X(),E=>t.resolveBlob(E))}async function re(E){let c=(await X()).keyRef?.(E);if(!c)throw new Error("configured fetched-sources store does not support keyRef");let w=await Promise.resolve(c);return Se(w)}async function ie(){let E=sa(t.kvStorageForRef(S()),async(R,F)=>{let $=R.payload,ee=($.enrichedCard??{}).id??$.cardId??"unknown";await V({type:"task-failed",taskName:ee,error:F,timestamp:Ke()});}),c=na(t.kvStorageForRef(S())),w=await X(),A=await H(),N=await f(),M=await h(),K=new Map,U=new Map,ne=[],xe=[],Ie=[],Ae=new Map,le=new Set,ge={async readRuntime(R){return K.get(R)??await c.readRuntime(R)},async writeRuntime(R,F){K.set(R,F),Me[R]=F;}},$e={async readSourceData(R,F){let $=`${R}/${F}`;return U.has($)?U.get($):await A.readSourceData(R,F)},ingestSourceDataStaged(R,F,$,te){return A.ingestSourceDataStaged(R,F,$,te)},async commitSourceData(R,F,$){let te=`${R}/.staged/${$}/${F}`,ee=await w.read(te);if(ee==null){let Ce=await Promise.resolve(w.keyRef?.(te));Ce&&(ee=await t.resolveBlob(Ce));}if(ee==null)return false;let Re=`${R}/${F}`,fe=ee.trim();try{U.set(Re,JSON.parse(fe));}catch{U.set(Re,fe);}return ne.push({cardId:R,outputFile:F,deliveryToken:$}),true},async hasSource(R,F){let $=`${R}/${F}`;return U.has($)||await A.hasSource(R,F)},async listSources(R){let F=await A.listSources(R),$=[...U.keys()].filter(te=>te.startsWith(`${R}/`)).map(te=>te.slice(`${R}/`.length));return [...new Set([...F,...$])]}},be=await l(),Ne=kt(be.graph),Me={...be.runtimeByCardId},{events:ye,newCursor:Ye}=await g().readEntriesAfterCursor(be.lastDrainedJournalId),De=ye,He=Gt(Ne,{handlers:{"card-handler":ia(e,Ye,{cardStore:N,cardRuntimeStore:ge,fetchedSourcesStore:$e,executionRequestStore:E},(R,F)=>{De.push({type:"task-completed",taskName:R,data:F,timestamp:Ke()});},(R,F)=>{xe.push({cardId:R,values:F});},R=>{Ie.push(R);})},onNodeRemoved:R=>{Ae.delete(R),K.delete(R),delete Me[R],le.add(R);}});for(;De.length>0;){let R=De;De=[];for(let F of R)if(F.type==="task-restart"){let $=await N.readCard(F.taskName);$&&Ae.set(F.taskName,$);}He.pushAll(R),await He.waitForHandlers();}let pt=He.getState();await He.dispose({wait:true}),await m({lastDrainedJournalId:Ye,graph:Rt(pt),runtimeByCardId:Me},(await x().readSnapshot(_)).version);for(let{cardId:R,values:F}of xe)await M.writeComputedValues(R,F);for(let R of Ie)await M.writeDataObjects(R);for(let[R,F]of K)await c.writeRuntime(R,F);for(let R of ne)await A.commitSourceData(R.cardId,R.outputFile,R.deliveryToken);let rt=Ct(a,pt);await M.writeStatusSnapshot(rt);let at=[];for(let{cardId:R,values:F}of xe)at.push({kind:"computed_values",cardId:R,values:F});for(let R of Ie)for(let[F,$]of Object.entries(R))at.push({kind:"data_object",key:F,payload:$});for(let[R,F]of Ae)at.push({kind:"card_refreshed",cardId:R,card:F});for(let R of le)at.push({kind:"card_removed",cardId:R});at.push({kind:"status",status:rt}),await B(at);let nt=await k();if(!nt)return;let j=t.supportsDirectSourceOutput?.(nt)===true;await E.dispatchEntriesForJournalId(Ye,async R=>{if(R.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${R.taskKind}" \u2014 skipping`);return}let F=R.payload,$=F.enrichedCard?.id??"unknown",te=F.enrichedCard?.source_defs??[];if(nt.howToRun==="queue-storage"&&j){try{let ee=await T().readQueueStoreRef();if(!ee)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let Re=t.queueStorageForRef(ee,"task-executor"),fe=typeof nt.extra?.boardId=="string"?nt.extra.boardId:void 0,Ce=[];for(let _e of te){if(!_e.outputFile)continue;let je=t.genId(),Ue=`${$}/.staged/${je}/${_e.outputFile}`,Ve=await Promise.resolve(w.keyRef?.(Ue));if(!Ve)continue;let lt={ref:Se(Ve),deliveryToken:je,outputFile:_e.outputFile,cardId:$},Xe=Mn({cbk:F.callbackToken,rg:e.value,br:Se(e),cid:$,b:_e.bindTo,d:_e.outputFile,cs:void 0,rqt:F.rqt,dt:lt.deliveryToken});Ce.push({...fe?{boardId:fe}:{},ref:nt,args:{source_def:_e,base_ref:Se(e),callback:n.createCallback(Xe),output:lt}});}Ce.length>0&&await Re.enqueueMany(Ce);}catch(ee){await V({type:"task-failed",taskName:$,error:ee instanceof Error?ee.message:String(ee),timestamp:Ke()});}return}for(let ee of te){if(!ee.outputFile)continue;let Re;if(j){let _e=t.genId(),je=`${$}/.staged/${_e}/${ee.outputFile}`,Ue=await Promise.resolve(w.keyRef?.(je));Ue&&(Re={ref:Se(Ue),deliveryToken:_e,outputFile:ee.outputFile,cardId:$});}let fe=Mn({cbk:F.callbackToken,rg:e.value,br:Se(e),cid:$,b:ee.bindTo,d:ee.outputFile,cs:void 0,rqt:F.rqt,...Re?{dt:Re.deliveryToken}:{}}),Ce=await t.dispatchExecution(nt,{source_def:ee,base_ref:Se(e),callback:n.createCallback(fe),...Re?{output:Re}:{}});Ce.dispatched||await V({type:"task-failed",taskName:$,error:Ce.error??"dispatch failed",timestamp:Ke()});}});}async function Q(){try{let E=async()=>{let w=await l(),{events:A}=await g().readEntriesAfterCursor(w.lastDrainedJournalId);A.length>0&&await ae();},c=await Fn(t.lock,ie,E);return Pe({ran:c!==!1})}catch(E){return Te(E)}}async function Z(){return u||(u=Q().finally(()=>{u=null;}),u)}async function ae(){let E=await T().readQueueStoreRef();if(!E)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let c=t.queueStorageForRef(E,"process-accumulated");c.enqueueIfAbsent?await c.enqueueIfAbsent({boardRef:Se(e)},`process-accumulated:${Se(e)}`):await c.enqueue({boardRef:Se(e)}),await t.requestProcessAccumulated?.();}async function de(){let E=await T().readQueueStoreRef();if(!E)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let c=t.queueStorageForRef(E,"process-accumulated");for(;;){let w=await c.lease({max:64,visibilityMs:1e3});if(w.length<=0)return;for(let A of w)await c.ack(A.id,A.leaseToken);if(w.length<64)return}}function ke(){ae();}return {async init(E){try{let c=E.params?.cardStoreRef;if(!c)return ve("init requires params.cardStoreRef");if(p=E.params?.boardRuntimeStoreRef,!p)return ve("init requires params.boardRuntimeStoreRef");let w=E.params?.outputsStoreRef;if(!w)return ve("init requires params.outputsStoreRef");let A=E.params?.queueStoreRef;if(!A)return ve("init requires params.queueStoreRef");let N=E.params?.fetchedSourcesStoreRef;if(!N)return ve("init requires params.fetchedSourcesStoreRef");y=E.params?.scratchStoreRef;let M=E.params?.chatStoreRef;if(!M)return ve("init requires params.chatStoreRef");let K=E.params?.artifactsStoreRef;if(!K)return ve("init requires params.artifactsStoreRef");await s()||await m({lastDrainedJournalId:"",graph:Rt(xt(Lt)),runtimeByCardId:{}},null);let U=T();return await U.writeBoardRuntimeStoreRef(p),await U.writeCardStoreRef(c),await U.writeOutputsStoreRef(w),await U.writeQueueStoreRef(A),await U.writeFetchedSourcesStoreRef(N),await U.writeChatStoreRef(M),await U.writeArtifactsStoreRef(K),await(await h()).writeStatusSnapshot(Ct(a,kt((await l()).graph))),Pe()}catch(c){return Te(c)}},async status(E){try{let c=await h(),w=await c.readStatusSnapshot();return w||(w=Ct(a,kt((await l()).graph)),await c.writeStatusSnapshot(w)),Pe(w)}catch(c){return Te(c)}},async getCardStoreRef(E){try{let c=await T().readCardStoreRef();return c?Pe({storeRef:c}):ve(`Board at ${e.value} has no card store configured`)}catch(c){return Te(c)}},async getBoardRuntimeStoreRef(E){try{return Pe({storeRef:p??null})}catch(c){return Te(c)}},async getOutputsStoreRef(E){try{let c=await T().readOutputsStoreRef();return c?Pe({storeRef:c}):ve(`Board at ${e.value} has no outputs store configured`)}catch(c){return Te(c)}},async getScratchStoreRef(E){try{return Pe({storeRef:y??null})}catch(c){return Te(c)}},async getChatStoreRef(E){try{return Pe({storeRef:await T().readChatStoreRef()})}catch(c){return Te(c)}},async getArtifactsStoreRef(E){try{return Pe({storeRef:await T().readArtifactsStoreRef()})}catch(c){return Te(c)}},async getFetchedSourcesStoreRef(E){try{return Pe({storeRef:await T().readFetchedSourcesStoreRef()})}catch(c){return Te(c)}},async getConfig(E){try{let c=E.params?.key;if(!c)return ve("getConfig requires params.key");let w=T(),A;switch(c){case "task-executor":A=C??null;break;case "chat-handler-flow":A=v??null;break;case "board-runtime-store-ref":A=await w.readBoardRuntimeStoreRef();break;case "card-store-ref":A=await w.readCardStoreRef();break;case "outputs-store-ref":A=await w.readOutputsStoreRef();break;case "scratch-store-ref":A=y??null;break;case "chat-store-ref":A=await w.readChatStoreRef();break;case "artifacts-store-ref":A=await w.readArtifactsStoreRef();break;case "fetched-sources-store-ref":A=await w.readFetchedSourcesStoreRef();break;default:return ve(`getConfig: unknown key "${c}"`)}return Pe({value:A})}catch(c){return Te(c)}},async getOutputsDataObject(E){try{let c=E.params?.key;if(!c)return ve("getOutputsDataObject requires params.key");let w=await L();return Pe(w[c]??null)}catch(c){return Te(c)}},async getAllOutputsDataObjects(E){try{return Pe(await L())}catch(c){return Te(c)}},async getOutputsComputedValues(E){try{let c=E.params?.key;return c?Pe(await(await h()).readComputedValues(c)):ve("getOutputsComputedValues requires params.key")}catch(c){return Te(c)}},async getAllOutputsComputedValues(E){try{return Pe(await(await h()).readAllComputedValues())}catch(c){return Te(c)}},async getOutputsFetchedSources(E){try{let c=E.params?.key;if(!c)return ve("getOutputsFetchedSources requires params.key");let w=await(await H()).listSources(c),A={};for(let N of w)A[N]=await re(`${c}/${N}`);return Pe(A)}catch(c){return Te(c)}},async getAllOutputsFetchedSources(E){try{let c=await H(),w=await(await X()).listKeys(),A=new Set;for(let M of w){let K=M.indexOf("/");K>0&&!M.includes("/.staged/")&&A.add(M.slice(0,K));}let N={};for(let M of A){let K=await c.listSources(M);if(K.length!==0){N[M]={};for(let U of K)N[M][U]=await re(`${M}/${U}`);}}return Pe(N)}catch(c){return Te(c)}},async buildSseOneShotPayload(E){try{let c=await(await f()).readAllCards(),w=await this.status({});if(w.status!=="success")return w;let A=await this.getAllOutputsDataObjects({});if(A.status!=="success")return A;let N=await this.getAllOutputsComputedValues({});if(N.status!=="success")return N;let M=N.data,K={};for(let U of c){let ne=typeof U?.id=="string"?U.id:null;if(!ne)continue;let xe=U.card_data&&typeof U.card_data=="object"&&!Array.isArray(U.card_data)?U.card_data:{};K[ne]={schema_version:"v1",card_id:ne,card_data:{...xe},computed_values:M[ne]&&typeof M[ne]=="object"?M[ne]:{}};}return Pe({cardDefinitions:c,statusSnapshot:w.data,dataObjectsByToken:A.data,cardRuntimeById:K})}catch(c){return Te(c)}},async addCardFiles(E){try{let c=E.params?.cardId;if(!c)return ve("addCardFiles requires params.cardId");let A=await fr(await f(),{emitNotification:d}).appendFiles({params:{id:c},body:E.body});return A.status!=="success"?A:Pe({cardId:c,files_added:A.data.files_added,notified:!0})}catch(c){return Te(c)}},async removeCard(E){try{let c=E.params?.id;if(!c)return ve("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(c);}catch{}return await V({type:"task-removal",taskName:c,timestamp:Ke()}),ke(),Pe()}catch(c){return Te(c)}},async retrigger(E){try{let c=E.params?.id;return c?(await V({type:"task-restart",taskName:c,timestamp:Ke()}),ke(),Pe()):ve("retrigger requires params.id")}catch(c){return Te(c)}},async processAccumulatedEvents(E){return await de(),Z()},async upsertCard(E){try{let c=E.params?.cardId,w=E.params?.all,A=!!E.params?.restart;if(!c&&!w)return ve("upsertCard requires --card-id <id> or --all");let N=await f(),M=w?(await N.readAllCards()).map(U=>U.id):[c];for(let U of M)if(!await N.readCard(U))return ve(`Card "${U}" not found in board at ${e.value}`);let K=t.kvStorage("card-upsert");for(let U of M){let ne=await N.readCard(U);if(!ne)continue;let xe=cr(ne),Ie=t.hashFn(xe),Ae=await K.read(U),le=Ae?.taskConfigHash!==Ie;if(!(!le&&!A)){if(le){let ge=Ae?.blobRef??await N.readCardKey(U)??U;await V({type:"task-upsert",taskName:U,taskConfig:xe,timestamp:Ke()}),await K.write(U,{blobRef:ge,taskConfigHash:Ie,updatedAt:Ke()});}A&&await V({type:"task-restart",taskName:U,timestamp:Ke()});}}return ke(),Pe()}catch(c){return Te(c)}},async taskFailed(E){try{let c=E.params?.token;if(!c)return ve("taskFailed requires params.token");let w=E.params?.error??"unknown error",A=Rr(c);return A?(await V({type:"task-failed",taskName:A.taskName,error:w,timestamp:Ke()}),ke(),Pe()):ve("Invalid callback token")}catch(c){return Te(c)}},async taskProgress(E){try{let c=E.params?.token;if(!c)return ve("taskProgress requires params.token");let w=(E.body??{}).update??{},A=Rr(c);return A?(await V({type:"task-progress",taskName:A.taskName,update:w,timestamp:Ke()}),ke(),Pe()):ve("Invalid callback token")}catch(c){return Te(c)}},async sourceDataFetched(E){try{let c=E.params?.token,w=E.params?.ref;if(!c)return ve("sourceDataFetched requires params.token");if(!w)return ve("sourceDataFetched requires params.ref");let A=Dn(c);if(!A)return ve("Invalid source token");let N=await H(),M=A.dt||t.genId();A.dt||await N.ingestSourceDataStaged(A.cid,A.d,st(w),M);let K=Rr(A.cbk);return K?(await V({type:"task-progress",taskName:K.taskName,update:{bindTo:A.b,outputFile:A.d,fetchedAt:Ke(),deliveryToken:M,sourceChecksum:A.cs,rqt:A.rqt},timestamp:Ke()}),ke(),Pe()):ve("Invalid callback token embedded in source token")}catch(c){return Te(c)}},async sourceDataFetchFailure(E){try{let c=E.params?.token,w=E.params?.reason??"unknown";if(!c)return ve("sourceDataFetchFailure requires params.token");let A=Dn(c);if(!A)return ve("Invalid source token");let N=Rr(A.cbk);return N?(await V({type:"task-progress",taskName:N.taskName,update:{bindTo:A.b,outputFile:A.d,failure:!0,reason:w,sourceChecksum:A.cs,rqt:A.rqt},timestamp:Ke()}),ke(),Pe()):ve("Invalid callback token embedded in source token")}catch(c){return Te(c)}}}}async function ua(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Un(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=Fe(n);if(a.length===1){await o(a[0]);return}await o(qe({kind:"notification-batch",notifications:a}));}return {async enqueue(n){let o=await e.enqueue(n);return await r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},async enqueueMany(n){let o=await e.enqueueMany(n);return await r(o.map(a=>({kind:"message_enqueued",lane:t.lane,message:a}))),o},enqueueIfAbsent:e.enqueueIfAbsent?async(n,o)=>{let a=await e.enqueueIfAbsent(n,o);return a&&await r([{kind:"message_enqueued",lane:t.lane,message:a}]),a}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,a){return e.nack(n,o,a)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},async stage(n,o){return e.stage(n,o)},async commitStaged(n){let o=await e.commitStaged(n);if(o){let a=await ua(e,n);a&&await r([{kind:"message_enqueued",lane:t.lane,message:a}]);}return o},async discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function qr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ca(e){return {...qr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function da(e){return {...qr(e),reason:e.reason}}function Nr(e){return {enqueueRequest(t){return e.enqueue(t).id},enqueueRequestIfAbsent:e.enqueueIfAbsent?(t,r)=>{let n=e.enqueueIfAbsent(t,r);return n?n.id:null}:void 0,leaseRequests(t){return e.lease(t).map(ca)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(qr)},peekDeadLetter(){return e.peekDeadLetter().map(da)}}}function la(e,t){return e.peekActive().find(r=>r.id===t)}function Kn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=Fe(n);if(a.length===1){await o(a[0]);return}await o(qe({kind:"notification-batch",notifications:a}));}return {enqueue(n){let o=e.enqueue(n);return r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},enqueueMany(n){let o=e.enqueueMany(n);return r(o.map(a=>({kind:"message_enqueued",lane:t.lane,message:a}))),o},enqueueIfAbsent:e.enqueueIfAbsent?(n,o)=>{let a=e.enqueueIfAbsent(n,o);return a&&r([{kind:"message_enqueued",lane:t.lane,message:a}]),a}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,a){return e.nack(n,o,a)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},stage(n,o){return e.stage(n,o)},commitStaged(n){let o=e.commitStaged(n);if(o){let a=la(e,n);a&&r([{kind:"message_enqueued",lane:t.lane,message:a}]);}return o},discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Hn(){return new Date().toISOString()}function Jn(e){return new TextEncoder().encode(e).byteLength}function fa(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Qn(e){function t(r){let n=e.stat?fa(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let o=e.read(r);return o===null?{key:r}:{key:r,size:Jn(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Hn(),a.size=a.size??Jn(n),a},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let d=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,d);}let a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Hn(),a.size=a.size??n.byteLength,a},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function Gn(){function e(o,a){if(!Array.isArray(o))return [];let d=[];for(let u of o){if(!u||typeof u!="object")continue;let p=u;typeof p.stored_name=="string"&&d.push({name:typeof p.name=="string"?p.name:p.stored_name,stored_name:p.stored_name,size:typeof p.size=="number"&&Number.isFinite(p.size)?p.size:null,mime_type:typeof p.mime_type=="string"?p.mime_type:null,uploaded_at:typeof p.uploaded_at=="string"?p.uploaded_at:a||null,chat:p.chat===true});}return d}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,a){let d=t(o);if(a.length===0)return o.files=d,d;let u=new Set(d.map(p=>p.stored_name));for(let p of a)u.has(p.stored_name)||(d.push(p),u.add(p.stored_name));return o.files=d,d}function n(o,a,d){let u=t(o);if(!Number.isInteger(a)||a<0||a>=u.length)return {ok:false,reason:"index_out_of_range"};let p=u[a];return !p||!p.stored_name?{ok:false,reason:"missing_stored_name"}:d&&d!==p.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:p}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function Wn(e,t={}){let r=t.emitNotification;function n(h){let f=typeof h=="number"?h:Number(h);return Number.isInteger(f)&&f>0?f:null}function o(h,f){let s=f;for(let l=h.length-1;l>=0;l-=1)if(h[l]?.role==="user"&&(s-=1,s===0))return h.slice(l);return h}function a(h){return h.some(f=>typeof f?.turn=="string"&&f.turn!=="")}function d(h,f){if(f<=0)return [];if(!a(h))return o(h,f);let s=new Map,l=[];for(let g of h){let k=typeof g?.turn=="string"?g.turn:"";s.has(k)||(s.set(k,[]),l.push(k)),s.get(k).push(g);}return l.slice(Math.max(0,l.length-f)).flatMap(g=>s.get(g)??[])}function u(h){return {status:"success",data:h}}function p(h){return {status:"fail",error:h}}function y(h){return {status:"error",error:h instanceof Error?h.message:String(h)}}function C(h){return {role:String(h.role||"system"),text:String(h.text||""),files:Array.isArray(h.files)?h.files:[],...typeof h.turn=="string"&&h.turn?{turn:h.turn}:{}}}async function v(h){if(!r||h.length===0)return;let f=Fe(h);if(f.length===1){await r(f[0]);return}await r(qe({kind:"notification-batch",notifications:f}));}async function S(h){let f=await e.readAll(h);return d(f,1).map(C)}async function B(h){let f=Date.now();return {kind:"card_chats",cardId:h,sentAt:new Date(f).toISOString(),sentAtMs:f,messages:await S(h),receiving:true,processing:await e.isProcessing(h)}}async function T(h,f="command envelope"){let s=typeof h.cardId=="string"?h.cardId:void 0;if(!h.command)return p(`chat-store: ${f} missing "command"`);if(!s)return p(`chat-store: ${f} missing "cardId"`);if(h.command==="append")return await x.append({params:{cardId:s},body:{role:h.role,text:h.text,files:h.files,turn:h.turn}});if(h.command==="read-all")return await x.readAll({params:{cardId:s},body:{lastUserTurns:h.lastUserTurns,tailTurns:h.tailTurns,turnId:h.turnId,allTurns:h.allTurns,tailTurnsBeforeId:h.tailTurnsBeforeId}});if(h.command==="read-after")return await x.readAfter({params:{cardId:s},body:{cursor:h.cursor??null}});if(h.command==="clear")return await x.clear({params:{cardId:s}});if(h.command==="set-processing")return await x.setProcessing({params:{cardId:s},body:{active:h.active}});if(h.command==="is-processing")return await x.isProcessing({params:{cardId:s}});if(h.command==="get-config")return await x.getConfig({params:{cardId:s}});if(h.command==="set-config"){let{command:l,cardId:m,...g}=h;return await x.setConfig({params:{cardId:s},body:g})}return p(`chat-store: unknown command "${String(h.command)}"`)}async function _(h){if(!Array.isArray(h.commands)||h.commands.length===0)return p('chat-store: command envelope must include a non-empty "commands" array');let f=[];for(let s=0;s<h.commands.length;s+=1){let l=h.commands[s];if(!l||typeof l!="object"||Array.isArray(l))return p(`chat-store: command envelope entry ${s} must be an object`);let m={cardId:h.cardId,...l},g=await T(m,`command envelope entry ${s}`);if(g.status!=="success")return g;f.push({index:s,command:String(m.command),data:g.data});}return u({results:f})}let x={async append(h){try{let f=h.params?.cardId;if(!f)return p("append requires params.cardId");let s=h.body??{},l=typeof s.role=="string"?s.role:"",m=typeof s.text=="string"?s.text:"",g=Array.isArray(s.files)?s.files:[],k=typeof s.turn=="string"?s.turn:"";if(!l)return p("append requires body.role");let I=await e.append(f,l,m,g,k);return await v([{kind:"chat_messages",cardId:f,messages:await S(f)}]),u({id:I})}catch(f){return y(f)}},async readAll(h){try{let f=h.params?.cardId;if(!f)return p("readAll requires params.cardId");let s=h.body??{},l=typeof s.turnId=="string"?s.turnId:"",m=s.allTurns===!0,g=typeof s.tailTurnsBeforeId=="string"?s.tailTurnsBeforeId:"",k=s.tailTurns===void 0?s.lastUserTurns:s.tailTurns,I=k===void 0?m||l?void 0:1:n(k);if(k!==void 0&&I===null)return p("readAll requires body.tailTurns (positive integer)");let q=await e.readAll(f),L=q.filter(V=>!l||String(V.turn||"")===l);if(g){let V=I;if(typeof V!="number"||!Number.isInteger(V)||V<=0)return p("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let J=new Map,X=[];for(let Q of q){let Z=String(Q.turn||"");J.has(Z)||(J.set(Z,[]),X.push(Z)),J.get(Z).push(Q);}let H=X.findIndex(Q=>Q===g),re=Math.max(0,H-V);return L=(H===-1?[]:X.slice(re,H)).flatMap(Q=>J.get(Q)??[]),u({records:L})}return u(typeof I=="number"?{records:d(L,I)}:{records:L})}catch(f){return y(f)}},async buildSseOneShotBatch(h){try{let f=h.params?.cardId;if(!f)return p("buildSseOneShotBatch requires params.cardId");let s=h.body??{},l=typeof s.receiving=="boolean"?s.receiving:!0,m=await B(f);return u(qe({kind:"notification-batch",notifications:[{...m,receiving:l}]}))}catch(f){return y(f)}},async readAfter(h){try{let f=h.params?.cardId;if(!f)return p("readAfter requires params.cardId");let l=(h.body??{}).cursor??null;return u(await e.readAfter(f,l))}catch(f){return y(f)}},async clear(h){try{let f=h.params?.cardId;return f?(await e.clear(f),u({ok:!0})):p("clear requires params.cardId")}catch(f){return y(f)}},async setProcessing(h){try{let f=h.params?.cardId;if(!f)return p("setProcessing requires params.cardId");let s=h.body??{};return typeof s.active!="boolean"?p("setProcessing requires body.active (boolean)"):(await e.setProcessing(f,s.active),await v([{kind:"chat_processing",cardId:f,active:s.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(f){return y(f)}},async isProcessing(h){try{let f=h.params?.cardId;return f?u({active:await e.isProcessing(f)}):p("isProcessing requires params.cardId")}catch(f){return y(f)}},async getConfig(h){try{let f=h.params?.cardId;return f?u({config:await e.getConfig(f)}):p("getConfig requires params.cardId")}catch(f){return y(f)}},async setConfig(h){try{let f=h.params?.cardId;if(!f)return p("setConfig requires params.cardId");let s=h.body??{};return await e.setConfig(f,s),u({ok:!0})}catch(f){return y(f)}},run:T,runBatch:_};return x}function It(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function zn(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(It):[]:It(e)?[e]:[]}function Yn(e,t,r){let n=0;return {accepted:e.filter(a=>{if(!It(a))return n++,false;let d=a;return typeof d.sentAtMs=="number"&&t-d.sentAtMs>r?(n++,false):true}),rejected:n}}function Zn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function jr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function ma(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function Xn(e,t){if(t.kind==="status"){jr(t.status)&&(e.status=t.status);return}if(t.kind==="computed_values"){e.computedValues[t.cardId]=t.values;return}if(t.kind==="data_object"){e.dataObjects[t.key]=t.payload;return}if(t.kind==="card_refreshed"){e.cards[t.cardId]=t.card;return}t.kind==="card_removed"&&(delete e.cards[t.cardId],delete e.computedValues[t.cardId]);}function eo(e,t){if(ma(t)){for(let r of t.notifications)It(r)&&Xn(e,r);return}It(t)&&Xn(e,t);}function Lr(e){let t=new Map,r=0;function n(f){let s=JSON.stringify(f);return r++,`id: ${r}
2
- data: ${s}
1
+ var ServerRuntimeControlface=(function(exports){'use strict';var To=Object.defineProperty;var Io=(e,t,r)=>t in e?To(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var rn=(e,t,r)=>Io(e,t+"",r);var Jt="b64:";function Po(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let a of t)o+=String.fromCharCode(a);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function _o(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let a=0;a<n.length;a+=1)o[a]=n.charCodeAt(a);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Te(e){return `${Jt}${Po(JSON.stringify(e))}`}function it(e){if(!e.startsWith(Jt))throw new Error(`Invalid ref format (expected ${Jt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(_o(e.slice(Jt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${e}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${e}`);let r=t;if(typeof r.kind!="string"||typeof r.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:r.kind,value:r.value}}async function nn(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function rt(e){return typeof e.journalStorage=="function"}function on(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?it(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function st(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pr(e){let t=e.reduce((o,a)=>o+a.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}function me(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function ut(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function ct(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function pt(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function Qt(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let a=Number(o);if(Number.isFinite(a))return a}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function an(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}async function gt(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o,c=a.status;if(c==="success")return Object.prototype.hasOwnProperty.call(a,"data")?o:{status:"success",data:{}};if(c==="fail"||c==="error")return o}return {status:"success",data:o}}function nt(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let a=n.data;if(a&&typeof a=="object"&&!Array.isArray(a)){let c=a.issues;if(Array.isArray(c)){let f=c.find(g=>typeof g=="string"&&g.trim());if(typeof f=="string")return `Validation failed: ${f}`}let u=a.errors;if(Array.isArray(u)&&u.length>0)return "Validation failed"}}return "Validation failed"}return t}function _r(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpControlplaneToolRegistry:a,retriggerCard:c,applyCardAction:u,resolveChatHandlerTarget:f,sendCardFileDownloadResponse:g}=e;async function k(S,b,B){let I=S.method||"GET",P=B,A=P.pathname;try{if(I==="POST"&&A===`${t}/mcp-actions`){await o();let d=Date.now(),m=new Date(d).toISOString(),p=await n(S),R=typeof p.tool=="string"?p.tool.trim():"",w=p.args&&typeof p.args=="object"&&!Array.isArray(p.args)?p.args:{};if(!R)return r(b,400,{error:"tool is required"}),!0;let O=me(w,"card_id");if(!O)return r(b,400,{error:"MCP action requires card_id"}),!0;if(R==="retrigger-card"||R==="retrigger"){await c(O);let J=Date.now();return r(b,200,{status:"success",data:{ok:!0,cardId:O,actionType:R,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:200}}),!0}let N=ct(w,"payload");if(R==="chat-send"&&!await f(O)){let J=Date.now();return r(b,409,{error:`chat handler is not configured for card: ${O}`,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:409}),!0}if(R==="chat-send"){let J=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!J||!String(J).trim()){let ae=Date.now();return r(b,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${O}`,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(ae).toISOString(),responseSentAtMs:ae,responseStatus:400}),!0}}await u(O,R,N);let U=Date.now();return r(b,200,{status:"success",data:{ok:!0,cardId:O,actionType:R,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(U).toISOString(),responseSentAtMs:U,responseStatus:200}}),!0}if(I==="POST"&&A===`${t}/mcp-controlplane`){await o();let d=await n(S),m=typeof d.tool=="string"?d.tool.trim():"",p=d.args&&typeof d.args=="object"&&!Array.isArray(d.args)?d.args:{};if(!m)return r(b,400,{error:"tool is required"}),!0;try{let R=await gt(m,p,a());if(R&&typeof R=="object"&&!Array.isArray(R)){let w=R;if(w.status==="fail")return r(b,400,{error:nt(R,"Request failed")}),!0;if(w.status==="error")return r(b,500,{error:nt(R,"Internal error")}),!0}r(b,200,R);}catch(R){let w=typeof R?.statusCode=="number"?Number(R.statusCode):500,O=R instanceof Error?R.message:String(R);r(b,w,{error:O});}return !0}let y=A.match(new RegExp(`^${st(t)}/cards/([^/]+)/retrigger$`));if(I==="POST"&&y){await o();let d=decodeURIComponent(y[1]);return await c(d),r(b,200,{ok:!0}),!0}let l=A.match(new RegExp(`^${st(t)}/cards/([^/]+)/actions$`));if(I==="POST"&&l){await o();let d=decodeURIComponent(l[1]),m=Date.now(),p=new Date(m).toISOString(),R=await n(S),w=R?.actionType;if(w==="chat-send"&&!await f(d)){let N=Date.now();return r(b,409,{error:`chat handler is not configured for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(N).toISOString(),responseSentAtMs:N,responseStatus:409}),!0}if(w==="chat-send"){let N=R?.payload??{},U=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!U||!String(U).trim()){let J=Date.now();return r(b,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${d}`,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:400}),!0}}await u(d,w,R?.payload);let O=Date.now();return r(b,200,{ok:!0,requestReceivedAt:p,requestReceivedAtMs:m,responseSentAt:new Date(O).toISOString(),responseSentAtMs:O,responseStatus:200}),!0}let i=A.match(new RegExp(`^${st(t)}/cards/([^/]+)/files/(\\d+)$`));if(I==="GET"&&i){let d=decodeURIComponent(i[1]),m=parseInt(i[2],10),p=P.searchParams.get("sn");return await g(b,d,m,p),!0}return !1}catch(y){let l=y?.statusCode||500;return r(b,l,{error:String(y?.message||y)}),true}}return {handleRuntimeApi:k}}function Gt(e,t){if(!e||typeof e!="object")throw new Error(`${t}: adapter.callbackTransport is required`);if(typeof e.createCallback!="function")throw new Error(`${t}: adapter.callbackTransport.createCallback is required`)}function Eo(e){switch(e){case "computed_values":case "data_object":case "status":return "board-output";case "card_refreshed":case "card_removed":return "card-store";case "card_chats":case "chat_messages":return "chat-store";case "chat_processing":case "card_watchparty":return "hosted-runtime";case "message_enqueued":return "queue-storage"}}function Bo(e){return e.category?e:{...e,category:Eo(e.kind)}}function De(e){return e.map(t=>Bo(t))}function $e(e){return {...e,category:e.category??"batch",notifications:De(e.notifications)}}var Rt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ze(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function kt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function sn(e){return e.tasks??{}}function Er(e){return e?e.status===Rt.FAILED||e.status===Rt.INACTIVATED:false}function un(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function cn(e){return e.maxExecutions}function dn(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===Rt.COMPLETED){let a=e.tasks[n];a&&Ze(a).forEach(u=>r.add(u));}return Array.from(r)}function ln(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;Ze(o).forEach(c=>{r[c]||(r[c]=[]),r[c].push(n);});}),r}function fn(e,t,r){let n=e.tasks[t]??Wt(),o={};if(r){let c=r.tasks[t],u=kt(c);for(let f of u)for(let[g,k]of Object.entries(r.tasks))if(Ze(k).includes(f)){let S=e.tasks[g];S?.lastDataHash&&(o[f]=S.lastDataHash);break}}let a={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:a},lastUpdated:new Date().toISOString()}}function mn(e,t,r,n,o,a){let c=e.tasks[r]??Wt(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let f;n&&u.on&&u.on[n]?f=u.on[n]:f=Ze(u);let g=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let b=u.requires??[];for(let B of b)for(let[I,P]of Object.entries(t.tasks))if(Ze(P).includes(B)){let A=e.tasks[I];A?.lastDataHash&&(g[B]=A.lastDataHash);break}}let k={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:a,lastConsumedHashes:g,error:void 0},S=[...new Set([...e.availableOutputs,...f])];return {...e,tasks:{...e.tasks,[r]:k},availableOutputs:S,lastUpdated:new Date().toISOString()}}function pn(e,t,r,n){let o=e.tasks[r]??Wt(),a=t.tasks[r];if(a?.retry){let f=o.retryCount+1;if(f<=a.retry.max_attempts){let g={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:g},lastUpdated:new Date().toISOString()}}}let c={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},u=e.availableOutputs;if(a?.on_failure&&a.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...a.on_failure])]),a?.circuit_breaker&&c.executionCount>=a.circuit_breaker.max_executions){let f=a.circuit_breaker.on_break;u=[...new Set([...u,...f])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:u,lastUpdated:new Date().toISOString()}}function gn(e,t,r,n){let o=e.tasks[t]??Wt(),a={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:a},lastUpdated:new Date().toISOString()}}function yn(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function Wt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Tt(e,t){let r=`live-${Date.now()}`,n={};for(let a of Object.keys(e.tasks))n[a]=Rn();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function Oo(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:fn(n,t.taskName,r)};case "task-completed":return {config:r,state:mn(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:pn(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:gn(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:yn(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Do(n,t.action)};case "task-upsert":return Fo(e,t.taskName,t.taskConfig);case "task-removal":return qo(e,t.taskName);case "node-requires-add":return No(e,t.nodeName,t.tokens);case "node-requires-remove":return jo(e,t.nodeName,t.tokens);case "node-provides-add":return Lo(e,t.nodeName,t.tokens);case "node-provides-remove":return Mo(e,t.nodeName,t.tokens);default:return e}}function hn(e,t){return t.reduce((r,n)=>Oo(r,n),e)}function Fo(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:Rn()},lastUpdated:new Date().toISOString()}}}function qo(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...a}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:a,lastUpdated:new Date().toISOString()}}}function No(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=kt(n),a=r.filter(c=>!o.includes(c));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...a]}}},state:e.state}}function jo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=kt(n),a=o.filter(c=>!r.includes(c));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:a}}},state:e.state}}function Lo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ze(n),a=r.filter(c=>!o.includes(c));return a.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...a]}}},state:e.state}}function Mo(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=Ze(n),a=o.filter(c=>!r.includes(c));return a.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:a}}},state:e.state}}function Ct(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function bt(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function Rn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Do(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function Ft(e){let{config:t,state:r}=e,n=sn(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let a=$o(n),c=dn(t,r.tasks),u=new Set([...c,...r.availableOutputs]),f=[],g=[],k=[],S=[];for(let[B,I]of Object.entries(n)){let P=r.tasks[B],A=un(I,t.settings),y=A!=="once";if(P?.status===Rt.RUNNING||Er(P))continue;let l=cn(I);if(l!==void 0&&P&&P.executionCount>=l||I.circuit_breaker&&P&&P.executionCount>=I.circuit_breaker.max_executions||!y&&P?.status===Rt.COMPLETED)continue;if(y&&P?.status===Rt.COMPLETED){let R=kt(I),w=false;switch(A){case "data-changed":{R.length>0&&R.some(N=>{for(let[U,J]of Object.entries(n))if(Ze(J).includes(N)){let ae=r.tasks[U];if(!ae)continue;let Q=P.lastConsumedHashes?.[N];return ae.lastDataHash==null?ae.executionCount>P.lastEpoch:ae.lastDataHash!==Q}return false})||(w=true);break}case "epoch-changed":{R.length>0&&R.some(N=>{for(let[U,J]of Object.entries(n))if(Ze(J).includes(N)){let ae=r.tasks[U];if(ae&&ae.executionCount>P.lastEpoch)return true}return false})||(w=true);break}case "time-based":{let O=I.refreshInterval??0;if(O<=0){w=true;break}let N=P.completedAt;if(!N){w=true;break}(Date.now()-Date.parse(N))/1e3<O&&(w=true);break}case "manual":w=true;break}if(w)continue}let i=kt(I);if(i.length===0){f.push(B);continue}let d=[],m=[],p=[];for(let R of i){if(u.has(R))continue;let w=a[R]||[];w.length===0?d.push(R):w.every(N=>Er(r.tasks[N]))?p.push({token:R,failedProducer:w[0]}):m.push(R);}d.length>0?k.push({taskName:B,missingTokens:d}):p.length>0?S.push({taskName:B,failedTokens:p.map(R=>R.token),failedProducers:[...new Set(p.map(R=>R.failedProducer))]}):m.length>0?g.push({taskName:B,waitingOn:m}):f.push(B);}let b={};if(f.length>1){let B=ln(f,n);for(let[I,P]of Object.entries(B))P.length>1&&(b[I]=P);}return {eligible:f,pending:g,unresolved:k,blocked:S,conflicts:b}}function $o(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of Ze(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let a of o)t[a]||(t[a]=[]),t[a].includes(r)||t[a].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var qt=class{constructor(){rn(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Br(e){let t=Or(e);return Uo(t)}function Or(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Or).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Or(t[n])).join(",")+"}"}function Uo(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Vo(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Ko(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let a=0;a<n.length;a++)o[a]=n.charCodeAt(a);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function kn(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Vo(t)}function Ho(e){try{let t=JSON.parse(Ko(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function zt(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:a}=t,c=new qt,u="state"in e&&"config"in e?e:Tt(e),f=false,g=new Set,k=new Map(Object.entries(n)),S=new qt,b=false,B=false;function I(){if(!f){if(b){B=true;return}b=true;try{do B=!1,P();while(B)}finally{b=false;}}}function P(){let i=S.drain(),d=c.drain(),m=[...i,...d];if(m.length>0&&(u=hn(u,m),o)){for(let R of m)if(R.type==="task-removal")try{o(R.taskName);}catch(w){console.warn("[reactive] onNodeRemoved failed:",w instanceof Error?w.message:String(w));}}let p=Ft(u);m.length>0&&a?.(m,u,p);for(let R of p.eligible)l(R);for(let R of m)if(R.type==="task-progress"){let{taskName:w,update:O}=R;if(!u.config.tasks[w])continue;let U=u.state.tasks[w];if(!U||U.status!=="running")continue;let J=kn(w),ae=y(w,J,O).catch(Q=>{f||(S.append({type:"task-failed",taskName:w,error:Q.message??String(Q),timestamp:new Date().toISOString()}),I());}).finally(()=>{g.delete(ae);});g.add(ae);}}function A(i){let m=u.config.tasks[i].requires??[],p=new Map;for(let[w,O]of Object.entries(u.config.tasks))for(let N of O.provides??[])p.set(N,w);let R={};for(let w of m){let O=p.get(w);O?R[w]=u.state.tasks[O]?.data:R[w]=void 0;}return R}async function y(i,d,m){let p=u.config.tasks[i],R=p.taskHandlers??[],w=A(i);for(let O of R){let N=k.get(O);if(!N)throw new Error(`Handler '${O}' not found in registry (task '${i}')`);let U={nodeId:i,state:w,taskState:u.state.tasks[i],config:p,callbackToken:d,update:m};if(await N(U)==="task-initiate-failure")throw new Error(`Handler '${O}' returned task-initiate-failure (task '${i}')`)}}function l(i){let m=u.config.tasks[i]?.taskHandlers;if(!m||m.length===0)return;S.append({type:"task-started",taskName:i,timestamp:new Date().toISOString()}),I();let p=kn(i),R=y(i,p).catch(w=>{f||(S.append({type:"task-failed",taskName:i,error:w.message??String(w),timestamp:new Date().toISOString()}),I());}).finally(()=>{g.delete(R);});g.add(R);}return {push(i){f||(i.type==="task-completed"&&i.data&&!i.dataHash&&(i={...i,dataHash:Br(i.data)}),c.append(i),I());},pushAll(i){if(!f){for(let d of i)d.type==="task-completed"&&d.data&&!d.dataHash?c.append({...d,dataHash:Br(d.data)}):c.append(d);I();}},resolveCallback(i,d,m){if(f)return;let p=Ho(i);if(!p)return;let{taskName:R}=p;if(u.config.tasks[R]){if(m&&m.length>0)c.append({type:"task-failed",taskName:R,error:m.join("; "),timestamp:new Date().toISOString()});else {let w=d&&Object.keys(d).length>0?Br(d):void 0;c.append({type:"task-completed",taskName:R,data:d,dataHash:w,timestamp:new Date().toISOString()});}I();}},addNode(i,d){f||(c.append({type:"task-upsert",taskName:i,taskConfig:d,timestamp:new Date().toISOString()}),I());},removeNode(i){f||(c.append({type:"task-removal",taskName:i,timestamp:new Date().toISOString()}),I());},addRequires(i,d){f||(c.append({type:"node-requires-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),I());},removeRequires(i,d){f||(c.append({type:"node-requires-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),I());},addProvides(i,d){f||(c.append({type:"node-provides-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),I());},removeProvides(i,d){f||(c.append({type:"node-provides-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),I());},registerHandler(i,d){k.set(i,d);},unregisterHandler(i){k.delete(i);},retrigger(i){f||u.config.tasks[i]&&(c.append({type:"task-restart",taskName:i,timestamp:new Date().toISOString()}),I());},retriggerAll(i){if(!f){for(let d of i)u.config.tasks[d]&&c.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});I();}},snapshot(){return Ct(u)},getState(){return u},getSchedule(){return Ft(u)},async waitForHandlers(){g.size>0&&await Promise.allSettled([...g]);},async dispose(i){i?.wait&&g.size>0&&await Promise.allSettled([...g]),f=true;}}}function Yt(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var Jo=Yt();Jo("./jsonata-sync.cjs");var Qo=Yt(),Xt=Qo("./jsonata-sync.cjs"),Sn=Xt;function Cn(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function wn(e,t,r){let n=t.split("."),o=e;for(let a=0;a<n.length-1;a++)(o[n[a]]==null||typeof o[n[a]]!="object")&&(o[n[a]]={}),o=o[n[a]];o[n[n.length-1]]=r;}async function Go(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let a=await Xt(o.expr).evaluate(n);wn(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch{}return e}function Wo(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let a of e.compute)try{let c=Sn(a.expr).evaluate(n);wn(e.computed_values,a.bindTo,c),n.computed_values=e.computed_values;}catch(c){let u=c instanceof Error?c.message:String(c);o.push({bindTo:a.bindTo,error:u});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function zo(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Xt(e).evaluate(n)}function Yo(e,t){return t.startsWith("fetched_sources.")?Cn(e._sourcesData??{},t.slice(16)):Cn(e,t)}var bn=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Xo=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Zo(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Xo.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof a.ref!="string"||!a.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let a=n;(typeof a.bindTo!="string"||!a.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof a.expr!="string"||!a.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((a,c)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`source_defs[${c}]: must be an object`);else {let u=a;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${c}]: missing required "bindTo" property`):(n.has(u.bindTo)&&t.push(`source_defs[${c}]: bindTo "${u.bindTo}" is not unique across source_defs`),n.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${c}]: missing required "outputFile" property`):(o.has(u.outputFile)&&t.push(`source_defs[${c}]: outputFile "${u.outputFile}" is not unique across source_defs`),o.add(u.outputFile));}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,a)=>{if(!o||typeof o!="object"){t.push(`view.elements[${a}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${a}].kind: required, must be a string`):bn.has(o.kind)||t.push(`view.elements[${a}].kind: unknown kind "${o.kind}". Valid: ${[...bn].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${a}].data: must be an object`);});}return {ok:t.length===0,errors:t}}async function ea(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[a,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[a]=await Xt(c).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}}))}function ta(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[a,c]of Object.entries(n.projections))if(typeof c=="string"&&c.trim().length>0)try{o[a]=Sn(c).evaluate(r);}catch{o[a]=void 0;}}return {...n,_projections:o}})}var We={run:Go,runSync:Wo,eval:zo,resolve:Yo,validate:Zo,enrichSources:ea,enrichSourcesSync:ta};function Zt(e){return JSON.stringify(e)}function er(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function tr(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Fr(e,t){return tr(e)?e.then(t):t(e)}function An(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function qr(e,t){return {readValues(n){let o=e(n);return Fr(o.listKeys(),a=>{let c=[...a].sort();if(c.length===0)return {version:null,values:{}};let u={},f=null;for(let g of c){let k=o.read(g);tr(k)?f=(f??Promise.resolve()).then(async()=>{u[g]=await k;}):u[g]=k;}return f?f.then(()=>({version:t(u),values:u})):{version:t(u),values:u}})},writeValues(n,o,a){let c=e(n),u=null;for(let f of a){let g=c.delete(f);tr(g)&&(u=(u??Promise.resolve()).then(()=>g).then(()=>{}));}for(let[f,g]of Object.entries(o)){let k=c.write(f,g);tr(k)&&(u=(u??Promise.resolve()).then(()=>k).then(()=>{}));}return u?u.then(()=>t(o)):t(o)}}}function rr(e,t){return {readSnapshot(r){return e.readValues(r)},commitSnapshot(r,n){if(n.schemaVersion!==t)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);return Fr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let a=An(o.values,n);return Fr(e.writeValues(r,a,n.deleteKeys),c=>({ok:true,newVersion:c}))})}}}function vn(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function xn(e){return {readEntriesAfterCursor(t){let r=vn(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return vn(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function Tn(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function nr(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function dt(e,t){return nr(e)?e.then(t):t(e)}function Nr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);nr(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function ra(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function na(e,t){let r=e.match(t);return r?r[1]:null}function In(e,t,r){let n={},o=Nr(e,a=>{let c=r(a);if(c)return dt(t(a),u=>{n[c]=u;})});return nr(o)?o.then(()=>n):n}function or(e,t){return {readSourceData(r,n){return dt(e.read(`${r}/${n}`),ra)},ingestSourceDataStaged(r,n,o,a){return dt(t(o),c=>e.write(`${r}/.staged/${a}/${n}`,c))},commitSourceData(r,n,o){let a=`${r}/.staged/${o}/${n}`,c=`${r}/${n}`;return e.renameKey(a,c)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return dt(e.listKeys(`${r}/`),n=>n.filter(o=>!o.includes("/.staged/")).map(o=>o.slice(`${r}/`.length)))}}}function jr(e,t){let r=(n,o)=>{try{let a=o(n);return nr(a)?a.catch(c=>t(n,c instanceof Error?c.message:String(c))):void 0}catch(a){try{return t(n,a instanceof Error?a.message:String(a))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return dt(e.read(n),a=>e.write(n,[...a??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return dt(e.read(n),a=>{let c=a;if(!(!c||c.length===0))return dt(Nr(c,u=>r(u,o)),()=>e.delete(n))})}}}function Lr(e,t,r){return {readRuntime(n){return dt(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function ar(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return dt(e.listKeys("cards/"),t=>In(t,r=>e.read(r),r=>na(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return Nr(Object.entries(t),([r,n])=>{if(r)return n===void 0?e.delete(`data-objects/${r}`):e.write(`data-objects/${r}`,n)})},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){return dt(e.listKeys("data-objects/"),t=>In(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}var ot="sys_keys_board_state",_e="__sys_keys_board_state_init";function Pn(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e.__private;return !!t&&typeof t=="object"&&!Array.isArray(t)&&t.visible_controlplane_only===true}function Mr(e){let t=e.filter(o=>!Pn(o)),r=[...new Set(t.map(o=>o.id).filter(o=>typeof o=="string"&&o.length>0))].sort(),n=[...new Set(t.flatMap(o=>Array.isArray(o.provides)?o.provides:[]).map(o=>o&&typeof o=="object"&&!Array.isArray(o)?o.bindTo:void 0).filter(o=>typeof o=="string"&&o.length>0&&o!==ot))].sort();return {card_ids:r,data_object_keys:n}}function Dr(e,t){let r=e.filter(a=>!Pn(a)),n=[...new Set(r.map(a=>a.id).filter(a=>typeof a=="string"&&a.length>0))].sort(),o=[...new Set(Object.entries(t).filter(([a])=>a!==_e).flatMap(([,a])=>Array.isArray(a.provides)?a.provides:[]).filter(a=>typeof a=="string"&&a.length>0&&a!==ot))].sort();return {card_ids:n,data_object_keys:o}}function xt(){return {id:_e,meta:{title:"System Keys Board State",synthetic:true},provides:[{bindTo:ot,ref:`card_data.${ot}`}],card_data:{[ot]:{card_ids:[],data_object_keys:[]}},__private:{visible_controlplane_only:true}}}function Mt(e,t){function r(){return e.readIndex()??{}}function n(o,a,c){let u=String(a||"").split(".").filter(Boolean);if(u.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let f={...o},g=f;for(let k=0;k<u.length-1;k++){let S=u[k],b=g[S],B=b&&typeof b=="object"&&!Array.isArray(b)?{...b}:{};g[S]=B,g=B;}return g[u[u.length-1]]=c,f}return {readCard(o){let a=r()[o];return !a||!e.cardExists(a.key)?null:e.readCard(a.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[a,c]of Object.entries(r())){if(!e.cardExists(c.key))continue;let u=e.readCard(c.key);u?o.push(u):t?.(`[card-store] could not read card "${a}" at key "${c.key}"`);}return o},readChecksumIndex(){let o={};for(let[a,c]of Object.entries(r()))o[a]=c.checksum;return o},changedSince(o){let a=r(),c=[];for(let[u,f]of Object.entries(a))o[u]!==f.checksum&&c.push(u);for(let u of Object.keys(o))a[u]||c.push(u);return c},validateUpsert(o,a){let c=r(),u=c[o],f=Object.entries(c).find(([,g])=>g.key===a);return u&&u.key!==a?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${a}"`}:f&&f[0]!==o?{ok:false,error:`Key "${a}" is already mapped to card id "${f[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,a,c){let u=r(),f=c??u[o]?.key??e.defaultCardKey(o),g=e.writeCard(f,a);u[o]={key:f,checksum:g,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(o,a,c){let u=r(),f=u[o];if(!f||!e.cardExists(f.key))throw new Error(`card "${o}" not found`);let g=e.readCard(f.key);if(!g||typeof g!="object"||Array.isArray(g))throw new Error(`card "${o}" is not patchable`);let k=n(g,a,c),S=e.writeCard(f.key,k);u[o]={key:f.key,checksum:S,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(o){let a=r(),c=a[o];c&&(e.removeCard(c.key),delete a[o],e.writeIndex(a));},readIndex(){return r()}}}function sr(e,t){return or(e,t)}function _n(e){return xn(e)}var ir="v1",lt="board/graph",En="board/lastJournalProcessedId";function Bn(e){return `cards/${e}/runtime`}function On(e){return rr(e,ir)}function ur(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return er(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Zt(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){e.write("board-runtime-store-ref",r);},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){e.write("queue-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){e.write("chat-store-ref",r);},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){e.write("artifacts-store-ref",r);},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){e.write("fetched-sources-store-ref",r);}}}function Fn(e){return ar(e)}function Nt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function oa(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function jt(e,t){return e?.lastRequestedToken?oa(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function $r(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Lt(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function St(e){let t=e.cards.filter(u=>u.name!==_e);if(t.length===e.cards.length)return e;let r=new Set;for(let u of t)for(let f of u.requires)r.add(f);let n=t.map(u=>({name:u.name,fanOut:u.unblocks.length})).sort((u,f)=>f.fanOut-u.fanOut||u.name.localeCompare(f.name)),o=n.length>0?n[0]:{name:null,fanOut:0},a=u=>t.filter(f=>f.status===u).length,c=t.filter(u=>u.requires.length===0&&u.unblocks.length===0).length;return {...e,summary:{...e.summary,card_count:t.length,completed:a("completed"),eligible:a("eligible"),pending:a("pending"),blocked:a("blocked"),unresolved:a("unresolved"),failed:a("failed"),in_progress:a("in-progress"),orphan_cards:c,topology:{edge_count:r.size,max_fan_out_card:o.name,max_fan_out:o.fanOut}},cards:t}}function cr(e){let{[ot]:t,...r}=e;return r}function wt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),a=Ft(t),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let I of a.pending)u.set(I.taskName,I.waitingOn);for(let I of a.unresolved)u.set(I.taskName,I.missingTokens);for(let I of a.blocked)u.set(I.taskName,I.failedTokens);let f=new Map;for(let[I,P]of Object.entries(n))for(let A of P.requires??[]){let y=f.get(A)??[];y.push(I),f.set(A,y);}let g=o.sort().map(I=>{let P=r[I],A=n[I]??{requires:[],provides:[]};P.status==="completed"?c.completed+=1:P.status==="failed"?c.failed+=1:P.status==="in-progress"&&(c.in_progress+=1);let y=A.requires??[],l=A.provides??[],i=Object.keys(P.data??{}).sort(),d=y.filter(N=>t.state.availableOutputs.includes(N)),m=y.filter(N=>!t.state.availableOutputs.includes(N)),p=u.get(I)??m,R=new Set;for(let N of l)for(let U of f.get(N)??[])U!==I&&R.add(U);let w=P.failedAt,O=P.error?{message:P.error,code:"TASK_FAILED",at:w,source:"task-runtime"}:void 0;return {name:I,status:P.status,error:O,requires:y,requires_satisfied:d,requires_missing:m,provides_declared:l,provides_runtime:i,blocked_by:p,unblocks:Array.from(R).sort(),runtime:{attempt_count:P.executionCount??0,restart_count:P.retryCount??0,in_progress_since:P.status==="in-progress"?P.startedAt??null:null,last_transition_at:P.lastUpdated??null,last_completed_at:P.completedAt??null,last_restarted_at:P.startedAt??null,status_age_ms:P.lastUpdated?0:null}}});c.pending=a.pending.length,c.blocked=a.blocked.length,c.unresolved=a.unresolved.length;let k=g.map(I=>({name:I.name,fanOut:I.unblocks.length})).sort((I,P)=>P.fanOut-I.fanOut||I.name.localeCompare(P.name)),S=k.length>0?k[0]:{name:null,fanOut:0},b=new Set;for(let I of Object.values(n))for(let P of I.requires??[])b.add(P);let B=0;for(let[I,P]of Object.entries(n)){let A=(P.requires??[]).length===0,l=(P.provides??[]).some(i=>(f.get(i)??[]).some(d=>d!==I));A&&!l&&(B+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:c.completed,eligible:a.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:B,topology:{edge_count:Array.from(b).length,max_fan_out_card:S.name,max_fan_out:S.fanOut}},cards:g}}function aa(){return new Date().toISOString()}function qn(e,t,r,n,o,a,c){return async u=>{let f=[],g=r.cardStore.readCard(u.nodeId);if(!g)return "task-initiate-failure";let k=g.id;if(k===_e){let G=r.activeTaskConfigs?.(),Z={[ot]:G?Dr(Object.keys(G).filter(re=>re!==_e).map(re=>r.cardStore.readCard(re)).filter(re=>!!re),G):Mr(r.cardStore.readAllCards())};return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(Z),n(u.nodeId,Z),"task-initiated"}let S=g.card_data??{},b=g.source_defs??[],B=b,I=r.cardRuntimeStore.readRuntime(k),P=false,A=()=>{P&&(r.cardRuntimeStore.writeRuntime(k,I),P=false);},y=G=>Nt(I._sources[G]),l=(G,Z)=>{I._sources[G]=Nt(Z),P=true;},i=u.taskState?.executionCount??0;if(I._lastExecutionCount!==i&&(I._sources={},I._lastExecutionCount=i,P=true),u.update){let G=u.update,Z=G.outputFile;if(Z){let re=y(Z);if(G.failure){let E=G.rqt??re.lastRequestedToken??re.queueRequestedToken;E&&l(Z,Lt(re,E));}else {let E=G.rqt;if(!re.lastCompletedToken||E>re.lastCompletedToken){let x=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,K=false;x&&(K=r.fetchedSourcesStore.commitSourceData(k,Z,x)),K?l(Z,$r(re,E)):l(Z,Lt(re,E));}}A();}}let m={};for(let G of b)if(G.outputFile){let Z=r.fetchedSourcesStore.readSourceData(k,G.outputFile);Z!==null&&(m[G.bindTo]=Z);}let p={};for(let[G,Z]of Object.entries(u.state??{}))if(Z!==null&&typeof Z=="object"&&!Array.isArray(Z)){let re=Z[G];p[G]=re!==void 0?re:Z;}else p[G]=Z;let R={id:k,card_data:{...S},requires:p,source_defs:b,compute:g.compute};R._sourcesData=m,g.compute&&We.runSync(R,{sourcesData:m}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(k,R.computed_values??{});let w={...g},O=We.enrichSourcesSync(Array.isArray(g.source_defs)?g.source_defs:void 0,{card_data:g.card_data,requires:p}),N=e.value;w.source_defs=Array.isArray(O)?O.map(G=>({...G,boardDir:typeof G.boardDir=="string"&&G.boardDir?G.boardDir:N})):O;let U=aa(),J=u.update?void 0:U,ae=B.filter(G=>{let Z=G.outputFile;if(typeof Z!="string"||!Z)return true;let re=y(Z);J&&(re={...re,queueRequestedToken:J},l(Z,re));let E=re.queueRequestedToken??re.lastRequestedToken??U,x=jt(re,E);return x==="in-flight"?false:x==="dispatch"});if(A(),ae.length>0){let G=false,Z=U;for(let re of ae){let E=re.outputFile;if(typeof E!="string"||!E)continue;let x=y(E),K=x.queueRequestedToken??U;l(E,{...x,lastRequestedToken:K}),Z=K,G=true;}return G&&A(),G&&(f.push({taskKind:"source-fetch",payload:{boardRef:Te(e),enrichedCard:w,callbackToken:u.callbackToken,rqt:Z}}),r.executionRequestStore.appendEntries(t,f)),"task-initiated"}if(B.some(G=>{let Z=G.outputFile;if(typeof Z!="string"||!Z)return false;let re=y(Z),E=re.queueRequestedToken??re.lastRequestedToken??U;return jt(re,E)==="in-flight"}))return "task-initiated";let te=g.provides??[],ue={};for(let{bindTo:G,ref:Z}of te)ue[G]=We.resolve(R,Z);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(ue),n(u.nodeId,ue),f.length>0&&r.executionRequestStore.appendEntries(t,f),"task-initiated"}}var Dt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function dr(e){return {[lt]:e.graph,[En]:e.lastDrainedJournalId,board:{runtimeByCardId:e.runtimeByCardId}}}function lr(e){let t=e[lt],r=e[En],o=e.board?.runtimeByCardId;if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${lt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:"",runtimeByCardId:o&&typeof o=="object"?o:{}}}function $t(e){let t=e.requires;return {provides:e.provides?.map(n=>n.bindTo)??[],taskHandlers:["card-handler"],description:e.meta?.title??e.id,...t&&t.length>0?{requires:t}:{}}}function fr(e,t={}){function r(g){return {status:"success",data:g}}function n(g){return {status:"fail",error:g}}function o(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}async function a(g){let k=t.emitNotification;if(!k||g.length===0)return;let S=De(g);if(S.length===1){await k(S[0]);return}await k($e({kind:"notification-batch",notifications:S}));}function c(g){let k=g.params?.id;if(k){let S=e.readCard(k);if(!S)throw new Error(`card "${k}" not found`);return [S]}return e.readAllCards()}function u(g){return $e({kind:"notification-batch",notifications:De(g.map(k=>({kind:"card_refreshed",cardId:k.id,card:k})))})}function f(g){if(Array.isArray(g))return g;if(g&&typeof g=="object"){let k=g;return Array.isArray(k.files)?k.files:[g]}return null}return {get(g){try{return r({cards:c(g)})}catch(k){return o(k)}},buildNotificationBatch(g){try{return r(u(c(g)))}catch(k){return o(k)}},set(g){try{let k=g.body;if(k==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(k)?k:[k];for(let b of S){if(typeof b.id!="string")return n("each card must have a string `id` field");e.writeCard(b.id,b);}return a(S.map(b=>({kind:"card_refreshed",cardId:b.id,card:b}))),r({count:S.length})}catch(k){return o(k)}},del(g){try{let k=g.body?.ids??[],S=g.params?.id,b=S?[...k,S]:k;if(b.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of b)e.removeCard(B);return a(b.map(B=>({kind:"card_removed",cardId:B}))),r({count:b.length})}catch(k){return o(k)}},patch(g){try{let k=g.params?.id,S=g.params?.path;if(!k)return n("patch requires params.id");if(!S)return n("patch requires params.path");let b=g.body,B=b&&Object.prototype.hasOwnProperty.call(b,"value")?b.value:g.body;e.patchCard(k,S,B);let I=e.readCard(k);return I?(a([{kind:"card_refreshed",cardId:k,card:I}]),r({count:1})):n(`card "${k}" not found`)}catch(k){return o(k)}},appendFiles(g){try{let k=g.params?.id;if(!k)return n("appendFiles requires params.id");let S=e.readCard(k);if(!S)return n(`card "${k}" not found`);let b=f(g.body);if(!b||b.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},I=Array.isArray(B.files)?B.files:[],P=[...I,...b],A=b.map((l,i)=>({idx:I.length+i,entry:l})),y=this.patch({params:{id:k,path:"card_data.files"},body:{value:P}});return y.status!=="success"?y:r({files_added:A})}catch(k){return o(k)}}}}function ye(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function fe(e){return {status:"fail",error:e}}function Ce(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function sa(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Ln(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function mr(e){try{let t=JSON.parse(Ln(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Nn(e){return sa(JSON.stringify(e))}function jn(e){try{let t=JSON.parse(Ln(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Qe(){return new Date().toISOString()}function ia(e){let t=new Map;return {appendEntries(r,n){if(!r||n.length===0)return;let o=t.get(r)??[];t.set(r,[...o,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let o=t.get(r);if(!(!o||o.length===0)){for(let a of o)try{n(a);}catch(c){try{e(a,c instanceof Error?c.message:String(c));}catch{}}t.delete(r);}}}}function Mn(e,t,r={}){Gt(t.callbackTransport,"createBoardLiveCardsPublic");let n=t.callbackTransport,o=t.onWarn??(()=>{}),a=Te(e),c=r.boardRuntimeStoreRef,u=r.scratchStoreRef,f=r.taskExecutorRef,g=r.chatHandlerFlow,k=r.emitNotification??(j=>{if(!t.publishBoardChangeNotifications)return;let v=j.kind==="notification-batch"?j.notifications:[j];return t.publishBoardChangeNotifications(v)});function S(){if(!c)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return c}function b(j){if(j.length!==0)try{let v=De(j),W=$e({kind:"notification-batch",notifications:v}),q=k(W);q&&typeof q.catch=="function"&&q.catch(V=>o(`[board-live-cards-public] emitNotification failed: ${V instanceof Error?V.message:String(V)}`));}catch(v){o(`[board-live-cards-public] emitNotification failed: ${v instanceof Error?v.message:String(v)}`);}}function B(){let j=P().readCardStoreRef();if(!j)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let v=t.kvStorageForRef(j);return {readIndex(){return v.read("_index")},writeIndex(W){v.write("_index",W);},readCard(W){return v.read(W)},writeCard(W,q){return v.write(W,q),t.hashFn(q)},removeCard(W){v.delete(W);},cardExists(W){return v.read(W)!==null},defaultCardKey(W){return W}}}let I={readValues(j){let v=t.kvStorageForRef(S()),W=v.listKeys().sort();if(W.length===0)return {version:null,values:{}};let q={};for(let V of W)q[V]=v.read(V);return {version:t.hashFn(q),values:q}},writeValues(j,v,W){let q=t.kvStorageForRef(S());for(let V of W)q.delete(V);for(let[V,oe]of Object.entries(v))q.write(V,oe);return t.hashFn(v)}},P=()=>ur(t.kvStorageForRef(S())),A=()=>On(I),y=()=>_n(t.journalAdapterForRef(S())),l=()=>Mt(B(),o),i=()=>{let j=P().readOutputsStoreRef();if(!j)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Fn(t.kvStorageForRef(j))};function d(){return f??P().readTaskExecutorRef()}function m(){return !!A().readSnapshot(e.value).values[lt]}function p(){let j=A().readSnapshot(e.value);if(!j.values[lt])throw new Error(`Board not initialized at ${e.value}`);return lr(j.values)}function R(j,v){let W=A().commitSnapshot(e.value,{schemaVersion:ir,expectedVersion:v,commitId:t.genId(),committedAt:Qe(),deleteKeys:[],shallowMerge:dr(j)});if(!W.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${v??"null"} current=${W.currentVersion??"null"}`)}function w(j){y().appendEvent(j);}async function O(){let v=ia((Y,s)=>{let C=Y.payload,L=(C?.enrichedCard??{}).id??C?.cardId??"unknown";w({type:"task-failed",taskName:L,error:s,timestamp:Qe()});}),W=p(),q=bt(W.graph),{events:V,newCursor:oe}=y().readEntriesAfterCursor(W.lastDrainedJournalId),de=K(),ie=sr(de,Y=>t.resolveBlob(Y)),Re={...W.runtimeByCardId},Be=new Map,je={readRuntime(Y){return Be.get(Y)??Re[Y]??{_sources:{}}},writeRuntime(Y,s){Be.set(Y,s),Re[Y]=s;}},Le=[],Me=new Map,Ye={readSourceData(Y,s){let C=`${Y}/${s}`;return Me.has(C)?Me.get(C):ie.readSourceData(Y,s)},ingestSourceDataStaged(Y,s,C,_){ie.ingestSourceDataStaged(Y,s,C,_);},commitSourceData(Y,s,C){let _=`${Y}/.staged/${C}/${s}`,L=de.read(_);if(L==null){let X=de.keyRef?.(_);X&&(L=t.resolveBlob(X));}if(L==null)return false;let H=`${Y}/${s}`,ne=L.trim();try{Me.set(H,JSON.parse(ne));}catch{Me.set(H,ne);}return Le.push({cardId:Y,outputFile:s,deliveryToken:C}),true},hasSource(Y,s){let C=`${Y}/${s}`;return Me.has(C)?true:ie.hasSource(Y,s)},listSources(Y){let s=ie.listSources(Y),C=new Set;for(let L of Me.keys())L.startsWith(`${Y}/`)&&C.add(L.slice(`${Y}/`.length));let _=new Set([...s,...C]);return Array.from(_)}},Ge=()=>q.config.tasks,Xe={cardStore:l(),cardRuntimeStore:je,fetchedSourcesStore:Ye,outputStore:i(),executionRequestStore:v,activeTaskConfigs:()=>Ge()},ft=[],_t=[],Et=[],mt=new Map,Bt=new Set,Vt=(Y,s)=>{ft.push({type:"task-completed",taskName:Y,data:s,timestamp:Qe()});},Kt=(Y,s)=>{w({type:"task-failed",taskName:Y,error:s,timestamp:Qe()});},vt=zt(q,{handlers:{"card-handler":qn(e,oe,Xe,Vt,Kt,(Y,s)=>{_t.push({cardId:Y,values:s});},Y=>{Et.push(Y);})},onNodeRemoved:Y=>{mt.delete(Y),Be.delete(Y),delete Re[Y],Bt.add(Y);}});for(Ge=()=>vt.getState().config.tasks,ft=V;ft.length>0;){let Y=ft;ft=[];for(let s of Y)if(s.type==="task-restart"){let C=Xe.cardStore.readCard(s.taskName);C&&mt.set(s.taskName,C);}vt.pushAll(Y),await vt.waitForHandlers();}let wr=vt.getState();await vt.dispose({wait:true});let vr=A().readSnapshot(e.value).version;R({lastDrainedJournalId:oe,graph:Ct(wr),runtimeByCardId:Re},vr);for(let{cardId:Y,values:s}of _t)Xe.outputStore.writeComputedValues(Y,s);for(let Y of Et)Xe.outputStore.writeDataObjects(Y);for(let{cardId:Y,outputFile:s,deliveryToken:C}of Le)ie.commitSourceData(Y,s,C);let Ot;try{Ot=St(wt(a,wr)),Xe.outputStore.writeStatusSnapshot(Ot);}catch(Y){o(`[board-live-cards-public] status publish failed: ${Y instanceof Error?Y.message:String(Y)}`);}let ht=[];for(let{cardId:Y,values:s}of _t)ht.push({kind:"computed_values",cardId:Y,values:s});for(let Y of Et)for(let[s,C]of Object.entries(Y))s&&ht.push({kind:"data_object",key:s,payload:C});for(let[Y,s]of mt)ht.push({kind:"card_refreshed",cardId:Y,card:s});for(let Y of Bt)ht.push({kind:"card_removed",cardId:Y});Ot!==void 0&&ht.push({kind:"status",status:Ot}),b(ht);let At=d()??{howToRun:"built-in",whatToRun:Te({kind:"built-in",value:"source-cli-task-executor"})},Ht=t.supportsDirectSourceOutput?.(At)===true;v.dispatchEntriesForJournalId(oe,Y=>{if(Y.taskKind!=="source-fetch"){o(`[process-accumulated-events] unknown taskKind "${Y.taskKind}" \u2014 skipping`);return}let s=Y.payload,C=s.enrichedCard?.id??"unknown",_=s.enrichedCard?.source_defs??[];if(At.howToRun==="queue-storage"&&Ht){try{let L=t.queueStorageForRef(N(),"task-executor"),H=typeof At.extra?.boardId=="string"?At.extra.boardId:void 0,ne=[];for(let X of _){if(!X.outputFile){o(`[dispatch] source "${X.bindTo}" has no outputFile \u2014 skipping`);continue}let le=t.genId(),Ue=`${C}/.staged/${le}/${X.outputFile}`,Ae=de.keyRef?.(Ue);if(!Ae)continue;let He={ref:Te(Ae),deliveryToken:le,outputFile:X.outputFile,cardId:C},Ar=Nn({cbk:s.callbackToken,rg:e.value,br:Te(e),cid:C,b:X.bindTo,d:X.outputFile,cs:void 0,rqt:s.rqt,dt:He.deliveryToken});ne.push({...H?{boardId:H}:{},ref:At,args:{source_def:X,base_ref:Te(e),callback:n.createCallback(Ar),output:He}});}ne.length>0&&L.enqueueMany(ne);}catch(L){Kt(C,L instanceof Error?L.message:String(L));}return}for(let L of _){if(!L.outputFile){o(`[dispatch] source "${L.bindTo}" has no outputFile \u2014 skipping`);continue}let H;if(Ht){let X=t.genId(),le=`${C}/.staged/${X}/${L.outputFile}`,Ue=de.keyRef?.(le);Ue&&(H={ref:Te(Ue),deliveryToken:X,outputFile:L.outputFile,cardId:C});}let ne=Nn({cbk:s.callbackToken,rg:e.value,br:Te(e),cid:C,b:L.bindTo,d:L.outputFile,cs:void 0,rqt:s.rqt,...H?{dt:H.deliveryToken}:{}});t.dispatchExecution(At,{source_def:L,base_ref:Te(e),callback:n.createCallback(ne),...H?{output:H}:{}}).catch(X=>Kt(C,X instanceof Error?X.message:String(X)));}});}function N(){let j=P().readQueueStoreRef();if(!j)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);return j}function U(){t.queueStorageForRef(N(),"process-accumulated").enqueue({boardRef:Te(e)}),t.requestProcessAccumulated?.();}function J(){let j=t.queueStorageForRef(N(),"process-accumulated");for(;;){let v=j.lease({max:64,visibilityMs:1e3});if(v.length<=0)return;for(let W of v)j.ack(W.id,W.leaseToken);if(v.length<64)return}}async function ae(){try{let j=()=>{let W=p(),{events:q}=y().readEntriesAfterCursor(W.lastDrainedJournalId);q.length<=0||U();},v=await nn(t.lock,O,j);return ye({ran:v!==!1})}catch(j){return Ce(j)}}function Q(){U();}function te(j){try{let v=j.params?.cardStoreRef;if(!v)return fe("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(c=j.params?.boardRuntimeStoreRef,!c)return fe("init requires params.boardRuntimeStoreRef \u2014 pass the board runtime store ref here");if(!m()){let Be=Tt(Dt);R({lastDrainedJournalId:"",graph:Ct(Be),runtimeByCardId:{}},null);}let W=j.params?.outputsStoreRef;if(!W)return fe("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let q=j.params?.queueStoreRef;if(!q)return fe("init requires params.queueStoreRef \u2014 pass the queue store ref here");let V=j.params?.fetchedSourcesStoreRef;if(!V)return fe("init requires params.fetchedSourcesStoreRef \u2014 pass the fetched sources store ref here");u=j.params?.scratchStoreRef;let oe=j.params?.chatStoreRef;if(!oe)return fe("init requires params.chatStoreRef \u2014 pass the chat store ref here");let de=j.params?.artifactsStoreRef;if(!de)return fe("init requires params.artifactsStoreRef \u2014 pass the artifacts store ref here");let ie=P();ie.writeBoardRuntimeStoreRef(c),ie.writeCardStoreRef(v),ie.writeOutputsStoreRef(W),ie.writeQueueStoreRef(q),ie.writeFetchedSourcesStoreRef(V),ie.writeChatStoreRef(oe),ie.writeArtifactsStoreRef(de),l().writeCard(xt().id,xt());let Re=h({params:{cardId:xt().id,restart:!0}});if(Re.status!=="success")return Re;try{i().writeStatusSnapshot(St(wt(a,bt(p().graph))));}catch{}return ye()}catch(v){return Ce(v)}}function ue(j){try{let v=i().readStatusSnapshot();if(!v){v=St(wt(a,bt(p().graph)));try{i().writeStatusSnapshot(v);}catch{}}return ye(v)}catch(v){return Ce(v)}}function G(j){try{let v=j.params?.id;if(!v)return fe("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(v);}catch{}return w({type:"task-removal",taskName:v,timestamp:Qe()}),v!==_e&&w({type:"task-restart",taskName:_e,timestamp:Qe()}),Q(),ye()}catch(v){return Ce(v)}}function Z(j){try{let v=j.params?.cardId;if(!v)return fe("addCardFiles requires params.cardId");let W=fr(l(),{emitNotification:k}).appendFiles({params:{id:v},body:j.body});return W.status!=="success"?W:ye({cardId:v,files_added:W.data.files_added,notified:!0})}catch(v){return Ce(v)}}function re(j){try{let v=j.params?.id;return v?(w({type:"task-restart",taskName:v,timestamp:Qe()}),Q(),ye()):fe("retrigger requires params.id")}catch(v){return Ce(v)}}async function E(j){return J(),ae()}function x(){let j=P().readFetchedSourcesStoreRef();if(!j)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return j}function K(){return t.blobStorageForRef(x())}function h(j){try{let v=j.params?.cardId,W=j.params?.all,q=!!j.params?.restart;if(!v&&!W)return fe("upsertCard requires --card-id <id> or --all");let V=W?l().readAllCards().map(de=>de.id):[v];for(let de of V)if(!l().readCard(de))return fe(`Card "${de}" not found in board at ${e.value}`);let oe=!1;for(let de of V){let ie=l().readCard(de),Re=$t(ie),Be=t.hashFn(Re),je=t.kvStorage("card-upsert"),Le=je.read(de),Me=Le?.taskConfigHash!==Be;if(!(!Me&&!q)){if(Me){let Ye=Le?.blobRef??l().readCardKey(de)??de;w({type:"task-upsert",taskName:de,taskConfig:Re,timestamp:Qe()}),je.write(de,{blobRef:Ye,taskConfigHash:Be,updatedAt:Qe()}),oe=oe||de!==_e;}q&&w({type:"task-restart",taskName:de,timestamp:Qe()});}}return oe&&w({type:"task-restart",taskName:_e,timestamp:Qe()}),Q(),ye()}catch(v){return Ce(v)}}function T(j){try{let v=j.params?.token;if(!v)return fe("taskFailed requires params.token");let W=j.params?.error??"unknown error",q=mr(v);return q?(w({type:"task-failed",taskName:q.taskName,error:W,timestamp:Qe()}),Q(),ye()):fe("Invalid callback token")}catch(v){return Ce(v)}}function F(j){try{let v=j.params?.token;if(!v)return fe("taskProgress requires params.token");let q=(j.body??{}).update??{},V=mr(v);return V?(w({type:"task-progress",taskName:V.taskName,update:q,timestamp:Qe()}),Q(),ye()):fe("Invalid callback token")}catch(v){return Ce(v)}}function D(j){try{let v=j.params?.token,W=j.params?.ref;if(!v)return fe("sourceDataFetched requires params.token");if(!W)return fe("sourceDataFetched requires params.ref");let q=jn(v);if(!q)return fe("Invalid source token");let{cbk:V,cid:oe,b:de,d:ie,cs:Re,rqt:Be,dt:je}=q,Le=sr(K(),Xe=>t.resolveBlob(Xe)),Me=je||t.genId();je||Le.ingestSourceDataStaged(oe,ie,it(W),Me);let Ye=mr(V);if(!Ye)return fe("Invalid callback token embedded in source token");let Ge=Qe();return w({type:"task-progress",taskName:Ye.taskName,update:{bindTo:de,outputFile:ie,fetchedAt:Ge,deliveryToken:Me,sourceChecksum:Re,rqt:Be},timestamp:Ge}),Q(),ye()}catch(v){return Ce(v)}}function M(j){try{let v=j.params?.token,W=j.params?.reason??"unknown";if(!v)return fe("sourceDataFetchFailure requires params.token");let q=jn(v);if(!q)return fe("Invalid source token");let{cbk:V,b:oe,d:de,cs:ie,rqt:Re}=q,Be=mr(V);return Be?(w({type:"task-progress",taskName:Be.taskName,update:{bindTo:oe,outputFile:de,failure:!0,reason:W,sourceChecksum:ie,rqt:Re},timestamp:Qe()}),Q(),ye()):fe("Invalid callback token embedded in source token")}catch(v){return Ce(v)}}function $(j){try{let v=P().readCardStoreRef();return v?ye({storeRef:v}):fe(`Board at ${e.value} has no card store configured`)}catch(v){return Ce(v)}}function se(j){try{return ye({storeRef:c??null})}catch(v){return Ce(v)}}function ce(j){try{let v=P().readOutputsStoreRef();return v?ye({storeRef:v}):fe(`Board at ${e.value} has no outputs store configured`)}catch(v){return Ce(v)}}function be(j){try{return ye({storeRef:u??null})}catch(v){return Ce(v)}}function xe(j){try{let v=P().readChatStoreRef();return ye({storeRef:v})}catch(v){return Ce(v)}}function Pe(j){try{let v=P().readArtifactsStoreRef();return ye({storeRef:v})}catch(v){return Ce(v)}}function pe(j){try{let v=P().readFetchedSourcesStoreRef();return ye({storeRef:v})}catch(v){return Ce(v)}}function ke(j){try{let v=j.params?.key;if(!v)return fe("getConfig requires params.key");let W=P(),q;switch(v){case "task-executor":q=f??null;break;case "chat-handler-flow":q=g??null;break;case "board-runtime-store-ref":q=W.readBoardRuntimeStoreRef();break;case "card-store-ref":q=W.readCardStoreRef();break;case "outputs-store-ref":q=W.readOutputsStoreRef();break;case "scratch-store-ref":q=u??null;break;case "chat-store-ref":q=W.readChatStoreRef();break;case "artifacts-store-ref":q=W.readArtifactsStoreRef();break;case "fetched-sources-store-ref":q=W.readFetchedSourcesStoreRef();break;default:return fe(`getConfig: unknown key "${v}"`)}return ye({value:q})}catch(v){return Ce(v)}}function Ve(j){try{let v=j.params?.key;if(!v)return fe("getOutputsDataObject requires params.key");if(v===ot)return ye(null);let W=i().readDataObject(v);return ye(W)}catch(v){return Ce(v)}}function Se(j){try{return ye(cr(i().readAllDataObjects()))}catch(v){return Ce(v)}}function Ke(j){try{let v=j.params?.key;if(!v)return fe("getOutputsComputedValues requires params.key");let W=i().readComputedValues(v);return ye(W)}catch(v){return Ce(v)}}function qe(j){try{return ye(i().readAllComputedValues())}catch(v){return Ce(v)}}function he(){return sr(K(),j=>t.resolveBlob(j))}function et(j){let v=K().keyRef?.(j);if(!v)throw new Error("configured fetched-sources store does not support keyRef");return Te(v)}function Je(j){try{let v=j.params?.key;if(!v)return fe("getOutputsFetchedSources requires params.key");let W=he().listSources(v),q={};for(let V of W)q[V]=et(`${v}/${V}`);return ye(q)}catch(v){return Ce(v)}}function tt(j){try{let v=he(),W=new Set;for(let V of K().listKeys()){let oe=V.indexOf("/");oe>0&&!V.includes("/.staged/")&&W.add(V.slice(0,oe));}let q={};for(let V of W){let oe=v.listSources(V);if(oe.length>0){q[V]={};for(let de of oe)q[V][de]=et(`${V}/${de}`);}}return ye(q)}catch(v){return Ce(v)}}function yt(j){try{let v=l().readAllCards().filter(ie=>ie.id!==_e),W=ue({});if(W.status!=="success")return W;let q=Se({});if(q.status!=="success")return q;let V=qe({});if(V.status!=="success")return V;let oe=V.data,de={};for(let ie of v){let Re=typeof ie?.id=="string"?ie.id:null;if(!Re)continue;let Be=ie.card_data&&typeof ie.card_data=="object"&&!Array.isArray(ie.card_data)?ie.card_data:{};de[Re]={schema_version:"v1",card_id:Re,card_data:{...Be},computed_values:oe[Re]&&typeof oe[Re]=="object"?oe[Re]:{}};}return ye({cardDefinitions:v,statusSnapshot:W.data,dataObjectsByToken:q.data,cardRuntimeById:de})}catch(v){return Ce(v)}}return {init:te,status:ue,getBoardRuntimeStoreRef:se,getCardStoreRef:$,getOutputsStoreRef:ce,getScratchStoreRef:be,getChatStoreRef:xe,getArtifactsStoreRef:Pe,getFetchedSourcesStoreRef:pe,getConfig:ke,getOutputsDataObject:Ve,getAllOutputsDataObjects:Se,getOutputsComputedValues:Ke,getAllOutputsComputedValues:qe,getOutputsFetchedSources:Je,getAllOutputsFetchedSources:tt,buildSseOneShotPayload:yt,removeCard:G,addCardFiles:Z,retrigger:re,processAccumulatedEvents:E,upsertCard:h,taskFailed:T,taskProgress:F,sourceDataFetched:D,sourceDataFetchFailure:M}}function Dn(e,t,r){let n=r?.taskExecutorRef,o=()=>{if(r){if(!r.boardRuntimeStoreRef)throw new Error(`Board at ${e.value} requires boardRuntimeStoreRef for non-core runtime operations.`);return ur(t.kvStorageForRef(r.boardRuntimeStoreRef))}return ur(t.kvStorage("config"))};function a(){let l=o().readCardStoreRef();if(!l)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let i=t.kvStorageForRef(l);return {readIndex(){return i.read("_index")},writeIndex(d){i.write("_index",d);},readCard(d){return i.read(d)},writeCard(d,m){return i.write(d,m),t.hashFn(m)},removeCard(d){i.delete(d);},cardExists(d){return i.read(d)!==null},defaultCardKey(d){return d}}}let c=()=>Mt(a(),t.onWarn??(()=>{}));function u(){return n??o().readTaskExecutorRef()}async function f(l,i){let d=t.validateSchema(i),m=[],p=u();if(p&&Array.isArray(i.source_defs))for(let w of i.source_defs){let O=typeof w.bindTo=="string"?w.bindTo:"(unknown)";try{let N;try{N=await t.invokeExecutor(p,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(w)});}catch(J){let ae=J;if(N=typeof ae?.stdout=="string"?ae.stdout:"",!N.trim()){m.push(`source "${O}": executor validate-source-def failed \u2014 ${J instanceof Error?J.message:String(J)}`);continue}}let U=JSON.parse(N.trim());if(!U.ok&&Array.isArray(U.errors))for(let J of U.errors)m.push(`source "${O}": ${J}`);}catch(N){m.push(`source "${O}": executor validate-source-def failed \u2014 ${N instanceof Error?N.message:String(N)}`);}}let R=[...d.errors,...m];return ye({cardId:l,isValid:R.length===0,issues:R})}function g(l,i){let d=l.params?.sourceIdx,m=l.params?.outRef;if(d===void 0)return fe(`${i} requires params.sourceIdx`);if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return fe(`${i} requires card JSON object in body`);let p=l.body,R=p["card-content"]??p,w=p["mock-projections"]??{},O=R.source_defs??[];if(d<0||d>=O.length)return fe(`sourceIdx ${d} out of range (card has ${O.length} source(s))`);let N=O[d],U=typeof N.bindTo=="string"?N.bindTo:"source";return {src:N,bindTo:U,outRef:m,mockProjections:w}}async function k(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return fe("validateCardPreflight requires card JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)";return await f(m,d)}catch(i){return Ce(i)}}async function S(l){try{let i=g(l,"probeSourcePreflight");if("status"in i)return i;let d=u();if(!d)return fe("No task-executor registered for this board");try{let m={...i.src,_projections:i.mockProjections},p=await t.invokeExecutor(d,"probe-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(m)}),R=JSON.parse(p.trim());return R.ok?ye({bindTo:i.bindTo,reachable:R.reachable,latencyMs:R.latencyMs,note:R.note}):fe(R.error??"Preflight probe failed")}catch{return fe("Executor does not support probe-source-preflight")}}catch(i){return Ce(i)}}async function b(l){try{let i=g(l,"runSourcePreflight");if("status"in i)return i;let d=u();if(!d)return fe("No task-executor registered for this board");try{let m={...i.src,_projections:i.mockProjections},p=await t.invokeExecutor(d,"run-source-preflight",{timeout:i.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(m)}),R=JSON.parse(p.trim());if(!R.ok)return ye({bindTo:i.bindTo,ok:!1,result:null,issues:[R.error??"Preflight run failed"]});if(i.outRef){let w=it(i.outRef);t.absoluteBlob.write(w.value,JSON.stringify(R.resultValue,null,2));}return ye({bindTo:typeof R.bindTo=="string"?R.bindTo:i.bindTo,ok:!0,result:R.resultValue??null,issues:[]})}catch(m){let p=m instanceof Error?m.message:String(m);return ye({bindTo:i.bindTo,ok:!1,result:null,issues:[p]})}}catch(i){return Ce(i)}}async function B(l){try{let i=u();if(!i)return fe("No task-executor registered for this board");let d=await t.invokeExecutor(i,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return ye(JSON.parse(d.trim()))}catch(i){return Ce(i)}}function I(l){try{let i=l.body;if(!i||!Array.isArray(i.ops))return fe("updatesInCardStore requires body.ops array");let d=i.ops,m=c();for(let p of d){let R=p.op,w=p.id;if(!w)return fe('op is missing "id"');if(R==="update"){let O=p["card-content"];if(!O)return fe(`update op for "${w}" is missing "card-content"`);m.writeCard(w,O);}else return fe(`Unknown op type: "${R??"(none)"}"`)}return ye()}catch(i){return Ce(i)}}function P(l){try{let i=l.body;if(!i||!Array.isArray(i.ids))return fe("readFromCardStore requires body.ids array");let d=i.ids,m=c(),p=d.map(R=>({id:R,"card-content":m.readCard(R)}));return ye({cards:p})}catch(i){return Ce(i)}}function A(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return fe("evalCardCompute requires a JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)",p=i["mock-fetched-sources"]??{},R=i["mock-requires"]??{},w=d.compute;if(!w||!Array.isArray(w)||w.length===0)return ye({cardId:m,ok:!0,computed_values:{},errors:[]});let O={id:m,card_data:d.card_data??{},requires:R,source_defs:d.source_defs,compute:w},N=We.runSync(O,{sourcesData:p}),U=N.node.computed_values??{},J=N.errors??[];return ye({cardId:m,ok:J.length===0,computed_values:U,errors:J})}catch(i){return Ce(i)}}async function y(l){try{if(!l.body||typeof l.body!="object"||Array.isArray(l.body))return fe("simulateCardCycle requires a JSON object in body");let i=l.body,d=i["card-content"]??i,m=typeof d.id=="string"?d.id:"(unknown)",p=i["mock-fetched-sources"]??{},R=i["mock-requires"]??{},w=await f(m,d),O=w.status==="success"?{isValid:w.data.isValid,issues:w.data.issues}:{isValid:!1,issues:[w.status==="fail"?w.error:"internal error"]},N=d.source_defs??[],U=d.card_data??{},J=[],ae=[];if(N.length>0){J=We.enrichSourcesSync(N,{card_data:U,requires:R});for(let K of J){let h=K.projections,T=K._projections;if(h&&T){for(let F of Object.keys(h))if(T[F]===void 0){let D=typeof K.bindTo=="string"?K.bindTo:"(unknown)";ae.push({bindTo:D,key:F,error:`Projection "${F}" resolved to undefined`});}}}}let Q=[],te={...p},ue=i["task-executor-ref"],G=(ue?.howToRun&&ue?.whatToRun?ue:void 0)??u();for(let K=0;K<J.length;K++){let h=J[K],T=typeof h.bindTo=="string"?h.bindTo:`source_${K}`;if(!G){Q.push({bindTo:T,skipped:!0,error:"No task executor configured"});continue}try{let F={...h},D=await t.invokeExecutor(G,"run-source-preflight",{timeout:h.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(F)}),M=JSON.parse(D.trim());M.ok&&!Object.prototype.hasOwnProperty.call(p,T)&&Object.prototype.hasOwnProperty.call(M,"resultValue")&&(te[T]=M.resultValue),Q.push({bindTo:T,reachable:M.reachable,latencyMs:M.latencyMs,error:M.ok?void 0:M.error});}catch{Q.push({bindTo:T,skipped:!0,error:"Executor does not support run-source-preflight"});}}let Z=d.compute,re={},E=[];if(Z&&Array.isArray(Z)&&Z.length>0){let K={id:m,card_data:U,requires:R,source_defs:d.source_defs,compute:Z},h=We.runSync(K,{sourcesData:te});re=h.node.computed_values??{},E=h.errors??[];}let x=O.isValid&&ae.length===0&&E.length===0&&Q.every(K=>K.reachable!==!1);return ye({cardId:m,ok:x,validation:O,source_probes:Q,projection_errors:ae,fetched_sources:te,computed_values:re,compute_errors:E})}catch(i){return Ce(i)}}return {validateCardPreflight:k,probeSourcePreflight:S,runSourcePreflight:b,evalCardCompute:A,simulateCardCycle:y,describeTaskExecutorCapabilities:B,updatesInCardStore:I,readFromCardStore:P}}function pr(e,t={}){function r(g){return {status:"success",data:g}}function n(g){return {status:"fail",error:g}}function o(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}async function a(g){let k=t.emitNotification;if(!k||g.length===0)return;let S=De(g);if(S.length===1){await k(S[0]);return}await k($e({kind:"notification-batch",notifications:S}));}async function c(g){let k=g.params?.id;if(k){let S=await e.readCard(k);if(!S)throw new Error(`card "${k}" not found`);return [S]}return await e.readAllCards()}function u(g){return $e({kind:"notification-batch",notifications:De(g.map(k=>({kind:"card_refreshed",cardId:k.id,card:k})))})}function f(g){if(Array.isArray(g))return g;if(g&&typeof g=="object"){let k=g;return Array.isArray(k.files)?k.files:[g]}return null}return {async get(g){try{return r({cards:await c(g)})}catch(k){return o(k)}},async buildNotificationBatch(g){try{return r(u(await c(g)))}catch(k){return o(k)}},async set(g){try{let k=g.body;if(k==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(k)?k:[k];for(let b of S){if(typeof b.id!="string")return n("each card must have a string `id` field");await e.writeCard(b.id,b);}return await a(S.map(b=>({kind:"card_refreshed",cardId:b.id,card:b}))),r({count:S.length})}catch(k){return o(k)}},async del(g){try{let k=g.body?.ids??[],S=g.params?.id,b=S?[...k,S]:k;if(b.length===0)return n("del requires body.ids (string[]) or params.id");for(let B of b)await e.removeCard(B);return await a(b.map(B=>({kind:"card_removed",cardId:B}))),r({count:b.length})}catch(k){return o(k)}},async patch(g){try{let k=g.params?.id,S=g.params?.path;if(!k)return n("patch requires params.id");if(!S)return n("patch requires params.path");let b=g.body,B=b&&Object.prototype.hasOwnProperty.call(b,"value")?b.value:g.body;await e.patchCard(k,S,B);let I=await e.readCard(k);return I?(await a([{kind:"card_refreshed",cardId:k,card:I}]),r({count:1})):n(`card "${k}" not found`)}catch(k){return o(k)}},async appendFiles(g){try{let k=g.params?.id;if(!k)return n("appendFiles requires params.id");let S=await e.readCard(k);if(!S)return n(`card "${k}" not found`);let b=f(g.body);if(!b||b.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let B=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},I=Array.isArray(B.files)?B.files:[],P=[...I,...b],A=b.map((l,i)=>({idx:I.length+i,entry:l})),y=await this.patch({params:{id:k,path:"card_data.files"},body:{value:P}});return y.status!=="success"?y:r({files_added:A})}catch(k){return o(k)}}}}async function $n(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function Ur(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function Vr(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...Ur(r),leaseToken:r.leaseToken,leaseExpiresAt:r.leaseExpiresAt}))},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},async peekActive(){return (await e.peekActive()).map(Ur)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...Ur(t),reason:t.reason}))}}}function Un(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return er(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Zt(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(r){return e.write("board-runtime-store-ref",r)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){return e.write("card-store-ref",r)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){return e.write("outputs-store-ref",r)},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(r){return e.write("queue-store-ref",r)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){return e.write("scratch-store-ref",r)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){return e.write("chat-store-ref",r)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){return e.write("artifacts-store-ref",r)},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(r){return e.write("fetched-sources-store-ref",r)}}}function ua(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function gr(e,t){return ua(e)?e.then(t):t(e)}function Vn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=Vn(r[n],o):r[n]=o;return r}function yr(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let a=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:yr(a,o,r)}}function Kn(e){return {read:r=>e.read(r),get(r,n){return gr(e.read(r),o=>{if(o===null)return null;let a=o;for(let c of n.split(".").filter(Boolean)){if(a===null||typeof a!="object"||Array.isArray(a))return null;a=a[c]??null;}return a??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return gr(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return gr(e.read(r),o=>e.write(r,Vn(o??{},n)))},patch(r,n,o){return gr(e.read(r),a=>{let c=n.split(".").filter(Boolean);return e.write(r,yr(a??{},c,o))})}}}function hr(e){return Kn(e)}function Rr(e,t){return {async readIndex(){return await e.read("_index")},writeIndex(r){return e.write("_index",r)},async readCard(r){return await e.read(r)},async writeCard(r,n){return await e.write(r,n),t(n)},removeCard(r){return e.delete(r)},async cardExists(r){return await e.read(r)!==null},defaultCardKey(r){return r}}}function kr(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,a]of Object.entries(await r())){if(!await e.cardExists(a.key))continue;let c=await e.readCard(a.key);c?n.push(c):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,a]of Object.entries(await r()))n[o]=a.checksum;return n},async changedSince(n){let o=await r(),a=[];for(let[c,u]of Object.entries(o))n[c]!==u.checksum&&a.push(c);for(let c of Object.keys(n))o[c]||a.push(c);return a},async validateUpsert(n,o){let a=await r(),c=a[n],u=Object.entries(a).find(([,f])=>f.key===o);return c&&c.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${c.key}", cannot remap to "${o}"`}:u&&u[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,a){let c=await r(),u=a??c[n]?.key??e.defaultCardKey(n),f=await e.writeCard(u,o);c[n]={key:u,checksum:f,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async patchCard(n,o,a){let c=await r(),u=c[n];if(!u||!await e.cardExists(u.key))throw new Error(`card "${n}" not found`);let f=await e.readCard(u.key);if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`card "${n}" is not patchable`);let g=String(o||"").split(".").filter(Boolean),k=yr(f,g,a),S=await e.writeCard(u.key,k);c[n]={key:u.key,checksum:S,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async removeCard(n){let o=await r(),a=o[n];a&&(await e.removeCard(a.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function Ie(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ve(e){return {status:"fail",error:e}}function Ee(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Ne(){return new Date().toISOString()}function ca(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Qn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,a=>a.charCodeAt(0));return new TextDecoder().decode(o)}function Cr(e){try{let t=JSON.parse(Qn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Hn(e){return ca(JSON.stringify(e))}function Jn(e){try{let t=JSON.parse(Qn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function da(e){return Lr(e,Bn,()=>({_sources:{}}))}function la(e,t){return or(e,t)}function fa(e){return ar(e)}function ma(e,t){return jr(e,t)}function pa(e,t,r,n,o,a){return async c=>{let u=[],f=await r.cardStore.readCard(c.nodeId);if(!f)return "task-initiate-failure";let g=f.id;if(g===_e){let Q=r.activeTaskConfigs?.(),te={[ot]:Q?Dr((await Promise.all(Object.keys(Q).filter(ue=>ue!==_e).map(ue=>r.cardStore.readCard(ue)))).filter(ue=>!!ue),Q):await Mr(await r.cardStore.readAllCards())};return (a??(()=>{}))(te),n(c.nodeId,te),"task-initiated"}let k=f.card_data??{},S=f.source_defs??[],b=S,B=await r.cardRuntimeStore.readRuntime(g),I=false,P=async()=>{I&&(await r.cardRuntimeStore.writeRuntime(g,B),I=false);},A=Q=>Nt(B._sources[Q]),y=(Q,te)=>{B._sources[Q]=Nt(te),I=true;},l=c.taskState?.executionCount??0;if(B._lastExecutionCount!==l&&(B._sources={},B._lastExecutionCount=l,I=true),c.update){let Q=c.update.outputFile;if(Q){let te=A(Q);if(c.update.failure){let ue=c.update.rqt??te.lastRequestedToken??te.queueRequestedToken;ue&&y(Q,Lt(te,ue));}else {let ue=c.update.rqt;if(!te.lastCompletedToken||ue>te.lastCompletedToken){let G=typeof c.update.deliveryToken=="string"?c.update.deliveryToken:void 0,Z=G?await r.fetchedSourcesStore.commitSourceData(g,Q,G):false;y(Q,Z?$r(te,ue):Lt(te,ue));}}await P();}}let i={};for(let Q of S){if(!Q.outputFile)continue;let te=await r.fetchedSourcesStore.readSourceData(g,Q.outputFile);te!==null&&(i[Q.bindTo]=te);}let d={};for(let[Q,te]of Object.entries(c.state??{}))if(te!==null&&typeof te=="object"&&!Array.isArray(te)){let ue=te[Q];d[Q]=ue!==void 0?ue:te;}else d[Q]=te;let m={id:g,card_data:{...k},requires:d,source_defs:S,compute:f.compute};m._sourcesData=i,f.compute&&We.runSync(m,{sourcesData:i}),(o??(()=>{}))(g,m.computed_values??{});let p=We.enrichSourcesSync(Array.isArray(f.source_defs)?f.source_defs:void 0,{card_data:f.card_data,requires:d}),R={...f,source_defs:Array.isArray(p)?p.map(Q=>({...Q,boardDir:typeof Q.boardDir=="string"&&Q.boardDir?Q.boardDir:e.value})):p},w=Ne(),O=c.update?void 0:w,N=b.filter(Q=>{let te=Q.outputFile;if(typeof te!="string"||!te)return true;let ue=A(te);O&&(ue={...ue,queueRequestedToken:O},y(te,ue));let G=ue.queueRequestedToken??ue.lastRequestedToken??w;return jt(ue,G)==="dispatch"});if(await P(),N.length>0){let Q=false,te=w;for(let ue of N){let G=ue.outputFile;if(typeof G!="string"||!G)continue;let Z=A(G),re=Z.queueRequestedToken??w;y(G,{...Z,lastRequestedToken:re}),te=re,Q=true;}return Q&&await P(),Q&&(u.push({taskKind:"source-fetch",payload:{boardRef:Te(e),enrichedCard:R,callbackToken:c.callbackToken,rqt:te}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(b.some(Q=>{let te=Q.outputFile;if(typeof te!="string"||!te)return false;let ue=A(te),G=ue.queueRequestedToken??ue.lastRequestedToken??w;return jt(ue,G)==="in-flight"}))return "task-initiated";let J=f.provides??[],ae={};for(let{bindTo:Q,ref:te}of J)ae[Q]=We.resolve(m,te);return (a??(()=>{}))(ae),n(c.nodeId,ae),u.length>0&&await r.executionRequestStore.appendEntries(t,u),"task-initiated"}}function Gn(e,t,r={}){Gt(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let n=t.callbackTransport,o=t.warn??(()=>{}),a=Te(e),c=r.emitNotification??(E=>{if(!t.publishBoardChangeNotifications)return;let x=E.kind==="notification-batch"?E.notifications:[E];return t.publishBoardChangeNotifications(x)}),u=null,f=r.boardRuntimeStoreRef,g=r.scratchStoreRef,k=r.taskExecutorRef,S=r.chatHandlerFlow;function b(){if(!f)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return f}function B(E){if(E.length!==0)try{let x=De(E),K=$e({kind:"notification-batch",notifications:x});return Promise.resolve(c(K)).catch(h=>{o(`[async-board-live-cards-public] emitNotification failed: ${h instanceof Error?h.message:String(h)}`);})}catch(x){o(`[async-board-live-cards-public] emitNotification failed: ${x instanceof Error?x.message:String(x)}`);return}}let I=()=>Un(t.kvStorageForRef(b())),P=e.value,A=()=>rr(qr(()=>t.kvStorageForRef(b()),t.hashFn),"v1"),y=async()=>{let E=await I().readOutputsStoreRef();if(!E)throw new Error(`Board at ${e.value} has no outputs store configured.`);return fa(t.kvStorageForRef(E))},l=async()=>{let E=await I().readCardStoreRef();if(!E)throw new Error(`Board at ${e.value} has no card store configured.`);let x=t.kvStorageForRef(E);return kr(Rr(hr(x),t.hashFn),o)};async function i(){return !!(await A().readSnapshot(P)).values[lt]}async function d(){let E=await A().readSnapshot(P);if(!E.values[lt])throw new Error(`Board not initialized at ${e.value}`);return lr(E.values)}async function m(E,x){let K=await A().commitSnapshot(P,{schemaVersion:"v1",expectedVersion:x,deleteKeys:[],shallowMerge:dr(E)});if(!K.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${x??"null"} current=${K.currentVersion??"null"}`)}let p=()=>Tn(t.journalStorageForRef(b()));async function R(){return k??await I().readTaskExecutorRef()}async function w(){return cr(await(await y()).readAllDataObjects())}async function O(E){await p().appendEvent(E);}async function N(){let E=await I().readFetchedSourcesStoreRef();if(!E)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return E}async function U(){return t.blobStorageForRef(await N())}async function J(){return la(await U(),E=>t.resolveBlob(E))}async function ae(E){let x=(await U()).keyRef?.(E);if(!x)throw new Error("configured fetched-sources store does not support keyRef");let K=await Promise.resolve(x);return Te(K)}async function Q(){let E=ma(t.kvStorageForRef(b()),async(q,V)=>{let oe=q.payload,ie=(oe.enrichedCard??{}).id??oe.cardId??"unknown";await O({type:"task-failed",taskName:ie,error:V,timestamp:Ne()});}),x=da(t.kvStorageForRef(b())),K=await U(),h=await J(),T=await l(),F=await y(),D=new Map,M=new Map,$=[],se=[],ce=[],be=new Map,xe=new Set,Pe={async readRuntime(q){return D.get(q)??await x.readRuntime(q)},async writeRuntime(q,V){D.set(q,V),Se[q]=V;}},pe={async readSourceData(q,V){let oe=`${q}/${V}`;return M.has(oe)?M.get(oe):await h.readSourceData(q,V)},ingestSourceDataStaged(q,V,oe,de){return h.ingestSourceDataStaged(q,V,oe,de)},async commitSourceData(q,V,oe){let de=`${q}/.staged/${oe}/${V}`,ie=await K.read(de);if(ie==null){let je=await Promise.resolve(K.keyRef?.(de));je&&(ie=await t.resolveBlob(je));}if(ie==null)return false;let Re=`${q}/${V}`,Be=ie.trim();try{M.set(Re,JSON.parse(Be));}catch{M.set(Re,Be);}return $.push({cardId:q,outputFile:V,deliveryToken:oe}),true},async hasSource(q,V){let oe=`${q}/${V}`;return M.has(oe)||await h.hasSource(q,V)},async listSources(q){let V=await h.listSources(q),oe=[...M.keys()].filter(de=>de.startsWith(`${q}/`)).map(de=>de.slice(`${q}/`.length));return [...new Set([...V,...oe])]}},ke=await d(),Ve=bt(ke.graph),Se={...ke.runtimeByCardId},{events:Ke,newCursor:qe}=await p().readEntriesAfterCursor(ke.lastDrainedJournalId),he=Ke,et=()=>Ve.config.tasks,Je=zt(Ve,{handlers:{"card-handler":pa(e,qe,{cardStore:T,cardRuntimeStore:Pe,fetchedSourcesStore:pe,outputStore:F,executionRequestStore:E,activeTaskConfigs:()=>et()},(q,V)=>{he.push({type:"task-completed",taskName:q,data:V,timestamp:Ne()});},(q,V)=>{se.push({cardId:q,values:V});},q=>{ce.push(q);})},onNodeRemoved:q=>{be.delete(q),D.delete(q),delete Se[q],xe.add(q);}});for(et=()=>Je.getState().config.tasks;he.length>0;){let q=he;he=[];for(let V of q)if(V.type==="task-restart"){let oe=await T.readCard(V.taskName);oe&&be.set(V.taskName,oe);}Je.pushAll(q),await Je.waitForHandlers();}let tt=Je.getState();await Je.dispose({wait:true}),await m({lastDrainedJournalId:qe,graph:Ct(tt),runtimeByCardId:Se},(await A().readSnapshot(P)).version);for(let{cardId:q,values:V}of se)await F.writeComputedValues(q,V);for(let q of ce)await F.writeDataObjects(q);for(let[q,V]of D)await x.writeRuntime(q,V);for(let q of $)await h.commitSourceData(q.cardId,q.outputFile,q.deliveryToken);let yt=St(wt(a,tt));await F.writeStatusSnapshot(yt);let j=[];for(let{cardId:q,values:V}of se)j.push({kind:"computed_values",cardId:q,values:V});for(let q of ce)for(let[V,oe]of Object.entries(q))j.push({kind:"data_object",key:V,payload:oe});for(let[q,V]of be)j.push({kind:"card_refreshed",cardId:q,card:V});for(let q of xe)j.push({kind:"card_removed",cardId:q});j.push({kind:"status",status:yt}),await B(j);let v=await R();if(!v)return;let W=t.supportsDirectSourceOutput?.(v)===true;await E.dispatchEntriesForJournalId(qe,async q=>{if(q.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${q.taskKind}" \u2014 skipping`);return}let V=q.payload,oe=V.enrichedCard?.id??"unknown",de=V.enrichedCard?.source_defs??[];if(v.howToRun==="queue-storage"&&W){try{let ie=await I().readQueueStoreRef();if(!ie)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let Re=t.queueStorageForRef(ie,"task-executor"),Be=typeof v.extra?.boardId=="string"?v.extra.boardId:void 0,je=[];for(let Le of de){if(!Le.outputFile)continue;let Me=t.genId(),Ye=`${oe}/.staged/${Me}/${Le.outputFile}`,Ge=await Promise.resolve(K.keyRef?.(Ye));if(!Ge)continue;let Xe={ref:Te(Ge),deliveryToken:Me,outputFile:Le.outputFile,cardId:oe},ft=Hn({cbk:V.callbackToken,rg:e.value,br:Te(e),cid:oe,b:Le.bindTo,d:Le.outputFile,cs:void 0,rqt:V.rqt,dt:Xe.deliveryToken});je.push({...Be?{boardId:Be}:{},ref:v,args:{source_def:Le,base_ref:Te(e),callback:n.createCallback(ft),output:Xe}});}je.length>0&&await Re.enqueueMany(je);}catch(ie){await O({type:"task-failed",taskName:oe,error:ie instanceof Error?ie.message:String(ie),timestamp:Ne()});}return}for(let ie of de){if(!ie.outputFile)continue;let Re;if(W){let Le=t.genId(),Me=`${oe}/.staged/${Le}/${ie.outputFile}`,Ye=await Promise.resolve(K.keyRef?.(Me));Ye&&(Re={ref:Te(Ye),deliveryToken:Le,outputFile:ie.outputFile,cardId:oe});}let Be=Hn({cbk:V.callbackToken,rg:e.value,br:Te(e),cid:oe,b:ie.bindTo,d:ie.outputFile,cs:void 0,rqt:V.rqt,...Re?{dt:Re.deliveryToken}:{}}),je=await t.dispatchExecution(v,{source_def:ie,base_ref:Te(e),callback:n.createCallback(Be),...Re?{output:Re}:{}});je.dispatched||await O({type:"task-failed",taskName:oe,error:je.error??"dispatch failed",timestamp:Ne()});}});}async function te(){try{let E=async()=>{let K=await d(),{events:h}=await p().readEntriesAfterCursor(K.lastDrainedJournalId);h.length>0&&await G();},x=await $n(t.lock,Q,E);return Ie({ran:x!==!1})}catch(E){return Ee(E)}}async function ue(){return u||(u=te().finally(()=>{u=null;}),u)}async function G(){let E=await I().readQueueStoreRef();if(!E)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);await t.queueStorageForRef(E,"process-accumulated").enqueue({boardRef:Te(e)}),await t.requestProcessAccumulated?.();}async function Z(){let E=await I().readQueueStoreRef();if(!E)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let x=t.queueStorageForRef(E,"process-accumulated");for(;;){let K=await x.lease({max:64,visibilityMs:1e3});if(K.length<=0)return;for(let h of K)await x.ack(h.id,h.leaseToken);if(K.length<64)return}}function re(){G();}return {async init(E){try{let x=E.params?.cardStoreRef;if(!x)return ve("init requires params.cardStoreRef");if(f=E.params?.boardRuntimeStoreRef,!f)return ve("init requires params.boardRuntimeStoreRef");let K=E.params?.outputsStoreRef;if(!K)return ve("init requires params.outputsStoreRef");let h=E.params?.queueStoreRef;if(!h)return ve("init requires params.queueStoreRef");let T=E.params?.fetchedSourcesStoreRef;if(!T)return ve("init requires params.fetchedSourcesStoreRef");g=E.params?.scratchStoreRef;let F=E.params?.chatStoreRef;if(!F)return ve("init requires params.chatStoreRef");let D=E.params?.artifactsStoreRef;if(!D)return ve("init requires params.artifactsStoreRef");await i()||await m({lastDrainedJournalId:"",graph:Ct(Tt(Dt)),runtimeByCardId:{}},null);let M=I();await M.writeBoardRuntimeStoreRef(f),await M.writeCardStoreRef(x),await M.writeOutputsStoreRef(K),await M.writeQueueStoreRef(h),await M.writeFetchedSourcesStoreRef(T),await M.writeChatStoreRef(F),await M.writeArtifactsStoreRef(D),await(await l()).writeCard(_e,xt());let $=t.kvStorage("card-upsert"),se=xt(),ce=$t(se),be=t.hashFn(ce),Pe=(await $.read(_e))?.blobRef??await(await l()).readCardKey(_e)??_e;return await O({type:"task-upsert",taskName:_e,taskConfig:ce,timestamp:Ne()}),await $.write(_e,{blobRef:Pe,taskConfigHash:be,updatedAt:Ne()}),await O({type:"task-restart",taskName:_e,timestamp:Ne()}),re(),await(await y()).writeStatusSnapshot(St(wt(a,bt((await d()).graph)))),Ie()}catch(x){return Ee(x)}},async status(E){try{let x=await y(),K=await x.readStatusSnapshot();return K||(K=St(wt(a,bt((await d()).graph))),await x.writeStatusSnapshot(K)),Ie(K)}catch(x){return Ee(x)}},async getCardStoreRef(E){try{let x=await I().readCardStoreRef();return x?Ie({storeRef:x}):ve(`Board at ${e.value} has no card store configured`)}catch(x){return Ee(x)}},async getBoardRuntimeStoreRef(E){try{return Ie({storeRef:f??null})}catch(x){return Ee(x)}},async getOutputsStoreRef(E){try{let x=await I().readOutputsStoreRef();return x?Ie({storeRef:x}):ve(`Board at ${e.value} has no outputs store configured`)}catch(x){return Ee(x)}},async getScratchStoreRef(E){try{return Ie({storeRef:g??null})}catch(x){return Ee(x)}},async getChatStoreRef(E){try{return Ie({storeRef:await I().readChatStoreRef()})}catch(x){return Ee(x)}},async getArtifactsStoreRef(E){try{return Ie({storeRef:await I().readArtifactsStoreRef()})}catch(x){return Ee(x)}},async getFetchedSourcesStoreRef(E){try{return Ie({storeRef:await I().readFetchedSourcesStoreRef()})}catch(x){return Ee(x)}},async getConfig(E){try{let x=E.params?.key;if(!x)return ve("getConfig requires params.key");let K=I(),h;switch(x){case "task-executor":h=k??null;break;case "chat-handler-flow":h=S??null;break;case "board-runtime-store-ref":h=await K.readBoardRuntimeStoreRef();break;case "card-store-ref":h=await K.readCardStoreRef();break;case "outputs-store-ref":h=await K.readOutputsStoreRef();break;case "scratch-store-ref":h=g??null;break;case "chat-store-ref":h=await K.readChatStoreRef();break;case "artifacts-store-ref":h=await K.readArtifactsStoreRef();break;case "fetched-sources-store-ref":h=await K.readFetchedSourcesStoreRef();break;default:return ve(`getConfig: unknown key "${x}"`)}return Ie({value:h})}catch(x){return Ee(x)}},async getOutputsDataObject(E){try{let x=E.params?.key;if(!x)return ve("getOutputsDataObject requires params.key");if(x===ot)return Ie(null);let K=await w();return Ie(K[x]??null)}catch(x){return Ee(x)}},async getAllOutputsDataObjects(E){try{return Ie(await w())}catch(x){return Ee(x)}},async getOutputsComputedValues(E){try{let x=E.params?.key;return x?Ie(await(await y()).readComputedValues(x)):ve("getOutputsComputedValues requires params.key")}catch(x){return Ee(x)}},async getAllOutputsComputedValues(E){try{return Ie(await(await y()).readAllComputedValues())}catch(x){return Ee(x)}},async getOutputsFetchedSources(E){try{let x=E.params?.key;if(!x)return ve("getOutputsFetchedSources requires params.key");let K=await(await J()).listSources(x),h={};for(let T of K)h[T]=await ae(`${x}/${T}`);return Ie(h)}catch(x){return Ee(x)}},async getAllOutputsFetchedSources(E){try{let x=await J(),K=await(await U()).listKeys(),h=new Set;for(let F of K){let D=F.indexOf("/");D>0&&!F.includes("/.staged/")&&h.add(F.slice(0,D));}let T={};for(let F of h){let D=await x.listSources(F);if(D.length!==0){T[F]={};for(let M of D)T[F][M]=await ae(`${F}/${M}`);}}return Ie(T)}catch(x){return Ee(x)}},async buildSseOneShotPayload(E){try{let x=(await(await l()).readAllCards()).filter(M=>M.id!==_e),K=await this.status({});if(K.status!=="success")return K;let h=await this.getAllOutputsDataObjects({});if(h.status!=="success")return h;let T=await this.getAllOutputsComputedValues({});if(T.status!=="success")return T;let F=T.data,D={};for(let M of x){let $=typeof M?.id=="string"?M.id:null;if(!$)continue;let se=M.card_data&&typeof M.card_data=="object"&&!Array.isArray(M.card_data)?M.card_data:{};D[$]={schema_version:"v1",card_id:$,card_data:{...se},computed_values:F[$]&&typeof F[$]=="object"?F[$]:{}};}return Ie({cardDefinitions:x,statusSnapshot:K.data,dataObjectsByToken:h.data,cardRuntimeById:D})}catch(x){return Ee(x)}},async addCardFiles(E){try{let x=E.params?.cardId;if(!x)return ve("addCardFiles requires params.cardId");let h=await pr(await l(),{emitNotification:c}).appendFiles({params:{id:x},body:E.body});return h.status!=="success"?h:Ie({cardId:x,files_added:h.data.files_added,notified:!0})}catch(x){return Ee(x)}},async removeCard(E){try{let x=E.params?.id;if(!x)return ve("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(x);}catch{}return await O({type:"task-removal",taskName:x,timestamp:Ne()}),x!==_e&&await O({type:"task-restart",taskName:_e,timestamp:Ne()}),re(),Ie()}catch(x){return Ee(x)}},async retrigger(E){try{let x=E.params?.id;return x?(await O({type:"task-restart",taskName:x,timestamp:Ne()}),re(),Ie()):ve("retrigger requires params.id")}catch(x){return Ee(x)}},async processAccumulatedEvents(E){return await Z(),ue()},async upsertCard(E){try{let x=E.params?.cardId,K=E.params?.all,h=!!E.params?.restart;if(!x&&!K)return ve("upsertCard requires --card-id <id> or --all");let T=await l(),F=K?(await T.readAllCards()).map($=>$.id):[x];for(let $ of F)if(!await T.readCard($))return ve(`Card "${$}" not found in board at ${e.value}`);let D=t.kvStorage("card-upsert"),M=!1;for(let $ of F){let se=await T.readCard($);if(!se)continue;let ce=$t(se),be=t.hashFn(ce),xe=await D.read($),Pe=xe?.taskConfigHash!==be;if(!(!Pe&&!h)){if(Pe){let pe=xe?.blobRef??await T.readCardKey($)??$;await O({type:"task-upsert",taskName:$,taskConfig:ce,timestamp:Ne()}),await D.write($,{blobRef:pe,taskConfigHash:be,updatedAt:Ne()}),M=M||$!==_e;}h&&await O({type:"task-restart",taskName:$,timestamp:Ne()});}}return M&&await O({type:"task-restart",taskName:_e,timestamp:Ne()}),re(),Ie()}catch(x){return Ee(x)}},async taskFailed(E){try{let x=E.params?.token;if(!x)return ve("taskFailed requires params.token");let K=E.params?.error??"unknown error",h=Cr(x);return h?(await O({type:"task-failed",taskName:h.taskName,error:K,timestamp:Ne()}),re(),Ie()):ve("Invalid callback token")}catch(x){return Ee(x)}},async taskProgress(E){try{let x=E.params?.token;if(!x)return ve("taskProgress requires params.token");let K=(E.body??{}).update??{},h=Cr(x);return h?(await O({type:"task-progress",taskName:h.taskName,update:K,timestamp:Ne()}),re(),Ie()):ve("Invalid callback token")}catch(x){return Ee(x)}},async sourceDataFetched(E){try{let x=E.params?.token,K=E.params?.ref;if(!x)return ve("sourceDataFetched requires params.token");if(!K)return ve("sourceDataFetched requires params.ref");let h=Jn(x);if(!h)return ve("Invalid source token");let T=await J(),F=h.dt||t.genId();h.dt||await T.ingestSourceDataStaged(h.cid,h.d,it(K),F);let D=Cr(h.cbk);return D?(await O({type:"task-progress",taskName:D.taskName,update:{bindTo:h.b,outputFile:h.d,fetchedAt:Ne(),deliveryToken:F,sourceChecksum:h.cs,rqt:h.rqt},timestamp:Ne()}),re(),Ie()):ve("Invalid callback token embedded in source token")}catch(x){return Ee(x)}},async sourceDataFetchFailure(E){try{let x=E.params?.token,K=E.params?.reason??"unknown";if(!x)return ve("sourceDataFetchFailure requires params.token");let h=Jn(x);if(!h)return ve("Invalid source token");let T=Cr(h.cbk);return T?(await O({type:"task-progress",taskName:T.taskName,update:{bindTo:h.b,outputFile:h.d,failure:!0,reason:K,sourceChecksum:h.cs,rqt:h.rqt},timestamp:Ne()}),re(),Ie()):ve("Invalid callback token embedded in source token")}catch(x){return Ee(x)}}}}async function ga(e,t){return (await e.peekActive()).find(r=>r.id===t)}function Wn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=De(n);if(a.length===1){await o(a[0]);return}await o($e({kind:"notification-batch",notifications:a}));}return {async enqueue(n){let o=await e.enqueue(n);return await r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},async enqueueMany(n){let o=await e.enqueueMany(n);return await r(o.map(a=>({kind:"message_enqueued",lane:t.lane,message:a}))),o},enqueueIfAbsent:e.enqueueIfAbsent?async(n,o)=>{let a=await e.enqueueIfAbsent(n,o);return a&&await r([{kind:"message_enqueued",lane:t.lane,message:a}]),a}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,a){return e.nack(n,o,a)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},async stage(n,o){return e.stage(n,o)},async commitStaged(n){let o=await e.commitStaged(n);if(o){let a=await ga(e,n);a&&await r([{kind:"message_enqueued",lane:t.lane,message:a}]);}return o},async discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Kr(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function ya(e){return {...Kr(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}}function ha(e){return {...Kr(e),reason:e.reason}}function Hr(e){return {enqueueRequest(t){return e.enqueue(t).id},enqueueRequestIfAbsent:e.enqueueIfAbsent?(t,r)=>{let n=e.enqueueIfAbsent(t,r);return n?n.id:null}:void 0,leaseRequests(t){return e.lease(t).map(ya)},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},peekActive(){return e.peekActive().map(Kr)},peekDeadLetter(){return e.peekDeadLetter().map(ha)}}}function Ra(e,t){return e.peekActive().find(r=>r.id===t)}function zn(e,t={}){async function r(n){let o=t.emitNotification;if(!o||n.length===0)return;let a=De(n);if(a.length===1){await o(a[0]);return}await o($e({kind:"notification-batch",notifications:a}));}return {enqueue(n){let o=e.enqueue(n);return r([{kind:"message_enqueued",lane:t.lane,message:o}]),o},enqueueMany(n){let o=e.enqueueMany(n);return r(o.map(a=>({kind:"message_enqueued",lane:t.lane,message:a}))),o},enqueueIfAbsent:e.enqueueIfAbsent?(n,o)=>{let a=e.enqueueIfAbsent(n,o);return a&&r([{kind:"message_enqueued",lane:t.lane,message:a}]),a}:void 0,lease(n){return e.lease(n)},ack(n,o){return e.ack(n,o)},nack(n,o,a){return e.nack(n,o,a)},peekActive(n){return e.peekActive(n)},peekDeadLetter(n){return e.peekDeadLetter(n)},stage(n,o){return e.stage(n,o)},commitStaged(n){let o=e.commitStaged(n);if(o){let a=Ra(e,n);a&&r([{kind:"message_enqueued",lane:t.lane,message:a}]);}return o},discardStaged(n,o){return e.discardStaged(n,o)},peekStaged(n){return e.peekStaged(n)}}}function Yn(){return new Date().toISOString()}function Xn(e){return new TextEncoder().encode(e).byteLength}function ka(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Zn(e){function t(r){let n=e.stat?ka(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let o=e.read(r);return o===null?{key:r}:{key:r,size:Xn(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Yn(),a.size=a.size??Xn(n),a},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let c=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,c);}let a=t(r)??{key:r};return a.contentType=o,a.updatedAt=a.updatedAt??Yn(),a.size=a.size??n.byteLength,a},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function eo(){function e(o,a){if(!Array.isArray(o))return [];let c=[];for(let u of o){if(!u||typeof u!="object")continue;let f=u;typeof f.stored_name=="string"&&c.push({name:typeof f.name=="string"?f.name:f.stored_name,stored_name:f.stored_name,size:typeof f.size=="number"&&Number.isFinite(f.size)?f.size:null,mime_type:typeof f.mime_type=="string"?f.mime_type:null,uploaded_at:typeof f.uploaded_at=="string"?f.uploaded_at:a||null,chat:f.chat===true});}return c}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,a){let c=t(o);if(a.length===0)return o.files=c,c;let u=new Set(c.map(f=>f.stored_name));for(let f of a)u.has(f.stored_name)||(c.push(f),u.add(f.stored_name));return o.files=c,c}function n(o,a,c){let u=t(o);if(!Number.isInteger(a)||a<0||a>=u.length)return {ok:false,reason:"index_out_of_range"};let f=u[a];return !f||!f.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==f.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:f}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function to(e,t={}){let r=t.emitNotification;function n(y){let l=typeof y=="number"?y:Number(y);return Number.isInteger(l)&&l>0?l:null}function o(y,l){let i=l;for(let d=y.length-1;d>=0;d-=1)if(y[d]?.role==="user"&&(i-=1,i===0))return y.slice(d);return y}function a(y){return y.some(l=>typeof l?.turn=="string"&&l.turn!=="")}function c(y,l){if(l<=0)return [];if(!a(y))return o(y,l);let i=new Map,d=[];for(let p of y){let R=typeof p?.turn=="string"?p.turn:"";i.has(R)||(i.set(R,[]),d.push(R)),i.get(R).push(p);}return d.slice(Math.max(0,d.length-l)).flatMap(p=>i.get(p)??[])}function u(y){return {status:"success",data:y}}function f(y){return {status:"fail",error:y}}function g(y){return {status:"error",error:y instanceof Error?y.message:String(y)}}function k(y){return {role:String(y.role||"system"),text:String(y.text||""),files:Array.isArray(y.files)?y.files:[],...typeof y.turn=="string"&&y.turn?{turn:y.turn}:{}}}async function S(y){if(!r||y.length===0)return;let l=De(y);if(l.length===1){await r(l[0]);return}await r($e({kind:"notification-batch",notifications:l}));}async function b(y){let l=await e.readAll(y);return c(l,1).map(k)}async function B(y){let l=Date.now();return {kind:"card_chats",cardId:y,sentAt:new Date(l).toISOString(),sentAtMs:l,messages:await b(y),receiving:true,processing:await e.isProcessing(y)}}async function I(y,l="command envelope"){let i=typeof y.cardId=="string"?y.cardId:void 0;if(!y.command)return f(`chat-store: ${l} missing "command"`);if(!i)return f(`chat-store: ${l} missing "cardId"`);if(y.command==="append")return await A.append({params:{cardId:i},body:{role:y.role,text:y.text,files:y.files,turn:y.turn}});if(y.command==="read-all")return await A.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 A.readAfter({params:{cardId:i},body:{cursor:y.cursor??null}});if(y.command==="clear")return await A.clear({params:{cardId:i}});if(y.command==="set-processing")return await A.setProcessing({params:{cardId:i},body:{active:y.active}});if(y.command==="is-processing")return await A.isProcessing({params:{cardId:i}});if(y.command==="get-config")return await A.getConfig({params:{cardId:i}});if(y.command==="set-config"){let{command:d,cardId:m,...p}=y;return await A.setConfig({params:{cardId:i},body:p})}return f(`chat-store: unknown command "${String(y.command)}"`)}async function P(y){if(!Array.isArray(y.commands)||y.commands.length===0)return f('chat-store: command envelope must include a non-empty "commands" array');let l=[];for(let i=0;i<y.commands.length;i+=1){let d=y.commands[i];if(!d||typeof d!="object"||Array.isArray(d))return f(`chat-store: command envelope entry ${i} must be an object`);let m={cardId:y.cardId,...d},p=await I(m,`command envelope entry ${i}`);if(p.status!=="success")return p;l.push({index:i,command:String(m.command),data:p.data});}return u({results:l})}let A={async append(y){try{let l=y.params?.cardId;if(!l)return f("append requires params.cardId");let i=y.body??{},d=typeof i.role=="string"?i.role:"",m=typeof i.text=="string"?i.text:"",p=Array.isArray(i.files)?i.files:[],R=typeof i.turn=="string"?i.turn:"";if(!d)return f("append requires body.role");let w=await e.append(l,d,m,p,R);return await S([{kind:"chat_messages",cardId:l,messages:await b(l)}]),u({id:w})}catch(l){return g(l)}},async readAll(y){try{let l=y.params?.cardId;if(!l)return f("readAll requires params.cardId");let i=y.body??{},d=typeof i.turnId=="string"?i.turnId:"",m=i.allTurns===!0,p=typeof i.tailTurnsBeforeId=="string"?i.tailTurnsBeforeId:"",R=i.tailTurns===void 0?i.lastUserTurns:i.tailTurns,w=R===void 0?m||d?void 0:1:n(R);if(R!==void 0&&w===null)return f("readAll requires body.tailTurns (positive integer)");let O=await e.readAll(l),N=O.filter(U=>!d||String(U.turn||"")===d);if(p){let U=w;if(typeof U!="number"||!Number.isInteger(U)||U<=0)return f("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let J=new Map,ae=[];for(let G of O){let Z=String(G.turn||"");J.has(Z)||(J.set(Z,[]),ae.push(Z)),J.get(Z).push(G);}let Q=ae.findIndex(G=>G===p),te=Math.max(0,Q-U);return N=(Q===-1?[]:ae.slice(te,Q)).flatMap(G=>J.get(G)??[]),u({records:N})}return u(typeof w=="number"?{records:c(N,w)}:{records:N})}catch(l){return g(l)}},async buildSseOneShotBatch(y){try{let l=y.params?.cardId;if(!l)return f("buildSseOneShotBatch requires params.cardId");let i=y.body??{},d=typeof i.receiving=="boolean"?i.receiving:!0,m=await B(l);return u($e({kind:"notification-batch",notifications:[{...m,receiving:d}]}))}catch(l){return g(l)}},async readAfter(y){try{let l=y.params?.cardId;if(!l)return f("readAfter requires params.cardId");let d=(y.body??{}).cursor??null;return u(await e.readAfter(l,d))}catch(l){return g(l)}},async clear(y){try{let l=y.params?.cardId;return l?(await e.clear(l),u({ok:!0})):f("clear requires params.cardId")}catch(l){return g(l)}},async setProcessing(y){try{let l=y.params?.cardId;if(!l)return f("setProcessing requires params.cardId");let i=y.body??{};return typeof i.active!="boolean"?f("setProcessing requires body.active (boolean)"):(await e.setProcessing(l,i.active),await S([{kind:"chat_processing",cardId:l,active:i.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(l){return g(l)}},async isProcessing(y){try{let l=y.params?.cardId;return l?u({active:await e.isProcessing(l)}):f("isProcessing requires params.cardId")}catch(l){return g(l)}},async getConfig(y){try{let l=y.params?.cardId;return l?u({config:await e.getConfig(l)}):f("getConfig requires params.cardId")}catch(l){return g(l)}},async setConfig(y){try{let l=y.params?.cardId;if(!l)return f("setConfig requires params.cardId");let i=y.body??{};return await e.setConfig(l,i),u({ok:!0})}catch(l){return g(l)}},run:I,runBatch:P};return A}function It(e){if(!e||typeof e!="object")return false;let t=e;return typeof t.kind=="string"&&t.kind.length>0}function ro(e){if(!e||typeof e!="object")return [];let t=e;return t.kind==="notification-batch"?Array.isArray(t.notifications)?t.notifications.filter(It):[]:It(e)?[e]:[]}function no(e,t,r){let n=0;return {accepted:e.filter(a=>{if(!It(a))return n++,false;let c=a;return typeof c.sentAtMs=="number"&&t-c.sentAtMs>r?(n++,false):true}),rejected:n}}function ao(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Jr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function Ca(e){if(!e||typeof e!="object")return false;let t=e;return t.kind==="notification-batch"&&Array.isArray(t.notifications)}function oo(e,t){if(t.kind==="status"){Jr(t.status)&&(e.status=t.status);return}if(t.kind==="computed_values"){e.computedValues[t.cardId]=t.values;return}if(t.kind==="data_object"){e.dataObjects[t.key]=t.payload;return}if(t.kind==="card_refreshed"){e.cards[t.cardId]=t.card;return}t.kind==="card_removed"&&(delete e.cards[t.cardId],delete e.computedValues[t.cardId]);}function so(e,t){if(Ca(t)){for(let r of t.notifications)It(r)&&oo(e,r);return}It(t)&&oo(e,t);}function Qr(e){let t=new Map,r=0;function n(l){let i=JSON.stringify(l);return r++,`id: ${r}
2
+ data: ${i}
3
3
 
4
- `}function o(f){let s=f;try{s.flushHeaders?.();}catch{}try{s.flush?.();}catch{}try{s.socket?.setNoDelay?.(!0);}catch{}try{s.socket?.uncork?.();}catch{}}function a(f,s){let l=t.get(f);if(l&&!(s&&l.res!==s)){t.delete(f);try{e.onSseClientDisconnected?.(f);}catch{}try{l.res.end();}catch{}}}function d(f,s,l){let m=t.get(f);m&&a(f,m.res),t.set(f,{res:s,subscribedChatCardIds:l?.subscribedChatCardIds??new Set,subscribedChannelNames:l?.subscribedChannelNames??new Set,subscribedCardChannels:l?.subscribedCardChannels??new Map});}function u(f,s){let l=t.get(f);if(!l)return;let m=n(s);try{l.res.write(m),o(l.res);}catch{a(f,l.res);}}function p(f){return qe({kind:"notification-batch",notifications:f})}async function y(f,s){let l=await e.buildChatOneShotBatch(f,s);return l.status==="success"?l.data:p([])}async function C(f,s){let l=t.get(f);return l?(l.subscribedChatCardIds.add(s),u(f,await y(s,true)),true):false}function v(f,s){let l=t.get(f);return l?(l.subscribedChatCardIds.delete(s),true):false}function S(f,s,l){let m=t.get(f);if(!m)return false;if(l){let g=m.subscribedCardChannels.get(l)??new Set;return g.add(s),m.subscribedCardChannels.set(l,g),true}return m.subscribedChannelNames.add(s),true}function B(f,s,l){let m=t.get(f);if(!m)return false;if(l){let g=m.subscribedCardChannels.get(l);return g&&(g.delete(s),g.size===0&&m.subscribedCardChannels.delete(l)),true}return m.subscribedChannelNames.delete(s),true}function T(f){return f.kind==="card_chats"||f.kind==="chat_messages"||f.kind==="chat_processing"}function _(f){return f.kind==="card_watchparty"}function x(f,s,l){return f.subscribedChannelNames.has(s)?true:!!f.subscribedCardChannels.get(l)?.has(s)}function h(f){if(!f||f.length===0)return;let s=[],l=new Map,m=new Map;for(let g of f)if(_(g)){let k=`${g.cardId}\0${g.channel}`,I=m.get(k)??[];I.push(g),m.set(k,I);}else if(T(g)){let k=l.get(g.cardId)??[];k.push(g),l.set(g.cardId,k);}else s.push(g);if(s.length>0){let g=p(s);for(let k of t.keys())u(k,g);}for(let[g,k]of l.entries()){let I=p(k);for(let[q,L]of t.entries())L.subscribedChatCardIds.has(g)&&u(q,I);}for(let[g,k]of m.entries()){let I=g.indexOf("\0"),q=I>=0?g.slice(0,I):"",L=I>=0?g.slice(I+1):g,V=p(k);for(let[J,X]of t.entries())!q||!L||x(X,L,q)&&u(J,V);}}return {size:()=>t.size,has:f=>t.has(f),get:f=>t.get(f),buildFrame:n,flushTransport:o,register:d,disconnect:a,writeFrame:u,subscribeChat:C,unsubscribeChat:v,subscribeChannel:S,unsubscribeChannel:B,broadcastNotificationBatch:h}}function Mr(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?Object.assign(new Error(e.error||`${t} failed`),{statusCode:400}):Object.assign(new Error(`${t} returned an unexpected response`),{statusCode:500})}async function Dr(e,t){return Mr(await e,t)}function $r(e){let t=ce(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool requires a card private key with at least two identifier segments (e.g. chat.foundry_thread_id)"),{statusCode:400});return t}function Vr(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function to(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:a,getMcpFacade:d,getMcpCardStoreFacade:u}=e;function p(s){let l=ce(s,"board_id");if(!l)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(l!==t)throw Object.assign(new Error(`Unknown board_id: ${l}`),{statusCode:400})}function y(s){let l=ce(s,"client_id");if(!l)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return l}function C(s){p(s);let l=y(s),m=ce(s,"channel_name"),g=ce(s,"card_id")||void 0;if(!m)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:l,channelName:m,...g?{cardId:g}:{}}}function v(s){p(s);let l=ce(s,"card_id");if(!l)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:l}}async function S(s){await r();let{cardId:l}=v(s),m=y(s);if(!await n.subscribeChat(m,l))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:m,subscribed:true}}}async function B(s){await r();let{cardId:l}=v(s),m=y(s);if(!n.unsubscribeChat(m,l))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:l,clientId:m,subscribed:false}}}async function T(s,l){await r();let{clientId:m,channelName:g,cardId:k}=C(s);if(!n.has(m))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return l?(n.subscribeChannel(m,g,k),o?.(m,g,k?{cardId:k}:{})):(n.unsubscribeChannel(m,g,k),a?.(m,g,k?{cardId:k}:{})),{status:"success",data:{boardId:t,clientId:m,channelName:g,subscribed:l,...k?{cardId:k}:{}}}}async function _(s,l){let{cardId:m}=v(s);return await d().setChatProcessing({cardId:m,active:l}),{status:"success",data:{boardId:t,cardId:m,active:l}}}async function x(s){let{cardId:l}=v(s),m=await d().getChatProcessing({cardId:l});return {status:"success",data:{boardId:t,cardId:l,active:m.active}}}async function h(s){let{cardId:l}=v(s),m=$r(s);if(!Object.prototype.hasOwnProperty.call(s,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(m.split(".").includes("visible_controlplane_only")){let g=await Dr(u().get({params:{id:l}}),"cardStore.get"),k=Array.isArray(g.cards)&&g.cards.length>0&&typeof g.cards[0]=="object"&&!Array.isArray(g.cards[0])?g.cards[0]:null,I=k?Vr(k,"visible_controlplane_only").value:void 0;if(s.value!==I)throw Object.assign(new Error("MCP tool cannot change the reserved private flag visible_controlplane_only"),{statusCode:403});return {status:"success",data:{boardId:t,cardId:l,key:m}}}return Mr(await u().patch({params:{id:l,path:`__private.${m}`},body:{value:s.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:l,key:m}}}async function f(s){let{cardId:l}=v(s),m=$r(s),g=await Dr(u().get({params:{id:l}}),"cardStore.get"),k=Array.isArray(g.cards)&&g.cards.length>0&&g.cards[0]&&typeof g.cards[0]=="object"&&!Array.isArray(g.cards[0])?g.cards[0]:null;if(!k)throw Object.assign(new Error(`Card "${l}" not found`),{statusCode:404});let I=Vr(k,m);return {status:"success",data:{boardId:t,cardId:l,key:m,exists:I.exists,value:I.value}}}return {requireCardArgs:v,subscribeChat:S,unsubscribeChat:B,watchChannel:T,setChatProcessing:_,getChatProcessing:x,setCardMeta:h,getCardMeta:f}}function ro(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e;function a(v){if(v.length===0)return null;if(v.length===1)return v[0];let S=[],B=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],T={};for(let x of B)T[x]=0;for(let x of v){let h=x,f=Array.isArray(h.cards)?h.cards:[];S.push(...f);for(let s of B)T[s]+=Number(h?.summary?.[s]||0);}let _=v[0];return {..._,cards:S,summary:{..._.summary||{},card_count:S.length,...T}}}async function d(){let v=[];for(let S of r)try{let B=await S.boardOps.buildSseOneShotPayload({});B.status==="success"&&B.data&&v.push(B.data);}catch{}return v}async function u(){let S=(await d()).map(B=>B.statusSnapshot).filter(Boolean);if(S.length===0){let B=r.map(T=>T.notification.status).filter(Boolean);return a(B)}return a(S)}async function p(){let v={},S=await d();for(let B of S)Object.assign(v,B.cardRuntimeById||{});if(Object.keys(v).length>0)return v;for(let B of r)for(let[T,_]of Object.entries(B.notification.computedValues)){let x=B.notification.cards[T];v[T]={schema_version:"v1",card_id:T,card_data:x?.card_data??{},computed_values:_??{}};}return v}async function y(){let v={},S=await d();for(let B of S)Object.assign(v,B.dataObjectsByToken||{});if(Object.keys(v).length===0)for(let B of r)Object.assign(v,B.notification.dataObjects||{});return v}async function C(){let v=await d(),S=v.flatMap(x=>Array.isArray(x.cardDefinitions)?x.cardDefinitions:[]),B={},T={};for(let x of v)Object.assign(B,x.dataObjectsByToken||{}),Object.assign(T,x.cardRuntimeById||{});let _={};for(let x of S){if(!x?.id)continue;let h=x.id;try{let f=await n(h),s=await o(h);(f.length>0||s)&&(_[h]={messages:f.map(l=>({role:String(l.role||"system"),text:String(l.text||""),files:Array.isArray(l.files)?l.files:[]})),receiving:!1,processing:s});}catch{}}return {boardId:t,cardDefinitions:S,statusSnapshot:await u(),dataObjectsByToken:B,cardRuntimeById:T,cardChatsByCardId:_}}return {readStatusSnapshot:u,readCardRuntimeArtifacts:p,readDataObjectsByToken:y,buildPublishedRuntimePayload:C}}function pa(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function no(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:a,writeChatRecord:d}=e;async function u(C){let v=[];try{let S=await o(C);if(!S)return v;let B=n().read(S.card_data&&typeof S.card_data=="object"?S.card_data:null);for(let T of B)v.push(String(T.stored_name??""));}catch{}return v}async function p(C,v,S,B){let T=t(C),_=r(C),x=pa(v),h=await u(C),s=`${String(h.length+1).padStart(3,"0")}-${x}`.slice(-36);if(!_.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${C}`),{statusCode:500});return await _.files.putBytes(`${T}/${s}`,new Uint8Array(B),S||"application/octet-stream"),{name:x,stored_name:s,size:B.length,mime_type:S||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function y(C,v,S,B,T){if(!B.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let _=T?.inChat===true,x=await p(C,v,S,B),h=null;if(await a(C,f=>{let s=new Date().toISOString(),l=f.card_data&&typeof f.card_data=="object"?f.card_data:{};f.card_data=l;let m=n().normalizeIncoming([{name:x.name,stored_name:x.stored_name,size:x.size,mime_type:x.mime_type,uploaded_at:x.uploaded_at||s,chat:_}],s);return h=n().merge(l,m).findIndex(k=>k.stored_name===x.stored_name),f}),_&&T?.suppressChatRecordWrite!==true){let f=typeof h=="number"&&h>=0?` #${h}`:"";await d(C,"system",`file uploaded: ${x.name} as ${x.stored_name}${f}`,[],T?.turnId??"");}return {ok:true,file:{...x,...typeof h=="number"&&h>=0?{file_idx:h}:{},chat:_},...typeof h=="number"&&h>=0?{file_idx:h}:{}}}return {uploadCardFile:y,readCardStoredFileNames:u}}function oo(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:ce(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=it(t,"tail_turns"),n=it(t,"tail"),o=ce(t,"turn_id"),a=t.all_turns===true,d=ce(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:ce(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...a?{allTurns:true}:{},...d?{tailTurnsBeforeId:d}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:ce(t,"card_id"),fileIdx:Number(it(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ft(t,"mock_requires","mock_requires"),mockFetchedSources:ft(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:Ht(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockProjections:ut(t,"mock_projections"),sourceIdx:Ht(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:ce(t,"card_id"),sourceIdx:Ht(t,"source_idx","source_idx"),mockRequires:ft(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:ft(t,"candidate_card_content","candidate_card_content"),mockRequires:ut(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:ce(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=ce(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:ce(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"stage-ai-failure-message":t=>{let r=ce(t,"turn_id"),n=ce(t,"failure");if(!r)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty turn_id"),{statusCode:400});if(!n)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty failure"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:ce(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:ce(t,"card_id"),candidateCardContent:ut(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:ce(t,"card_id")})}}function ao(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:ce(t,"token"),ref:ce(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:ce(t,"token"),reason:ce(t,"reason")})}}function so(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function a(u,p){let y=ce(u,"board_id");if(!y)throw Object.assign(new Error(`${p} requires board_id`),{statusCode:400});if(y!==t)throw Object.assign(new Error(`Unknown board_id: ${y}`),{statusCode:400})}function d(u,p){let{cardId:y}=o.requireCardArgs(u),C=ce(u,"turn_id");return a(u,p),n().manageAddChatAttachment({cardId:y,role:ce(u,"role")||"user",...C?{turn:C}:{},files:[{file_name:ce(u,"file_name"),content_type:ce(u,"content_type")||"application/octet-stream",...typeof u.text=="string"?{text:u.text}:{},...typeof u.base64=="string"?{base64:u.base64}:{},...Array.isArray(u.bytes)?{bytes:u.bytes}:{}}]})}return {"list-runtime-cards":u=>(a(u,"list-runtime-cards"),n().listRuntimeCards()),"sse.subscribe-chat":u=>o.subscribeChat(u),"sse.unsubscribe-chat":u=>o.unsubscribeChat(u),"sse.watch-channel":u=>o.watchChannel(u,true),"sse.unwatch-channel":u=>o.watchChannel(u,false),"getstate.is-chat-processing":u=>o.getChatProcessing(u),"setstate.chat-processing-started":u=>o.setChatProcessing(u,true),"setstate.chat-processing-done":u=>o.setChatProcessing(u,false),"getstate.card-private":u=>o.getCardMeta(u),"setstate.card-private":u=>o.setCardMeta(u),"manage.upload-card-file":u=>{let p=ce(u,"card_id"),y=ce(u,"file_name"),C=ce(u,"content_type")||"application/octet-stream",v=Xr(u);if(a(u,"manage.upload-card-file"),!p)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!y)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!v)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(p,y,C,v,{inChat:false})},"manage.add-chat-attachment":u=>d(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>d(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:p}=o.requireCardArgs(u),y=ce(u,"role")||"user",C=ce(u,"turn_id");return a(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:p,role:y,...typeof u.text=="string"?{text:u.text}:{},...C?{turn:C}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:p}=o.requireCardArgs(u);return a(u,"manage.patch-card"),n().managePatchCard({cardId:p,patch:ut(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:p}=o.requireCardArgs(u);return a(u,"manage.upsert-card"),n().manageUpsertCard({cardId:p,candidateCardContent:ut(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:p}=o.requireCardArgs(u);return a(u,"manage.remove-card"),n().manageRemoveCard({cardId:p},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:p}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:p})}}},"manage.admin-upsert-card":u=>{let p=ce(u,"board_id"),y=ce(u,"card_id");if(!p)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!y)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(p!==t)throw Object.assign(new Error(`Unknown board_id: ${p}`),{statusCode:400});return n().adminUpsertCard({cardId:y,candidateCardContent:ut(u,"candidate_card_content")})}}}function tt(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function io(e,t){if(e?.status==="success"&&Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw e?.status==="success"?new Error(`${t} returned success without data`):e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function W(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Oe(e){return Array.isArray(e)?e:[]}function Kr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=W(e).fetched_sources,n=n.slice(16));for(let o of n.split(".")){if(r==null||typeof r!="object")return;r=r[o];}return r}function Ur(e,t){let r=W(e.view);return {elements:Oe(r.elements).map((o,a)=>{let d=W(o),u=W(d.data),p=typeof d.visible=="string"?!!Kr(t,d.visible):true,y=typeof u.bind=="string"?u.bind:void 0,C=typeof u.maxRows=="number"?u.maxRows:void 0,v=y?Kr(t,y):void 0,S={id:typeof d.id=="string"&&d.id?d.id:`element-${a}`,kind:d.kind,label:d.label,visible:p};return v!==void 0&&(S.resolved=Array.isArray(v)&&typeof C=="number"?v.slice(0,C):v),S})}}function uo(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Oe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],a={};for(let d of o){let u=W(d),p=typeof u.bindTo=="string"?u.bindTo:"",y=typeof u.ref=="string"?u.ref:"";if(!p||!y)continue;let C=Kr(t,y);C!==void 0&&(a[p]=C);}return a}function ga(e){if(typeof e!="string"||!e.trim())return null;let t=/^(file uploaded|AI generated|AI geneterated):\s*.*?#(\d+)\s*$/i.exec(e.trim());if(!t)return null;let r=Number.parseInt(t[2],10);return !Number.isInteger(r)||r<0?null:r}function ya(e){return {"card-content":e}}function kr(e){let t={...e};return delete t.__private,t}function ha(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Ra(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function ka(e,t){let r=Ra(e);if(!t||Object.keys(t).length===0)return r;function n(o,a,d){let u=String(a||"").split(".").filter(Boolean);if(!u.length)return;let p=o;for(let y=0;y<u.length-1;y+=1){let C=u[y];(!p[C]||typeof p[C]!="object")&&(p[C]={}),p=p[C];}p[u[u.length-1]]=d;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,a=W(r.view),d=Oe(a.elements);for(let u of d){let p=W(W(u).data);if(typeof p.writeTo=="string"&&p.writeTo){o=p.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...W(r.card_data),...t.fieldValues}),r}if(Array.isArray(t._stagedFiles)&&t._stagedFiles.length>0)return r;for(let[o,a]of Object.entries(t))o!=="_stagedFiles"&&(a!==null&&typeof a=="object"&&!Array.isArray(a)&&r[o]!==null&&typeof r[o]=="object"&&!Array.isArray(r[o])?r[o]={...r[o],...a}:r[o]=a);return r}function Cr(e){return W(e.__private).visible_controlplane_only===true}async function Pt(e,t){let r=await Qe(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function co(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:a,sourceFetchDone:d,sourceFetchFailed:u,uploadCardFile:p,buildFileDownloadUrl:y,readFetchedSourceJsonByRef:C}=e;function v(c,w){if(typeof c=="function")return c;throw new Error(`${w} is not configured for this MCP facade`)}async function S(){let c=await Qe(n.get({}),"cardStore.get");return Array.isArray(c.cards)?c.cards.map(w=>W(w)).filter(w=>!Cr(w)):[]}function B(c){if(Array.isArray(c.bytes))return new Uint8Array(c.bytes.map(w=>Math.max(0,Math.min(255,Number(w)||0))));if(typeof c.text=="string")return new TextEncoder().encode(c.text);if(typeof c.base64=="string"){let w=String(c.base64).replace(/-/g,"+").replace(/_/g,"/"),A=w+"=".repeat((4-w.length%4)%4),N=atob(A);return Uint8Array.from(N,M=>M.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function T(){let c=W(await Qe(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:c.version,commonSourceFields:W(c.commonSourceDefFields),sourceKinds:W(c.sourceKinds)}}async function _(){let c=W(await Qe(t.status({}),"status")),w=W(c.summary),A=Oe(c.cards),N=await Qe(n.get({}),"cardStore.get"),M=new Set((Array.isArray(N.cards)?N.cards.map(W):[]).filter(Cr).map(U=>typeof U.id=="string"?U.id:"").filter(Boolean)),K=A.filter(U=>!M.has(String(W(U).name??"")));return {meta:W(c.meta),summary:{card_count:typeof w.card_count=="number"?w.card_count:0,completed:typeof w.completed=="number"?w.completed:0,eligible:typeof w.eligible=="number"?w.eligible:0,pending:typeof w.pending=="number"?w.pending:0,blocked:typeof w.blocked=="number"?w.blocked:0,in_progress:typeof w.in_progress=="number"?w.in_progress:0,failed:typeof w.failed=="number"?w.failed:0,unresolved:typeof w.unresolved=="number"?w.unresolved:0},cards:K.map(U=>{let ne=W(U);return {"card-id":typeof ne.name=="string"?ne.name:null,status:ne.status??null,error:ne.error??null,requires:Oe(ne.requires),requires_satisfied:Oe(ne.requires_satisfied),requires_missing:Oe(ne.requires_missing),provides_declared:Oe(ne.provides_declared),provides_runtime:Oe(ne.provides_runtime)}})}}async function x(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let A=W(await Qe(t.status({}),"status")),M=Oe(A.cards).map(W).find(ye=>ye.name===w);if(!M)throw new Error(`card "${w}" not found in board status`);let K=W(await Pt(n,w)),U=kr(K),ne=Oe(M.requires_satisfied).filter(ye=>typeof ye=="string"&&!!ye),xe=Oe(M.provides_runtime).filter(ye=>typeof ye=="string"&&!!ye),Ie=Object.fromEntries(await Promise.all(ne.map(async ye=>[ye,await Qe(t.getOutputsDataObject({params:{key:ye}}),`getOutputsDataObject(${ye})`)]))),Ae=Object.fromEntries(await Promise.all(xe.map(async ye=>[ye,await Qe(t.getOutputsDataObject({params:{key:ye}}),`getOutputsDataObject(${ye})`)]))),le=W(await Qe(t.getOutputsComputedValues({params:{key:w}}),"getOutputsComputedValues")),ge=await Qe(t.getOutputsFetchedSources({params:{key:w}}),"getOutputsFetchedSources"),$e=Oe(K.source_defs).map(W),be={};for(let ye of $e)typeof ye.bindTo=="string"&&typeof ye.outputFile=="string"&&(be[ye.outputFile]=ye.bindTo);let Ne={};for(let[ye,Ye]of Object.entries(ge)){let De=be[ye]??ye;if(!C||typeof Ye!="string"){Ne[De]=null;continue}try{Ne[De]=C({cardId:w,ref:Ye});}catch{Ne[De]=null;}}let Me={card_data:W(K.card_data),requires:Ie,fetched_sources:Ne,computed_values:le};return {cardId:w,card_status_in_board:M,card_definition_and_static_data:U,refs_for_fetched_source_files:ge,runtime_data:{requires:Ie,provides:Ae,computed_values:le,rendered_view:Ur(K,Me)}}}async function h(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("inspectChatMessagesOnCards requires cardId");let A=typeof c.turnId=="string"?c.turnId:"",N=c.allTurns===true,M=typeof c.tailTurnsBeforeId=="string"?c.tailTurnsBeforeId:"",K=N?void 0:c.lastUserTurns??(A?void 0:1),U=c.tail,ne={...K===void 0?{}:{tailTurns:K},...A?{turnId:A}:{},...N?{allTurns:true}:{},...M?{tailTurnsBeforeId:M}:{}},xe=Object.keys(ne).length>0?{params:{cardId:w},body:ne}:{params:{cardId:w}},Ie=tt(await o.readAll(xe),"chatStore.readAll"),Ae=W(await Pt(n,w)),le=Oe(W(Ae.card_data).files).map((be,Ne)=>({idx:Ne,stored_name:W(be).stored_name})).filter(be=>typeof be.stored_name=="string"&&be.stored_name.length>0),$e=(Array.isArray(Ie.records)?Ie.records:[]).map(be=>{let Me=W(be.payload),ye={...be},Ye=typeof be?.role=="string"?be.role:typeof Me.role=="string"?String(Me.role):"",De=typeof be?.text=="string"?be.text:typeof Me.text=="string"?String(Me.text):"";if(Ye==="system"){let He=ga(De);if(He!==null&&le.some(rt=>rt.idx===He)){let rt=`Retrieve using inspect-file-contents --card-id ${w} --file-idx ${He}`;ye.retrieval_hint=rt,Object.keys(Me).length>0&&typeof be.role!="string"&&(ye.payload={...Me,retrieval_hint:rt});}}return ye});return {cardId:w,messages:typeof U=="number"&&U>=0?$e.slice(-U):$e}}async function f(c){let w=String(c.cardId||"").trim(),A=Number(c.fileIdx);if(!w)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(A)||A<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let N=W(await Pt(n,w)),M=Oe(W(N.card_data).files).map(W);if(A>=M.length)throw new Error(`attachment index ${A} is out of range for card "${w}"`);let K=M[A],U=typeof K.stored_name=="string"?K.stored_name:null;return {cardId:w,fileIdx:A,downloadUrl:y({cardId:w,fileIdx:A,storedName:U}),...typeof K.name=="string"?{name:K.name}:{},...typeof K.stored_name=="string"?{stored_name:K.stored_name}:{},...typeof K.mime_type=="string"?{mime_type:K.mime_type}:{},...typeof K.size=="number"?{size:K.size}:{},...typeof K.uploaded_at=="string"?{uploaded_at:K.uploaded_at}:{}}}async function s(c){return await r.validateCardPreflight({body:ya(c.candidateCardContent)})}function l(c){if(!c.mockRequires||typeof c.mockRequires!="object"||Array.isArray(c.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!c.mockFetchedSources||typeof c.mockFetchedSources!="object"||Array.isArray(c.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let w=r.evalCardCompute({body:{"card-content":c.candidateCardContent,"mock-requires":c.mockRequires,"mock-fetched-sources":c.mockFetchedSources}});if(w.status!=="success")return w;let A=W(io(w,"evalCardCompute")),N=W(c.candidateCardContent),M={card_data:W(N.card_data),requires:W(c.mockRequires),fetched_sources:W(c.mockFetchedSources),computed_values:W(A.computed_values)};return {status:"success",data:{cardId:typeof A.cardId=="string"?A.cardId:typeof N.id=="string"?N.id:"(unknown)",ok:A.ok===true,computed_values:W(A.computed_values),errors:Oe(A.errors).map(K=>{let U=W(K);return {bindTo:typeof U.bindTo=="string"?U.bindTo:"",error:typeof U.error=="string"?U.error:""}}),provides_outputs:uo(N,M),rendered_view:Ur(N,M)}}}async function m(c){return await r.probeSourcePreflight({params:{sourceIdx:c.sourceIdx},body:{"card-content":c.candidateCardContent,"mock-projections":c.mockProjections}})}async function g(c){return await r.runSourcePreflight({params:{sourceIdx:c.sourceIdx},body:{"card-content":c.candidateCardContent,"mock-projections":c.mockProjections}})}async function k(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!c.mockRequires||typeof c.mockRequires!="object"||Array.isArray(c.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let A=W(await Pt(n,w)),N=Oe(A.source_defs).filter(K=>!!K&&typeof K=="object"&&!Array.isArray(K)),M={};if(c.sourceIdx>=0&&c.sourceIdx<N.length){let K=N[c.sourceIdx],U=Je.enrichSourcesSync([K],{card_data:W(A.card_data),requires:c.mockRequires});Array.isArray(U)&&U.length>0&&(M=W(U[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:c.sourceIdx},body:{"card-content":A,"mock-requires":c.mockRequires,"mock-projections":M}})}async function I(c){let w=W(await Qe(r.simulateCardCycle({body:{"card-content":c.candidateCardContent,"mock-requires":c.mockRequires}}),"simulateCardCycle")),A=W(c.candidateCardContent),N=W(w.validation),M=Oe(w.source_probes),K=Oe(w.projection_errors),U=W(w.fetched_sources),ne=Oe(w.compute_errors),xe=W(w.computed_values),Ie={card_data:W(A.card_data),requires:c.mockRequires,fetched_sources:U,computed_values:xe},Ae=[];for(let le of Oe(N.issues))typeof le=="string"&&le&&Ae.push(le);for(let le of M){let ge=W(le),$e=typeof ge.bindTo=="string"?ge.bindTo:"source",be=typeof ge.error=="string"?ge.error:"";be&&Ae.push(`${$e}: ${be}`);}for(let le of K){let ge=W(le),$e=typeof ge.bindTo=="string"?ge.bindTo:"source",be=typeof ge.key=="string"?ge.key:"projection",Ne=typeof ge.error=="string"?ge.error:"projection failed";Ae.push(`${$e}.${be}: ${Ne}`);}for(let le of ne){let ge=W(le),$e=typeof ge.bindTo=="string"?ge.bindTo:"compute",be=typeof ge.error=="string"?ge.error:"compute failed";Ae.push(`${$e}: ${be}`);}return {status:"success",data:{cardId:typeof w.cardId=="string"?w.cardId:"(unknown)",ok:w.ok===true,issues:Ae,provides_outputs:uo(A,Ie),rendered_view:Ur(A,Ie)}}}async function q(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("manageReadCard requires cardId");let A=await Qe(n.get({params:{id:w}}),"cardStore.get");return (Array.isArray(A.cards)?A.cards.map(W):[]).map(M=>kr(M))}async function L(c){let w=await Promise.all(Oe(c.files).map(async A=>{let N=W(A),M=String(N.file_name??N.fileName??N.name??"").trim(),K=String(N.content_type??N.contentType??"application/octet-stream");if(!M)throw new Error("file entry requires file_name");return await p({cardId:c.cardId,fileName:M,contentType:K,bytes:B(N),suppressChatRecordWrite:true})}));for(let[A,N]of w.entries()){let M=W(N.file),K=typeof N.file_idx=="number"&&Number.isInteger(N.file_idx)&&N.file_idx>=0?N.file_idx:A,U=c.role==="assistant"?`AI generated: ${String(M.name||"")} as ${String(M.stored_name||"")} #${K}`:`file uploaded: ${String(M.name||"")} as ${String(M.stored_name||"")} #${K}`;tt(await o.append({params:{cardId:c.cardId},body:{role:"system",text:U,files:[],turn:c.turn}}),"chatStore.append(system attachment message)");}return w.map(A=>A.file)}async function V(c){let w=String(c.cardId||"").trim(),A=String(c.role||"user").trim()||"user",N=typeof c.turn=="string"?c.turn:"";if(!w)throw new Error("manageAddChatAttachment requires cardId");let M=await L({cardId:w,role:A,turn:N,files:c.files});return {status:"success",data:{cardId:w,turn:N,files:M}}}async function J(c){let w=String(c.cardId||"").trim(),A=String(c.role||"").trim(),N=typeof c.text=="string"?c.text:"",M=typeof c.turn=="string"?c.turn:"";if(!w)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!A)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(A==="assistant"&&M){let ne=tt(await o.readAll({params:{cardId:w},body:{turnId:M}}),"chatStore.readAll(existing turn messages)"),xe=Array.isArray(ne.records)?ne.records.find(Ie=>Ie.role==="assistant"&&String(Ie.turn||"")===M):void 0;if(xe)return {status:"success",data:{cardId:w,id:String(xe.id),role:A,turn:M,files:Array.isArray(xe.files)?xe.files:[]}}}let K=await L({cardId:w,role:A,turn:M,files:c.files}),U=tt(await o.append({params:{cardId:w},body:{role:A,text:N,files:K,turn:M}}),"chatStore.append");return {status:"success",data:{cardId:w,id:String(U.id),role:A,turn:M,files:K}}}async function X(c,w={}){let A=String(c.cardId||"").trim(),N=W(c.patch);if(!A)throw new Error("managePatchCard requires cardId");let M=await q({cardId:A}),K=W(M[0]),U=ka(K,N);return H({cardId:A,candidateCardContent:U},w)}async function H(c,w={}){let A=String(c.cardId||"").trim(),N=W(c.candidateCardContent),M=kr(N);if(!A)throw new Error("manageUpsertCard requires cardId");if(typeof M.id!="string"||!M.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(M.id!==A)throw new Error(`candidateCardContent.id must match cardId (${A})`);let K=null;try{K=await s({candidateCardContent:M});}catch(le){let ge=le instanceof Error?le.message:String(le);if(!/non-core adapter is not configured/i.test(ge))throw le;K=null;}if(K!==null){let le=W(K),ge=W(le.data);if(le.status!=="success"||ge.isValid!==true)return {status:"fail",step:"validate",validation:K}}let U=null;try{U=await Pt(n,A);}catch{U=null;}let ne=U?W(U):null;if(ne&&Cr(ne)&&!w.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${A}" not found`),{statusCode:404});let xe={...M,...ne&&ha(ne,"__private")?{__private:ne.__private}:{}},Ie=await n.set({body:xe});tt(Ie,"cardStore.set");let Ae;try{Ae=await t.upsertCard({params:{cardId:A,restart:!0}}),tt(Ae,"upsertCard");}catch(le){try{U&&await n.set({body:U});}catch{}throw le}return {status:"success",data:{validation:K,card_saved:null,board_result:Ae}}}async function re(c,w={}){let A=String(c.cardId||"").trim();if(!A)throw new Error("manageRemoveCard requires cardId");if(!w.allowControlplaneOnlyCards){let K=await Qe(n.get({params:{id:A}}),"cardStore.get");if((Array.isArray(K.cards)?K.cards.map(W):[]).some(Cr))throw Object.assign(new Error(`Card "${A}" not found`),{statusCode:404})}let N=await t.removeCard({params:{id:A}});tt(N,"removeCard");let M=await n.del({params:{id:A}});return tt(M,"cardStore.del"),{status:"success",data:{board_result:N,store_result:M}}}async function ie(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("adminReadCard requires cardId");let A=await Qe(n.get({params:{id:w}}),"cardStore.get");return Array.isArray(A.cards)?A.cards.map(N=>W(N)):[]}async function Q(c){let w=String(c.cardId||"").trim(),A=W(c.candidateCardContent),N=kr(A);if(!w)throw new Error("adminUpsertCard requires cardId");if(typeof N.id!="string"||!N.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(N.id!==w)throw new Error(`candidateCardContent.id must match cardId (${w})`);let M=await s({candidateCardContent:N}),K=W(M),U=W(K.data);if(K.status!=="success"||U.isValid!==true)return {status:"fail",step:"validate",validation:M};let ne=null;try{ne=await Pt(n,w);}catch{ne=null;}let xe=ne?W(W(ne).__private):{},Ie={...N,__private:{...xe,visible_controlplane_only:true}},Ae=await n.set({body:Ie});tt(Ae,"cardStore.set");let le;try{le=await t.upsertCard({params:{cardId:w,restart:!0}}),tt(le,"upsertCard");}catch(ge){try{ne&&await n.set({body:ne});}catch{}throw ge}return {status:"success",data:{validation:M,card_saved:null,board_result:le}}}async function Z(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("getChatProcessing requires cardId");let A=io(await o.isProcessing({params:{cardId:w}}),"chatStore.isProcessing");return {cardId:w,active:!!A.active}}async function ae(c){let w=String(c.cardId||"").trim();if(!w)throw new Error("setChatProcessing requires cardId");if(typeof c.active!="boolean")throw new Error("setChatProcessing requires boolean active");return tt(await o.setProcessing({params:{cardId:w},body:{active:c.active}}),"chatStore.setProcessing"),{cardId:w,active:c.active}}async function de(){let c=await v(a,"webhook.process-accumulated")();return c?.status==="fail"||c?.status==="error"?c:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(c??{},"data")?c.data??null:null}}}async function ke(c){let w=String(c.token||"").trim(),A=String(c.ref||"").trim();if(!w)throw new Error("webhookSourceFetchDone requires token");if(!A)throw new Error("webhookSourceFetchDone requires ref");let N=await v(d,"webhook.source-fetch-done")({token:w,ref:A});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:w,ref:A,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}async function E(c){let w=String(c.token||"").trim(),A=String(c.reason||"").trim();if(!w)throw new Error("webhookSourceFetchFailed requires token");if(!A)throw new Error("webhookSourceFetchFailed requires reason");let N=await v(u,"webhook.source-fetch-failed")({token:w,reason:A});return N?.status==="fail"||N?.status==="error"?N:{status:"success",data:{token:w,reason:A,runtime_result:Object.prototype.hasOwnProperty.call(N??{},"data")?N.data??null:null}}}return {listRuntimeCards:S,discoverSourceKinds:T,inspectBoardRuntimeStatus:_,inspectCardDefinitionAndRuntime:x,inspectChatMessagesOnCards:h,inspectFileContents:f,preflightValidateCandidateCardDefinition:s,preflightMaterializeCandidateCard:l,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:g,preflightRunSingleSourceInLiveCard:k,preflightRunOneCycleWithCandidateCard:I,manageReadCard:q,manageAddChatAttachment:V,manageAddChatEntryAndAnyAttachments:J,managePatchCard:X,manageUpsertCard:H,manageRemoveCard:re,adminReadCard:ie,adminUpsertCard:Q,getChatProcessing:Z,setChatProcessing:ae,webhookProcessAccumulated:de,webhookSourceFetchDone:ke,webhookSourceFetchFailed:E}}async function Qe(e,t){return tt(await e,t)}function lo(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:a,readCardRuntimeArtifacts:d,readCardFromStore:u,readCardDefinitions:p,processAccumulatedLaneInternal:y,reportSourceFetched:C,reportSourceFetchFailure:v,uploadCardFile:S,chatStorePublic:B,serverUrl:T,apiBasePath:_}=e;function x(){return t[0]??null}function h(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let g=m?.params?.key;return g?{status:"success",data:(await a())[g]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let g=m?.params?.key;return g?{status:"success",data:(await d())[g]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let g=m?.params?.key;if(!g)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let k=n(g)??x();return k?k.boardOps.getOutputsFetchedSources({params:{key:g}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let g=m?.params?.id;if(!g)return {status:"fail",error:"removeCard requires params.id"};let k=n(g)??x();return k?k.boardOps.removeCard({params:{id:g}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let g=m?.params?.cardId;if(!g)return {status:"fail",error:"upsertCard requires params.cardId"};let k=n(g)??x();if(!k)return {status:"fail",error:"Board context is unavailable"};let I=await k.boardOps.upsertCard({params:{cardId:g,restart:m.params.restart===true}});if(I.status!=="success")return I;if(Ze(k.boardAdapter)){let q=await y(true);if(q.status!=="success")return q}return I}}}function f(){let m=()=>{let g=x();if(!g?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return g.nonCore};return {describeTaskExecutorCapabilities(g){return m().describeTaskExecutorCapabilities(g)},validateCardPreflight(g){return m().validateCardPreflight(g)},evalCardCompute(g){return m().evalCardCompute(g)},probeSourcePreflight(g){return m().probeSourcePreflight(g)},runSourcePreflight(g){return m().runSourcePreflight(g)},simulateCardCycle(g){return m().simulateCardCycle(g)}}}function s(){return {async get(m){let g=typeof m.params?.id=="string"?m.params.id:void 0;if(g){let k=await u(g);return k?{status:"success",data:{cards:[k]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await p()}}},async set(m){let g=m.body;if(g==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let k=Array.isArray(g)?g:[g];for(let I of k){let q=I,L=typeof q.id=="string"?q.id:"";if(!L)return {status:"fail",error:"each card must have a string `id` field"};let V=r.get(L)??0,J=t[V]??x();if(!J)return {status:"fail",error:"Board context is unavailable"};let X=await J.cardStoreOps.set({body:q});if(X.status!=="success")return X;r.set(L,V);}return {status:"success",data:{count:k.length}}},async del(m){let g=[m.params?.id,...m.body?.ids??[]].filter(k=>typeof k=="string"&&!!k);if(g.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let k of g){let I=n(k)??x();if(!I)return {status:"fail",error:"Board context is unavailable"};let q=await I.cardStoreOps.del({params:{id:k}});if(q.status!=="success")return q;r.delete(k);}return {status:"success",data:{count:g.length}}},async patch(m){let g=typeof m.params?.id=="string"?m.params.id:void 0,k=typeof m.params?.path=="string"?m.params.path:void 0;if(!g||!k)return {status:"fail",error:"patch requires params.id and params.path"};let I=n(g)??x();return I?I.cardStoreOps.patch(m):{status:"fail",error:"Board context is unavailable"}},async appendFiles(m){let g=typeof m.params?.id=="string"?m.params.id:void 0;if(!g)return {status:"fail",error:"appendFiles requires params.id"};let k=n(g)??x();return k?k.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function l(){return co({board:h(),nonCore:f(),cardStore:s(),chatStore:B,processAccumulated:()=>y(true),sourceFetchDone:({token:m,ref:g})=>C(m,g),sourceFetchFailed:({token:m,reason:g})=>v(m,g),uploadCardFile({cardId:m,fileName:g,contentType:k,bytes:I,suppressChatRecordWrite:q}){return S(m,g,k,I,{inChat:true,...q===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:g,storedName:k}){let I=`${T||""}${_}/cards/${encodeURIComponent(m)}/files/${g}`;return k?`${I}?sn=${encodeURIComponent(k)}`:I},readFetchedSourceJsonByRef({cardId:m,ref:g}){let k=n(m)??x();if(!k||Ze(k.boardAdapter))return null;let L=k.boardAdapter.resolveBlob(st(g)).trim();return L?JSON.parse(L):null}})}return {mcpBoardFacade:h,mcpNonCoreFacade:f,mcpCardStoreFacade:s,createMcpFacade:l}}function fo(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:a,createMcpToolRegistry:d,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:p,sliceTextByLines:y}=e;async function C(v,S,B){let T=v.method||"GET",_=B,x=_.pathname;try{if(T==="POST"&&x===`${t}/mcp`){await o();let h=await n(v),f=typeof h.tool=="string"?h.tool.trim():"",s=h.args&&typeof h.args=="object"&&!Array.isArray(h.args)?h.args:{};if(!f)return r(S,400,{error:"tool is required"}),!0;if(f==="inspect.file-contents")return r(S,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let l=await mt(f,s,d(a()));if(l&&typeof l=="object"&&!Array.isArray(l)){let m=l;if(m.status==="fail")return r(S,400,{error:et(l,"Request failed")}),!0;if(m.status==="error")return r(S,500,{error:et(l,"Internal error")}),!0}r(S,200,l);}catch(l){let m=typeof l?.statusCode=="number"?Number(l.statusCode):500,g=l instanceof Error?l.message:String(l);r(S,m,{error:g});}return !0}if(T==="POST"&&x===`${t}/mcp-raw`){await o();let h=await n(v),f=typeof h.tool=="string"?h.tool.trim():"",s=h.args&&typeof h.args=="object"&&!Array.isArray(h.args)?h.args:{};if(!f)return r(S,400,{error:"tool is required"}),!0;if(f!=="inspect.file-contents")return r(S,400,{error:`Tool does not support raw response: ${f}`}),!0;let l=ce(s,"card_id","cardId"),m=it(s,"file_idx","fileIdx"),g=it(s,"head-lines","headLines"),k=it(s,"tail-lines","tailLines"),I=it(s,"head-bytes","headBytes"),q=it(s,"tail-bytes","tailBytes");if(!l)return r(S,400,{error:"inspect.file-contents requires card_id"}),!0;if(m===void 0||!Number.isInteger(m)||m<0)return r(S,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([g,k,I,q].filter(de=>de!==void 0).length>1)return r(S,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[de,ke]of [["head-lines",g],["tail-lines",k],["head-bytes",I],["tail-bytes",q]])if(ke!==void 0&&(!Number.isInteger(ke)||ke<0))return r(S,400,{error:`inspect.file-contents requires ${de} to be a non-negative integer`}),!0;let V=await a().inspectFileContents({cardId:l,fileIdx:m}),J=typeof V?.stored_name=="string"?V.stored_name:null,{fileRecord:X,bytes:H}=await u(l,m,J),re=String(X.name||X.stored_name||"download.bin"),ie=String(X.mime_type||"application/octet-stream"),Q=(_.searchParams.get("resp")||"").trim().toLowerCase();if(Q&&Q!=="json-b64")return r(S,400,{error:`unsupported resp mode: ${Q}`}),!0;let Z=Q==="json-b64",ae;if(g!==void 0||k!==void 0){if(!p(ie))return r(S,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let de=new TextDecoder().decode(H),ke=g!==void 0?y(de,"head",g):y(de,"tail",k);ae=typeof Buffer<"u"?Buffer.from(ke,"utf8"):new TextEncoder().encode(ke);}else if(I!==void 0||q!==void 0){let de=I??q;ae=I!==void 0?H.slice(0,de):H.slice(Math.max(0,H.length-de));}else ae=H;if(Z){let de=typeof Buffer<"u"?Buffer.from(ae).toString("base64"):btoa(String.fromCharCode(...ae));return r(S,200,{bodyBase64:de,mimeType:ie,filename:re,byteLength:ae.length}),!0}return S.writeHead(200,{"Content-Type":ie,"Content-Disposition":`attachment; filename="${re}"`,"Content-Length":ae.length}),S.end(ae),!0}return !1}catch(h){let f=h?.statusCode||500;return r(S,f,{error:String(h?.message||h)}),true}}return {handleAgentfaceApi:C}}function mo(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:a}=e;async function d(u,p,y){let C=u.method||"GET",v=y.pathname;try{if(C==="POST"&&v===`${t}/mcp-webhooks`){await o();let S=await n(u),B=typeof S.tool=="string"?S.tool.trim():"",T=S.args&&typeof S.args=="object"&&!Array.isArray(S.args)?S.args:{};if(!B)return r(p,400,{error:"tool is required"}),!0;try{let _=await mt(B,T,a());if(_&&typeof _=="object"&&!Array.isArray(_)){let x=_;if(x.status==="fail")return r(p,400,{error:et(_,"Request failed")}),!0;if(x.status==="error")return r(p,500,{error:et(_,"Internal error")}),!0}r(p,200,_);}catch(_){let x=typeof _?.statusCode=="number"?Number(_.statusCode):500,h=_ instanceof Error?_.message:String(_);r(p,x,{error:h});}return !0}return !1}catch(S){let B=S?.statusCode||500;return r(p,B,{error:String(S?.message||S)}),true}}return {handleWebhooksApi:d}}function Hr(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:a,onChannelSubscribed:d,onChannelUnsubscribed:u}=e;function p(C,v,S,B,T){if(!t.has(v)){n(C,404,{error:`SSE client not connected: ${v}`});return}T?(t.subscribeChannel(v,S,B.cardId),d?.(v,S,B)):(t.unsubscribeChannel(v,S,B.cardId),u?.(v,S,B)),n(C,200,{ok:true,clientId:v,channelName:S,...B.cardId?{cardId:B.cardId}:{},subscribed:T});}async function y(C,v,S,B){let T=B?.oneShot===true,_=B?.bootstrapPayload!==false,x=!T&&S?t.get(S):null,h=x?new Set(x.subscribedChatCardIds):new Set,f=x?new Set(x.subscribedChannelNames):new Set,s=x?new Map(Array.from(x.subscribedCardChannels.entries(),([m,g])=>[m,new Set(g)])):new Map;if(v.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(v),_){let m=await o(),g=t.buildFrame(m);v.write(g);}if(T){v.end();return}if(!S)throw new Error("clientId is required for streaming SSE");t.register(S,v,{subscribedChatCardIds:h,subscribedChannelNames:f,subscribedCardChannels:s});try{a?.(S,m=>{t.writeFrame(S,m);});}catch{}let l=setInterval(()=>{try{v.write(`: keepalive
4
+ `}function o(l){let i=l;try{i.flushHeaders?.();}catch{}try{i.flush?.();}catch{}try{i.socket?.setNoDelay?.(!0);}catch{}try{i.socket?.uncork?.();}catch{}}function a(l,i){let d=t.get(l);if(d&&!(i&&d.res!==i)){t.delete(l);try{e.onSseClientDisconnected?.(l);}catch{}try{d.res.end();}catch{}}}function c(l,i,d){let m=t.get(l);m&&a(l,m.res),t.set(l,{res:i,subscribedChatCardIds:d?.subscribedChatCardIds??new Set,subscribedChannelNames:d?.subscribedChannelNames??new Set,subscribedCardChannels:d?.subscribedCardChannels??new Map});}function u(l,i){let d=t.get(l);if(!d)return;let m=n(i);try{d.res.write(m),o(d.res);}catch{a(l,d.res);}}function f(l){return $e({kind:"notification-batch",notifications:l})}async function g(l,i){let d=await e.buildChatOneShotBatch(l,i);return d.status==="success"?d.data:f([])}async function k(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.add(i),u(l,await g(i,true)),true):false}function S(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.delete(i),true):false}function b(l,i,d){let m=t.get(l);if(!m)return false;if(d){let p=m.subscribedCardChannels.get(d)??new Set;return p.add(i),m.subscribedCardChannels.set(d,p),true}return m.subscribedChannelNames.add(i),true}function B(l,i,d){let m=t.get(l);if(!m)return false;if(d){let p=m.subscribedCardChannels.get(d);return p&&(p.delete(i),p.size===0&&m.subscribedCardChannels.delete(d)),true}return m.subscribedChannelNames.delete(i),true}function I(l){return l.kind==="card_chats"||l.kind==="chat_messages"||l.kind==="chat_processing"}function P(l){return l.kind==="card_watchparty"}function A(l,i,d){return l.subscribedChannelNames.has(i)?true:!!l.subscribedCardChannels.get(d)?.has(i)}function y(l){if(!l||l.length===0)return;let i=[],d=new Map,m=new Map;for(let p of l)if(P(p)){let R=`${p.cardId}\0${p.channel}`,w=m.get(R)??[];w.push(p),m.set(R,w);}else if(I(p)){let R=d.get(p.cardId)??[];R.push(p),d.set(p.cardId,R);}else i.push(p);if(i.length>0){let p=f(i);for(let R of t.keys())u(R,p);}for(let[p,R]of d.entries()){let w=f(R);for(let[O,N]of t.entries())N.subscribedChatCardIds.has(p)&&u(O,w);}for(let[p,R]of m.entries()){let w=p.indexOf("\0"),O=w>=0?p.slice(0,w):"",N=w>=0?p.slice(w+1):p,U=f(R);for(let[J,ae]of t.entries())!O||!N||A(ae,N,O)&&u(J,U);}}return {size:()=>t.size,has:l=>t.has(l),get:l=>t.get(l),buildFrame:n,flushTransport:o,register:c,disconnect:a,writeFrame:u,subscribeChat:k,unsubscribeChat:S,subscribeChannel:b,unsubscribeChannel:B,broadcastNotificationBatch:y}}function Gr(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?Object.assign(new Error(e.error||`${t} failed`),{statusCode:400}):Object.assign(new Error(`${t} returned an unexpected response`),{statusCode:500})}async function Wr(e,t){return Gr(await e,t)}function zr(e){let t=me(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool requires a card private key with at least two identifier segments (e.g. chat.foundry_thread_id)"),{statusCode:400});return t}function Yr(e,t){let r=e.__private;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function io(e){let{boardId:t,bootstrapBoard:r,sseHub:n,onChannelSubscribed:o,onChannelUnsubscribed:a,getMcpFacade:c,getMcpCardStoreFacade:u}=e;function f(i){let d=me(i,"board_id");if(!d)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(d!==t)throw Object.assign(new Error(`Unknown board_id: ${d}`),{statusCode:400})}function g(i){let d=me(i,"client_id");if(!d)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return d}function k(i){f(i);let d=g(i),m=me(i,"channel_name"),p=me(i,"card_id")||void 0;if(!m)throw Object.assign(new Error("MCP tool requires channel_name"),{statusCode:400});return {clientId:d,channelName:m,...p?{cardId:p}:{}}}function S(i){f(i);let d=me(i,"card_id");if(!d)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});return {cardId:d}}async function b(i){await r();let{cardId:d}=S(i),m=g(i);if(!await n.subscribeChat(m,d))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:d,clientId:m,subscribed:true}}}async function B(i){await r();let{cardId:d}=S(i),m=g(i);if(!n.unsubscribeChat(m,d))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return {status:"success",data:{boardId:t,cardId:d,clientId:m,subscribed:false}}}async function I(i,d){await r();let{clientId:m,channelName:p,cardId:R}=k(i);if(!n.has(m))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return d?(n.subscribeChannel(m,p,R),o?.(m,p,R?{cardId:R}:{})):(n.unsubscribeChannel(m,p,R),a?.(m,p,R?{cardId:R}:{})),{status:"success",data:{boardId:t,clientId:m,channelName:p,subscribed:d,...R?{cardId:R}:{}}}}async function P(i,d){let{cardId:m}=S(i);return await c().setChatProcessing({cardId:m,active:d}),{status:"success",data:{boardId:t,cardId:m,active:d}}}async function A(i){let{cardId:d}=S(i),m=await c().getChatProcessing({cardId:d});return {status:"success",data:{boardId:t,cardId:d,active:m.active}}}async function y(i){let{cardId:d}=S(i),m=zr(i);if(!Object.prototype.hasOwnProperty.call(i,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(m.split(".").includes("visible_controlplane_only")){let p=await Wr(u().get({params:{id:d}}),"cardStore.get"),R=Array.isArray(p.cards)&&p.cards.length>0&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null,w=R?Yr(R,"visible_controlplane_only").value:void 0;if(i.value!==w)throw Object.assign(new Error("MCP tool cannot change the reserved private flag visible_controlplane_only"),{statusCode:403});return {status:"success",data:{boardId:t,cardId:d,key:m}}}return Gr(await u().patch({params:{id:d,path:`__private.${m}`},body:{value:i.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:d,key:m}}}async function l(i){let{cardId:d}=S(i),m=zr(i),p=await Wr(u().get({params:{id:d}}),"cardStore.get"),R=Array.isArray(p.cards)&&p.cards.length>0&&p.cards[0]&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null;if(!R)throw Object.assign(new Error(`Card "${d}" not found`),{statusCode:404});let w=Yr(R,m);return {status:"success",data:{boardId:t,cardId:d,key:m,exists:w.exists,value:w.value}}}return {requireCardArgs:S,subscribeChat:b,unsubscribeChat:B,watchChannel:I,setChatProcessing:P,getChatProcessing:A,setCardMeta:y,getCardMeta:l}}function uo(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e,a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1;function c(B){return {role:String(B.role||"system"),text:String(B.text||""),files:Array.isArray(B.files)?B.files:[],...typeof B.turn=="string"&&B.turn?{turn:B.turn}:{}}}function u(B){if(B.length===0)return null;if(B.length===1)return B[0];let I=[],P=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],A={};for(let l of P)A[l]=0;for(let l of B){let i=l,d=Array.isArray(i.cards)?i.cards:[];I.push(...d);for(let m of P)A[m]+=Number(i?.summary?.[m]||0);}let y=B[0];return {...y,cards:I,summary:{...y.summary||{},card_count:I.length,...A}}}async function f(){let B=[];for(let I of r)try{let P=await I.boardOps.buildSseOneShotPayload({});P.status==="success"&&P.data&&B.push(P.data);}catch{}return B}async function g(){let I=(await f()).map(P=>P.statusSnapshot).filter(Boolean);if(I.length===0){let P=r.map(A=>A.notification.status).filter(Boolean);return u(P)}return u(I)}async function k(){let B={},I=await f();for(let P of I)Object.assign(B,P.cardRuntimeById||{});if(Object.keys(B).length>0)return B;for(let P of r)for(let[A,y]of Object.entries(P.notification.computedValues)){let l=P.notification.cards[A];B[A]={schema_version:"v1",card_id:A,card_data:l?.card_data??{},computed_values:y??{}};}return B}async function S(){let B={},I=await f();for(let P of I)Object.assign(B,P.dataObjectsByToken||{});if(Object.keys(B).length===0)for(let P of r)Object.assign(B,P.notification.dataObjects||{});return B}async function b(){let B=await f(),I=B.flatMap(l=>Array.isArray(l.cardDefinitions)?l.cardDefinitions:[]),P={},A={};for(let l of B)Object.assign(P,l.dataObjectsByToken||{}),Object.assign(A,l.cardRuntimeById||{});let y={};for(let l of I){if(!l?.id)continue;let i=l.id;try{let d=await n(i,{tailTurns:a}),m=await o(i);(d.length>0||m)&&(y[i]={messages:d.map(p=>c(p)),receiving:!1,processing:m});}catch{}}return {boardId:t,cardDefinitions:I,statusSnapshot:await g(),dataObjectsByToken:P,cardRuntimeById:A,cardChatsByCardId:y}}return {readStatusSnapshot:g,readCardRuntimeArtifacts:k,readDataObjectsByToken:S,buildPublishedRuntimePayload:b}}function ba(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function co(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:a,writeChatRecord:c}=e;async function u(k){let S=[];try{let b=await o(k);if(!b)return S;let B=n().read(b.card_data&&typeof b.card_data=="object"?b.card_data:null);for(let I of B)S.push(String(I.stored_name??""));}catch{}return S}async function f(k,S,b,B){let I=t(k),P=r(k),A=ba(S),y=await u(k),i=`${String(y.length+1).padStart(3,"0")}-${A}`.slice(-36);if(!P.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${k}`),{statusCode:500});return await P.files.putBytes(`${I}/${i}`,new Uint8Array(B),b||"application/octet-stream"),{name:A,stored_name:i,size:B.length,mime_type:b||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function g(k,S,b,B,I){if(!B.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let P=I?.inChat===true,A=await f(k,S,b,B),y=null;if(await a(k,l=>{let i=new Date().toISOString(),d=l.card_data&&typeof l.card_data=="object"?l.card_data:{};l.card_data=d;let m=n().normalizeIncoming([{name:A.name,stored_name:A.stored_name,size:A.size,mime_type:A.mime_type,uploaded_at:A.uploaded_at||i,chat:P}],i);return y=n().merge(d,m).findIndex(R=>R.stored_name===A.stored_name),l}),P&&I?.suppressChatRecordWrite!==true){let l=typeof y=="number"&&y>=0?` #${y}`:"";await c(k,"system",`file uploaded: ${A.name} as ${A.stored_name}${l}`,[],I?.turnId??"");}return {ok:true,file:{...A,...typeof y=="number"&&y>=0?{file_idx:y}:{},chat:P},...typeof y=="number"&&y>=0?{file_idx:y}:{}}}return {uploadCardFile:g,readCardStoredFileNames:u}}function lo(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:me(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=ut(t,"tail_turns"),n=ut(t,"tail"),o=me(t,"turn_id"),a=t.all_turns===true,c=me(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:me(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...a?{allTurns:true}:{},...c?{tailTurnsBeforeId:c}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:me(t,"card_id"),fileIdx:Number(ut(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockRequires:pt(t,"mock_requires","mock_requires"),mockFetchedSources:pt(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockProjections:ct(t,"mock_projections"),sourceIdx:Qt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockProjections:ct(t,"mock_projections"),sourceIdx:Qt(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:me(t,"card_id"),sourceIdx:Qt(t,"source_idx","source_idx"),mockRequires:pt(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:pt(t,"candidate_card_content","candidate_card_content"),mockRequires:ct(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:me(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=me(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:me(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"stage-ai-failure-message":t=>{let r=me(t,"turn_id"),n=me(t,"failure");if(!r)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty turn_id"),{statusCode:400});if(!n)throw Object.assign(new Error("stage-ai-failure-message requires a non-empty failure"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:me(t,"card_id"),role:"system",text:n,turn:r})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:me(t,"card_id"),candidateCardContent:ct(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:me(t,"card_id")})}}function fo(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:me(t,"token"),ref:me(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:me(t,"token"),reason:me(t,"reason")})}}function mo(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function a(u,f){let g=me(u,"board_id");if(!g)throw Object.assign(new Error(`${f} requires board_id`),{statusCode:400});if(g!==t)throw Object.assign(new Error(`Unknown board_id: ${g}`),{statusCode:400})}function c(u,f){let{cardId:g}=o.requireCardArgs(u),k=me(u,"turn_id");return a(u,f),n().manageAddChatAttachment({cardId:g,role:me(u,"role")||"user",...k?{turn:k}:{},files:[{file_name:me(u,"file_name"),content_type:me(u,"content_type")||"application/octet-stream",...typeof u.text=="string"?{text:u.text}:{},...typeof u.base64=="string"?{base64:u.base64}:{},...Array.isArray(u.bytes)?{bytes:u.bytes}:{}}]})}return {"list-runtime-cards":u=>(a(u,"list-runtime-cards"),n().listRuntimeCards()),"sse.subscribe-chat":u=>o.subscribeChat(u),"sse.unsubscribe-chat":u=>o.unsubscribeChat(u),"sse.watch-channel":u=>o.watchChannel(u,true),"sse.unwatch-channel":u=>o.watchChannel(u,false),"getstate.is-chat-processing":u=>o.getChatProcessing(u),"setstate.chat-processing-started":u=>o.setChatProcessing(u,true),"setstate.chat-processing-done":u=>o.setChatProcessing(u,false),"getstate.card-private":u=>o.getCardMeta(u),"setstate.card-private":u=>o.setCardMeta(u),"manage.upload-card-file":u=>{let f=me(u,"card_id"),g=me(u,"file_name"),k=me(u,"content_type")||"application/octet-stream",S=an(u);if(a(u,"manage.upload-card-file"),!f)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!g)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!S)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(f,g,k,S,{inChat:false})},"manage.add-chat-attachment":u=>c(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>c(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:f}=o.requireCardArgs(u),g=me(u,"role")||"user",k=me(u,"turn_id");return a(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:f,role:g,...typeof u.text=="string"?{text:u.text}:{},...k?{turn:k}:{},...Array.isArray(u.files)?{files:u.files}:{}})},"manage.patch-card":u=>{let{cardId:f}=o.requireCardArgs(u);return a(u,"manage.patch-card"),n().managePatchCard({cardId:f,patch:ct(u,"patch")},{allowControlplaneOnlyCards:true})},"manage.upsert-card":u=>{let{cardId:f}=o.requireCardArgs(u);return a(u,"manage.upsert-card"),n().manageUpsertCard({cardId:f,candidateCardContent:ct(u,"candidate_card_content")},{allowControlplaneOnlyCards:true})},"manage.remove-card":u=>{let{cardId:f}=o.requireCardArgs(u);return a(u,"manage.remove-card"),n().manageRemoveCard({cardId:f},{allowControlplaneOnlyCards:true})},"manage.admin-read-card":async u=>{let{cardId:f}=o.requireCardArgs(u);return {status:"success",data:{cards:await n().adminReadCard({cardId:f})}}},"manage.admin-upsert-card":u=>{let f=me(u,"board_id"),g=me(u,"card_id");if(!f)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!g)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(f!==t)throw Object.assign(new Error(`Unknown board_id: ${f}`),{statusCode:400});return n().adminUpsertCard({cardId:g,candidateCardContent:ct(u,"candidate_card_content")})}}}function at(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function po(e,t){if(e?.status==="success"&&Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw e?.status==="success"?new Error(`${t} returned success without data`):e?.status==="fail"||e?.status==="error"?new Error(e.error||`${t} failed`):new Error(`${t} returned an unexpected response`)}function z(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Fe(e){return Array.isArray(e)?e:[]}function Zr(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=z(e).fetched_sources,n=n.slice(16));for(let o of n.split(".")){if(r==null||typeof r!="object")return;r=r[o];}return r}function Xr(e,t){let r=z(e.view);return {elements:Fe(r.elements).map((o,a)=>{let c=z(o),u=z(c.data),f=typeof c.visible=="string"?!!Zr(t,c.visible):true,g=typeof u.bind=="string"?u.bind:void 0,k=typeof u.maxRows=="number"?u.maxRows:void 0,S=g?Zr(t,g):void 0,b={id:typeof c.id=="string"&&c.id?c.id:`element-${a}`,kind:c.kind,label:c.label,visible:f};return S!==void 0&&(b.resolved=Array.isArray(S)&&typeof k=="number"?S.slice(0,k):S),b})}}function go(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Fe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],a={};for(let c of o){let u=z(c),f=typeof u.bindTo=="string"?u.bindTo:"",g=typeof u.ref=="string"?u.ref:"";if(!f||!g)continue;let k=Zr(t,g);k!==void 0&&(a[f]=k);}return a}function Sa(e){if(typeof e!="string"||!e.trim())return null;let t=/^(file uploaded|AI generated|AI geneterated):\s*.*?#(\d+)\s*$/i.exec(e.trim());if(!t)return null;let r=Number.parseInt(t[2],10);return !Number.isInteger(r)||r<0?null:r}function wa(e){return {"card-content":e}}function br(e){let t={...e};return delete t.__private,t}function va(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Aa(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function xa(e,t){let r=Aa(e);if(!t||Object.keys(t).length===0)return r;function n(o,a,c){let u=String(a||"").split(".").filter(Boolean);if(!u.length)return;let f=o;for(let g=0;g<u.length-1;g+=1){let k=u[g];(!f[k]||typeof f[k]!="object")&&(f[k]={}),f=f[k];}f[u[u.length-1]]=c;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,a=z(r.view),c=Fe(a.elements);for(let u of c){let f=z(z(u).data);if(typeof f.writeTo=="string"&&f.writeTo){o=f.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...z(r.card_data),...t.fieldValues}),r}if(Array.isArray(t._stagedFiles)&&t._stagedFiles.length>0)return r;for(let[o,a]of Object.entries(t))o!=="_stagedFiles"&&(a!==null&&typeof a=="object"&&!Array.isArray(a)&&r[o]!==null&&typeof r[o]=="object"&&!Array.isArray(r[o])?r[o]={...r[o],...a}:r[o]=a);return r}function Sr(e){return z(e.__private).visible_controlplane_only===true}async function Pt(e,t){let r=await ze(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function yo(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:a,sourceFetchDone:c,sourceFetchFailed:u,uploadCardFile:f,buildFileDownloadUrl:g,readFetchedSourceJsonByRef:k}=e;function S(h,T){if(typeof h=="function")return h;throw new Error(`${T} is not configured for this MCP facade`)}async function b(){let h=await ze(n.get({}),"cardStore.get");return Array.isArray(h.cards)?h.cards.map(T=>z(T)).filter(T=>!Sr(T)):[]}function B(h){if(Array.isArray(h.bytes))return new Uint8Array(h.bytes.map(T=>Math.max(0,Math.min(255,Number(T)||0))));if(typeof h.text=="string")return new TextEncoder().encode(h.text);if(typeof h.base64=="string"){let T=String(h.base64).replace(/-/g,"+").replace(/_/g,"/"),F=T+"=".repeat((4-T.length%4)%4),D=atob(F);return Uint8Array.from(D,M=>M.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function I(){let h=z(await ze(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:h.version,commonSourceFields:z(h.commonSourceDefFields),sourceKinds:z(h.sourceKinds)}}async function P(){let h=z(await ze(t.status({}),"status")),T=z(h.summary),F=Fe(h.cards),D=await ze(n.get({}),"cardStore.get"),M=new Set((Array.isArray(D.cards)?D.cards.map(z):[]).filter(Sr).map(se=>typeof se.id=="string"?se.id:"").filter(Boolean)),$=F.filter(se=>!M.has(String(z(se).name??"")));return {meta:z(h.meta),summary:{card_count:typeof T.card_count=="number"?T.card_count:0,completed:typeof T.completed=="number"?T.completed:0,eligible:typeof T.eligible=="number"?T.eligible:0,pending:typeof T.pending=="number"?T.pending:0,blocked:typeof T.blocked=="number"?T.blocked:0,in_progress:typeof T.in_progress=="number"?T.in_progress:0,failed:typeof T.failed=="number"?T.failed:0,unresolved:typeof T.unresolved=="number"?T.unresolved:0},cards:$.map(se=>{let ce=z(se);return {"card-id":typeof ce.name=="string"?ce.name:null,status:ce.status??null,error:ce.error??null,requires:Fe(ce.requires),requires_satisfied:Fe(ce.requires_satisfied),requires_missing:Fe(ce.requires_missing),provides_declared:Fe(ce.provides_declared),provides_runtime:Fe(ce.provides_runtime)}})}}async function A(h){let T=String(h.cardId||"").trim();if(!T)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let F=z(await ze(t.status({}),"status")),M=Fe(F.cards).map(z).find(he=>he.name===T);if(!M)throw new Error(`card "${T}" not found in board status`);let $=z(await Pt(n,T)),se=br($),ce=Fe(M.requires_satisfied).filter(he=>typeof he=="string"&&!!he),be=Fe(M.provides_runtime).filter(he=>typeof he=="string"&&!!he),xe=Object.fromEntries(await Promise.all(ce.map(async he=>[he,await ze(t.getOutputsDataObject({params:{key:he}}),`getOutputsDataObject(${he})`)]))),Pe=Object.fromEntries(await Promise.all(be.map(async he=>[he,await ze(t.getOutputsDataObject({params:{key:he}}),`getOutputsDataObject(${he})`)]))),pe=z(await ze(t.getOutputsComputedValues({params:{key:T}}),"getOutputsComputedValues")),ke=await ze(t.getOutputsFetchedSources({params:{key:T}}),"getOutputsFetchedSources"),Ve=Fe($.source_defs).map(z),Se={};for(let he of Ve)typeof he.bindTo=="string"&&typeof he.outputFile=="string"&&(Se[he.outputFile]=he.bindTo);let Ke={};for(let[he,et]of Object.entries(ke)){let Je=Se[he]??he;if(!k||typeof et!="string"){Ke[Je]=null;continue}try{Ke[Je]=k({cardId:T,ref:et});}catch{Ke[Je]=null;}}let qe={card_data:z($.card_data),requires:xe,fetched_sources:Ke,computed_values:pe};return {cardId:T,card_status_in_board:M,card_definition_and_static_data:se,refs_for_fetched_source_files:ke,runtime_data:{requires:xe,provides:Pe,computed_values:pe,rendered_view:Xr($,qe)}}}async function y(h){let T=String(h.cardId||"").trim();if(!T)throw new Error("inspectChatMessagesOnCards requires cardId");let F=typeof h.turnId=="string"?h.turnId:"",D=h.allTurns===true,M=typeof h.tailTurnsBeforeId=="string"?h.tailTurnsBeforeId:"",$=D?void 0:h.lastUserTurns??(F?void 0:1),se=h.tail,ce={...$===void 0?{}:{tailTurns:$},...F?{turnId:F}:{},...D?{allTurns:true}:{},...M?{tailTurnsBeforeId:M}:{}},be=Object.keys(ce).length>0?{params:{cardId:T},body:ce}:{params:{cardId:T}},xe=at(await o.readAll(be),"chatStore.readAll"),Pe=z(await Pt(n,T)),pe=Fe(z(Pe.card_data).files).map((Se,Ke)=>({idx:Ke,stored_name:z(Se).stored_name})).filter(Se=>typeof Se.stored_name=="string"&&Se.stored_name.length>0),Ve=(Array.isArray(xe.records)?xe.records:[]).map(Se=>{let qe=z(Se.payload),he={...Se},et=typeof Se?.role=="string"?Se.role:typeof qe.role=="string"?String(qe.role):"",Je=typeof Se?.text=="string"?Se.text:typeof qe.text=="string"?String(qe.text):"";if(et==="system"){let tt=Sa(Je);if(tt!==null&&pe.some(j=>j.idx===tt)){let j=`Retrieve using inspect-file-contents --card-id ${T} --file-idx ${tt}`;he.retrieval_hint=j,Object.keys(qe).length>0&&typeof Se.role!="string"&&(he.payload={...qe,retrieval_hint:j});}}return he});return {cardId:T,messages:typeof se=="number"&&se>=0?Ve.slice(-se):Ve}}async function l(h){let T=String(h.cardId||"").trim(),F=Number(h.fileIdx);if(!T)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 D=z(await Pt(n,T)),M=Fe(z(D.card_data).files).map(z);if(F>=M.length)throw new Error(`attachment index ${F} is out of range for card "${T}"`);let $=M[F],se=typeof $.stored_name=="string"?$.stored_name:null;return {cardId:T,fileIdx:F,downloadUrl:g({cardId:T,fileIdx:F,storedName:se}),...typeof $.name=="string"?{name:$.name}:{},...typeof $.stored_name=="string"?{stored_name:$.stored_name}:{},...typeof $.mime_type=="string"?{mime_type:$.mime_type}:{},...typeof $.size=="number"?{size:$.size}:{},...typeof $.uploaded_at=="string"?{uploaded_at:$.uploaded_at}:{}}}async function i(h){return await r.validateCardPreflight({body:wa(h.candidateCardContent)})}function d(h){if(!h.mockRequires||typeof h.mockRequires!="object"||Array.isArray(h.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!h.mockFetchedSources||typeof h.mockFetchedSources!="object"||Array.isArray(h.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let T=r.evalCardCompute({body:{"card-content":h.candidateCardContent,"mock-requires":h.mockRequires,"mock-fetched-sources":h.mockFetchedSources}});if(T.status!=="success")return T;let F=z(po(T,"evalCardCompute")),D=z(h.candidateCardContent),M={card_data:z(D.card_data),requires:z(h.mockRequires),fetched_sources:z(h.mockFetchedSources),computed_values:z(F.computed_values)};return {status:"success",data:{cardId:typeof F.cardId=="string"?F.cardId:typeof D.id=="string"?D.id:"(unknown)",ok:F.ok===true,computed_values:z(F.computed_values),errors:Fe(F.errors).map($=>{let se=z($);return {bindTo:typeof se.bindTo=="string"?se.bindTo:"",error:typeof se.error=="string"?se.error:""}}),provides_outputs:go(D,M),rendered_view:Xr(D,M)}}}async function m(h){return await r.probeSourcePreflight({params:{sourceIdx:h.sourceIdx},body:{"card-content":h.candidateCardContent,"mock-projections":h.mockProjections}})}async function p(h){return await r.runSourcePreflight({params:{sourceIdx:h.sourceIdx},body:{"card-content":h.candidateCardContent,"mock-projections":h.mockProjections}})}async function R(h){let T=String(h.cardId||"").trim();if(!T)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!h.mockRequires||typeof h.mockRequires!="object"||Array.isArray(h.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let F=z(await Pt(n,T)),D=Fe(F.source_defs).filter($=>!!$&&typeof $=="object"&&!Array.isArray($)),M={};if(h.sourceIdx>=0&&h.sourceIdx<D.length){let $=D[h.sourceIdx],se=We.enrichSourcesSync([$],{card_data:z(F.card_data),requires:h.mockRequires});Array.isArray(se)&&se.length>0&&(M=z(se[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:h.sourceIdx},body:{"card-content":F,"mock-requires":h.mockRequires,"mock-projections":M}})}async function w(h){let T=z(await ze(r.simulateCardCycle({body:{"card-content":h.candidateCardContent,"mock-requires":h.mockRequires}}),"simulateCardCycle")),F=z(h.candidateCardContent),D=z(T.validation),M=Fe(T.source_probes),$=Fe(T.projection_errors),se=z(T.fetched_sources),ce=Fe(T.compute_errors),be=z(T.computed_values),xe={card_data:z(F.card_data),requires:h.mockRequires,fetched_sources:se,computed_values:be},Pe=[];for(let pe of Fe(D.issues))typeof pe=="string"&&pe&&Pe.push(pe);for(let pe of M){let ke=z(pe),Ve=typeof ke.bindTo=="string"?ke.bindTo:"source",Se=typeof ke.error=="string"?ke.error:"";Se&&Pe.push(`${Ve}: ${Se}`);}for(let pe of $){let ke=z(pe),Ve=typeof ke.bindTo=="string"?ke.bindTo:"source",Se=typeof ke.key=="string"?ke.key:"projection",Ke=typeof ke.error=="string"?ke.error:"projection failed";Pe.push(`${Ve}.${Se}: ${Ke}`);}for(let pe of ce){let ke=z(pe),Ve=typeof ke.bindTo=="string"?ke.bindTo:"compute",Se=typeof ke.error=="string"?ke.error:"compute failed";Pe.push(`${Ve}: ${Se}`);}return {status:"success",data:{cardId:typeof T.cardId=="string"?T.cardId:"(unknown)",ok:T.ok===true,issues:Pe,provides_outputs:go(F,xe),rendered_view:Xr(F,xe)}}}async function O(h){let T=String(h.cardId||"").trim();if(!T)throw new Error("manageReadCard requires cardId");let F=await ze(n.get({params:{id:T}}),"cardStore.get");return (Array.isArray(F.cards)?F.cards.map(z):[]).map(M=>br(M))}async function N(h){let T=await Promise.all(Fe(h.files).map(async F=>{let D=z(F),M=String(D.file_name??D.fileName??D.name??"").trim(),$=String(D.content_type??D.contentType??"application/octet-stream");if(!M)throw new Error("file entry requires file_name");return await f({cardId:h.cardId,fileName:M,contentType:$,bytes:B(D),suppressChatRecordWrite:true})}));for(let[F,D]of T.entries()){let M=z(D.file),$=typeof D.file_idx=="number"&&Number.isInteger(D.file_idx)&&D.file_idx>=0?D.file_idx:F,se=h.role==="assistant"?`AI generated: ${String(M.name||"")} as ${String(M.stored_name||"")} #${$}`:`file uploaded: ${String(M.name||"")} as ${String(M.stored_name||"")} #${$}`;at(await o.append({params:{cardId:h.cardId},body:{role:"system",text:se,files:[],turn:h.turn}}),"chatStore.append(system attachment message)");}return T.map(F=>F.file)}async function U(h){let T=String(h.cardId||"").trim(),F=String(h.role||"user").trim()||"user",D=typeof h.turn=="string"?h.turn:"";if(!T)throw new Error("manageAddChatAttachment requires cardId");let M=await N({cardId:T,role:F,turn:D,files:h.files});return {status:"success",data:{cardId:T,turn:D,files:M}}}async function J(h){let T=String(h.cardId||"").trim(),F=String(h.role||"").trim(),D=typeof h.text=="string"?h.text:"",M=typeof h.turn=="string"?h.turn:"";if(!T)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!F)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(F==="assistant"&&M){let ce=at(await o.readAll({params:{cardId:T},body:{turnId:M}}),"chatStore.readAll(existing turn messages)"),be=Array.isArray(ce.records)?ce.records.find(xe=>xe.role==="assistant"&&String(xe.turn||"")===M):void 0;if(be)return {status:"success",data:{cardId:T,id:String(be.id),role:F,turn:M,files:Array.isArray(be.files)?be.files:[]}}}let $=await N({cardId:T,role:F,turn:M,files:h.files}),se=at(await o.append({params:{cardId:T},body:{role:F,text:D,files:$,turn:M}}),"chatStore.append");return {status:"success",data:{cardId:T,id:String(se.id),role:F,turn:M,files:$}}}async function ae(h,T={}){let F=String(h.cardId||"").trim(),D=z(h.patch);if(!F)throw new Error("managePatchCard requires cardId");let M=await O({cardId:F}),$=z(M[0]),se=xa($,D);return Q({cardId:F,candidateCardContent:se},T)}async function Q(h,T={}){let F=String(h.cardId||"").trim(),D=z(h.candidateCardContent),M=br(D);if(!F)throw new Error("manageUpsertCard requires cardId");if(typeof M.id!="string"||!M.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(M.id!==F)throw new Error(`candidateCardContent.id must match cardId (${F})`);let $=null;try{$=await i({candidateCardContent:M});}catch(pe){let ke=pe instanceof Error?pe.message:String(pe);if(!/non-core adapter is not configured/i.test(ke))throw pe;$=null;}if($!==null){let pe=z($),ke=z(pe.data);if(pe.status!=="success"||ke.isValid!==true)return {status:"fail",step:"validate",validation:$}}let se=null;try{se=await Pt(n,F);}catch{se=null;}let ce=se?z(se):null;if(ce&&Sr(ce)&&!T.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404});let be={...M,...ce&&va(ce,"__private")?{__private:ce.__private}:{}},xe=await n.set({body:be});at(xe,"cardStore.set");let Pe;try{Pe=await t.upsertCard({params:{cardId:F,restart:!0}}),at(Pe,"upsertCard");}catch(pe){try{se&&await n.set({body:se});}catch{}throw pe}return {status:"success",data:{validation:$,card_saved:null,board_result:Pe}}}async function te(h,T={}){let F=String(h.cardId||"").trim();if(!F)throw new Error("manageRemoveCard requires cardId");if(!T.allowControlplaneOnlyCards){let $=await ze(n.get({params:{id:F}}),"cardStore.get");if((Array.isArray($.cards)?$.cards.map(z):[]).some(Sr))throw Object.assign(new Error(`Card "${F}" not found`),{statusCode:404})}let D=await t.removeCard({params:{id:F}});at(D,"removeCard");let M=await n.del({params:{id:F}});return at(M,"cardStore.del"),{status:"success",data:{board_result:D,store_result:M}}}async function ue(h){let T=String(h.cardId||"").trim();if(!T)throw new Error("adminReadCard requires cardId");let F=await ze(n.get({params:{id:T}}),"cardStore.get");return Array.isArray(F.cards)?F.cards.map(D=>z(D)):[]}async function G(h){let T=String(h.cardId||"").trim(),F=z(h.candidateCardContent),D=br(F);if(!T)throw new Error("adminUpsertCard requires cardId");if(typeof D.id!="string"||!D.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(D.id!==T)throw new Error(`candidateCardContent.id must match cardId (${T})`);let M=await i({candidateCardContent:D}),$=z(M),se=z($.data);if($.status!=="success"||se.isValid!==true)return {status:"fail",step:"validate",validation:M};let ce=null;try{ce=await Pt(n,T);}catch{ce=null;}let be=ce?z(z(ce).__private):{},xe={...D,__private:{...be,visible_controlplane_only:true}},Pe=await n.set({body:xe});at(Pe,"cardStore.set");let pe;try{pe=await t.upsertCard({params:{cardId:T,restart:!0}}),at(pe,"upsertCard");}catch(ke){try{ce&&await n.set({body:ce});}catch{}throw ke}return {status:"success",data:{validation:M,card_saved:null,board_result:pe}}}async function Z(h){let T=String(h.cardId||"").trim();if(!T)throw new Error("getChatProcessing requires cardId");let F=po(await o.isProcessing({params:{cardId:T}}),"chatStore.isProcessing");return {cardId:T,active:!!F.active}}async function re(h){let T=String(h.cardId||"").trim();if(!T)throw new Error("setChatProcessing requires cardId");if(typeof h.active!="boolean")throw new Error("setChatProcessing requires boolean active");return at(await o.setProcessing({params:{cardId:T},body:{active:h.active}}),"chatStore.setProcessing"),{cardId:T,active:h.active}}async function E(){let h=await S(a,"webhook.process-accumulated")();return h?.status==="fail"||h?.status==="error"?h:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(h??{},"data")?h.data??null:null}}}async function x(h){let T=String(h.token||"").trim(),F=String(h.ref||"").trim();if(!T)throw new Error("webhookSourceFetchDone requires token");if(!F)throw new Error("webhookSourceFetchDone requires ref");let D=await S(c,"webhook.source-fetch-done")({token:T,ref:F});return D?.status==="fail"||D?.status==="error"?D:{status:"success",data:{token:T,ref:F,runtime_result:Object.prototype.hasOwnProperty.call(D??{},"data")?D.data??null:null}}}async function K(h){let T=String(h.token||"").trim(),F=String(h.reason||"").trim();if(!T)throw new Error("webhookSourceFetchFailed requires token");if(!F)throw new Error("webhookSourceFetchFailed requires reason");let D=await S(u,"webhook.source-fetch-failed")({token:T,reason:F});return D?.status==="fail"||D?.status==="error"?D:{status:"success",data:{token:T,reason:F,runtime_result:Object.prototype.hasOwnProperty.call(D??{},"data")?D.data??null:null}}}return {listRuntimeCards:b,discoverSourceKinds:I,inspectBoardRuntimeStatus:P,inspectCardDefinitionAndRuntime:A,inspectChatMessagesOnCards:y,inspectFileContents:l,preflightValidateCandidateCardDefinition:i,preflightMaterializeCandidateCard:d,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:R,preflightRunOneCycleWithCandidateCard:w,manageReadCard:O,manageAddChatAttachment:U,manageAddChatEntryAndAnyAttachments:J,managePatchCard:ae,manageUpsertCard:Q,manageRemoveCard:te,adminReadCard:ue,adminUpsertCard:G,getChatProcessing:Z,setChatProcessing:re,webhookProcessAccumulated:E,webhookSourceFetchDone:x,webhookSourceFetchFailed:K}}async function ze(e,t){return at(await e,t)}function ho(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:a,readCardRuntimeArtifacts:c,readCardFromStore:u,readCardDefinitions:f,processAccumulatedLaneInternal:g,reportSourceFetched:k,reportSourceFetchFailure:S,uploadCardFile:b,chatStorePublic:B,serverUrl:I,apiBasePath:P}=e;function A(){return t[0]??null}function y(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let p=m?.params?.key;return p?{status:"success",data:(await a())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let p=m?.params?.key;return p?{status:"success",data:(await c())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let p=m?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let R=n(p)??A();return R?R.boardOps.getOutputsFetchedSources({params:{key:p}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let p=m?.params?.id;if(!p)return {status:"fail",error:"removeCard requires params.id"};let R=n(p)??A();return R?R.boardOps.removeCard({params:{id:p}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"upsertCard requires params.cardId"};let R=n(p)??A();if(!R)return {status:"fail",error:"Board context is unavailable"};let w=await R.boardOps.upsertCard({params:{cardId:p,restart:m.params.restart===true}});if(w.status!=="success")return w;if(rt(R.boardAdapter)){let O=await g(true);if(O.status!=="success")return O}return w}}}function l(){let m=()=>{let p=A();if(!p?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return p.nonCore};return {describeTaskExecutorCapabilities(p){return m().describeTaskExecutorCapabilities(p)},validateCardPreflight(p){return m().validateCardPreflight(p)},evalCardCompute(p){return m().evalCardCompute(p)},probeSourcePreflight(p){return m().probeSourcePreflight(p)},runSourcePreflight(p){return m().runSourcePreflight(p)},simulateCardCycle(p){return m().simulateCardCycle(p)}}}function i(){return {async get(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(p){let R=await u(p);return R?{status:"success",data:{cards:[R]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await f()}}},async set(m){let p=m.body;if(p==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let R=Array.isArray(p)?p:[p];for(let w of R){let O=w,N=typeof O.id=="string"?O.id:"";if(!N)return {status:"fail",error:"each card must have a string `id` field"};let U=r.get(N)??0,J=t[U]??A();if(!J)return {status:"fail",error:"Board context is unavailable"};let ae=await J.cardStoreOps.set({body:O});if(ae.status!=="success")return ae;r.set(N,U);}return {status:"success",data:{count:R.length}}},async del(m){let p=[m.params?.id,...m.body?.ids??[]].filter(R=>typeof R=="string"&&!!R);if(p.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let R of p){let w=n(R)??A();if(!w)return {status:"fail",error:"Board context is unavailable"};let O=await w.cardStoreOps.del({params:{id:R}});if(O.status!=="success")return O;r.delete(R);}return {status:"success",data:{count:p.length}}},async patch(m){let p=typeof m.params?.id=="string"?m.params.id:void 0,R=typeof m.params?.path=="string"?m.params.path:void 0;if(!p||!R)return {status:"fail",error:"patch requires params.id and params.path"};let w=n(p)??A();return w?w.cardStoreOps.patch(m):{status:"fail",error:"Board context is unavailable"}},async appendFiles(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(!p)return {status:"fail",error:"appendFiles requires params.id"};let R=n(p)??A();return R?R.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function d(){return yo({board:y(),nonCore:l(),cardStore:i(),chatStore:B,processAccumulated:()=>g(true),sourceFetchDone:({token:m,ref:p})=>k(m,p),sourceFetchFailed:({token:m,reason:p})=>S(m,p),uploadCardFile({cardId:m,fileName:p,contentType:R,bytes:w,suppressChatRecordWrite:O}){return b(m,p,R,w,{inChat:true,...O===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:p,storedName:R}){let w=`${I||""}${P}/cards/${encodeURIComponent(m)}/files/${p}`;return R?`${w}?sn=${encodeURIComponent(R)}`:w},readFetchedSourceJsonByRef({cardId:m,ref:p}){let R=n(m)??A();if(!R||rt(R.boardAdapter))return null;let N=R.boardAdapter.resolveBlob(it(p)).trim();return N?JSON.parse(N):null}})}return {mcpBoardFacade:y,mcpNonCoreFacade:l,mcpCardStoreFacade:i,createMcpFacade:d}}function Ro(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:a,createMcpToolRegistry:c,resolveCardFileDownloadPayload:u,isLikelyTextMimeType:f,sliceTextByLines:g}=e;async function k(S,b,B){let I=S.method||"GET",P=B,A=P.pathname;try{if(I==="POST"&&A===`${t}/mcp`){await o();let y=await n(S),l=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!l)return r(b,400,{error:"tool is required"}),!0;if(l==="inspect.file-contents")return r(b,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let d=await gt(l,i,c(a()));if(d&&typeof d=="object"&&!Array.isArray(d)){let m=d;if(m.status==="fail")return r(b,400,{error:nt(d,"Request failed")}),!0;if(m.status==="error")return r(b,500,{error:nt(d,"Internal error")}),!0}r(b,200,d);}catch(d){let m=typeof d?.statusCode=="number"?Number(d.statusCode):500,p=d instanceof Error?d.message:String(d);r(b,m,{error:p});}return !0}if(I==="POST"&&A===`${t}/mcp-raw`){await o();let y=await n(S),l=typeof y.tool=="string"?y.tool.trim():"",i=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!l)return r(b,400,{error:"tool is required"}),!0;if(l!=="inspect.file-contents")return r(b,400,{error:`Tool does not support raw response: ${l}`}),!0;let d=me(i,"card_id","cardId"),m=ut(i,"file_idx","fileIdx"),p=ut(i,"head-lines","headLines"),R=ut(i,"tail-lines","tailLines"),w=ut(i,"head-bytes","headBytes"),O=ut(i,"tail-bytes","tailBytes");if(!d)return r(b,400,{error:"inspect.file-contents requires card_id"}),!0;if(m===void 0||!Number.isInteger(m)||m<0)return r(b,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([p,R,w,O].filter(E=>E!==void 0).length>1)return r(b,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[E,x]of [["head-lines",p],["tail-lines",R],["head-bytes",w],["tail-bytes",O]])if(x!==void 0&&(!Number.isInteger(x)||x<0))return r(b,400,{error:`inspect.file-contents requires ${E} to be a non-negative integer`}),!0;let U=await a().inspectFileContents({cardId:d,fileIdx:m}),J=typeof U?.stored_name=="string"?U.stored_name:null,{fileRecord:ae,bytes:Q}=await u(d,m,J),te=String(ae.name||ae.stored_name||"download.bin"),ue=String(ae.mime_type||"application/octet-stream"),G=(P.searchParams.get("resp")||"").trim().toLowerCase();if(G&&G!=="json-b64")return r(b,400,{error:`unsupported resp mode: ${G}`}),!0;let Z=G==="json-b64",re;if(p!==void 0||R!==void 0){if(!f(ue))return r(b,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let E=new TextDecoder().decode(Q),x=p!==void 0?g(E,"head",p):g(E,"tail",R);re=typeof Buffer<"u"?Buffer.from(x,"utf8"):new TextEncoder().encode(x);}else if(w!==void 0||O!==void 0){let E=w??O;re=w!==void 0?Q.slice(0,E):Q.slice(Math.max(0,Q.length-E));}else re=Q;if(Z){let E=typeof Buffer<"u"?Buffer.from(re).toString("base64"):btoa(String.fromCharCode(...re));return r(b,200,{bodyBase64:E,mimeType:ue,filename:te,byteLength:re.length}),!0}return b.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${te}"`,"Content-Length":re.length}),b.end(re),!0}return !1}catch(y){let l=y?.statusCode||500;return r(b,l,{error:String(y?.message||y)}),true}}return {handleAgentfaceApi:k}}function ko(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:a}=e;async function c(u,f,g){let k=u.method||"GET",S=g.pathname;try{if(k==="POST"&&S===`${t}/mcp-webhooks`){await o();let b=await n(u),B=typeof b.tool=="string"?b.tool.trim():"",I=b.args&&typeof b.args=="object"&&!Array.isArray(b.args)?b.args:{};if(!B)return r(f,400,{error:"tool is required"}),!0;try{let P=await gt(B,I,a());if(P&&typeof P=="object"&&!Array.isArray(P)){let A=P;if(A.status==="fail")return r(f,400,{error:nt(P,"Request failed")}),!0;if(A.status==="error")return r(f,500,{error:nt(P,"Internal error")}),!0}r(f,200,P);}catch(P){let A=typeof P?.statusCode=="number"?Number(P.statusCode):500,y=P instanceof Error?P.message:String(P);r(f,A,{error:y});}return !0}return !1}catch(b){let B=b?.statusCode||500;return r(f,B,{error:String(b?.message||b)}),true}}return {handleWebhooksApi:c}}function en(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:a,onChannelSubscribed:c,onChannelUnsubscribed:u}=e;function f(k,S,b,B,I){if(!t.has(S)){n(k,404,{error:`SSE client not connected: ${S}`});return}I?(t.subscribeChannel(S,b,B.cardId),c?.(S,b,B)):(t.unsubscribeChannel(S,b,B.cardId),u?.(S,b,B)),n(k,200,{ok:true,clientId:S,channelName:b,...B.cardId?{cardId:B.cardId}:{},subscribed:I});}async function g(k,S,b,B){let I=B?.oneShot===true,P=B?.bootstrapPayload!==false,A=!I&&b?t.get(b):null,y=A?new Set(A.subscribedChatCardIds):new Set,l=A?new Set(A.subscribedChannelNames):new Set,i=A?new Map(Array.from(A.subscribedCardChannels.entries(),([m,p])=>[m,new Set(p)])):new Map;if(S.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(S),P){let m=await o(),p=t.buildFrame(m);S.write(p);}if(I){S.end();return}if(!b)throw new Error("clientId is required for streaming SSE");t.register(b,S,{subscribedChatCardIds:y,subscribedChannelNames:l,subscribedCardChannels:i});try{a?.(b,m=>{t.writeFrame(b,m);});}catch{}let d=setInterval(()=>{try{S.write(`: keepalive
5
5
 
6
- `);}catch{}},15e3);C.on("close",()=>{clearInterval(l),t.disconnect(S,v);});}return {handleChannelSubscription:p,handleSse:y}}function po(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:a,boardContexts:d,publishPersistedStateSnapshot:u,upsertCardsFromSource:p,sseHub:y,queueSseHub:C}=e,{handleSse:v,handleChannelSubscription:S}=Hr(e),{handleSse:B}=Hr({...e,sseHub:C,buildPublishedRuntimePayload:async()=>null});async function T(_,x,h){let f=_.method||"GET",s=h,l=s.pathname;try{if(f==="GET"&&l===`${t}/sse`){let q=s.searchParams.has("one-shot");await o();let L=String(s.searchParams.get("clientId")||"").trim();if(!q&&!L)return r(x,400,{error:"clientId query param is required for SSE"}),!0;if(await v(_,x,L||void 0,{oneShot:q}),q)return !0;for(let V=0;V<d.length;V++)await u(d[V]),await p(d[V],V),await u(d[V]);return !0}if(f==="GET"&&l===`${t}/sse-q`){let q=String(s.searchParams.get("clientId")||"").trim();return q?(await B(_,x,q,{bootstrapPayload:!1}),!0):(r(x,400,{error:"clientId query param is required for SSE"}),!0)}let m=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(f==="POST"&&m){await a();let q=decodeURIComponent(m[1]),L=await n(_),V=typeof L?.clientId=="string"?L.clientId.trim():"";return V?await y.subscribeChat(V,q)?(r(x,200,{ok:!0,clientId:V,cardId:q,subscribed:!0}),!0):(r(x,404,{error:`SSE client not connected: ${V}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let g=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(f==="POST"&&g){await a();let q=decodeURIComponent(g[1]),L=await n(_),V=typeof L?.clientId=="string"?L.clientId.trim():"";return V?y.unsubscribeChat(V,q)?(r(x,200,{ok:!0,clientId:V,cardId:q,subscribed:!1}),!0):(r(x,404,{error:`SSE client not connected: ${V}`}),!0):(r(x,400,{error:"clientId is required"}),!0)}let k=l.match(new RegExp(`^${ot(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&k){await a();let q=decodeURIComponent(k[1]),L=k[2]==="subscribe",V=await n(_),J=typeof V?.clientId=="string"?V.clientId.trim():"";return J?(S(x,J,q,{},L),!0):(r(x,400,{error:"clientId is required"}),!0)}let I=l.match(new RegExp(`^${ot(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&I){await a();let q=decodeURIComponent(I[1]),L=decodeURIComponent(I[2]),V=I[3]==="subscribe",J=await n(_),X=typeof J?.clientId=="string"?J.clientId.trim():"";return X?(S(x,X,L,{cardId:q},V),!0):(r(x,400,{error:"clientId is required"}),!0)}return !1}catch(m){let g=m?.statusCode||500;return r(x,g,{error:String(m?.message||m)}),true}}return {handleWatchersRoutes:T,handleSse:v,handleChannelSubscription:S}}var Ca=3e4;function ba(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function go(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,a=`${t}/notify-q`;async function d(u,p,y){if(y.pathname!==a)return false;if((u.method??"").toUpperCase()!=="POST")return o(p,405,{status:"error",error:"Method not allowed"}),true;if(!ba(u))return o(p,403,{status:"error",error:"Forbidden"}),true;let C;try{C=await n(u);}catch{return o(p,400,{status:"error",error:"Invalid JSON body"}),true}if(!C||typeof C!="object"||!Array.isArray(C.notifications))return o(p,400,{status:"error",error:"body.notifications must be an array"}),true;let v=C.notifications,{accepted:S,rejected:B}=Yn(v,Date.now(),Ca);return S.length>0&&r(S),o(p,200,{status:"success",data:{accepted:S.length,rejected:B}}),true}return {handleNotifyRoute:d}}var ho={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},yo="chat-handler-flow-queue",Mt="__probe__echo__probe__";function Sa(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...ho,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",a=e.logger||{info:console.log,warn:console.warn,error:console.error},d=e.invocationAdapter,u=e.chatFlowRunner||null,p=e.notificationTransport||null,y=e.serverUrl||null,C=e.executionExtra||{},v=e.onSseClientConnected,S=e.onSseClientDisconnected,B=e.onChannelSubscribed,T=e.onChannelUnsubscribed,_=Lr({buildChatOneShotBatch:async(i,P)=>await ne.buildSseOneShotBatch({params:{cardId:i},body:{receiving:P}}),onSseClientDisconnected:S}),x=Lr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function h(i){function P(z){return {...z,queueStorageForRef(me,Ee){return Kn(z.queueStorageForRef(me,Ee),{lane:Ee,emitNotification:G})}}}function b(z){return {...z,queueStorageForRef(me,Ee){return Un(z.queueStorageForRef(me,Ee),{lane:Ee,emitNotification:G})}}}function O(z){return {async get(me){return z.get(me)},async set(me){return z.set(me)},async del(me){return z.del(me)},async patch(me){return z.patch(me)},async appendFiles(me){return z.appendFiles(me)}}}function D(z){return {async get(me){return await z.get(me)},async set(me){return await z.set(me)},async del(me){return await z.del(me)},async patch(me){return await z.patch(me)},async appendFiles(me){return await z.appendFiles(me)}}}let Y=null;function G(z){if(z.kind==="notification-batch"){H(z.notifications,Y??void 0);return}H([z],Y??void 0);}let oe=Ze(i.boardAdapter)?b(i.boardAdapter):P(i.boardAdapter),Be=i.nonCoreAdapter??(!Ze(oe)&&k(oe)?oe:null),ue=Ze(oe)?Vn(i.baseRef,oe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,scratchStoreRef:i.scratchStoreRef,taskExecutorRef:i.taskExecutorRef,chatHandlerFlow:i.chatHandlerFlow,emitNotification:G}):Bn(i.baseRef,oe,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,scratchStoreRef:i.scratchStoreRef,taskExecutorRef:i.taskExecutorRef,chatHandlerFlow:i.chatHandlerFlow,emitNotification:G}),Le=i.nonCore??(Be?On(i.baseRef,Be,{boardRuntimeStoreRef:i.boardRuntimeStoreRef,taskExecutorRef:i.taskExecutorRef}):null),vt=oe.chatStorageForRef(i.chatStoreRef),At,Ut=Ze(oe)?(()=>{let z=hr(yr(gr(oe.kvStorageForRef(i.cardStoreRef)),oe.hashFn),a.warn),me=fr(z,{emitNotification:G}),Ee=D(me);return At={get(we){return Ee.get(we)},set(we){return Ee.set(we)}},Ee})():(()=>{let z=oe.kvStorageForRef(i.cardStoreRef),Ee=dr(jt({readIndex:()=>z.read("_index"),writeIndex:we=>z.write("_index",we),readCard:we=>z.read(we),writeCard:(we,br)=>(z.write(we,br),we),removeCard:we=>{z.delete(we);},cardExists:we=>z.read(we)!==null,defaultCardKey:we=>we},a.warn),{emitNotification:G});return At=Ee,O(Ee)})(),Et;if(Ze(oe)){let z=oe.blobStorageForRef(i.artifactsStoreRef);Et={async putBytes(me,Ee){if(z.writeBytes){await z.writeBytes(me,Ee);return}let we=JSON.stringify({__kind:"bytes-array",data:[...Ee]});await z.write(me,we);},async getBytes(me){if(z.readBytes){let we=await z.readBytes(me);if(we!==null)return we}let Ee=await z.read(me);if(Ee===null)return null;try{let we=JSON.parse(Ee);if(we&&we.__kind==="bytes-array"&&Array.isArray(we.data))return new Uint8Array(we.data)}catch{}return new TextEncoder().encode(Ee)},async listKeys(me){return await z.listKeys(me)}};}else {let z=oe.blobStorageForRef(i.artifactsStoreRef),me=Qn(z);Et={putBytes(Ee,we,br){me.putBytes(Ee,we,br);},getBytes(Ee){return me.getBytes(Ee)},listKeys(Ee){return me.list(Ee).map(we=>we.key)}};}let ko={async init(z){return ue.init(z)},async status(z){return ue.status(z)},async getConfig(z){return ue.getConfig(z)},async getAllOutputsDataObjects(z){return ue.getAllOutputsDataObjects(z)},async getAllOutputsComputedValues(z){return ue.getAllOutputsComputedValues(z)},async getOutputsFetchedSources(z){return ue.getOutputsFetchedSources(z)},async buildSseOneShotPayload(z){return ue.buildSseOneShotPayload(z)},async upsertCard(z){return ue.upsertCard(z)},async removeCard(z){return ue.removeCard(z)},async sourceDataFetched(z){return ue.sourceDataFetched(z)},async sourceDataFetchFailure(z){return ue.sourceDataFetchFailure(z)}};return Y={label:i.label,board:ue,nonCore:Le,publicCardStore:At,boardOps:ko,cardStoreOps:Ut,get filesArtifacts(){return Et},get chatStorage(){return vt},boardAdapter:oe,boardRuntimeStoreRef:i.boardRuntimeStoreRef,cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef,artifactsStoreRef:i.artifactsStoreRef,fetchedSourcesStoreRef:i.fetchedSourcesStoreRef,queueStoreRef:i.queueStoreRef,chatStoreRef:i.chatStoreRef,scratchStoreRef:i.scratchStoreRef,notifyRef:i.notifyRef,taskExecutorRef:i.taskExecutorRef,chatHandlerRef:i.chatHandlerRef,chatHandlerFlow:i.chatHandlerFlow,inferenceAdapterRef:i.inferenceAdapterRef,notification:Zn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},Y}let f=e.boards.map(h),s=new Map;function l(i){return s.get(i)??0}function m(i){return i.queueStoreRef}function g(i,P){if(Ze(i.boardAdapter)){let O=i.boardAdapter.queueStorageForRef(m(i),P);return Fr(O)}let b=i.boardAdapter.queueStorageForRef(m(i),P);return Nr(b)}function k(i){let P=i;return typeof P.invokeExecutor=="function"&&typeof P.validateSchema=="function"}function I(i){let P=f[l(i)];return {files:P?P.filesArtifacts:null}}function q(){return Gn()}function L(i){return String(i||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function V(i){return "cardId"in i&&typeof i.cardId=="string"?E(i.cardId)??void 0:f[0]??void 0}function J(i){for(let P of i){let b=V(P);if(b)return b}return f[0]??void 0}function X(i,P={}){if(!i||i.length===0)return;let b=Fe(i),O={kind:"notification-batch",notifications:b},D=P.ctx??J(b);if(P.appendState!==false&&D&&eo(D.notification,O),P.broadcastSse!==false){let Y=b.filter(oe=>oe.kind==="message_enqueued"),G=b.filter(oe=>oe.kind!=="message_enqueued");G.length>0&&_.broadcastNotificationBatch(G),Y.length>0&&x.broadcastNotificationBatch(Y);}if(!(P.mirrorExternal===false||!D?.boardAdapter.publishBoardChangeNotifications))try{let Y=b.filter(G=>G.category==="board-output"||G.category==="card-store");Y.length>0&&D.boardAdapter.publishBoardChangeNotifications(Y);}catch{}}function H(i,P){X(i,{ctx:P,appendState:true,broadcastSse:true,mirrorExternal:true});}async function re(i){if(!i||i.notificationTeardown||!p||!i.notifyRef)return;let P=await p.subscribe(i.notifyRef,b=>{let O=zn(b);X(O,{ctx:i,appendState:true,broadcastSse:true,mirrorExternal:false});});i.notificationTeardown=P;}async function ie(i){if(!i||i.initialized)return;let P={boardRuntimeStoreRef:i.boardRuntimeStoreRef,cardStoreRef:i.cardStoreRef,outputsStoreRef:i.outputsStoreRef,fetchedSourcesStoreRef:i.fetchedSourcesStoreRef,artifactsStoreRef:i.artifactsStoreRef,queueStoreRef:i.queueStoreRef,chatStoreRef:i.chatStoreRef,scratchStoreRef:i.scratchStoreRef},b={};i.taskExecutorRef&&(b["task-executor-ref"]=i.taskExecutorRef),i.chatHandlerFlow!==void 0&&(b["chat-handler-flow"]=i.chatHandlerFlow);let O=await i.boardOps.init({params:P,body:b});if(O.status!=="success")throw Object.assign(new Error(O.error||`init failed for ${i.label}`),{statusCode:500});if(await re(i),!i.chatHandlerFlow&&i.chatHandlerRef&&d.describe)try{let D=await d.describe(i.chatHandlerRef);D&&D.kind!=="chat-handler"?a.warn(`[init] chat-handler describe returned kind="${D.kind}", expected "chat-handler" for ${i.label}`):D&&a.info(`[init] chat-handler validated: ${D.name} (protocol ${D.protocolVersion}) for ${i.label}`);}catch(D){a.warn(`[init] chat-handler describe failed for ${i.label}: ${D?.message||String(D)}`);}i.initialized=true;}async function Q(i){let P=[],b=await i.boardOps.status({});b.status==="success"&&b.data!=null&&jr(b.data)&&P.push({kind:"status",status:b.data});let O=await i.boardOps.getAllOutputsDataObjects({});if(O.status==="success"&&O.data!=null)for(let[Y,G]of Object.entries(O.data))Y&&P.push({kind:"data_object",key:Y,payload:G});let D=await i.boardOps.getAllOutputsComputedValues({});if(D.status==="success"&&D.data!=null)for(let[Y,G]of Object.entries(D.data))Y&&G&&typeof G=="object"&&!Array.isArray(G)&&P.push({kind:"computed_values",cardId:Y,values:G});P.length>0&&X(P,{ctx:i,appendState:true,broadcastSse:true,mirrorExternal:false});}async function Z(i,P){if(!i||i.cardsBootstrapped)return;let b=await i.cardStoreOps.get({}),O=b.status==="success"&&Array.isArray(b.data?.cards)?b.data.cards:[];for(let D of O)typeof D.id=="string"&&(s.set(D.id,P),await i.boardOps.upsertCard({params:{cardId:D.id}}));i.cardsBootstrapped=true;}async function ae(){for(let i of f)await ie(i);}async function de(){await ae();for(let i=0;i<f.length;i++)await Q(f[i]),await Z(f[i],i),await Q(f[i]);}async function ke(i=false){i||await ae();for(let P of f){let b=await P.board.processAccumulatedEvents({});if(b.status!=="success")return b}return {status:"success"}}function E(i){return f[l(i)]??null}async function c(i){let P=E(i);if(!P)return null;let b=await P.cardStoreOps.get({params:{id:i}});if(b.status!=="success")return null;let O=Array.isArray(b.data?.cards)?b.data.cards:[];return O.length>0?O[0]:null}async function w(){let i=async b=>{if(!b)return [];let O=await b.cardStoreOps.get({});return O.status!=="success"||!Array.isArray(O.data?.cards)?[]:O.data.cards},P=[];for(let b of f)P.push(...await i(b));return P}function A(){return f[0]??null}function N(i){return E(i)??A()}function M(i){let P=N(i);if(!P)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${i}`),{statusCode:404});return P.chatStorage}async function K(i){return await M(i).isProcessing(i)}async function U(i,P){let b=await ne.setProcessing({params:{cardId:i},body:{active:P}});if(b.status!=="success")throw Object.assign(new Error(b.error||`Failed to set chat processing for card: ${i}`),{statusCode:500})}let ne=Wn({append(i,P,b,O,D){return M(i).append(i,P,b,O,D)},readAll(i){return M(i).readAll(i)},readAfter(i,P){return M(i).readAfter(i,P)},clear(i){return M(i).clear(i)},setProcessing(i,P){return M(i).setProcessing(i,P)},isProcessing(i){return M(i).isProcessing(i)},getConfig(i){return M(i).getConfig(i)},setConfig(i,P){return M(i).setConfig(i,P)}},{emitNotification(i){if(i.kind==="notification-batch"){H(i.notifications);return}H([i]);}}),xe=lo({boardContexts:f,cardOwnerIndex:s,cardContextForCard:i=>E(i),readStatusSnapshot:()=>Me(),readDataObjectsByToken:()=>Ye(),readCardRuntimeArtifacts:()=>ye(),readCardFromStore:i=>c(i),readCardDefinitions:()=>w(),processAccumulatedLaneInternal:i=>ke(i),reportSourceFetched:(i,P)=>bt(i,{ref:P}),reportSourceFetchFailure:(i,P)=>St(i,{reason:P}),uploadCardFile:(i,P,b,O,D)=>$(i,P,b,O,D),chatStorePublic:ne,serverUrl:y,apiBasePath:t}),Ie=xe.mcpCardStoreFacade,Ae=xe.createMcpFacade,le=to({boardId:o,bootstrapBoard:()=>de(),sseHub:_,onChannelSubscribed:B,onChannelUnsubscribed:T,getMcpFacade:()=>Ae(),getMcpCardStoreFacade:()=>Ie()});function ge(i){return oo(i)}function $e(){return ao(Ae())}function be(){return so({boardId:o,uploadCardFile:$,getMcpFacade:()=>Ae(),controlplane:le})}let Ne=ro({boardId:o,boardContexts:f,readChatRecords:i=>R(i),getChatProcessing:i=>K(i)}),Me=Ne.readStatusSnapshot,ye=Ne.readCardRuntimeArtifacts,Ye=Ne.readDataObjectsByToken,De=Ne.buildPublishedRuntimePayload;async function He(i,P,b){let O=b?.syncBoard!==false,D=b?.restartOnlyIfChanged===true,Y=E(i);if(!Y)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let G=await c(i);if(!G)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let oe=D?JSON.stringify(G):null,Be=P(G)||G;if(D&&JSON.stringify(Be)===oe)return;let ue=await Y.cardStoreOps.set({body:Be});if(ue.status!=="success")throw Object.assign(new Error(ue.error||`Failed to persist card: ${i}`),{statusCode:500});if(O){let Le=await Y.boardOps.upsertCard({params:{cardId:i,restart:true}});if(Le.status!=="success")throw Object.assign(new Error(Le.error||`Failed to upsert card: ${i}`),{statusCode:500})}}async function pt(i,P){await He(i,P,{syncBoard:true});}async function rt(i,P){await He(i,P,{syncBoard:false});}async function at(i){let P=E(i);if(!P)throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});if(!await c(i))throw Object.assign(new Error(`Card not found: ${i}`),{statusCode:404});let O=await P.boardOps.upsertCard({params:{cardId:i,restart:true}});if(O.status!=="success")throw Object.assign(new Error(O.error||`Failed to retrigger card: ${i}`),{statusCode:500})}async function nt(i){let P=await ne.clear({params:{cardId:i}});if(P.status!=="success")throw Object.assign(new Error(P.error||`Failed to clear chat records for card: ${i}`),{statusCode:500});try{await U(i,!1);}catch{}}async function j(i,P,b,O,D=""){let Y=typeof b=="string"?b.trim():"",G=await ne.append({params:{cardId:i},body:{role:P||"system",text:Y,files:O,turn:D}});if(G.status!=="success")throw Object.assign(new Error(G.error||`Failed to append chat record for card: ${i}`),{statusCode:500});return String(G.data?.id||"")}async function R(i){return await M(i).readAll(i)}let $=no({safeCardId:i=>L(i),artifactsStores:i=>I(i),cardFileMetadataStore:()=>q(),readCardFromStore:i=>c(i),updateCardLocalOnly:(i,P)=>rt(i,P),writeChatRecord:(i,P,b,O,D)=>j(i,P,b,O,D)}).uploadCardFile;async function te(i){let P=E(i);if(!P)return null;let b=await P.boardOps.getConfig({params:{key:"chat-handler-flow"}}),D=(b.status==="success"?b.data?.value:null)??P.chatHandlerFlow??null,Y=P.chatHandlerRef;return D==null&&(!Y||typeof Y!="object")?null:{ctx:P,handlerFlow:D,handlerRef:Y}}function ee(i){let P=typeof i=="string"?i.trim():"";if(P.length<Mt.length*2||!P.startsWith(Mt)||!P.endsWith(Mt))return null;let b=P.slice(Mt.length,P.length-Mt.length).trim(),O=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(b);return O?{assistant:O[1].trim().toLowerCase(),text:O[2].trim()}:{assistant:"echo",text:b}}async function Re(i,P,b=false,O="",D=""){try{let Y=await te(i);if(!Y){try{await U(i,!1);}catch{}return}let{ctx:G,handlerFlow:oe,handlerRef:Be}=Y;if(!b)try{await U(i,!0);}catch{}let ue={boardId:o,cardId:String(i),lastChatEntryId:P,...O?{turnId:O}:{},...typeof D=="string"&&D.trim()?{probe:D.trim()}:{},...C,...y?{serverUrl:y}:{}},Le=oe!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:yo}}:Be;Ze(G.boardAdapter)?await g(G,"chat-agent").enqueueRequest({boardId:o,ref:Le,args:oe!=null?{...ue,__chatHandlerFlow:oe}:ue}):g(G,"chat-agent").enqueueRequest({boardId:o,ref:Le,args:oe!=null?{...ue,__chatHandlerFlow:oe}:ue}),await Promise.resolve(G.boardAdapter.requestProcessAccumulated?.());}catch(Y){try{await U(i,!1);}catch{}a.warn(`[chat-handler] queue failed for card "${i}": ${Y instanceof Error?Y.message:String(Y)}`);}}async function fe(i,P,b){if(P.howToRun==="built-in"&&Yr(P)===yo){let O=u,D=b.__chatHandlerFlow,Y={...b};return delete Y.__chatHandlerFlow,O?O.run(D,Y,{boardId:o,cardId:String(Y.cardId||""),label:i.label,logger:a,serverUrl:y,executionExtra:C}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return d.invoke(P,b)}async function Ce(i,P=false){P||await ae();let b=typeof i.args?.cardId=="string"?i.args.cardId:"",O=b?E(b):A();if(!O)throw new Error(b?`Board context is unavailable for chat-agent request: ${b}`:"Board context is unavailable for chat-agent request");let D=await fe(O,i.ref,i.args);if(!D.dispatched){if(b)try{await U(b,!1);}catch{}throw new Error(D.error||`chat-agent dispatch failed for card "${b||"unknown"}"`)}}async function _e(i,P,b){if(P==="chat-send"){let D=b&&typeof b["turn-id"]=="string"?b["turn-id"]:b&&typeof b.turnId=="string"?b.turnId:b&&typeof b.turn=="string"?b.turn:"";if(b&&"files"in b&&b.files!==void 0&&b.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let Y=be(),G=ee(b?.text),oe=G?G.text:b?.text,Be=await mt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:i,role:"user",text:oe,turn_id:D,files:[]},Y);if(Be?.status!=="success")throw new Error(et(Be,`chat-send append failed for card ${i}`));let ue=Be?.data?.id;if(typeof ue!="string"||!ue)throw new Error(`chat-send did not return an append id for card ${i}`);let Le=await mt("setstate.chat-processing-started",{board_id:o,card_id:i},Y);if(Le?.status!=="success")throw new Error(et(Le,`chat-send processing update failed for card ${i}`));Re(i,ue,true,D,G?.assistant||"");return}await pt(i,D=>{let Y=new Date().toISOString(),G=D.card_data&&typeof D.card_data=="object"?D.card_data:{};if(D.card_data=G,P==="file-upload"){let oe=q().normalizeIncoming(b?.files,Y);return oe.length>0&&q().merge(G,oe),D}if(P==="action"){let oe=b&&typeof b.buttonId=="string"?b.buttonId:"";if(!oe)return D;G.lastAction={buttonId:oe,at:Y},G.lastActionText=`${oe} @ ${Y}`;}return D});}function je(i,P,b){let O=JSON.stringify(b),D=typeof Buffer<"u"?Buffer.byteLength(O):new TextEncoder().encode(O).length;i.writeHead(P,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":D}),i.end(O);}async function Ue(i,P,b){let O=await c(i);if(!O)throw Object.assign(new Error("Card not found"),{statusCode:404});let D=q().resolve(O.card_data,P,b);if(!D.ok&&D.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!D.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let Y=D.file,G=L(i),oe=I(i),Be=String(Y.stored_name||""),ue=`${G}/${Be}`,Le=oe.files?await oe.files.getBytes(ue):null;if(!Le)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:Y,bytes:Le}}async function Ve(i,P,b,O){let{fileRecord:D,bytes:Y}=await Ue(P,b,O),G=String(D.name||D.stored_name||"download.bin"),oe=String(D.mime_type||"application/octet-stream");i.writeHead(200,{"Content-Type":oe,"Content-Disposition":`attachment; filename="${G}"`,"Content-Length":Y.length}),i.end(Y);}function lt(i){let P=String(i||"").toLowerCase();return P.startsWith("text/")||P.includes("json")||P.includes("xml")||P.includes("javascript")||P.includes("typescript")||P.includes("yaml")||P.includes("csv")}function Xe(i,P,b){let O=i.split(/\r?\n/);return (P==="head"?O.slice(0,b):O.slice(-b)).join(`
7
- `)}async function Ge(i){let P=[];for await(let O of i)P.push(O);let b=typeof Buffer<"u"?Buffer.concat(P).toString("utf-8").trim():new TextDecoder().decode(Sr(P)).trim();return b?JSON.parse(b):{}}async function bt(i,P){let b=typeof P.ref=="string"?P.ref.trim():"";if(!b)return {status:"fail",error:"board-worker success callback requires body.ref"};let O=f[0];return O?O.boardOps.sourceDataFetched({params:{token:i,ref:b}}):{status:"fail",error:"no board context"}}async function St(i,P){let b=typeof P.reason=="string"&&P.reason.trim()?P.reason:"unknown",O=f[0];return O?O.boardOps.sourceDataFetchFailure({params:{token:i,reason:b}}):{status:"fail",error:"no board context"}}let $t=po({sseHub:_,queueSseHub:x,corsHeaders:r,json:je,buildPublishedRuntimePayload:()=>De(),onSseClientConnected:v,onChannelSubscribed:B,onChannelUnsubscribed:T,apiBasePath:t,readJsonBody:i=>Ge(i),initBoardAndSetup:()=>ae(),bootstrapBoard:()=>de(),boardContexts:f,publishPersistedStateSnapshot:i=>Q(i),upsertCardsFromSource:(i,P)=>Z(i,P)}).handleWatchersRoutes,Tt=fo({apiBasePath:t,json:je,readJsonBody:i=>Ge(i),bootstrapBoard:()=>de(),createMcpFacade:()=>Ae(),createMcpToolRegistry:i=>ge(i),resolveCardFileDownloadPayload:(i,P,b)=>Ue(i,P,b),isLikelyTextMimeType:i=>lt(i),sliceTextByLines:(i,P,b)=>Xe(i,P,b)}).handleAgentfaceApi,Qr=mo({apiBasePath:t,json:je,readJsonBody:i=>Ge(i),initBoardAndSetup:()=>ae(),createMcpWebhookToolRegistry:()=>$e()}).handleWebhooksApi,Vt=wr({apiBasePath:t,json:je,readJsonBody:i=>Ge(i),bootstrapBoard:()=>de(),createMcpControlplaneToolRegistry:()=>be(),retriggerCard:i=>at(i),applyCardAction:(i,P,b)=>_e(i,P,b),resolveChatHandlerTarget:i=>te(i),sendCardFileDownloadResponse:(i,P,b,O)=>Ve(i,P,b,O)}).handleRuntimeApi,wt=go({apiBasePath:t,emitNotifications:i=>H(i),readJsonBody:i=>Ge(i),json:(i,P,b)=>je(i,P,b)}).handleNotifyRoute;async function gt(i,P,b){return !!(await Tt(i,P,b)||await Qr(i,P,b)||await $t(i,P,b)||await wt(i,P,b)||await Vt(i,P,b))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:gt,emitNotification(i){if(i.kind==="notification-batch"){H(i.notifications);return}H([i]);},buildPublishedRuntimePayload:De,__drainProcessAccumulatedLane:ke,handleChatAgentRequest:Ce,clearChatRecords:nt,reportSourceFetched(i,P){return bt(i,{ref:P})},reportSourceFetchFailure(i,P){return St(i,{reason:P})},get cardStore(){return f[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function wa(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...ho,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,a=new Map,d="boards-config.json";function u(){let x=n.getText(d);if(!x)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(x)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function p(x){n.putText(d,JSON.stringify(x,null,2));}function y(x){let h=String(x||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return h.length>0&&h.length<=64?h:null}function C(x){if(a.has(x))return a.get(x);let f=u().boards.find(l=>l.id===x)||{},s=o(x,f);return a.set(x,s),s}function v(x,h,f){let s=JSON.stringify(f),l=typeof Buffer<"u"?Buffer.byteLength(s):new TextEncoder().encode(s).length;x.writeHead(h,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":l}),x.end(s);}async function S(x,h,f){let s=x.method||"GET",l=f.pathname;if(s==="GET"&&l===t)return v(h,200,{ok:true,boards:u().boards}),true;if(s==="POST"&&l===t){let m=[];for await(let J of x)m.push(J);let g=typeof Buffer<"u"?Buffer.concat(m).toString("utf-8").trim():new TextDecoder().decode(Sr(m)).trim(),k={};try{k=g?JSON.parse(g):{};}catch{k={};}let I=y(k.id);if(!I)return v(h,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let q=u();if(q.boards.some(J=>J.id===I))return v(h,409,{error:`Board "${I}" is already registered`}),true;let L=typeof k.label=="string"&&k.label.trim()?k.label.trim():I,V={id:I,label:L};for(let[J,X]of Object.entries(k))J==="id"||J==="label"||X!=null&&(V[J]=X);return q.boards.push(V),p(q),v(h,200,{ok:true,board:V}),true}return false}async function B(x,h,f){let l=f.pathname.match(new RegExp(`^${ot(t)}/([^/]+)(/|$)`));if(!l)return false;let m=y(decodeURIComponent(l[1]));return m?u().boards.some(I=>I.id===m)?!!await C(m).handleRuntimeApi(x,h,f):(v(h,404,{error:`Board "${m}" not registered. POST ${t} with {id} to register it first.`}),true):(v(h,400,{error:"Invalid board id"}),true)}async function T(x,h,f){return !!(await S(x,h,f)||await B(x,h,f))}function _(x){if(!u().boards.some(f=>f.id===x))throw Object.assign(new Error(`Board "${x}" not registered`),{statusCode:404});return {service:C(x)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:T,requireBoardService:_}}exports.createMultiBoardServerRuntime=wa;exports.createRoutesRuntimeApi=wr;exports.createSingleBoardServerRuntime=Sa;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
6
+ `);}catch{}},15e3);k.on("close",()=>{clearInterval(d),t.disconnect(b,S);});}return {handleChannelSubscription:f,handleSse:g}}function Co(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:a,boardContexts:c,publishPersistedStateSnapshot:u,upsertCardsFromSource:f,sseHub:g,queueSseHub:k}=e,{handleSse:S,handleChannelSubscription:b}=en(e),{handleSse:B}=en({...e,sseHub:k,buildPublishedRuntimePayload:async()=>null});async function I(P,A,y){let l=P.method||"GET",i=y,d=i.pathname;try{if(l==="GET"&&d===`${t}/sse`){let O=i.searchParams.has("one-shot");await o();let N=String(i.searchParams.get("clientId")||"").trim();if(!O&&!N)return r(A,400,{error:"clientId query param is required for SSE"}),!0;if(await S(P,A,N||void 0,{oneShot:O}),O)return !0;for(let U=0;U<c.length;U++)await u(c[U]),await f(c[U],U),await u(c[U]);return !0}if(l==="GET"&&d===`${t}/sse-q`){let O=String(i.searchParams.get("clientId")||"").trim();return O?(await B(P,A,O,{bootstrapPayload:!1}),!0):(r(A,400,{error:"clientId query param is required for SSE"}),!0)}let m=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(l==="POST"&&m){await a();let O=decodeURIComponent(m[1]),N=await n(P),U=typeof N?.clientId=="string"?N.clientId.trim():"";return U?await g.subscribeChat(U,O)?(r(A,200,{ok:!0,clientId:U,cardId:O,subscribed:!0}),!0):(r(A,404,{error:`SSE client not connected: ${U}`}),!0):(r(A,400,{error:"clientId is required"}),!0)}let p=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(l==="POST"&&p){await a();let O=decodeURIComponent(p[1]),N=await n(P),U=typeof N?.clientId=="string"?N.clientId.trim():"";return U?g.unsubscribeChat(U,O)?(r(A,200,{ok:!0,clientId:U,cardId:O,subscribed:!1}),!0):(r(A,404,{error:`SSE client not connected: ${U}`}),!0):(r(A,400,{error:"clientId is required"}),!0)}let R=d.match(new RegExp(`^${st(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&R){await a();let O=decodeURIComponent(R[1]),N=R[2]==="subscribe",U=await n(P),J=typeof U?.clientId=="string"?U.clientId.trim():"";return J?(b(A,J,O,{},N),!0):(r(A,400,{error:"clientId is required"}),!0)}let w=d.match(new RegExp(`^${st(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&w){await a();let O=decodeURIComponent(w[1]),N=decodeURIComponent(w[2]),U=w[3]==="subscribe",J=await n(P),ae=typeof J?.clientId=="string"?J.clientId.trim():"";return ae?(b(A,ae,N,{cardId:O},U),!0):(r(A,400,{error:"clientId is required"}),!0)}return !1}catch(m){let p=m?.statusCode||500;return r(A,p,{error:String(m?.message||m)}),true}}return {handleWatchersRoutes:I,handleSse:S,handleChannelSubscription:b}}var Ta=3e4;function Ia(e){let t=e.socket?.remoteAddress??"";return t==="127.0.0.1"||t==="::1"||t==="::ffff:127.0.0.1"}function bo(e){let{apiBasePath:t,emitNotifications:r,readJsonBody:n,json:o}=e,a=`${t}/notify-q`;async function c(u,f,g){if(g.pathname!==a)return false;if((u.method??"").toUpperCase()!=="POST")return o(f,405,{status:"error",error:"Method not allowed"}),true;if(!Ia(u))return o(f,403,{status:"error",error:"Forbidden"}),true;let k;try{k=await n(u);}catch{return o(f,400,{status:"error",error:"Invalid JSON body"}),true}if(!k||typeof k!="object"||!Array.isArray(k.notifications))return o(f,400,{status:"error",error:"body.notifications must be an array"}),true;let S=k.notifications,{accepted:b,rejected:B}=no(S,Date.now(),Ta);return b.length>0&&r(b),o(f,200,{status:"success",data:{accepted:b.length,rejected:B}}),true}return {handleNotifyRoute:c}}var wo={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},So="chat-handler-flow-queue",Ut="__probe__echo__probe__";function Pa(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...wo,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1,c=e.logger||{info:console.log,warn:console.warn,error:console.error},u=e.invocationAdapter,f=e.chatFlowRunner||null,g=e.notificationTransport||null,k=e.serverUrl||null,S=e.executionExtra||{},b=e.onSseClientConnected,B=e.onSseClientDisconnected,I=e.onChannelSubscribed,P=e.onChannelUnsubscribed,A=Qr({buildChatOneShotBatch:async(s,C)=>await be.buildSseOneShotBatch({params:{cardId:s},body:{receiving:C}}),onSseClientDisconnected:B}),y=Qr({buildChatOneShotBatch:async()=>({status:"success",data:{kind:"notification-batch",category:"batch",notifications:[]}})});function l(s){function C(ee){return {...ee,queueStorageForRef(ge,Oe){return zn(ee.queueStorageForRef(ge,Oe),{lane:Oe,emitNotification:X})}}}function _(ee){return {...ee,queueStorageForRef(ge,Oe){return Wn(ee.queueStorageForRef(ge,Oe),{lane:Oe,emitNotification:X})}}}function L(ee){return {async get(ge){return ee.get(ge)},async set(ge){return ee.set(ge)},async del(ge){return ee.del(ge)},async patch(ge){return ee.patch(ge)},async appendFiles(ge){return ee.appendFiles(ge)}}}function H(ee){return {async get(ge){return await ee.get(ge)},async set(ge){return await ee.set(ge)},async del(ge){return await ee.del(ge)},async patch(ge){return await ee.patch(ge)},async appendFiles(ge){return await ee.appendFiles(ge)}}}let ne=null;function X(ee){if(ee.kind==="notification-batch"){te(ee.notifications,ne??void 0);return}te([ee],ne??void 0);}let le=rt(s.boardAdapter)?_(s.boardAdapter):C(s.boardAdapter),Ue=s.nonCoreAdapter??(!rt(le)&&w(le)?le:null),Ae=rt(le)?Gn(s.baseRef,le,{boardRuntimeStoreRef:s.boardRuntimeStoreRef,scratchStoreRef:s.scratchStoreRef,taskExecutorRef:s.taskExecutorRef,chatHandlerFlow:s.chatHandlerFlow,emitNotification:X}):Mn(s.baseRef,le,{boardRuntimeStoreRef:s.boardRuntimeStoreRef,scratchStoreRef:s.scratchStoreRef,taskExecutorRef:s.taskExecutorRef,chatHandlerFlow:s.chatHandlerFlow,emitNotification:X}),He=s.nonCore??(Ue?Dn(s.baseRef,Ue,{boardRuntimeStoreRef:s.boardRuntimeStoreRef,taskExecutorRef:s.taskExecutorRef}):null),Ar=le.chatStorageForRef(s.chatStoreRef),xr,Ao=rt(le)?(()=>{let ee=kr(Rr(hr(le.kvStorageForRef(s.cardStoreRef)),le.hashFn),c.warn),ge=pr(ee,{emitNotification:X}),Oe=H(ge);return xr={get(we){return Oe.get(we)},set(we){return Oe.set(we)}},Oe})():(()=>{let ee=le.kvStorageForRef(s.cardStoreRef),Oe=fr(Mt({readIndex:()=>ee.read("_index"),writeIndex:we=>ee.write("_index",we),readCard:we=>ee.read(we),writeCard:(we,Ir)=>(ee.write(we,Ir),we),removeCard:we=>{ee.delete(we);},cardExists:we=>ee.read(we)!==null,defaultCardKey:we=>we},c.warn),{emitNotification:X});return xr=Oe,L(Oe)})(),Tr;if(rt(le)){let ee=le.blobStorageForRef(s.artifactsStoreRef);Tr={async putBytes(ge,Oe){if(ee.writeBytes){await ee.writeBytes(ge,Oe);return}let we=JSON.stringify({__kind:"bytes-array",data:[...Oe]});await ee.write(ge,we);},async getBytes(ge){if(ee.readBytes){let we=await ee.readBytes(ge);if(we!==null)return we}let Oe=await ee.read(ge);if(Oe===null)return null;try{let we=JSON.parse(Oe);if(we&&we.__kind==="bytes-array"&&Array.isArray(we.data))return new Uint8Array(we.data)}catch{}return new TextEncoder().encode(Oe)},async listKeys(ge){return await ee.listKeys(ge)}};}else {let ee=le.blobStorageForRef(s.artifactsStoreRef),ge=Zn(ee);Tr={putBytes(Oe,we,Ir){ge.putBytes(Oe,we,Ir);},getBytes(Oe){return ge.getBytes(Oe)},listKeys(Oe){return ge.list(Oe).map(we=>we.key)}};}let xo={async init(ee){return 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 ne={label:s.label,board:Ae,nonCore:He,publicCardStore:xr,boardOps:xo,cardStoreOps:Ao,get filesArtifacts(){return Tr},get chatStorage(){return Ar},boardAdapter:le,boardRuntimeStoreRef:s.boardRuntimeStoreRef,cardStoreRef:s.cardStoreRef,outputsStoreRef:s.outputsStoreRef,artifactsStoreRef:s.artifactsStoreRef,fetchedSourcesStoreRef:s.fetchedSourcesStoreRef,queueStoreRef:s.queueStoreRef,chatStoreRef:s.chatStoreRef,scratchStoreRef:s.scratchStoreRef,notifyRef:s.notifyRef,taskExecutorRef:s.taskExecutorRef,chatHandlerRef:s.chatHandlerRef,chatHandlerFlow:s.chatHandlerFlow,inferenceAdapterRef:s.inferenceAdapterRef,notification:ao(),notificationTeardown:null,initialized:false,cardsBootstrapped:false},ne}let i=e.boards.map(l),d=new Map;function m(s){return d.get(s)??0}function p(s){return s.queueStoreRef}function R(s,C){if(rt(s.boardAdapter)){let L=s.boardAdapter.queueStorageForRef(p(s),C);return Vr(L)}let _=s.boardAdapter.queueStorageForRef(p(s),C);return Hr(_)}function w(s){let C=s;return typeof C.invokeExecutor=="function"&&typeof C.validateSchema=="function"}function O(s){let C=i[m(s)];return {files:C?C.filesArtifacts:null}}function N(){return eo()}function U(s){return String(s||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}function J(s){return "cardId"in s&&typeof s.cardId=="string"?h(s.cardId)??void 0:i[0]??void 0}function ae(s){for(let C of s){let _=J(C);if(_)return _}return i[0]??void 0}function Q(s,C={}){if(!s||s.length===0)return;let _=De(s),L={kind:"notification-batch",notifications:_},H=C.ctx??ae(_);if(C.appendState!==false&&H&&so(H.notification,L),C.broadcastSse!==false){let ne=_.filter(le=>le.kind==="message_enqueued"),X=_.filter(le=>le.kind!=="message_enqueued");X.length>0&&A.broadcastNotificationBatch(X),ne.length>0&&y.broadcastNotificationBatch(ne);}if(!(C.mirrorExternal===false||!H?.boardAdapter.publishBoardChangeNotifications))try{let ne=_.filter(X=>X.category==="board-output"||X.category==="card-store");ne.length>0&&H.boardAdapter.publishBoardChangeNotifications(ne);}catch{}}function te(s,C){Q(s,{ctx:C,appendState:true,broadcastSse:true,mirrorExternal:true});}async function ue(s){if(!s||s.notificationTeardown||!g||!s.notifyRef)return;let C=await g.subscribe(s.notifyRef,_=>{let L=ro(_);Q(L,{ctx:s,appendState:true,broadcastSse:true,mirrorExternal:false});});s.notificationTeardown=C;}async function G(s){if(!s||s.initialized)return;let C={boardRuntimeStoreRef:s.boardRuntimeStoreRef,cardStoreRef:s.cardStoreRef,outputsStoreRef:s.outputsStoreRef,fetchedSourcesStoreRef:s.fetchedSourcesStoreRef,artifactsStoreRef:s.artifactsStoreRef,queueStoreRef:s.queueStoreRef,chatStoreRef:s.chatStoreRef,scratchStoreRef:s.scratchStoreRef},_={};s.taskExecutorRef&&(_["task-executor-ref"]=s.taskExecutorRef),s.chatHandlerFlow!==void 0&&(_["chat-handler-flow"]=s.chatHandlerFlow);let L=await s.boardOps.init({params:C,body:_});if(L.status!=="success")throw Object.assign(new Error(L.error||`init failed for ${s.label}`),{statusCode:500});if(await ue(s),!s.chatHandlerFlow&&s.chatHandlerRef&&u.describe)try{let H=await u.describe(s.chatHandlerRef);H&&H.kind!=="chat-handler"?c.warn(`[init] chat-handler describe returned kind="${H.kind}", expected "chat-handler" for ${s.label}`):H&&c.info(`[init] chat-handler validated: ${H.name} (protocol ${H.protocolVersion}) for ${s.label}`);}catch(H){c.warn(`[init] chat-handler describe failed for ${s.label}: ${H?.message||String(H)}`);}s.initialized=true;}async function Z(s){let C=[],_=await s.boardOps.status({});_.status==="success"&&_.data!=null&&Jr(_.data)&&C.push({kind:"status",status:_.data});let L=await s.boardOps.getAllOutputsDataObjects({});if(L.status==="success"&&L.data!=null)for(let[ne,X]of Object.entries(L.data))ne&&C.push({kind:"data_object",key:ne,payload:X});let H=await s.boardOps.getAllOutputsComputedValues({});if(H.status==="success"&&H.data!=null)for(let[ne,X]of Object.entries(H.data))ne&&X&&typeof X=="object"&&!Array.isArray(X)&&C.push({kind:"computed_values",cardId:ne,values:X});C.length>0&&Q(C,{ctx:s,appendState:true,broadcastSse:true,mirrorExternal:false});}async function re(s,C){if(!s||s.cardsBootstrapped)return;let _=await s.cardStoreOps.get({}),L=_.status==="success"&&Array.isArray(_.data?.cards)?_.data.cards:[];for(let H of L)typeof H.id=="string"&&(d.set(H.id,C),await s.boardOps.upsertCard({params:{cardId:H.id}}));s.cardsBootstrapped=true;}async function E(){for(let s of i)await G(s);}async function x(){await E();for(let s=0;s<i.length;s++)await Z(i[s]),await re(i[s],s),await Z(i[s]);}async function K(s=false){s||await E();for(let C of i){let _=await C.board.processAccumulatedEvents({});if(_.status!=="success")return _}return {status:"success"}}function h(s){return i[m(s)]??null}async function T(s){let C=h(s);if(!C)return null;let _=await C.cardStoreOps.get({params:{id:s}});if(_.status!=="success")return null;let L=Array.isArray(_.data?.cards)?_.data.cards:[];return L.length>0?L[0]:null}async function F(){let s=async _=>{if(!_)return [];let L=await _.cardStoreOps.get({});return L.status!=="success"||!Array.isArray(L.data?.cards)?[]:L.data.cards},C=[];for(let _ of i)C.push(...await s(_));return C}function D(){return i[0]??null}function M(s){return h(s)??D()}function $(s){let C=M(s);if(!C)throw Object.assign(new Error(`Board context is unavailable for chat operations: ${s}`),{statusCode:404});return C.chatStorage}async function se(s){return await $(s).isProcessing(s)}async function ce(s,C){let _=await be.setProcessing({params:{cardId:s},body:{active:C}});if(_.status!=="success")throw Object.assign(new Error(_.error||`Failed to set chat processing for card: ${s}`),{statusCode:500})}let be=to({append(s,C,_,L,H){return $(s).append(s,C,_,L,H)},readAll(s){return $(s).readAll(s)},readAfter(s,C){return $(s).readAfter(s,C)},clear(s){return $(s).clear(s)},setProcessing(s,C){return $(s).setProcessing(s,C)},isProcessing(s){return $(s).isProcessing(s)},getConfig(s){return $(s).getConfig(s)},setConfig(s,C){return $(s).setConfig(s,C)}},{emitNotification(s){if(s.kind==="notification-batch"){te(s.notifications);return}te([s]);}}),xe=ho({boardContexts:i,cardOwnerIndex:d,cardContextForCard:s=>h(s),readStatusSnapshot:()=>he(),readDataObjectsByToken:()=>Je(),readCardRuntimeArtifacts:()=>et(),readCardFromStore:s=>T(s),readCardDefinitions:()=>F(),processAccumulatedLaneInternal:s=>K(s),reportSourceFetched:(s,C)=>Bt(s,{ref:C}),reportSourceFetchFailure:(s,C)=>Vt(s,{reason:C}),uploadCardFile:(s,C,_,L,H)=>ie(s,C,_,L,H),chatStorePublic:be,serverUrl:k,apiBasePath:t}),Pe=xe.mcpCardStoreFacade,pe=xe.createMcpFacade,ke=io({boardId:o,bootstrapBoard:()=>x(),sseHub:A,onChannelSubscribed:I,onChannelUnsubscribed:P,getMcpFacade:()=>pe(),getMcpCardStoreFacade:()=>Pe()});function Ve(s){return lo(s)}function Se(){return fo(pe())}function Ke(){return mo({boardId:o,uploadCardFile:ie,getMcpFacade:()=>pe(),controlplane:ke})}let qe=uo({boardId:o,boardContexts:i,readChatRecords:(s,C)=>oe(s,C),getChatProcessing:s=>se(s),chatBootstrapTailTurns:a}),he=qe.readStatusSnapshot,et=qe.readCardRuntimeArtifacts,Je=qe.readDataObjectsByToken,tt=qe.buildPublishedRuntimePayload;async function yt(s,C,_){let L=_?.syncBoard!==false,H=_?.restartOnlyIfChanged===true,ne=h(s);if(!ne)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let X=await T(s);if(!X)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let le=H?JSON.stringify(X):null,Ue=C(X)||X;if(H&&JSON.stringify(Ue)===le)return;let Ae=await ne.cardStoreOps.set({body:Ue});if(Ae.status!=="success")throw Object.assign(new Error(Ae.error||`Failed to persist card: ${s}`),{statusCode:500});if(L){let He=await ne.boardOps.upsertCard({params:{cardId:s,restart:true}});if(He.status!=="success")throw Object.assign(new Error(He.error||`Failed to upsert card: ${s}`),{statusCode:500})}}async function j(s,C){await yt(s,C,{syncBoard:true});}async function v(s,C){await yt(s,C,{syncBoard:false});}async function W(s){let C=h(s);if(!C)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});if(!await T(s))throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let L=await C.boardOps.upsertCard({params:{cardId:s,restart:true}});if(L.status!=="success")throw Object.assign(new Error(L.error||`Failed to retrigger card: ${s}`),{statusCode:500})}async function q(s){let C=await be.clear({params:{cardId:s}});if(C.status!=="success")throw Object.assign(new Error(C.error||`Failed to clear chat records for card: ${s}`),{statusCode:500});try{await ce(s,!1);}catch{}}async function V(s,C,_,L,H=""){let ne=typeof _=="string"?_.trim():"",X=await be.append({params:{cardId:s},body:{role:C||"system",text:ne,files:L,turn:H}});if(X.status!=="success")throw Object.assign(new Error(X.error||`Failed to append chat record for card: ${s}`),{statusCode:500});return String(X.data?.id||"")}async function oe(s,C){let _=Number.isInteger(C?.tailTurns)&&C?.tailTurns>0?C?.tailTurns:void 0,L=await be.readAll({params:{cardId:s},..._===void 0?{}:{body:{tailTurns:_}}});if(L.status!=="success")throw Object.assign(new Error(L.error||`Failed to read chat records for card: ${s}`),{statusCode:500});return Array.isArray(L.data?.records)?L.data.records:[]}let ie=co({safeCardId:s=>U(s),artifactsStores:s=>O(s),cardFileMetadataStore:()=>N(),readCardFromStore:s=>T(s),updateCardLocalOnly:(s,C)=>v(s,C),writeChatRecord:(s,C,_,L,H)=>V(s,C,_,L,H)}).uploadCardFile;async function Re(s){let C=h(s);if(!C)return null;let _=await C.boardOps.getConfig({params:{key:"chat-handler-flow"}}),H=(_.status==="success"?_.data?.value:null)??C.chatHandlerFlow??null,ne=C.chatHandlerRef;return H==null&&(!ne||typeof ne!="object")?null:{ctx:C,handlerFlow:H,handlerRef:ne}}function Be(s){let C=typeof s=="string"?s.trim():"";if(C.length<Ut.length*2||!C.startsWith(Ut)||!C.endsWith(Ut))return null;let _=C.slice(Ut.length,C.length-Ut.length).trim(),L=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(_);return L?{assistant:L[1].trim().toLowerCase(),text:L[2].trim()}:{assistant:"echo",text:_}}async function je(s,C,_=false,L="",H=""){try{let ne=await Re(s);if(!ne){try{await ce(s,!1);}catch{}return}let{ctx:X,handlerFlow:le,handlerRef:Ue}=ne;if(!_)try{await ce(s,!0);}catch{}let Ae={boardId:o,cardId:String(s),lastChatEntryId:C,...L?{turnId:L}:{},...typeof H=="string"&&H.trim()?{probe:H.trim()}:{},...S,...k?{serverUrl:k}:{}},He=le!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:So}}:Ue;rt(X.boardAdapter)?await R(X,"chat-agent").enqueueRequest({boardId:o,ref:He,args:le!=null?{...Ae,__chatHandlerFlow:le}:Ae}):R(X,"chat-agent").enqueueRequest({boardId:o,ref:He,args:le!=null?{...Ae,__chatHandlerFlow:le}:Ae}),await Promise.resolve(X.boardAdapter.requestProcessAccumulated?.());}catch(ne){try{await ce(s,!1);}catch{}c.warn(`[chat-handler] queue failed for card "${s}": ${ne instanceof Error?ne.message:String(ne)}`);}}async function Le(s,C,_){if(C.howToRun==="built-in"&&on(C)===So){let L=f,H=_.__chatHandlerFlow,ne={..._};return delete ne.__chatHandlerFlow,L?L.run(H,ne,{boardId:o,cardId:String(ne.cardId||""),label:s.label,logger:c,serverUrl:k,executionExtra:S}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return u.invoke(C,_)}async function Me(s,C=false){C||await E();let _=typeof s.args?.cardId=="string"?s.args.cardId:"",L=_?h(_):D();if(!L)throw new Error(_?`Board context is unavailable for chat-agent request: ${_}`:"Board context is unavailable for chat-agent request");let H=await Le(L,s.ref,s.args);if(!H.dispatched){if(_)try{await ce(_,!1);}catch{}throw new Error(H.error||`chat-agent dispatch failed for card "${_||"unknown"}"`)}}async function Ye(s,C,_){if(C==="chat-send"){let H=_&&typeof _["turn-id"]=="string"?_["turn-id"]:_&&typeof _.turnId=="string"?_.turnId:_&&typeof _.turn=="string"?_.turn:"";if(_&&"files"in _&&_.files!==void 0&&_.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let ne=Ke(),X=Be(_?.text),le=X?X.text:_?.text,Ue=await gt("manage.add-chat-entry-and-any-attachments",{board_id:o,card_id:s,role:"user",text:le,turn_id:H,files:[]},ne);if(Ue?.status!=="success")throw new Error(nt(Ue,`chat-send append failed for card ${s}`));let Ae=Ue?.data?.id;if(typeof Ae!="string"||!Ae)throw new Error(`chat-send did not return an append id for card ${s}`);let He=await gt("setstate.chat-processing-started",{board_id:o,card_id:s},ne);if(He?.status!=="success")throw new Error(nt(He,`chat-send processing update failed for card ${s}`));je(s,Ae,true,H,X?.assistant||"");return}await j(s,H=>{let ne=new Date().toISOString(),X=H.card_data&&typeof H.card_data=="object"?H.card_data:{};if(H.card_data=X,C==="file-upload"){let le=N().normalizeIncoming(_?.files,ne);return le.length>0&&N().merge(X,le),H}if(C==="action"){let le=_&&typeof _.buttonId=="string"?_.buttonId:"";if(!le)return H;X.lastAction={buttonId:le,at:ne},X.lastActionText=`${le} @ ${ne}`;}return H});}function Ge(s,C,_){let L=JSON.stringify(_),H=typeof Buffer<"u"?Buffer.byteLength(L):new TextEncoder().encode(L).length;s.writeHead(C,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":H}),s.end(L);}async function Xe(s,C,_){let L=await T(s);if(!L)throw Object.assign(new Error("Card not found"),{statusCode:404});let H=N().resolve(L.card_data,C,_);if(!H.ok&&H.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!H.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let ne=H.file,X=U(s),le=O(s),Ue=String(ne.stored_name||""),Ae=`${X}/${Ue}`,He=le.files?await le.files.getBytes(Ae):null;if(!He)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:ne,bytes:He}}async function ft(s,C,_,L){let{fileRecord:H,bytes:ne}=await Xe(C,_,L),X=String(H.name||H.stored_name||"download.bin"),le=String(H.mime_type||"application/octet-stream");s.writeHead(200,{"Content-Type":le,"Content-Disposition":`attachment; filename="${X}"`,"Content-Length":ne.length}),s.end(ne);}function _t(s){let C=String(s||"").toLowerCase();return C.startsWith("text/")||C.includes("json")||C.includes("xml")||C.includes("javascript")||C.includes("typescript")||C.includes("yaml")||C.includes("csv")}function Et(s,C,_){let L=s.split(/\r?\n/);return (C==="head"?L.slice(0,_):L.slice(-_)).join(`
7
+ `)}async function mt(s){let C=[];for await(let L of s)C.push(L);let _=typeof Buffer<"u"?Buffer.concat(C).toString("utf-8").trim():new TextDecoder().decode(Pr(C)).trim();return _?JSON.parse(_):{}}async function Bt(s,C){let _=typeof C.ref=="string"?C.ref.trim():"";if(!_)return {status:"fail",error:"board-worker success callback requires body.ref"};let L=i[0];return L?L.boardOps.sourceDataFetched({params:{token:s,ref:_}}):{status:"fail",error:"no board context"}}async function Vt(s,C){let _=typeof C.reason=="string"&&C.reason.trim()?C.reason:"unknown",L=i[0];return L?L.boardOps.sourceDataFetchFailure({params:{token:s,reason:_}}):{status:"fail",error:"no board context"}}let tn=Co({sseHub:A,queueSseHub:y,corsHeaders:r,json:Ge,buildPublishedRuntimePayload:()=>tt(),onSseClientConnected:b,onChannelSubscribed:I,onChannelUnsubscribed:P,apiBasePath:t,readJsonBody:s=>mt(s),initBoardAndSetup:()=>E(),bootstrapBoard:()=>x(),boardContexts:i,publishPersistedStateSnapshot:s=>Z(s),upsertCardsFromSource:(s,C)=>re(s,C)}).handleWatchersRoutes,vt=Ro({apiBasePath:t,json:Ge,readJsonBody:s=>mt(s),bootstrapBoard:()=>x(),createMcpFacade:()=>pe(),createMcpToolRegistry:s=>Ve(s),resolveCardFileDownloadPayload:(s,C,_)=>Xe(s,C,_),isLikelyTextMimeType:s=>_t(s),sliceTextByLines:(s,C,_)=>Et(s,C,_)}).handleAgentfaceApi,vr=ko({apiBasePath:t,json:Ge,readJsonBody:s=>mt(s),initBoardAndSetup:()=>E(),createMcpWebhookToolRegistry:()=>Se()}).handleWebhooksApi,ht=_r({apiBasePath:t,json:Ge,readJsonBody:s=>mt(s),bootstrapBoard:()=>x(),createMcpControlplaneToolRegistry:()=>Ke(),retriggerCard:s=>W(s),applyCardAction:(s,C,_)=>Ye(s,C,_),resolveChatHandlerTarget:s=>Re(s),sendCardFileDownloadResponse:(s,C,_,L)=>ft(s,C,_,L)}).handleRuntimeApi,Ht=bo({apiBasePath:t,emitNotifications:s=>te(s),readJsonBody:s=>mt(s),json:(s,C,_)=>Ge(s,C,_)}).handleNotifyRoute;async function Y(s,C,_){return !!(await vt(s,C,_)||await vr(s,C,_)||await tn(s,C,_)||await Ht(s,C,_)||await ht(s,C,_))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:Y,emitNotification(s){if(s.kind==="notification-batch"){te(s.notifications);return}te([s]);},buildPublishedRuntimePayload:tt,__drainProcessAccumulatedLane:K,handleChatAgentRequest:Me,clearChatRecords:q,reportSourceFetched(s,C){return Bt(s,{ref:C})},reportSourceFetchFailure(s,C){return Vt(s,{reason:C})},get cardStore(){return i[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function _a(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...wo,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,a=new Map,c="boards-config.json";function u(){let A=n.getText(c);if(!A)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(A)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function f(A){n.putText(c,JSON.stringify(A,null,2));}function g(A){let y=String(A||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return y.length>0&&y.length<=64?y:null}function k(A){if(a.has(A))return a.get(A);let l=u().boards.find(d=>d.id===A)||{},i=o(A,l);return a.set(A,i),i}function S(A,y,l){let i=JSON.stringify(l),d=typeof Buffer<"u"?Buffer.byteLength(i):new TextEncoder().encode(i).length;A.writeHead(y,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":d}),A.end(i);}async function b(A,y,l){let i=A.method||"GET",d=l.pathname;if(i==="GET"&&d===t)return S(y,200,{ok:true,boards:u().boards}),true;if(i==="POST"&&d===t){let m=[];for await(let J of A)m.push(J);let p=typeof Buffer<"u"?Buffer.concat(m).toString("utf-8").trim():new TextDecoder().decode(Pr(m)).trim(),R={};try{R=p?JSON.parse(p):{};}catch{R={};}let w=g(R.id);if(!w)return S(y,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let O=u();if(O.boards.some(J=>J.id===w))return S(y,409,{error:`Board "${w}" is already registered`}),true;let N=typeof R.label=="string"&&R.label.trim()?R.label.trim():w,U={id:w,label:N};for(let[J,ae]of Object.entries(R))J==="id"||J==="label"||ae!=null&&(U[J]=ae);return O.boards.push(U),f(O),S(y,200,{ok:true,board:U}),true}return false}async function B(A,y,l){let d=l.pathname.match(new RegExp(`^${st(t)}/([^/]+)(/|$)`));if(!d)return false;let m=g(decodeURIComponent(d[1]));return m?u().boards.some(w=>w.id===m)?!!await k(m).handleRuntimeApi(A,y,l):(S(y,404,{error:`Board "${m}" not registered. POST ${t} with {id} to register it first.`}),true):(S(y,400,{error:"Invalid board id"}),true)}async function I(A,y,l){return !!(await b(A,y,l)||await B(A,y,l))}function P(A){if(!u().boards.some(l=>l.id===A))throw Object.assign(new Error(`Board "${A}" not registered`),{statusCode:404});return {service:k(A)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:I,requireBoardService:P}}exports.createMultiBoardServerRuntime=_a;exports.createRoutesRuntimeApi=_r;exports.createSingleBoardServerRuntime=Pa;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
8
8
  //# sourceMappingURL=server-runtime-controlface.js.map