yaml-flow 8.11.4 → 8.11.6

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 (82) 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 +7 -7
  4. package/browser/server-runtime-controlface.js +4 -4
  5. package/lib/board-live-cards-node.cjs +2 -2
  6. package/lib/board-live-cards-node.js +2 -2
  7. package/lib/board-live-cards-public.cjs +1 -1
  8. package/lib/board-live-cards-public.js +1 -1
  9. package/lib/board-live-cards-server-runtime.cjs +1 -1
  10. package/lib/board-live-cards-server-runtime.js +1 -1
  11. package/lib/board-livegraph-runtime/index.cjs +1 -1
  12. package/lib/board-livegraph-runtime/index.js +1 -1
  13. package/lib/board-sse-state.cjs +2 -0
  14. package/lib/board-sse-state.d.cts +19 -0
  15. package/lib/board-sse-state.d.ts +19 -0
  16. package/lib/board-sse-state.js +2 -0
  17. package/lib/board-state-reducer.cjs +1 -1
  18. package/lib/board-state-reducer.js +1 -1
  19. package/lib/card-store-public.cjs +1 -1
  20. package/lib/card-store-public.js +1 -1
  21. package/lib/{chunk-MEL5LKF7.js → chunk-23PEDGFN.js} +2 -2
  22. package/lib/{chunk-O65MSWUE.cjs → chunk-52XPRCZC.cjs} +2 -2
  23. package/lib/chunk-5RUSICUC.cjs +3 -0
  24. package/lib/chunk-7SBE7A6E.cjs +2 -0
  25. package/lib/chunk-7Y47QXMX.cjs +2 -0
  26. package/lib/chunk-AW3COGCI.cjs +3 -0
  27. package/lib/chunk-CAQHA4GK.js +2 -0
  28. package/lib/chunk-CJQEM63S.cjs +2 -0
  29. package/lib/chunk-CODPG5MY.js +3 -0
  30. package/lib/chunk-EHREWADE.js +2 -0
  31. package/lib/chunk-EOVTMJYZ.js +2 -0
  32. package/lib/chunk-FULAMLUU.js +3 -0
  33. package/lib/chunk-HOSD6UHA.js +3 -0
  34. package/lib/{chunk-37JSBRZO.js → chunk-I3ZOFU3F.js} +2 -2
  35. package/lib/chunk-IXZV5BS5.js +2 -0
  36. package/lib/chunk-J7KE7SPA.cjs +2 -0
  37. package/lib/{chunk-LRO5AL75.cjs → chunk-NOAERAOE.cjs} +2 -2
  38. package/lib/chunk-Q444D72R.js +2 -0
  39. package/lib/chunk-QKWQ4HRE.js +3 -0
  40. package/lib/chunk-R7SQQSDX.js +2 -0
  41. package/lib/chunk-SIPLKLWU.cjs +2 -0
  42. package/lib/{chunk-HLJH7LGW.js → chunk-SK2R5ILQ.js} +3 -3
  43. package/lib/chunk-VI36DRWG.cjs +2 -0
  44. package/lib/chunk-WE7JOO4T.cjs +3 -0
  45. package/lib/chunk-WGYS2L4V.js +2 -0
  46. package/lib/chunk-X5MLNGGM.cjs +16 -0
  47. package/lib/{chunk-Z26U6RSG.cjs → chunk-YAPTL2MP.cjs} +2 -2
  48. package/lib/{chunk-MQAVZUXB.cjs → chunk-ZWXZ5DBX.cjs} +3 -3
  49. package/lib/cloud-storage.cjs +1 -1
  50. package/lib/cloud-storage.js +1 -1
  51. package/lib/continuous-event-graph/index.cjs +1 -1
  52. package/lib/continuous-event-graph/index.js +1 -1
  53. package/lib/event-graph/index.cjs +1 -1
  54. package/lib/event-graph/index.js +1 -1
  55. package/lib/firestore-storage/index.cjs +1 -1
  56. package/lib/firestore-storage/index.js +1 -1
  57. package/lib/index.cjs +2 -2
  58. package/lib/index.js +1 -1
  59. package/lib/localstorage-storage/index.cjs +1 -1
  60. package/lib/localstorage-storage/index.js +1 -1
  61. package/lib/notification-consumer/index.cjs +1 -1
  62. package/lib/notification-consumer/index.js +1 -1
  63. package/lib/server-runtime/index.cjs +1 -1
  64. package/lib/server-runtime/index.js +1 -1
  65. package/lib/server-runtime-controlface/index.cjs +1 -1
  66. package/lib/server-runtime-controlface/index.js +1 -1
  67. package/lib/server-runtime-core/index.cjs +1 -1
  68. package/lib/server-runtime-core/index.js +1 -1
  69. package/package.json +6 -1
  70. package/lib/chunk-4BEQXKRF.js +0 -2
  71. package/lib/chunk-5EA2ESS4.cjs +0 -16
  72. package/lib/chunk-5VTIOM2U.js +0 -3
  73. package/lib/chunk-5XLFPPTY.cjs +0 -2
  74. package/lib/chunk-7QNEV5S3.js +0 -2
  75. package/lib/chunk-BAG7MHZP.cjs +0 -3
  76. package/lib/chunk-EZOXABJ2.js +0 -3
  77. package/lib/chunk-G4XXRHL2.cjs +0 -3
  78. package/lib/chunk-HVLWVMG6.cjs +0 -3
  79. package/lib/chunk-LODXIALE.cjs +0 -2
  80. package/lib/chunk-VGT3TRQG.js +0 -3
  81. package/lib/chunk-WDPOGXTY.js +0 -2
  82. package/lib/chunk-WHKT5HN4.js +0 -3
@@ -1,8 +1,8 @@
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}
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 Ie(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(k=>typeof k=="string"&&k.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:k}=e;async function R(b,S,_){let T=b.method||"GET",I=_,A=I.pathname;try{if(T==="POST"&&A===`${t}/mcp-actions`){await o();let d=Date.now(),m=new Date(d).toISOString(),p=await n(b),h=typeof p.tool=="string"?p.tool.trim():"",w=p.args&&typeof p.args=="object"&&!Array.isArray(p.args)?p.args:{};if(!h)return r(S,400,{error:"tool is required"}),!0;let O=me(w,"card_id");if(!O)return r(S,400,{error:"MCP action requires card_id"}),!0;if(h==="retrigger-card"||h==="retrigger"){await c(O);let J=Date.now();return r(S,200,{status:"success",data:{ok:!0,cardId:O,actionType:h,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(J).toISOString(),responseSentAtMs:J,responseStatus:200}}),!0}let N=ct(w,"payload");if(h==="chat-send"&&!await f(O)){let J=Date.now();return r(S,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(h==="chat-send"){let J=typeof N["turn-id"]=="string"?N["turn-id"]:typeof N.turnId=="string"?N.turnId:typeof N.turn=="string"?N.turn:"";if(!J||!String(J).trim()){let ae=Date.now();return r(S,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,h,N);let U=Date.now();return r(S,200,{status:"success",data:{ok:!0,cardId:O,actionType:h,requestReceivedAt:m,requestReceivedAtMs:d,responseSentAt:new Date(U).toISOString(),responseSentAtMs:U,responseStatus:200}}),!0}if(T==="POST"&&A===`${t}/mcp-controlplane`){await o();let d=await n(b),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(S,400,{error:"tool is required"}),!0;try{let h=await gt(m,p,a());if(h&&typeof h=="object"&&!Array.isArray(h)){let w=h;if(w.status==="fail")return r(S,400,{error:nt(h,"Request failed")}),!0;if(w.status==="error")return r(S,500,{error:nt(h,"Internal error")}),!0}r(S,200,h);}catch(h){let w=typeof h?.statusCode=="number"?Number(h.statusCode):500,O=h instanceof Error?h.message:String(h);r(S,w,{error:O});}return !0}let g=A.match(new RegExp(`^${st(t)}/cards/([^/]+)/retrigger$`));if(T==="POST"&&g){await o();let d=decodeURIComponent(g[1]);return await c(d),r(S,200,{ok:!0}),!0}let l=A.match(new RegExp(`^${st(t)}/cards/([^/]+)/actions$`));if(T==="POST"&&l){await o();let d=decodeURIComponent(l[1]),m=Date.now(),p=new Date(m).toISOString(),h=await n(b),w=h?.actionType;if(w==="chat-send"&&!await f(d)){let N=Date.now();return r(S,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=h?.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(S,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,h?.payload);let O=Date.now();return r(S,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(T==="GET"&&i){let d=decodeURIComponent(i[1]),m=parseInt(i[2],10),p=I.searchParams.get("sn");return await k(S,d,m,p),!0}return !1}catch(g){let l=g?.statusCode||500;return r(S,l,{error:String(g?.message||g)}),true}}return {handleRuntimeApi:R}}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[k,R]of Object.entries(r.tasks))if(Ze(R).includes(f)){let b=e.tasks[k];b?.lastDataHash&&(o[f]=b.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 k=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let S=u.requires??[];for(let _ of S)for(let[T,I]of Object.entries(t.tasks))if(Ze(I).includes(_)){let A=e.tasks[T];A?.lastDataHash&&(k[_]=A.lastDataHash);break}}let R={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:o,data:a,lastConsumedHashes:k,error:void 0},b=[...new Set([...e.availableOutputs,...f])];return {...e,tasks:{...e.tasks,[r]:R},availableOutputs:b,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 k={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:k},lastUpdated:new Date().toISOString()}}}let c={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},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=[],k=[],R=[],b=[];for(let[_,T]of Object.entries(n)){let I=r.tasks[_],A=un(T,t.settings),g=A!=="once";if(I?.status===Rt.RUNNING||Er(I))continue;let l=cn(T);if(l!==void 0&&I&&I.executionCount>=l||T.circuit_breaker&&I&&I.executionCount>=T.circuit_breaker.max_executions||!g&&I?.status===Rt.COMPLETED)continue;if(g&&I?.status===Rt.COMPLETED){let h=kt(T),w=false;switch(A){case "data-changed":{h.length>0&&h.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=I.lastConsumedHashes?.[N];return ae.lastDataHash==null?ae.executionCount>I.lastEpoch:ae.lastDataHash!==Q}return false})||(w=true);break}case "epoch-changed":{h.length>0&&h.some(N=>{for(let[U,J]of Object.entries(n))if(Ze(J).includes(N)){let ae=r.tasks[U];if(ae&&ae.executionCount>I.lastEpoch)return true}return false})||(w=true);break}case "time-based":{let O=T.refreshInterval??0;if(O<=0){w=true;break}let N=I.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(T);if(i.length===0){f.push(_);continue}let d=[],m=[],p=[];for(let h of i){if(u.has(h))continue;let w=a[h]||[];w.length===0?d.push(h):w.every(N=>Er(r.tasks[N]))?p.push({token:h,failedProducer:w[0]}):m.push(h);}d.length>0?R.push({taskName:_,missingTokens:d}):p.length>0?b.push({taskName:_,failedTokens:p.map(h=>h.token),failedProducers:[...new Set(p.map(h=>h.failedProducer))]}):m.length>0?k.push({taskName:_,waitingOn:m}):f.push(_);}let S={};if(f.length>1){let _=ln(f,n);for(let[T,I]of Object.entries(_))I.length>1&&(S[T]=I);}return {eligible:f,pending:k,unresolved:R,blocked:b,conflicts:S}}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,k=new Set,R=new Map(Object.entries(n)),b=new qt,S=false,_=false;function T(){if(!f){if(S){_=true;return}S=true;try{do _=!1,I();while(_)}finally{S=false;}}}function I(){let i=b.drain(),d=c.drain(),m=[...i,...d];if(m.length>0&&(u=hn(u,m),o)){for(let h of m)if(h.type==="task-removal")try{o(h.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 h of p.eligible)l(h);for(let h of m)if(h.type==="task-progress"){let{taskName:w,update:O}=h;if(!u.config.tasks[w])continue;let U=u.state.tasks[w];if(!U||U.status!=="running")continue;let J=kn(w),ae=g(w,J,O).catch(Q=>{f||(b.append({type:"task-failed",taskName:w,error:Q.message??String(Q),timestamp:new Date().toISOString()}),T());}).finally(()=>{k.delete(ae);});k.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 h={};for(let w of m){let O=p.get(w);O?h[w]=u.state.tasks[O]?.data:h[w]=void 0;}return h}async function g(i,d,m){let p=u.config.tasks[i],h=p.taskHandlers??[],w=A(i);for(let O of h){let N=R.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;b.append({type:"task-started",taskName:i,timestamp:new Date().toISOString()}),T();let p=kn(i),h=g(i,p).catch(w=>{f||(b.append({type:"task-failed",taskName:i,error:w.message??String(w),timestamp:new Date().toISOString()}),T());}).finally(()=>{k.delete(h);});k.add(h);}return {push(i){f||(i.type==="task-completed"&&i.data&&!i.dataHash&&(i={...i,dataHash:Br(i.data)}),c.append(i),T());},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);T();}},resolveCallback(i,d,m){if(f)return;let p=Ho(i);if(!p)return;let{taskName:h}=p;if(u.config.tasks[h]){if(m&&m.length>0)c.append({type:"task-failed",taskName:h,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:h,data:d,dataHash:w,timestamp:new Date().toISOString()});}T();}},addNode(i,d){f||(c.append({type:"task-upsert",taskName:i,taskConfig:d,timestamp:new Date().toISOString()}),T());},removeNode(i){f||(c.append({type:"task-removal",taskName:i,timestamp:new Date().toISOString()}),T());},addRequires(i,d){f||(c.append({type:"node-requires-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),T());},removeRequires(i,d){f||(c.append({type:"node-requires-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),T());},addProvides(i,d){f||(c.append({type:"node-provides-add",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),T());},removeProvides(i,d){f||(c.append({type:"node-provides-remove",nodeName:i,tokens:d,timestamp:new Date().toISOString()}),T());},registerHandler(i,d){R.set(i,d);},unregisterHandler(i){R.delete(i);},retrigger(i){f||u.config.tasks[i]&&(c.append({type:"task-restart",taskName:i,timestamp:new Date().toISOString()}),T());},retriggerAll(i){if(!f){for(let d of i)u.config.tasks[d]&&c.append({type:"task-restart",taskName:d,timestamp:new Date().toISOString()});T();}},snapshot(){return Ct(u)},getState(){return u},getSchedule(){return Ft(u)},async waitForHandlers(){k.size>0&&await Promise.allSettled([...k]);},async dispose(i){i?.wait&&k.size>0&&await Promise.allSettled([...k]),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 k of c){let R=o.read(k);tr(R)?f=(f??Promise.resolve()).then(async()=>{u[k]=await R;}):u[k]=R;}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 k=c.delete(f);tr(k)&&(u=(u??Promise.resolve()).then(()=>k).then(()=>{}));}for(let[f,k]of Object.entries(o)){let R=c.write(f,k);tr(R)&&(u=(u??Promise.resolve()).then(()=>R).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",ve="__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!==ve).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:ve,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},k=f;for(let R=0;R<u.length-1;R++){let b=u[R],S=k[b],_=S&&typeof S=="object"&&!Array.isArray(S)?{...S}:{};k[b]=_,k=_;}return k[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(([,k])=>k.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),k=e.writeCard(f,a);u[o]={key:f,checksum:k,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 k=e.readCard(f.key);if(!k||typeof k!="object"||Array.isArray(k))throw new Error(`card "${o}" is not patchable`);let R=n(k,a,c),b=e.writeCard(f.key,R);u[o]={key:f.key,checksum:b,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!==ve);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 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 f=new Map;for(let[T,I]of Object.entries(n))for(let A of I.requires??[]){let g=f.get(A)??[];g.push(T),f.set(A,g);}let k=o.sort().map(T=>{let I=r[T],A=n[T]??{requires:[],provides:[]};I.status==="completed"?c.completed+=1:I.status==="failed"?c.failed+=1:I.status==="in-progress"&&(c.in_progress+=1);let g=A.requires??[],l=A.provides??[],i=Object.keys(I.data??{}).sort(),d=g.filter(N=>t.state.availableOutputs.includes(N)),m=g.filter(N=>!t.state.availableOutputs.includes(N)),p=u.get(T)??m,h=new Set;for(let N of l)for(let U of f.get(N)??[])U!==T&&h.add(U);let w=I.failedAt,O=I.error?{message:I.error,code:"TASK_FAILED",at:w,source:"task-runtime"}:void 0;return {name:T,status:I.status,error:O,requires:g,requires_satisfied:d,requires_missing:m,provides_declared:l,provides_runtime:i,blocked_by:p,unblocks:Array.from(h).sort(),runtime:{attempt_count:I.executionCount??0,restart_count:I.retryCount??0,in_progress_since:I.status==="in-progress"?I.startedAt??null:null,last_transition_at:I.lastUpdated??null,last_completed_at:I.completedAt??null,last_restarted_at:I.startedAt??null,status_age_ms:I.lastUpdated?0:null}}});c.pending=a.pending.length,c.blocked=a.blocked.length,c.unresolved=a.unresolved.length;let R=k.map(T=>({name:T.name,fanOut:T.unblocks.length})).sort((T,I)=>I.fanOut-T.fanOut||T.name.localeCompare(I.name)),b=R.length>0?R[0]:{name:null,fanOut:0},S=new Set;for(let T of Object.values(n))for(let I of T.requires??[])S.add(I);let _=0;for(let[T,I]of Object.entries(n)){let A=(I.requires??[]).length===0,l=(I.provides??[]).some(i=>(f.get(i)??[]).some(d=>d!==T));A&&!l&&(_+=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:_,topology:{edge_count:Array.from(S).length,max_fan_out_card:b.name,max_fan_out:b.fanOut}},cards:k}}function aa(){return new Date().toISOString()}function qn(e,t,r,n,o,a,c){return async u=>{let f=[],k=r.cardStore.readCard(u.nodeId);if(!k)return "task-initiate-failure";let R=k.id;if(R===ve){let G=r.activeTaskConfigs?.(),Z={[ot]:G?Dr(Object.keys(G).filter(re=>re!==ve).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 b=k.card_data??{},S=k.source_defs??[],_=S,T=r.cardRuntimeStore.readRuntime(R),I=false,A=()=>{I&&(r.cardRuntimeStore.writeRuntime(R,T),I=false);},g=G=>Nt(T._sources[G]),l=(G,Z)=>{T._sources[G]=Nt(Z),I=true;},i=u.taskState?.executionCount??0;if(T._lastExecutionCount!==i&&(T._sources={},T._lastExecutionCount=i,I=true),u.update){let G=u.update,Z=G.outputFile;if(Z){let re=g(Z);if(G.failure){let B=G.rqt??re.lastRequestedToken??re.queueRequestedToken;B&&l(Z,Lt(re,B));}else {let B=G.rqt;if(!re.lastCompletedToken||B>re.lastCompletedToken){let x=typeof G.deliveryToken=="string"?G.deliveryToken:void 0,K=false;x&&(K=r.fetchedSourcesStore.commitSourceData(R,Z,x)),K?l(Z,$r(re,B)):l(Z,Lt(re,B));}}A();}}let m={};for(let G of S)if(G.outputFile){let Z=r.fetchedSourcesStore.readSourceData(R,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 h={id:R,card_data:{...b},requires:p,source_defs:S,compute:k.compute};h._sourcesData=m,k.compute&&We.runSync(h,{sourcesData:m}),(a??r.outputStore.writeComputedValues.bind(r.outputStore))(R,h.computed_values??{});let w={...k},O=We.enrichSourcesSync(Array.isArray(k.source_defs)?k.source_defs:void 0,{card_data:k.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=_.filter(G=>{let Z=G.outputFile;if(typeof Z!="string"||!Z)return true;let re=g(Z);J&&(re={...re,queueRequestedToken:J},l(Z,re));let B=re.queueRequestedToken??re.lastRequestedToken??U,x=jt(re,B);return x==="in-flight"?false:x==="dispatch"});if(A(),ae.length>0){let G=false,Z=U;for(let re of ae){let B=re.outputFile;if(typeof B!="string"||!B)continue;let x=g(B),K=x.queueRequestedToken??U;l(B,{...x,lastRequestedToken:K}),Z=K,G=true;}return G&&A(),G&&(f.push({taskKind:"source-fetch",payload:{boardRef:Ie(e),enrichedCard:w,callbackToken:u.callbackToken,rqt:Z}}),r.executionRequestStore.appendEntries(t,f)),"task-initiated"}if(_.some(G=>{let Z=G.outputFile;if(typeof Z!="string"||!Z)return false;let re=g(Z),B=re.queueRequestedToken??re.lastRequestedToken??U;return jt(re,B)==="in-flight"}))return "task-initiated";let te=k.provides??[],ue={};for(let{bindTo:G,ref:Z}of te)ue[G]=We.resolve(h,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(R){return {status:"success",data:R}}function n(R){return {status:"fail",error:R}}function o(R){return {status:"error",error:R instanceof Error?R.message:String(R)}}function a(R){return R===ve}async function c(R){let b=t.emitNotification;if(!b||R.length===0)return;let S=De(R.filter(_=>_.kind!=="card_refreshed"?true:!a(_.cardId)));if(S.length!==0){if(S.length===1){await b(S[0]);return}await b($e({kind:"notification-batch",notifications:S}));}}function u(R){let b=R.params?.id;if(b){if(a(b))throw new Error(`card "${b}" not found`);let S=e.readCard(b);if(!S)throw new Error(`card "${b}" not found`);return [S]}return e.readAllCards().filter(S=>!a(S.id))}function f(R){let b=R.filter(S=>!a(S.id));return $e({kind:"notification-batch",notifications:De(b.map(S=>({kind:"card_refreshed",cardId:S.id,card:S})))})}function k(R){if(Array.isArray(R))return R;if(R&&typeof R=="object"){let b=R;return Array.isArray(b.files)?b.files:[R]}return null}return {get(R){try{return r({cards:u(R)})}catch(b){return o(b)}},buildNotificationBatch(R){try{return r(f(u(R)))}catch(b){return o(b)}},set(R){try{let b=R.body;if(b==null)return n("set requires a body (card object or array of cards)");let S=Array.isArray(b)?b:[b];for(let _ of S){if(typeof _.id!="string")return n("each card must have a string `id` field");e.writeCard(_.id,_);}return c(S.map(_=>({kind:"card_refreshed",cardId:_.id,card:_}))),r({count:S.length})}catch(b){return o(b)}},del(R){try{let b=R.body?.ids??[],S=R.params?.id,_=S?[...b,S]:b;if(_.length===0)return n("del requires body.ids (string[]) or params.id");for(let T of _)e.removeCard(T);return c(_.map(T=>({kind:"card_removed",cardId:T}))),r({count:_.length})}catch(b){return o(b)}},patch(R){try{let b=R.params?.id,S=R.params?.path;if(!b)return n("patch requires params.id");if(!S)return n("patch requires params.path");let _=R.body,T=_&&Object.prototype.hasOwnProperty.call(_,"value")?_.value:R.body;e.patchCard(b,S,T);let I=e.readCard(b);return I?(c([{kind:"card_refreshed",cardId:b,card:I}]),r({count:1})):n(`card "${b}" not found`)}catch(b){return o(b)}},appendFiles(R){try{let b=R.params?.id;if(!b)return n("appendFiles requires params.id");let S=e.readCard(b);if(!S)return n(`card "${b}" not found`);let _=k(R.body);if(!_||_.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let T=S.card_data&&typeof S.card_data=="object"&&!Array.isArray(S.card_data)?S.card_data:{},I=Array.isArray(T.files)?T.files:[],A=[...I,..._],g=_.map((i,d)=>({idx:I.length+d,entry:i})),l=this.patch({params:{id:b,path:"card_data.files"},body:{value:A}});return l.status!=="success"?l:r({files_added:g})}catch(b){return o(b)}}}}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=Ie(e),c=r.boardRuntimeStoreRef,u=r.scratchStoreRef,f=r.taskExecutorRef,k=r.chatHandlerFlow,R=r.emitNotification??(j=>{if(!t.publishBoardChangeNotifications)return;let v=j.kind==="notification-batch"?j.notifications:[j];return t.publishBoardChangeNotifications(v)});function b(){if(!c)throw new Error(`Board at ${e.value} has no board runtime store configured. Pass boardRuntimeStoreRef at construction or init.`);return c}function S(j){if(j.length!==0)try{let v=De(j),W=$e({kind:"notification-batch",notifications:v}),F=R(W);F&&typeof F.catch=="function"&&F.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 _(){let j=I().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,F){return v.write(W,F),t.hashFn(F)},removeCard(W){v.delete(W);},cardExists(W){return v.read(W)!==null},defaultCardKey(W){return W}}}let T={readValues(j){let v=t.kvStorageForRef(b()),W=v.listKeys().sort();if(W.length===0)return {version:null,values:{}};let F={};for(let V of W)F[V]=v.read(V);return {version:t.hashFn(F),values:F}},writeValues(j,v,W){let F=t.kvStorageForRef(b());for(let V of W)F.delete(V);for(let[V,oe]of Object.entries(v))F.write(V,oe);return t.hashFn(v)}},I=()=>ur(t.kvStorageForRef(b())),A=()=>On(T),g=()=>_n(t.journalAdapterForRef(b())),l=()=>Mt(_(),o),i=()=>{let j=I().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??I().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 h(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){g().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(),F=bt(W.graph),{events:V,newCursor:oe}=g().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,E){ie.ingestSourceDataStaged(Y,s,C,E);},commitSourceData(Y,s,C){let E=`${Y}/.staged/${C}/${s}`,L=de.read(E);if(L==null){let X=de.keyRef?.(E);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 E=new Set([...s,...C]);return Array.from(E)}},Ge=()=>F.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(F,{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;h({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)Y!==ve&&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}),S(ht);let At=d()??{howToRun:"built-in",whatToRun:Ie({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",E=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 E){if(!X.outputFile){o(`[dispatch] source "${X.bindTo}" has no outputFile \u2014 skipping`);continue}let le=t.genId(),Ue=`${C}/.staged/${le}/${X.outputFile}`,xe=de.keyRef?.(Ue);if(!xe)continue;let He={ref:Ie(xe),deliveryToken:le,outputFile:X.outputFile,cardId:C},Ar=Nn({cbk:s.callbackToken,rg:e.value,br:Ie(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:Ie(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 E){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:Ie(Ue),deliveryToken:X,outputFile:L.outputFile,cardId:C});}let ne=Nn({cbk:s.callbackToken,rg:e.value,br:Ie(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:Ie(e),callback:n.createCallback(ne),...H?{output:H}:{}}).catch(X=>Kt(C,X instanceof Error?X.message:String(X)));}});}function N(){let j=I().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:Ie(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:F}=g().readEntriesAfterCursor(W.lastDrainedJournalId);F.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);h({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 F=j.params?.queueStoreRef;if(!F)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=I();ie.writeBoardRuntimeStoreRef(c),ie.writeCardStoreRef(v),ie.writeOutputsStoreRef(W),ie.writeQueueStoreRef(F),ie.writeFetchedSourcesStoreRef(V),ie.writeChatStoreRef(oe),ie.writeArtifactsStoreRef(de),l().writeCard(xt().id,xt());let Re=y({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!==ve&&w({type:"task-restart",taskName:ve,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:R}).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 B(j){return J(),ae()}function x(){let j=I().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 y(j){try{let v=j.params?.cardId,W=j.params?.all,F=!!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&&!F)){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!==ve;}F&&w({type:"task-restart",taskName:de,timestamp:Qe()});}}return oe&&w({type:"task-restart",taskName:ve,timestamp:Qe()}),Q(),ye()}catch(v){return Ce(v)}}function P(j){try{let v=j.params?.token;if(!v)return fe("taskFailed requires params.token");let W=j.params?.error??"unknown error",F=mr(v);return F?(w({type:"task-failed",taskName:F.taskName,error:W,timestamp:Qe()}),Q(),ye()):fe("Invalid callback token")}catch(v){return Ce(v)}}function q(j){try{let v=j.params?.token;if(!v)return fe("taskProgress requires params.token");let F=(j.body??{}).update??{},V=mr(v);return V?(w({type:"task-progress",taskName:V.taskName,update:F,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 F=jn(v);if(!F)return fe("Invalid source token");let{cbk:V,cid:oe,b:de,d:ie,cs:Re,rqt:Be,dt:je}=F,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 F=jn(v);if(!F)return fe("Invalid source token");let{cbk:V,b:oe,d:de,cs:ie,rqt:Re}=F,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=I().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=I().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 Te(j){try{let v=I().readChatStoreRef();return ye({storeRef:v})}catch(v){return Ce(v)}}function _e(j){try{let v=I().readArtifactsStoreRef();return ye({storeRef:v})}catch(v){return Ce(v)}}function pe(j){try{let v=I().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=I(),F;switch(v){case "task-executor":F=f??null;break;case "chat-handler-flow":F=k??null;break;case "board-runtime-store-ref":F=W.readBoardRuntimeStoreRef();break;case "card-store-ref":F=W.readCardStoreRef();break;case "outputs-store-ref":F=W.readOutputsStoreRef();break;case "scratch-store-ref":F=u??null;break;case "chat-store-ref":F=W.readChatStoreRef();break;case "artifacts-store-ref":F=W.readArtifactsStoreRef();break;case "fetched-sources-store-ref":F=W.readFetchedSourcesStoreRef();break;default:return fe(`getConfig: unknown key "${v}"`)}return ye({value:F})}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 Ie(v)}function Je(j){try{let v=j.params?.key;if(!v)return fe("getOutputsFetchedSources requires params.key");let W=he().listSources(v),F={};for(let V of W)F[V]=et(`${v}/${V}`);return ye(F)}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 F={};for(let V of W){let oe=v.listSources(V);if(oe.length>0){F[V]={};for(let de of oe)F[V][de]=et(`${V}/${de}`);}}return ye(F)}catch(v){return Ce(v)}}function yt(j){try{let v=l().readAllCards().filter(ie=>ie.id!==ve),W=ue({});if(W.status!=="success")return W;let F=Se({});if(F.status!=="success")return F;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:F.data,cardRuntimeById:de})}catch(v){return Ce(v)}}return {init:te,status:ue,getBoardRuntimeStoreRef:se,getCardStoreRef:$,getOutputsStoreRef:ce,getScratchStoreRef:be,getChatStoreRef:Te,getArtifactsStoreRef:_e,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:B,upsertCard:y,taskFailed:P,taskProgress:q,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 h=[...d.errors,...m];return ye({cardId:l,isValid:h.length===0,issues:h})}function k(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,h=p["card-content"]??p,w=p["mock-projections"]??{},O=h.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 R(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 b(l){try{let i=k(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)}),h=JSON.parse(p.trim());return h.ok?ye({bindTo:i.bindTo,reachable:h.reachable,latencyMs:h.latencyMs,note:h.note}):fe(h.error??"Preflight probe failed")}catch{return fe("Executor does not support probe-source-preflight")}}catch(i){return Ce(i)}}async function S(l){try{let i=k(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)}),h=JSON.parse(p.trim());if(!h.ok)return ye({bindTo:i.bindTo,ok:!1,result:null,issues:[h.error??"Preflight run failed"]});if(i.outRef){let w=it(i.outRef);t.absoluteBlob.write(w.value,JSON.stringify(h.resultValue,null,2));}return ye({bindTo:typeof h.bindTo=="string"?h.bindTo:i.bindTo,ok:!0,result:h.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 _(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 T(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 h=p.op,w=p.id;if(!w)return fe('op is missing "id"');if(h==="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: "${h??"(none)"}"`)}return ye()}catch(i){return Ce(i)}}function I(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(h=>({id:h,"card-content":m.readCard(h)}));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"]??{},h=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:h,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 g(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"]??{},h=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:h});for(let K of J){let y=K.projections,P=K._projections;if(y&&P){for(let q of Object.keys(y))if(P[q]===void 0){let D=typeof K.bindTo=="string"?K.bindTo:"(unknown)";ae.push({bindTo:D,key:q,error:`Projection "${q}" 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 y=J[K],P=typeof y.bindTo=="string"?y.bindTo:`source_${K}`;if(!G){Q.push({bindTo:P,skipped:!0,error:"No task executor configured"});continue}try{let q={...y},D=await t.invokeExecutor(G,"run-source-preflight",{timeout:y.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(q)}),M=JSON.parse(D.trim());M.ok&&!Object.prototype.hasOwnProperty.call(p,P)&&Object.prototype.hasOwnProperty.call(M,"resultValue")&&(te[P]=M.resultValue),Q.push({bindTo:P,reachable:M.reachable,latencyMs:M.latencyMs,error:M.ok?void 0:M.error});}catch{Q.push({bindTo:P,skipped:!0,error:"Executor does not support run-source-preflight"});}}let Z=d.compute,re={},B=[];if(Z&&Array.isArray(Z)&&Z.length>0){let K={id:m,card_data:U,requires:h,source_defs:d.source_defs,compute:Z},y=We.runSync(K,{sourcesData:te});re=y.node.computed_values??{},B=y.errors??[];}let x=O.isValid&&ae.length===0&&B.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:B})}catch(i){return Ce(i)}}return {validateCardPreflight:R,probeSourcePreflight:b,runSourcePreflight:S,evalCardCompute:A,simulateCardCycle:g,describeTaskExecutorCapabilities:_,updatesInCardStore:T,readFromCardStore:I}}function pr(e,t={}){function r(k){return {status:"success",data:k}}function n(k){return {status:"fail",error:k}}function o(k){return {status:"error",error:k instanceof Error?k.message:String(k)}}async function a(k){let R=t.emitNotification;if(!R||k.length===0)return;let b=De(k);if(b.length===1){await R(b[0]);return}await R($e({kind:"notification-batch",notifications:b}));}async function c(k){let R=k.params?.id;if(R){let b=await e.readCard(R);if(!b)throw new Error(`card "${R}" not found`);return [b]}return await e.readAllCards()}function u(k){return $e({kind:"notification-batch",notifications:De(k.map(R=>({kind:"card_refreshed",cardId:R.id,card:R})))})}function f(k){if(Array.isArray(k))return k;if(k&&typeof k=="object"){let R=k;return Array.isArray(R.files)?R.files:[k]}return null}return {async get(k){try{return r({cards:await c(k)})}catch(R){return o(R)}},async buildNotificationBatch(k){try{return r(u(await c(k)))}catch(R){return o(R)}},async set(k){try{let R=k.body;if(R==null)return n("set requires a body (card object or array of cards)");let b=Array.isArray(R)?R:[R];for(let S of b){if(typeof S.id!="string")return n("each card must have a string `id` field");await e.writeCard(S.id,S);}return await a(b.map(S=>({kind:"card_refreshed",cardId:S.id,card:S}))),r({count:b.length})}catch(R){return o(R)}},async del(k){try{let R=k.body?.ids??[],b=k.params?.id,S=b?[...R,b]:R;if(S.length===0)return n("del requires body.ids (string[]) or params.id");for(let _ of S)await e.removeCard(_);return await a(S.map(_=>({kind:"card_removed",cardId:_}))),r({count:S.length})}catch(R){return o(R)}},async patch(k){try{let R=k.params?.id,b=k.params?.path;if(!R)return n("patch requires params.id");if(!b)return n("patch requires params.path");let S=k.body,_=S&&Object.prototype.hasOwnProperty.call(S,"value")?S.value:k.body;await e.patchCard(R,b,_);let T=await e.readCard(R);return T?(await a([{kind:"card_refreshed",cardId:R,card:T}]),r({count:1})):n(`card "${R}" not found`)}catch(R){return o(R)}},async appendFiles(k){try{let R=k.params?.id;if(!R)return n("appendFiles requires params.id");let b=await e.readCard(R);if(!b)return n(`card "${R}" not found`);let S=f(k.body);if(!S||S.length===0)return n("appendFiles requires a file metadata object, array, or body.files array");let _=b.card_data&&typeof b.card_data=="object"&&!Array.isArray(b.card_data)?b.card_data:{},T=Array.isArray(_.files)?_.files:[],I=[...T,...S],A=S.map((l,i)=>({idx:T.length+i,entry:l})),g=await this.patch({params:{id:R,path:"card_data.files"},body:{value:I}});return g.status!=="success"?g:r({files_added:A})}catch(R){return o(R)}}}}async function $n(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function 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 k=String(o||"").split(".").filter(Boolean),R=yr(f,k,a),b=await e.writeCard(u.key,R);c[n]={key:u.key,checksum:b,updatedAt:new Date().toISOString()},await e.writeIndex(c);},async removeCard(n){let o=await r(),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 Ae(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 k=f.id;if(k===ve){let Q=r.activeTaskConfigs?.(),te={[ot]:Q?Dr((await Promise.all(Object.keys(Q).filter(ue=>ue!==ve).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 R=f.card_data??{},b=f.source_defs??[],S=b,_=await r.cardRuntimeStore.readRuntime(k),T=false,I=async()=>{T&&(await r.cardRuntimeStore.writeRuntime(k,_),T=false);},A=Q=>Nt(_._sources[Q]),g=(Q,te)=>{_._sources[Q]=Nt(te),T=true;},l=c.taskState?.executionCount??0;if(_._lastExecutionCount!==l&&(_._sources={},_._lastExecutionCount=l,T=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&&g(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(k,Q,G):false;g(Q,Z?$r(te,ue):Lt(te,ue));}}await I();}}let i={};for(let Q of b){if(!Q.outputFile)continue;let te=await r.fetchedSourcesStore.readSourceData(k,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:k,card_data:{...R},requires:d,source_defs:b,compute:f.compute};m._sourcesData=i,f.compute&&We.runSync(m,{sourcesData:i}),(o??(()=>{}))(k,m.computed_values??{});let p=We.enrichSourcesSync(Array.isArray(f.source_defs)?f.source_defs:void 0,{card_data:f.card_data,requires:d}),h={...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=S.filter(Q=>{let te=Q.outputFile;if(typeof te!="string"||!te)return true;let ue=A(te);O&&(ue={...ue,queueRequestedToken:O},g(te,ue));let G=ue.queueRequestedToken??ue.lastRequestedToken??w;return jt(ue,G)==="dispatch"});if(await I(),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;g(G,{...Z,lastRequestedToken:re}),te=re,Q=true;}return Q&&await I(),Q&&(u.push({taskKind:"source-fetch",payload:{boardRef:Ie(e),enrichedCard:h,callbackToken:c.callbackToken,rqt:te}}),await r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(S.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=Ie(e),c=r.emitNotification??(B=>{if(!t.publishBoardChangeNotifications)return;let x=B.kind==="notification-batch"?B.notifications:[B];return t.publishBoardChangeNotifications(x)}),u=null,f=r.boardRuntimeStoreRef,k=r.scratchStoreRef,R=r.taskExecutorRef,b=r.chatHandlerFlow;function S(){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){if(B.length!==0)try{let x=De(B),K=$e({kind:"notification-batch",notifications:x});return Promise.resolve(c(K)).catch(y=>{o(`[async-board-live-cards-public] emitNotification failed: ${y instanceof Error?y.message:String(y)}`);})}catch(x){o(`[async-board-live-cards-public] emitNotification failed: ${x instanceof Error?x.message:String(x)}`);return}}let T=()=>Un(t.kvStorageForRef(S())),I=e.value,A=()=>rr(qr(()=>t.kvStorageForRef(S()),t.hashFn),"v1"),g=async()=>{let B=await T().readOutputsStoreRef();if(!B)throw new Error(`Board at ${e.value} has no outputs store configured.`);return fa(t.kvStorageForRef(B))},l=async()=>{let B=await T().readCardStoreRef();if(!B)throw new Error(`Board at ${e.value} has no card store configured.`);let x=t.kvStorageForRef(B);return kr(Rr(hr(x),t.hashFn),o)};async function i(){return !!(await A().readSnapshot(I)).values[lt]}async function d(){let B=await A().readSnapshot(I);if(!B.values[lt])throw new Error(`Board not initialized at ${e.value}`);return lr(B.values)}async function m(B,x){let K=await A().commitSnapshot(I,{schemaVersion:"v1",expectedVersion:x,deleteKeys:[],shallowMerge:dr(B)});if(!K.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${x??"null"} current=${K.currentVersion??"null"}`)}let p=()=>Tn(t.journalStorageForRef(S()));async function h(){return R??await T().readTaskExecutorRef()}async function w(){return cr(await(await g()).readAllDataObjects())}async function O(B){await p().appendEvent(B);}async function N(){let B=await T().readFetchedSourcesStoreRef();if(!B)throw new Error(`Board at ${e.value} has no fetched sources store configured. Run: init --fetched-sources-store-ref <b64-ref>`);return B}async function U(){return t.blobStorageForRef(await N())}async function J(){return la(await U(),B=>t.resolveBlob(B))}async function ae(B){let x=(await U()).keyRef?.(B);if(!x)throw new Error("configured fetched-sources store does not support keyRef");let K=await Promise.resolve(x);return Ie(K)}async function Q(){let B=ma(t.kvStorageForRef(S()),async(F,V)=>{let oe=F.payload,ie=(oe.enrichedCard??{}).id??oe.cardId??"unknown";await O({type:"task-failed",taskName:ie,error:V,timestamp:Ne()});}),x=da(t.kvStorageForRef(S())),K=await U(),y=await J(),P=await l(),q=await g(),D=new Map,M=new Map,$=[],se=[],ce=[],be=new Map,Te=new Set,_e={async readRuntime(F){return D.get(F)??await x.readRuntime(F)},async writeRuntime(F,V){D.set(F,V),Se[F]=V;}},pe={async readSourceData(F,V){let oe=`${F}/${V}`;return M.has(oe)?M.get(oe):await y.readSourceData(F,V)},ingestSourceDataStaged(F,V,oe,de){return y.ingestSourceDataStaged(F,V,oe,de)},async commitSourceData(F,V,oe){let de=`${F}/.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=`${F}/${V}`,Be=ie.trim();try{M.set(Re,JSON.parse(Be));}catch{M.set(Re,Be);}return $.push({cardId:F,outputFile:V,deliveryToken:oe}),true},async hasSource(F,V){let oe=`${F}/${V}`;return M.has(oe)||await y.hasSource(F,V)},async listSources(F){let V=await y.listSources(F),oe=[...M.keys()].filter(de=>de.startsWith(`${F}/`)).map(de=>de.slice(`${F}/`.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:P,cardRuntimeStore:_e,fetchedSourcesStore:pe,outputStore:q,executionRequestStore:B,activeTaskConfigs:()=>et()},(F,V)=>{he.push({type:"task-completed",taskName:F,data:V,timestamp:Ne()});},(F,V)=>{se.push({cardId:F,values:V});},F=>{ce.push(F);})},onNodeRemoved:F=>{be.delete(F),D.delete(F),delete Se[F],Te.add(F);}});for(et=()=>Je.getState().config.tasks;he.length>0;){let F=he;he=[];for(let V of F)if(V.type==="task-restart"){let oe=await P.readCard(V.taskName);oe&&be.set(V.taskName,oe);}Je.pushAll(F),await Je.waitForHandlers();}let tt=Je.getState();await Je.dispose({wait:true}),await m({lastDrainedJournalId:qe,graph:Ct(tt),runtimeByCardId:Se},(await A().readSnapshot(I)).version);for(let{cardId:F,values:V}of se)await q.writeComputedValues(F,V);for(let F of ce)await q.writeDataObjects(F);for(let[F,V]of D)await x.writeRuntime(F,V);for(let F of $)await y.commitSourceData(F.cardId,F.outputFile,F.deliveryToken);let yt=St(wt(a,tt));await q.writeStatusSnapshot(yt);let j=[];for(let{cardId:F,values:V}of se)j.push({kind:"computed_values",cardId:F,values:V});for(let F of ce)for(let[V,oe]of Object.entries(F))j.push({kind:"data_object",key:V,payload:oe});for(let[F,V]of be)F!==ve&&j.push({kind:"card_refreshed",cardId:F,card:V});for(let F of Te)j.push({kind:"card_removed",cardId:F});j.push({kind:"status",status:yt}),await _(j);let v=await h();if(!v)return;let W=t.supportsDirectSourceOutput?.(v)===true;await B.dispatchEntriesForJournalId(qe,async F=>{if(F.taskKind!=="source-fetch"){o(`[async-process-accumulated-events] unknown taskKind "${F.taskKind}" \u2014 skipping`);return}let V=F.payload,oe=V.enrichedCard?.id??"unknown",de=V.enrichedCard?.source_defs??[];if(v.howToRun==="queue-storage"&&W){try{let ie=await T().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:Ie(Ge),deliveryToken:Me,outputFile:Le.outputFile,cardId:oe},ft=Hn({cbk:V.callbackToken,rg:e.value,br:Ie(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:Ie(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:Ie(Ye),deliveryToken:Le,outputFile:ie.outputFile,cardId:oe});}let Be=Hn({cbk:V.callbackToken,rg:e.value,br:Ie(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:Ie(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 B=async()=>{let K=await d(),{events:y}=await p().readEntriesAfterCursor(K.lastDrainedJournalId);y.length>0&&await G();},x=await $n(t.lock,Q,B);return Pe({ran:x!==!1})}catch(B){return Ee(B)}}async function ue(){return u||(u=te().finally(()=>{u=null;}),u)}async function G(){let B=await T().readQueueStoreRef();if(!B)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);await t.queueStorageForRef(B,"process-accumulated").enqueue({boardRef:Ie(e)}),await t.requestProcessAccumulated?.();}async function Z(){let B=await T().readQueueStoreRef();if(!B)throw new Error(`Board at ${e.value} has no queue store configured. Run: init --queue-store-ref <b64-ref>`);let x=t.queueStorageForRef(B,"process-accumulated");for(;;){let K=await x.lease({max:64,visibilityMs:1e3});if(K.length<=0)return;for(let y of K)await x.ack(y.id,y.leaseToken);if(K.length<64)return}}function re(){G();}return {async init(B){try{let x=B.params?.cardStoreRef;if(!x)return Ae("init requires params.cardStoreRef");if(f=B.params?.boardRuntimeStoreRef,!f)return Ae("init requires params.boardRuntimeStoreRef");let K=B.params?.outputsStoreRef;if(!K)return Ae("init requires params.outputsStoreRef");let y=B.params?.queueStoreRef;if(!y)return Ae("init requires params.queueStoreRef");let P=B.params?.fetchedSourcesStoreRef;if(!P)return Ae("init requires params.fetchedSourcesStoreRef");k=B.params?.scratchStoreRef;let q=B.params?.chatStoreRef;if(!q)return Ae("init requires params.chatStoreRef");let D=B.params?.artifactsStoreRef;if(!D)return Ae("init requires params.artifactsStoreRef");await i()||await m({lastDrainedJournalId:"",graph:Ct(Tt(Dt)),runtimeByCardId:{}},null);let M=T();await M.writeBoardRuntimeStoreRef(f),await M.writeCardStoreRef(x),await M.writeOutputsStoreRef(K),await M.writeQueueStoreRef(y),await M.writeFetchedSourcesStoreRef(P),await M.writeChatStoreRef(q),await M.writeArtifactsStoreRef(D),await(await l()).writeCard(ve,xt());let $=t.kvStorage("card-upsert"),se=xt(),ce=$t(se),be=t.hashFn(ce),_e=(await $.read(ve))?.blobRef??await(await l()).readCardKey(ve)??ve;return await O({type:"task-upsert",taskName:ve,taskConfig:ce,timestamp:Ne()}),await $.write(ve,{blobRef:_e,taskConfigHash:be,updatedAt:Ne()}),await O({type:"task-restart",taskName:ve,timestamp:Ne()}),re(),await(await g()).writeStatusSnapshot(St(wt(a,bt((await d()).graph)))),Pe()}catch(x){return Ee(x)}},async status(B){try{let x=await g(),K=await x.readStatusSnapshot();return K||(K=St(wt(a,bt((await d()).graph))),await x.writeStatusSnapshot(K)),Pe(K)}catch(x){return Ee(x)}},async getCardStoreRef(B){try{let x=await T().readCardStoreRef();return x?Pe({storeRef:x}):Ae(`Board at ${e.value} has no card store configured`)}catch(x){return Ee(x)}},async getBoardRuntimeStoreRef(B){try{return Pe({storeRef:f??null})}catch(x){return Ee(x)}},async getOutputsStoreRef(B){try{let x=await T().readOutputsStoreRef();return x?Pe({storeRef:x}):Ae(`Board at ${e.value} has no outputs store configured`)}catch(x){return Ee(x)}},async getScratchStoreRef(B){try{return Pe({storeRef:k??null})}catch(x){return Ee(x)}},async getChatStoreRef(B){try{return Pe({storeRef:await T().readChatStoreRef()})}catch(x){return Ee(x)}},async getArtifactsStoreRef(B){try{return Pe({storeRef:await T().readArtifactsStoreRef()})}catch(x){return Ee(x)}},async getFetchedSourcesStoreRef(B){try{return Pe({storeRef:await T().readFetchedSourcesStoreRef()})}catch(x){return Ee(x)}},async getConfig(B){try{let x=B.params?.key;if(!x)return Ae("getConfig requires params.key");let K=T(),y;switch(x){case "task-executor":y=R??null;break;case "chat-handler-flow":y=b??null;break;case "board-runtime-store-ref":y=await K.readBoardRuntimeStoreRef();break;case "card-store-ref":y=await K.readCardStoreRef();break;case "outputs-store-ref":y=await K.readOutputsStoreRef();break;case "scratch-store-ref":y=k??null;break;case "chat-store-ref":y=await K.readChatStoreRef();break;case "artifacts-store-ref":y=await K.readArtifactsStoreRef();break;case "fetched-sources-store-ref":y=await K.readFetchedSourcesStoreRef();break;default:return Ae(`getConfig: unknown key "${x}"`)}return Pe({value:y})}catch(x){return Ee(x)}},async getOutputsDataObject(B){try{let x=B.params?.key;if(!x)return Ae("getOutputsDataObject requires params.key");if(x===ot)return Pe(null);let K=await w();return Pe(K[x]??null)}catch(x){return Ee(x)}},async getAllOutputsDataObjects(B){try{return Pe(await w())}catch(x){return Ee(x)}},async getOutputsComputedValues(B){try{let x=B.params?.key;return x?Pe(await(await g()).readComputedValues(x)):Ae("getOutputsComputedValues requires params.key")}catch(x){return Ee(x)}},async getAllOutputsComputedValues(B){try{return Pe(await(await g()).readAllComputedValues())}catch(x){return Ee(x)}},async getOutputsFetchedSources(B){try{let x=B.params?.key;if(!x)return Ae("getOutputsFetchedSources requires params.key");let K=await(await J()).listSources(x),y={};for(let P of K)y[P]=await ae(`${x}/${P}`);return Pe(y)}catch(x){return Ee(x)}},async getAllOutputsFetchedSources(B){try{let x=await J(),K=await(await U()).listKeys(),y=new Set;for(let q of K){let D=q.indexOf("/");D>0&&!q.includes("/.staged/")&&y.add(q.slice(0,D));}let P={};for(let q of y){let D=await x.listSources(q);if(D.length!==0){P[q]={};for(let M of D)P[q][M]=await ae(`${q}/${M}`);}}return Pe(P)}catch(x){return Ee(x)}},async buildSseOneShotPayload(B){try{let x=(await(await l()).readAllCards()).filter(M=>M.id!==ve),K=await this.status({});if(K.status!=="success")return K;let y=await this.getAllOutputsDataObjects({});if(y.status!=="success")return y;let P=await this.getAllOutputsComputedValues({});if(P.status!=="success")return P;let q=P.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:q[$]&&typeof q[$]=="object"?q[$]:{}};}return Pe({cardDefinitions:x,statusSnapshot:K.data,dataObjectsByToken:y.data,cardRuntimeById:D})}catch(x){return Ee(x)}},async addCardFiles(B){try{let x=B.params?.cardId;if(!x)return Ae("addCardFiles requires params.cardId");let y=await pr(await l(),{emitNotification:c}).appendFiles({params:{id:x},body:B.body});return y.status!=="success"?y:Pe({cardId:x,files_added:y.data.files_added,notified:!0})}catch(x){return Ee(x)}},async removeCard(B){try{let x=B.params?.id;if(!x)return Ae("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(x);}catch{}return await O({type:"task-removal",taskName:x,timestamp:Ne()}),x!==ve&&await O({type:"task-restart",taskName:ve,timestamp:Ne()}),re(),Pe()}catch(x){return Ee(x)}},async retrigger(B){try{let x=B.params?.id;return x?(await O({type:"task-restart",taskName:x,timestamp:Ne()}),re(),Pe()):Ae("retrigger requires params.id")}catch(x){return Ee(x)}},async processAccumulatedEvents(B){return await Z(),ue()},async upsertCard(B){try{let x=B.params?.cardId,K=B.params?.all,y=!!B.params?.restart;if(!x&&!K)return Ae("upsertCard requires --card-id <id> or --all");let P=await l(),q=K?(await P.readAllCards()).map($=>$.id):[x];for(let $ of q)if(!await P.readCard($))return Ae(`Card "${$}" not found in board at ${e.value}`);let D=t.kvStorage("card-upsert"),M=!1;for(let $ of q){let se=await P.readCard($);if(!se)continue;let ce=$t(se),be=t.hashFn(ce),Te=await D.read($),_e=Te?.taskConfigHash!==be;if(!(!_e&&!y)){if(_e){let pe=Te?.blobRef??await P.readCardKey($)??$;await O({type:"task-upsert",taskName:$,taskConfig:ce,timestamp:Ne()}),await D.write($,{blobRef:pe,taskConfigHash:be,updatedAt:Ne()}),M=M||$!==ve;}y&&await O({type:"task-restart",taskName:$,timestamp:Ne()});}}return M&&await O({type:"task-restart",taskName:ve,timestamp:Ne()}),re(),Pe()}catch(x){return Ee(x)}},async taskFailed(B){try{let x=B.params?.token;if(!x)return Ae("taskFailed requires params.token");let K=B.params?.error??"unknown error",y=Cr(x);return y?(await O({type:"task-failed",taskName:y.taskName,error:K,timestamp:Ne()}),re(),Pe()):Ae("Invalid callback token")}catch(x){return Ee(x)}},async taskProgress(B){try{let x=B.params?.token;if(!x)return Ae("taskProgress requires params.token");let K=(B.body??{}).update??{},y=Cr(x);return y?(await O({type:"task-progress",taskName:y.taskName,update:K,timestamp:Ne()}),re(),Pe()):Ae("Invalid callback token")}catch(x){return Ee(x)}},async sourceDataFetched(B){try{let x=B.params?.token,K=B.params?.ref;if(!x)return Ae("sourceDataFetched requires params.token");if(!K)return Ae("sourceDataFetched requires params.ref");let y=Jn(x);if(!y)return Ae("Invalid source token");let P=await J(),q=y.dt||t.genId();y.dt||await P.ingestSourceDataStaged(y.cid,y.d,it(K),q);let D=Cr(y.cbk);return D?(await O({type:"task-progress",taskName:D.taskName,update:{bindTo:y.b,outputFile:y.d,fetchedAt:Ne(),deliveryToken:q,sourceChecksum:y.cs,rqt:y.rqt},timestamp:Ne()}),re(),Pe()):Ae("Invalid callback token embedded in source token")}catch(x){return Ee(x)}},async sourceDataFetchFailure(B){try{let x=B.params?.token,K=B.params?.reason??"unknown";if(!x)return Ae("sourceDataFetchFailure requires params.token");let y=Jn(x);if(!y)return Ae("Invalid source token");let P=Cr(y.cbk);return P?(await O({type:"task-progress",taskName:P.taskName,update:{bindTo:y.b,outputFile:y.d,failure:!0,reason:K,sourceChecksum:y.cs,rqt:y.rqt},timestamp:Ne()}),re(),Pe()):Ae("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(g){let l=typeof g=="number"?g:Number(g);return Number.isInteger(l)&&l>0?l:null}function o(g,l){let i=l;for(let d=g.length-1;d>=0;d-=1)if(g[d]?.role==="user"&&(i-=1,i===0))return g.slice(d);return g}function a(g){return g.some(l=>typeof l?.turn=="string"&&l.turn!=="")}function c(g,l){if(l<=0)return [];if(!a(g))return o(g,l);let i=new Map,d=[];for(let p of g){let h=typeof p?.turn=="string"?p.turn:"";i.has(h)||(i.set(h,[]),d.push(h)),i.get(h).push(p);}return d.slice(Math.max(0,d.length-l)).flatMap(p=>i.get(p)??[])}function u(g){return {status:"success",data:g}}function f(g){return {status:"fail",error:g}}function k(g){return {status:"error",error:g instanceof Error?g.message:String(g)}}function R(g){return {role:String(g.role||"system"),text:String(g.text||""),files:Array.isArray(g.files)?g.files:[],...typeof g.turn=="string"&&g.turn?{turn:g.turn}:{}}}async function b(g){if(!r||g.length===0)return;let l=De(g);if(l.length===1){await r(l[0]);return}await r($e({kind:"notification-batch",notifications:l}));}async function S(g){let l=await e.readAll(g);return c(l,1).map(R)}async function _(g){let l=Date.now();return {kind:"card_chats",cardId:g,sentAt:new Date(l).toISOString(),sentAtMs:l,messages:await S(g),receiving:true,processing:await e.isProcessing(g)}}async function T(g,l="command envelope"){let i=typeof g.cardId=="string"?g.cardId:void 0;if(!g.command)return f(`chat-store: ${l} missing "command"`);if(!i)return f(`chat-store: ${l} missing "cardId"`);if(g.command==="append")return await A.append({params:{cardId:i},body:{role:g.role,text:g.text,files:g.files,turn:g.turn}});if(g.command==="read-all")return await A.readAll({params:{cardId:i},body:{lastUserTurns:g.lastUserTurns,tailTurns:g.tailTurns,turnId:g.turnId,allTurns:g.allTurns,tailTurnsBeforeId:g.tailTurnsBeforeId}});if(g.command==="read-after")return await A.readAfter({params:{cardId:i},body:{cursor:g.cursor??null}});if(g.command==="clear")return await A.clear({params:{cardId:i}});if(g.command==="set-processing")return await A.setProcessing({params:{cardId:i},body:{active:g.active}});if(g.command==="is-processing")return await A.isProcessing({params:{cardId:i}});if(g.command==="get-config")return await A.getConfig({params:{cardId:i}});if(g.command==="set-config"){let{command:d,cardId:m,...p}=g;return await A.setConfig({params:{cardId:i},body:p})}return f(`chat-store: unknown command "${String(g.command)}"`)}async function I(g){if(!Array.isArray(g.commands)||g.commands.length===0)return f('chat-store: command envelope must include a non-empty "commands" array');let l=[];for(let i=0;i<g.commands.length;i+=1){let d=g.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:g.cardId,...d},p=await T(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(g){try{let l=g.params?.cardId;if(!l)return f("append requires params.cardId");let i=g.body??{},d=typeof i.role=="string"?i.role:"",m=typeof i.text=="string"?i.text:"",p=Array.isArray(i.files)?i.files:[],h=typeof i.turn=="string"?i.turn:"";if(!d)return f("append requires body.role");let w=await e.append(l,d,m,p,h);return await b([{kind:"chat_messages",cardId:l,messages:await S(l)}]),u({id:w})}catch(l){return k(l)}},async readAll(g){try{let l=g.params?.cardId;if(!l)return f("readAll requires params.cardId");let i=g.body??{},d=typeof i.turnId=="string"?i.turnId:"",m=i.allTurns===!0,p=typeof i.tailTurnsBeforeId=="string"?i.tailTurnsBeforeId:"",h=i.tailTurns===void 0?i.lastUserTurns:i.tailTurns,w=h===void 0?m||d?void 0:1:n(h);if(h!==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 k(l)}},async buildSseOneShotBatch(g){try{let l=g.params?.cardId;if(!l)return f("buildSseOneShotBatch requires params.cardId");let i=g.body??{},d=typeof i.receiving=="boolean"?i.receiving:!0,m=await _(l);return u($e({kind:"notification-batch",notifications:[{...m,receiving:d}]}))}catch(l){return k(l)}},async readAfter(g){try{let l=g.params?.cardId;if(!l)return f("readAfter requires params.cardId");let d=(g.body??{}).cursor??null;return u(await e.readAfter(l,d))}catch(l){return k(l)}},async clear(g){try{let l=g.params?.cardId;return l?(await e.clear(l),u({ok:!0})):f("clear requires params.cardId")}catch(l){return k(l)}},async setProcessing(g){try{let l=g.params?.cardId;if(!l)return f("setProcessing requires params.cardId");let i=g.body??{};return typeof i.active!="boolean"?f("setProcessing requires body.active (boolean)"):(await e.setProcessing(l,i.active),await b([{kind:"chat_processing",cardId:l,active:i.active,sentAtMs:Date.now()}]),u({ok:!0}))}catch(l){return k(l)}},async isProcessing(g){try{let l=g.params?.cardId;return l?u({active:await e.isProcessing(l)}):f("isProcessing requires params.cardId")}catch(l){return k(l)}},async getConfig(g){try{let l=g.params?.cardId;return l?u({config:await e.getConfig(l)}):f("getConfig requires params.cardId")}catch(l){return k(l)}},async setConfig(g){try{let l=g.params?.cardId;if(!l)return f("setConfig requires params.cardId");let i=g.body??{};return await e.setConfig(l,i),u({ok:!0})}catch(l){return k(l)}},run:T,runBatch:I};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
2
  data: ${i}
3
3
 
4
- `}function o(l){let i=l;try{i.flushHeaders?.();}catch{}try{i.flush?.();}catch{}try{i.socket?.setNoDelay?.(!0);}catch{}try{i.socket?.uncork?.();}catch{}}function 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
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 k(l,i){let d=await e.buildChatOneShotBatch(l,i);return d.status==="success"?d.data:f([])}async function R(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.add(i),u(l,await k(i,true)),true):false}function b(l,i){let d=t.get(l);return d?(d.subscribedChatCardIds.delete(i),true):false}function S(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 _(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 T(l){return l.kind==="card_chats"||l.kind==="chat_messages"||l.kind==="chat_processing"}function I(l){return l.kind==="card_watchparty"}function A(l,i,d){return l.subscribedChannelNames.has(i)?true:!!l.subscribedCardChannels.get(d)?.has(i)}function g(l){if(!l||l.length===0)return;let i=[],d=new Map,m=new Map;for(let p of l)if(I(p)){let h=`${p.cardId}\0${p.channel}`,w=m.get(h)??[];w.push(p),m.set(h,w);}else if(T(p)){let h=d.get(p.cardId)??[];h.push(p),d.set(p.cardId,h);}else i.push(p);if(i.length>0){let p=f(i);for(let h of t.keys())u(h,p);}for(let[p,h]of d.entries()){let w=f(h);for(let[O,N]of t.entries())N.subscribedChatCardIds.has(p)&&u(O,w);}for(let[p,h]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(h);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:R,unsubscribeChat:b,subscribeChannel:S,unsubscribeChannel:_,broadcastNotificationBatch:g}}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 k(i){let d=me(i,"client_id");if(!d)throw Object.assign(new Error("MCP tool requires client_id"),{statusCode:400});return d}function R(i){f(i);let d=k(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 b(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 S(i){await r();let{cardId:d}=b(i),m=k(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 _(i){await r();let{cardId:d}=b(i),m=k(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 T(i,d){await r();let{clientId:m,channelName:p,cardId:h}=R(i);if(!n.has(m))throw Object.assign(new Error(`SSE client not connected: ${m}`),{statusCode:404});return d?(n.subscribeChannel(m,p,h),o?.(m,p,h?{cardId:h}:{})):(n.unsubscribeChannel(m,p,h),a?.(m,p,h?{cardId:h}:{})),{status:"success",data:{boardId:t,clientId:m,channelName:p,subscribed:d,...h?{cardId:h}:{}}}}async function I(i,d){let{cardId:m}=b(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}=b(i),m=await c().getChatProcessing({cardId:d});return {status:"success",data:{boardId:t,cardId:d,active:m.active}}}async function g(i){let{cardId:d}=b(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"),h=Array.isArray(p.cards)&&p.cards.length>0&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null,w=h?Yr(h,"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}=b(i),m=zr(i),p=await Wr(u().get({params:{id:d}}),"cardStore.get"),h=Array.isArray(p.cards)&&p.cards.length>0&&p.cards[0]&&typeof p.cards[0]=="object"&&!Array.isArray(p.cards[0])?p.cards[0]:null;if(!h)throw Object.assign(new Error(`Card "${d}" not found`),{statusCode:404});let w=Yr(h,m);return {status:"success",data:{boardId:t,cardId:d,key:m,exists:w.exists,value:w.value}}}return {requireCardArgs:b,subscribeChat:S,unsubscribeChat:_,watchChannel:T,setChatProcessing:I,getChatProcessing:A,setCardMeta:g,getCardMeta:l}}function uo(e){let{boardId:t,boardContexts:r,readChatRecords:n,getChatProcessing:o}=e,a=Number.isInteger(e.chatBootstrapTailTurns)&&e.chatBootstrapTailTurns>0?e.chatBootstrapTailTurns:1;function c(_){return {role:String(_.role||"system"),text:String(_.text||""),files:Array.isArray(_.files)?_.files:[],...typeof _.turn=="string"&&_.turn?{turn:_.turn}:{}}}function u(_){if(_.length===0)return null;if(_.length===1)return _[0];let T=[],I=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],A={};for(let l of I)A[l]=0;for(let l of _){let i=l,d=Array.isArray(i.cards)?i.cards:[];T.push(...d);for(let m of I)A[m]+=Number(i?.summary?.[m]||0);}let g=_[0];return {...g,cards:T,summary:{...g.summary||{},card_count:T.length,...A}}}async function f(){let _=[];for(let T of r)try{let I=await T.boardOps.buildSseOneShotPayload({});I.status==="success"&&I.data&&_.push(I.data);}catch{}return _}async function k(){let T=(await f()).map(I=>I.statusSnapshot).filter(Boolean);if(T.length===0){let I=r.map(A=>A.notification.status).filter(Boolean);return u(I)}return u(T)}async function R(){let _={},T=await f();for(let I of T)Object.assign(_,I.cardRuntimeById||{});if(Object.keys(_).length>0)return _;for(let I of r)for(let[A,g]of Object.entries(I.notification.computedValues)){let l=I.notification.cards[A];_[A]={schema_version:"v1",card_id:A,card_data:l?.card_data??{},computed_values:g??{}};}return _}async function b(){let _={},T=await f();for(let I of T)Object.assign(_,I.dataObjectsByToken||{});if(Object.keys(_).length===0)for(let I of r)Object.assign(_,I.notification.dataObjects||{});return _}async function S(){let _=await f(),T=_.flatMap(l=>Array.isArray(l.cardDefinitions)?l.cardDefinitions:[]),I={},A={};for(let l of _)Object.assign(I,l.dataObjectsByToken||{}),Object.assign(A,l.cardRuntimeById||{});let g={};for(let l of T){if(!l?.id)continue;let i=l.id;try{let d=await n(i,{tailTurns:a}),m=await o(i);(d.length>0||m)&&(g[i]={messages:d.map(p=>c(p)),receiving:!1,processing:m});}catch{}}return {boardId:t,cardDefinitions:T,statusSnapshot:await k(),dataObjectsByToken:I,cardRuntimeById:A,cardChatsByCardId:g}}return {readStatusSnapshot:k,readCardRuntimeArtifacts:R,readDataObjectsByToken:b,buildPublishedRuntimePayload:S}}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(R){let b=[];try{let S=await o(R);if(!S)return b;let _=n().read(S.card_data&&typeof S.card_data=="object"?S.card_data:null);for(let T of _)b.push(String(T.stored_name??""));}catch{}return b}async function f(R,b,S,_){let T=t(R),I=r(R),A=ba(b),g=await u(R),i=`${String(g.length+1).padStart(3,"0")}-${A}`.slice(-36);if(!I.files)throw Object.assign(new Error(`artifactsStoreRef is not configured for card uploads: ${R}`),{statusCode:500});return await I.files.putBytes(`${T}/${i}`,new Uint8Array(_),S||"application/octet-stream"),{name:A,stored_name:i,size:_.length,mime_type:S||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function k(R,b,S,_,T){if(!_.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let I=T?.inChat===true,A=await f(R,b,S,_),g=null;if(await a(R,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:I}],i);return g=n().merge(d,m).findIndex(h=>h.stored_name===A.stored_name),l}),I&&T?.suppressChatRecordWrite!==true){let l=typeof g=="number"&&g>=0?` #${g}`:"";await c(R,"system",`file uploaded: ${A.name} as ${A.stored_name}${l}`,[],T?.turnId??"");}return {ok:true,file:{...A,...typeof g=="number"&&g>=0?{file_idx:g}:{},chat:I},...typeof g=="number"&&g>=0?{file_idx:g}:{}}}return {uploadCardFile:k,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 k=me(u,"board_id");if(!k)throw Object.assign(new Error(`${f} requires board_id`),{statusCode:400});if(k!==t)throw Object.assign(new Error(`Unknown board_id: ${k}`),{statusCode:400})}function c(u,f){let{cardId:k}=o.requireCardArgs(u),R=me(u,"turn_id");return a(u,f),n().manageAddChatAttachment({cardId:k,role:me(u,"role")||"user",...R?{turn:R}:{},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"),k=me(u,"file_name"),R=me(u,"content_type")||"application/octet-stream",b=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(!k)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(f,k,R,b,{inChat:false})},"manage.add-chat-attachment":u=>c(u,"manage.add-chat-attachment"),"manage.add-chat-attachement":u=>c(u,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":u=>{let{cardId:f}=o.requireCardArgs(u),k=me(u,"role")||"user",R=me(u,"turn_id");return a(u,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:f,role:k,...typeof u.text=="string"?{text:u.text}:{},...R?{turn:R}:{},...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"),k=me(u,"card_id");if(!f)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!k)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:k,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,k=typeof u.bind=="string"?u.bind:void 0,R=typeof u.maxRows=="number"?u.maxRows:void 0,b=k?Zr(t,k):void 0,S={id:typeof c.id=="string"&&c.id?c.id:`element-${a}`,kind:c.kind,label:c.label,visible:f};return b!==void 0&&(S.resolved=Array.isArray(b)&&typeof R=="number"?b.slice(0,R):b),S})}}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:"",k=typeof u.ref=="string"?u.ref:"";if(!f||!k)continue;let R=Zr(t,k);R!==void 0&&(a[f]=R);}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 k=0;k<u.length-1;k+=1){let R=u[k];(!f[R]||typeof f[R]!="object")&&(f[R]={}),f=f[R];}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:k,readFetchedSourceJsonByRef:R}=e;function b(y,P){if(typeof y=="function")return y;throw new Error(`${P} is not configured for this MCP facade`)}async function S(){let y=await ze(n.get({}),"cardStore.get");return Array.isArray(y.cards)?y.cards.map(P=>z(P)).filter(P=>!Sr(P)):[]}function _(y){if(Array.isArray(y.bytes))return new Uint8Array(y.bytes.map(P=>Math.max(0,Math.min(255,Number(P)||0))));if(typeof y.text=="string")return new TextEncoder().encode(y.text);if(typeof y.base64=="string"){let P=String(y.base64).replace(/-/g,"+").replace(/_/g,"/"),q=P+"=".repeat((4-P.length%4)%4),D=atob(q);return Uint8Array.from(D,M=>M.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function T(){let y=z(await ze(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:y.version,commonSourceFields:z(y.commonSourceDefFields),sourceKinds:z(y.sourceKinds)}}async function I(){let y=z(await ze(t.status({}),"status")),P=z(y.summary),q=Fe(y.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)),$=q.filter(se=>!M.has(String(z(se).name??"")));return {meta:z(y.meta),summary:{card_count:typeof P.card_count=="number"?P.card_count:0,completed:typeof P.completed=="number"?P.completed:0,eligible:typeof P.eligible=="number"?P.eligible:0,pending:typeof P.pending=="number"?P.pending:0,blocked:typeof P.blocked=="number"?P.blocked:0,in_progress:typeof P.in_progress=="number"?P.in_progress:0,failed:typeof P.failed=="number"?P.failed:0,unresolved:typeof P.unresolved=="number"?P.unresolved:0},cards:$.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(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let q=z(await ze(t.status({}),"status")),M=Fe(q.cards).map(z).find(he=>he.name===P);if(!M)throw new Error(`card "${P}" not found in board status`);let $=z(await Pt(n,P)),se=br($),ce=Fe(M.requires_satisfied).filter(he=>typeof he=="string"&&!!he),be=Fe(M.provides_runtime).filter(he=>typeof he=="string"&&!!he),Te=Object.fromEntries(await Promise.all(ce.map(async he=>[he,await ze(t.getOutputsDataObject({params:{key:he}}),`getOutputsDataObject(${he})`)]))),_e=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:P}}),"getOutputsComputedValues")),ke=await ze(t.getOutputsFetchedSources({params:{key:P}}),"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(!R||typeof et!="string"){Ke[Je]=null;continue}try{Ke[Je]=R({cardId:P,ref:et});}catch{Ke[Je]=null;}}let qe={card_data:z($.card_data),requires:Te,fetched_sources:Ke,computed_values:pe};return {cardId:P,card_status_in_board:M,card_definition_and_static_data:se,refs_for_fetched_source_files:ke,runtime_data:{requires:Te,provides:_e,computed_values:pe,rendered_view:Xr($,qe)}}}async function g(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("inspectChatMessagesOnCards requires cardId");let q=typeof y.turnId=="string"?y.turnId:"",D=y.allTurns===true,M=typeof y.tailTurnsBeforeId=="string"?y.tailTurnsBeforeId:"",$=D?void 0:y.lastUserTurns??(q?void 0:1),se=y.tail,ce={...$===void 0?{}:{tailTurns:$},...q?{turnId:q}:{},...D?{allTurns:true}:{},...M?{tailTurnsBeforeId:M}:{}},be=Object.keys(ce).length>0?{params:{cardId:P},body:ce}:{params:{cardId:P}},Te=at(await o.readAll(be),"chatStore.readAll"),_e=z(await Pt(n,P)),pe=Fe(z(_e.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(Te.records)?Te.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 ${P} --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:P,messages:typeof se=="number"&&se>=0?Ve.slice(-se):Ve}}async function l(y){let P=String(y.cardId||"").trim(),q=Number(y.fileIdx);if(!P)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(q)||q<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let D=z(await Pt(n,P)),M=Fe(z(D.card_data).files).map(z);if(q>=M.length)throw new Error(`attachment index ${q} is out of range for card "${P}"`);let $=M[q],se=typeof $.stored_name=="string"?$.stored_name:null;return {cardId:P,fileIdx:q,downloadUrl:k({cardId:P,fileIdx:q,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(y){return await r.validateCardPreflight({body:wa(y.candidateCardContent)})}function d(y){if(!y.mockRequires||typeof y.mockRequires!="object"||Array.isArray(y.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!y.mockFetchedSources||typeof y.mockFetchedSources!="object"||Array.isArray(y.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let P=r.evalCardCompute({body:{"card-content":y.candidateCardContent,"mock-requires":y.mockRequires,"mock-fetched-sources":y.mockFetchedSources}});if(P.status!=="success")return P;let q=z(po(P,"evalCardCompute")),D=z(y.candidateCardContent),M={card_data:z(D.card_data),requires:z(y.mockRequires),fetched_sources:z(y.mockFetchedSources),computed_values:z(q.computed_values)};return {status:"success",data:{cardId:typeof q.cardId=="string"?q.cardId:typeof D.id=="string"?D.id:"(unknown)",ok:q.ok===true,computed_values:z(q.computed_values),errors:Fe(q.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(y){return await r.probeSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":y.candidateCardContent,"mock-projections":y.mockProjections}})}async function p(y){return await r.runSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":y.candidateCardContent,"mock-projections":y.mockProjections}})}async function h(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!y.mockRequires||typeof y.mockRequires!="object"||Array.isArray(y.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let q=z(await Pt(n,P)),D=Fe(q.source_defs).filter($=>!!$&&typeof $=="object"&&!Array.isArray($)),M={};if(y.sourceIdx>=0&&y.sourceIdx<D.length){let $=D[y.sourceIdx],se=We.enrichSourcesSync([$],{card_data:z(q.card_data),requires:y.mockRequires});Array.isArray(se)&&se.length>0&&(M=z(se[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:y.sourceIdx},body:{"card-content":q,"mock-requires":y.mockRequires,"mock-projections":M}})}async function w(y){let P=z(await ze(r.simulateCardCycle({body:{"card-content":y.candidateCardContent,"mock-requires":y.mockRequires}}),"simulateCardCycle")),q=z(y.candidateCardContent),D=z(P.validation),M=Fe(P.source_probes),$=Fe(P.projection_errors),se=z(P.fetched_sources),ce=Fe(P.compute_errors),be=z(P.computed_values),Te={card_data:z(q.card_data),requires:y.mockRequires,fetched_sources:se,computed_values:be},_e=[];for(let pe of Fe(D.issues))typeof pe=="string"&&pe&&_e.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&&_e.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";_e.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";_e.push(`${Ve}: ${Se}`);}return {status:"success",data:{cardId:typeof P.cardId=="string"?P.cardId:"(unknown)",ok:P.ok===true,issues:_e,provides_outputs:go(q,Te),rendered_view:Xr(q,Te)}}}async function O(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("manageReadCard requires cardId");let q=await ze(n.get({params:{id:P}}),"cardStore.get");return (Array.isArray(q.cards)?q.cards.map(z):[]).map(M=>br(M))}async function N(y){let P=await Promise.all(Fe(y.files).map(async q=>{let D=z(q),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:y.cardId,fileName:M,contentType:$,bytes:_(D),suppressChatRecordWrite:true})}));for(let[q,D]of P.entries()){let M=z(D.file),$=typeof D.file_idx=="number"&&Number.isInteger(D.file_idx)&&D.file_idx>=0?D.file_idx:q,se=y.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:y.cardId},body:{role:"system",text:se,files:[],turn:y.turn}}),"chatStore.append(system attachment message)");}return P.map(q=>q.file)}async function U(y){let P=String(y.cardId||"").trim(),q=String(y.role||"user").trim()||"user",D=typeof y.turn=="string"?y.turn:"";if(!P)throw new Error("manageAddChatAttachment requires cardId");let M=await N({cardId:P,role:q,turn:D,files:y.files});return {status:"success",data:{cardId:P,turn:D,files:M}}}async function J(y){let P=String(y.cardId||"").trim(),q=String(y.role||"").trim(),D=typeof y.text=="string"?y.text:"",M=typeof y.turn=="string"?y.turn:"";if(!P)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!q)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(q==="assistant"&&M){let ce=at(await o.readAll({params:{cardId:P},body:{turnId:M}}),"chatStore.readAll(existing turn messages)"),be=Array.isArray(ce.records)?ce.records.find(Te=>Te.role==="assistant"&&String(Te.turn||"")===M):void 0;if(be)return {status:"success",data:{cardId:P,id:String(be.id),role:q,turn:M,files:Array.isArray(be.files)?be.files:[]}}}let $=await N({cardId:P,role:q,turn:M,files:y.files}),se=at(await o.append({params:{cardId:P},body:{role:q,text:D,files:$,turn:M}}),"chatStore.append");return {status:"success",data:{cardId:P,id:String(se.id),role:q,turn:M,files:$}}}async function ae(y,P={}){let q=String(y.cardId||"").trim(),D=z(y.patch);if(!q)throw new Error("managePatchCard requires cardId");let M=await O({cardId:q}),$=z(M[0]),se=xa($,D);return Q({cardId:q,candidateCardContent:se},P)}async function Q(y,P={}){let q=String(y.cardId||"").trim(),D=z(y.candidateCardContent),M=br(D);if(!q)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!==q)throw new Error(`candidateCardContent.id must match cardId (${q})`);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,q);}catch{se=null;}let ce=se?z(se):null;if(ce&&Sr(ce)&&!P.allowControlplaneOnlyCards)throw Object.assign(new Error(`Card "${q}" not found`),{statusCode:404});let be={...M,...ce&&va(ce,"__private")?{__private:ce.__private}:{}},Te=await n.set({body:be});at(Te,"cardStore.set");let _e;try{_e=await t.upsertCard({params:{cardId:q,restart:!0}}),at(_e,"upsertCard");}catch(pe){try{se&&await n.set({body:se});}catch{}throw pe}return {status:"success",data:{validation:$,card_saved:null,board_result:_e}}}async function te(y,P={}){let q=String(y.cardId||"").trim();if(!q)throw new Error("manageRemoveCard requires cardId");if(!P.allowControlplaneOnlyCards){let $=await ze(n.get({params:{id:q}}),"cardStore.get");if((Array.isArray($.cards)?$.cards.map(z):[]).some(Sr))throw Object.assign(new Error(`Card "${q}" not found`),{statusCode:404})}let D=await t.removeCard({params:{id:q}});at(D,"removeCard");let M=await n.del({params:{id:q}});return at(M,"cardStore.del"),{status:"success",data:{board_result:D,store_result:M}}}async function ue(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("adminReadCard requires cardId");let q=await ze(n.get({params:{id:P}}),"cardStore.get");return Array.isArray(q.cards)?q.cards.map(D=>z(D)):[]}async function G(y){let P=String(y.cardId||"").trim(),q=z(y.candidateCardContent),D=br(q);if(!P)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!==P)throw new Error(`candidateCardContent.id must match cardId (${P})`);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,P);}catch{ce=null;}let be=ce?z(z(ce).__private):{},Te={...D,__private:{...be,visible_controlplane_only:true}},_e=await n.set({body:Te});at(_e,"cardStore.set");let pe;try{pe=await t.upsertCard({params:{cardId:P,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(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("getChatProcessing requires cardId");let q=po(await o.isProcessing({params:{cardId:P}}),"chatStore.isProcessing");return {cardId:P,active:!!q.active}}async function re(y){let P=String(y.cardId||"").trim();if(!P)throw new Error("setChatProcessing requires cardId");if(typeof y.active!="boolean")throw new Error("setChatProcessing requires boolean active");return at(await o.setProcessing({params:{cardId:P},body:{active:y.active}}),"chatStore.setProcessing"),{cardId:P,active:y.active}}async function B(){let y=await b(a,"webhook.process-accumulated")();return y?.status==="fail"||y?.status==="error"?y:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(y??{},"data")?y.data??null:null}}}async function x(y){let P=String(y.token||"").trim(),q=String(y.ref||"").trim();if(!P)throw new Error("webhookSourceFetchDone requires token");if(!q)throw new Error("webhookSourceFetchDone requires ref");let D=await b(c,"webhook.source-fetch-done")({token:P,ref:q});return D?.status==="fail"||D?.status==="error"?D:{status:"success",data:{token:P,ref:q,runtime_result:Object.prototype.hasOwnProperty.call(D??{},"data")?D.data??null:null}}}async function K(y){let P=String(y.token||"").trim(),q=String(y.reason||"").trim();if(!P)throw new Error("webhookSourceFetchFailed requires token");if(!q)throw new Error("webhookSourceFetchFailed requires reason");let D=await b(u,"webhook.source-fetch-failed")({token:P,reason:q});return D?.status==="fail"||D?.status==="error"?D:{status:"success",data:{token:P,reason:q,runtime_result:Object.prototype.hasOwnProperty.call(D??{},"data")?D.data??null:null}}}return {listRuntimeCards:S,discoverSourceKinds:T,inspectBoardRuntimeStatus:I,inspectCardDefinitionAndRuntime:A,inspectChatMessagesOnCards:g,inspectFileContents:l,preflightValidateCandidateCardDefinition:i,preflightMaterializeCandidateCard:d,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:h,preflightRunOneCycleWithCandidateCard:w,manageReadCard:O,manageAddChatAttachment:U,manageAddChatEntryAndAnyAttachments:J,managePatchCard:ae,manageUpsertCard:Q,manageRemoveCard:te,adminReadCard:ue,adminUpsertCard:G,getChatProcessing:Z,setChatProcessing:re,webhookProcessAccumulated:B,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:k,reportSourceFetched:R,reportSourceFetchFailure:b,uploadCardFile:S,chatStorePublic:_,serverUrl:T,apiBasePath:I}=e;function A(){return t[0]??null}function g(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let p=m?.params?.key;return p?{status:"success",data:(await a())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let p=m?.params?.key;return p?{status:"success",data:(await c())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let p=m?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let h=n(p)??A();return h?h.boardOps.getOutputsFetchedSources({params:{key:p}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let p=m?.params?.id;if(!p)return {status:"fail",error:"removeCard requires params.id"};let h=n(p)??A();return h?h.boardOps.removeCard({params:{id:p}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"upsertCard requires params.cardId"};let h=n(p)??A();if(!h)return {status:"fail",error:"Board context is unavailable"};let w=await h.boardOps.upsertCard({params:{cardId:p,restart:m.params.restart===true}});if(w.status!=="success")return w;if(rt(h.boardAdapter)){let O=await k(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 h=await u(p);return h?{status:"success",data:{cards:[h]}}:{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 h=Array.isArray(p)?p:[p];for(let w of h){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:h.length}}},async del(m){let p=[m.params?.id,...m.body?.ids??[]].filter(h=>typeof h=="string"&&!!h);if(p.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let h of p){let w=n(h)??A();if(!w)return {status:"fail",error:"Board context is unavailable"};let O=await w.cardStoreOps.del({params:{id:h}});if(O.status!=="success")return O;r.delete(h);}return {status:"success",data:{count:p.length}}},async patch(m){let p=typeof m.params?.id=="string"?m.params.id:void 0,h=typeof m.params?.path=="string"?m.params.path:void 0;if(!p||!h)return {status:"fail",error:"patch requires params.id and params.path"};let 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 h=n(p)??A();return h?h.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function d(){return yo({board:g(),nonCore:l(),cardStore:i(),chatStore:_,processAccumulated:()=>k(true),sourceFetchDone:({token:m,ref:p})=>R(m,p),sourceFetchFailed:({token:m,reason:p})=>b(m,p),uploadCardFile({cardId:m,fileName:p,contentType:h,bytes:w,suppressChatRecordWrite:O}){return S(m,p,h,w,{inChat:true,...O===true?{suppressChatRecordWrite:true}:{}})},buildFileDownloadUrl({cardId:m,fileIdx:p,storedName:h}){let w=`${T||""}${I}/cards/${encodeURIComponent(m)}/files/${p}`;return h?`${w}?sn=${encodeURIComponent(h)}`:w},readFetchedSourceJsonByRef({cardId:m,ref:p}){let h=n(m)??A();if(!h||rt(h.boardAdapter))return null;let N=h.boardAdapter.resolveBlob(it(p)).trim();return N?JSON.parse(N):null}})}return {mcpBoardFacade:g,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:k}=e;async function R(b,S,_){let T=b.method||"GET",I=_,A=I.pathname;try{if(T==="POST"&&A===`${t}/mcp`){await o();let g=await n(b),l=typeof g.tool=="string"?g.tool.trim():"",i=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!l)return r(S,400,{error:"tool is required"}),!0;if(l==="inspect.file-contents")return r(S,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(S,400,{error:nt(d,"Request failed")}),!0;if(m.status==="error")return r(S,500,{error:nt(d,"Internal error")}),!0}r(S,200,d);}catch(d){let m=typeof d?.statusCode=="number"?Number(d.statusCode):500,p=d instanceof Error?d.message:String(d);r(S,m,{error:p});}return !0}if(T==="POST"&&A===`${t}/mcp-raw`){await o();let g=await n(b),l=typeof g.tool=="string"?g.tool.trim():"",i=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!l)return r(S,400,{error:"tool is required"}),!0;if(l!=="inspect.file-contents")return r(S,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"),h=ut(i,"tail-lines","tailLines"),w=ut(i,"head-bytes","headBytes"),O=ut(i,"tail-bytes","tailBytes");if(!d)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([p,h,w,O].filter(B=>B!==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[B,x]of [["head-lines",p],["tail-lines",h],["head-bytes",w],["tail-bytes",O]])if(x!==void 0&&(!Number.isInteger(x)||x<0))return r(S,400,{error:`inspect.file-contents requires ${B} 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=(I.searchParams.get("resp")||"").trim().toLowerCase();if(G&&G!=="json-b64")return r(S,400,{error:`unsupported resp mode: ${G}`}),!0;let Z=G==="json-b64",re;if(p!==void 0||h!==void 0){if(!f(ue))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 B=new TextDecoder().decode(Q),x=p!==void 0?k(B,"head",p):k(B,"tail",h);re=typeof Buffer<"u"?Buffer.from(x,"utf8"):new TextEncoder().encode(x);}else if(w!==void 0||O!==void 0){let B=w??O;re=w!==void 0?Q.slice(0,B):Q.slice(Math.max(0,Q.length-B));}else re=Q;if(Z){let B=typeof Buffer<"u"?Buffer.from(re).toString("base64"):btoa(String.fromCharCode(...re));return r(S,200,{bodyBase64:B,mimeType:ue,filename:te,byteLength:re.length}),!0}return S.writeHead(200,{"Content-Type":ue,"Content-Disposition":`attachment; filename="${te}"`,"Content-Length":re.length}),S.end(re),!0}return !1}catch(g){let l=g?.statusCode||500;return r(S,l,{error:String(g?.message||g)}),true}}return {handleAgentfaceApi:R}}function ko(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:a}=e;async function c(u,f,k){let R=u.method||"GET",b=k.pathname;try{if(R==="POST"&&b===`${t}/mcp-webhooks`){await o();let S=await n(u),_=typeof S.tool=="string"?S.tool.trim():"",T=S.args&&typeof S.args=="object"&&!Array.isArray(S.args)?S.args:{};if(!_)return r(f,400,{error:"tool is required"}),!0;try{let I=await gt(_,T,a());if(I&&typeof I=="object"&&!Array.isArray(I)){let A=I;if(A.status==="fail")return r(f,400,{error:nt(I,"Request failed")}),!0;if(A.status==="error")return r(f,500,{error:nt(I,"Internal error")}),!0}r(f,200,I);}catch(I){let A=typeof I?.statusCode=="number"?Number(I.statusCode):500,g=I instanceof Error?I.message:String(I);r(f,A,{error:g});}return !0}return !1}catch(S){let _=S?.statusCode||500;return r(f,_,{error:String(S?.message||S)}),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(R,b,S,_,T){if(!t.has(b)){n(R,404,{error:`SSE client not connected: ${b}`});return}T?(t.subscribeChannel(b,S,_.cardId),c?.(b,S,_)):(t.unsubscribeChannel(b,S,_.cardId),u?.(b,S,_)),n(R,200,{ok:true,clientId:b,channelName:S,..._.cardId?{cardId:_.cardId}:{},subscribed:T});}async function k(R,b,S,_){let T=_?.oneShot===true,I=_?.bootstrapPayload!==false,A=!T&&S?t.get(S):null,g=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(b.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(b),I){let m=await o(),p=t.buildFrame(m);b.write(p);}if(T){b.end();return}if(!S)throw new Error("clientId is required for streaming SSE");t.register(S,b,{subscribedChatCardIds:g,subscribedChannelNames:l,subscribedCardChannels:i});try{a?.(S,m=>{t.writeFrame(S,m);});}catch{}let d=setInterval(()=>{try{b.write(`: keepalive
5
5
 
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
6
+ `);}catch{}},15e3);R.on("close",()=>{clearInterval(d),t.disconnect(S,b);});}return {handleChannelSubscription:f,handleSse:k}}function Co(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:a,boardContexts:c,publishPersistedStateSnapshot:u,upsertCardsFromSource:f,sseHub:k,queueSseHub:R}=e,{handleSse:b,handleChannelSubscription:S}=en(e),{handleSse:_}=en({...e,sseHub:R,buildPublishedRuntimePayload:async()=>null});async function T(I,A,g){let l=I.method||"GET",i=g,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 b(I,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 _(I,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(I),U=typeof N?.clientId=="string"?N.clientId.trim():"";return U?await k.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(I),U=typeof N?.clientId=="string"?N.clientId.trim():"";return U?k.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 h=d.match(new RegExp(`^${st(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(l==="POST"&&h){await a();let O=decodeURIComponent(h[1]),N=h[2]==="subscribe",U=await n(I),J=typeof U?.clientId=="string"?U.clientId.trim():"";return J?(S(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(I),ae=typeof J?.clientId=="string"?J.clientId.trim():"";return ae?(S(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:T,handleSse:b,handleChannelSubscription:S}}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,k){if(k.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 R;try{R=await n(u);}catch{return o(f,400,{status:"error",error:"Invalid JSON body"}),true}if(!R||typeof R!="object"||!Array.isArray(R.notifications))return o(f,400,{status:"error",error:"body.notifications must be an array"}),true;let b=R.notifications,{accepted:S,rejected:_}=no(b,Date.now(),Ta);return S.length>0&&r(S),o(f,200,{status:"success",data:{accepted:S.length,rejected:_}}),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,k=e.notificationTransport||null,R=e.serverUrl||null,b=e.executionExtra||{},S=e.onSseClientConnected,_=e.onSseClientDisconnected,T=e.onChannelSubscribed,I=e.onChannelUnsubscribed,A=Qr({buildChatOneShotBatch:async(s,C)=>await be.buildSseOneShotBatch({params:{cardId:s},body:{receiving:C}}),onSseClientDisconnected:_}),g=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 E(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)?E(s.boardAdapter):C(s.boardAdapter),Ue=s.nonCoreAdapter??(!rt(le)&&w(le)?le:null),xe=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 xe.init(ee)},async status(ee){return xe.status(ee)},async getConfig(ee){return xe.getConfig(ee)},async getAllOutputsDataObjects(ee){return xe.getAllOutputsDataObjects(ee)},async getAllOutputsComputedValues(ee){return xe.getAllOutputsComputedValues(ee)},async getOutputsFetchedSources(ee){return xe.getOutputsFetchedSources(ee)},async buildSseOneShotPayload(ee){return xe.buildSseOneShotPayload(ee)},async upsertCard(ee){return xe.upsertCard(ee)},async removeCard(ee){return xe.removeCard(ee)},async sourceDataFetched(ee){return xe.sourceDataFetched(ee)},async sourceDataFetchFailure(ee){return xe.sourceDataFetchFailure(ee)}};return ne={label:s.label,board:xe,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 h(s,C){if(rt(s.boardAdapter)){let L=s.boardAdapter.queueStorageForRef(p(s),C);return Vr(L)}let E=s.boardAdapter.queueStorageForRef(p(s),C);return Hr(E)}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"?y(s.cardId)??void 0:i[0]??void 0}function ae(s){for(let C of s){let E=J(C);if(E)return E}return i[0]??void 0}function Q(s,C={}){if(!s||s.length===0)return;let E=De(s),L={kind:"notification-batch",notifications:E},H=C.ctx??ae(E);if(C.appendState!==false&&H&&so(H.notification,L),C.broadcastSse!==false){let ne=E.filter(le=>le.kind==="message_enqueued"),X=E.filter(le=>le.kind!=="message_enqueued");X.length>0&&A.broadcastNotificationBatch(X),ne.length>0&&g.broadcastNotificationBatch(ne);}if(!(C.mirrorExternal===false||!H?.boardAdapter.publishBoardChangeNotifications))try{let ne=E.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||!k||!s.notifyRef)return;let C=await k.subscribe(s.notifyRef,E=>{let L=ro(E);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},E={};s.taskExecutorRef&&(E["task-executor-ref"]=s.taskExecutorRef),s.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=s.chatHandlerFlow);let L=await s.boardOps.init({params:C,body:E});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=[],E=await s.boardOps.status({});E.status==="success"&&E.data!=null&&Jr(E.data)&&C.push({kind:"status",status:E.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 E=await s.cardStoreOps.get({}),L=E.status==="success"&&Array.isArray(E.data?.cards)?E.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 B(){for(let s of i)await G(s);}async function x(){await B();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 B();for(let C of i){let E=await C.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}function y(s){return i[m(s)]??null}async function P(s){let C=y(s);if(!C)return null;let E=await C.cardStoreOps.get({params:{id:s}});if(E.status!=="success")return null;let L=Array.isArray(E.data?.cards)?E.data.cards:[];return L.length>0?L[0]:null}async function q(){let s=async E=>{if(!E)return [];let L=await E.cardStoreOps.get({});return L.status!=="success"||!Array.isArray(L.data?.cards)?[]:L.data.cards},C=[];for(let E of i)C.push(...await s(E));return C}function D(){return i[0]??null}function M(s){return y(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 E=await be.setProcessing({params:{cardId:s},body:{active:C}});if(E.status!=="success")throw Object.assign(new Error(E.error||`Failed to set chat processing for card: ${s}`),{statusCode:500})}let be=to({append(s,C,E,L,H){return $(s).append(s,C,E,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]);}}),Te=ho({boardContexts:i,cardOwnerIndex:d,cardContextForCard:s=>y(s),readStatusSnapshot:()=>he(),readDataObjectsByToken:()=>Je(),readCardRuntimeArtifacts:()=>et(),readCardFromStore:s=>P(s),readCardDefinitions:()=>q(),processAccumulatedLaneInternal:s=>K(s),reportSourceFetched:(s,C)=>Bt(s,{ref:C}),reportSourceFetchFailure:(s,C)=>Vt(s,{reason:C}),uploadCardFile:(s,C,E,L,H)=>ie(s,C,E,L,H),chatStorePublic:be,serverUrl:R,apiBasePath:t}),_e=Te.mcpCardStoreFacade,pe=Te.createMcpFacade,ke=io({boardId:o,bootstrapBoard:()=>x(),sseHub:A,onChannelSubscribed:T,onChannelUnsubscribed:I,getMcpFacade:()=>pe(),getMcpCardStoreFacade:()=>_e()});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,E){let L=E?.syncBoard!==false,H=E?.restartOnlyIfChanged===true,ne=y(s);if(!ne)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});let X=await P(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 xe=await ne.cardStoreOps.set({body:Ue});if(xe.status!=="success")throw Object.assign(new Error(xe.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=y(s);if(!C)throw Object.assign(new Error(`Card not found: ${s}`),{statusCode:404});if(!await P(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 F(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,E,L,H=""){let ne=typeof E=="string"?E.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 E=Number.isInteger(C?.tailTurns)&&C?.tailTurns>0?C?.tailTurns:void 0,L=await be.readAll({params:{cardId:s},...E===void 0?{}:{body:{tailTurns:E}}});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=>P(s),updateCardLocalOnly:(s,C)=>v(s,C),writeChatRecord:(s,C,E,L,H)=>V(s,C,E,L,H)}).uploadCardFile;async function Re(s){let C=y(s);if(!C)return null;let E=await C.boardOps.getConfig({params:{key:"chat-handler-flow"}}),H=(E.status==="success"?E.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 E=C.slice(Ut.length,C.length-Ut.length).trim(),L=/^([A-Za-z0-9_-]+)__(.*)$/s.exec(E);return L?{assistant:L[1].trim().toLowerCase(),text:L[2].trim()}:{assistant:"echo",text:E}}async function je(s,C,E=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(!E)try{await ce(s,!0);}catch{}let xe={boardId:o,cardId:String(s),lastChatEntryId:C,...L?{turnId:L}:{},...typeof H=="string"&&H.trim()?{probe:H.trim()}:{},...b,...R?{serverUrl:R}:{}},He=le!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:So}}:Ue;rt(X.boardAdapter)?await h(X,"chat-agent").enqueueRequest({boardId:o,ref:He,args:le!=null?{...xe,__chatHandlerFlow:le}:xe}):h(X,"chat-agent").enqueueRequest({boardId:o,ref:He,args:le!=null?{...xe,__chatHandlerFlow:le}:xe}),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,E){if(C.howToRun==="built-in"&&on(C)===So){let L=f,H=E.__chatHandlerFlow,ne={...E};return delete ne.__chatHandlerFlow,L?L.run(H,ne,{boardId:o,cardId:String(ne.cardId||""),label:s.label,logger:c,serverUrl:R,executionExtra:b}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return u.invoke(C,E)}async function Me(s,C=false){C||await B();let E=typeof s.args?.cardId=="string"?s.args.cardId:"",L=E?y(E):D();if(!L)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let H=await Le(L,s.ref,s.args);if(!H.dispatched){if(E)try{await ce(E,!1);}catch{}throw new Error(H.error||`chat-agent dispatch failed for card "${E||"unknown"}"`)}}async function Ye(s,C,E){if(C==="chat-send"){let H=E&&typeof E["turn-id"]=="string"?E["turn-id"]:E&&typeof E.turnId=="string"?E.turnId:E&&typeof E.turn=="string"?E.turn:"";if(E&&"files"in E&&E.files!==void 0&&E.files!==null)throw Object.assign(new Error('chat-send does not accept a "files" parameter; upload attachments via manage.add-chat-attachment first'),{statusCode:400});let ne=Ke(),X=Be(E?.text),le=X?X.text:E?.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 xe=Ue?.data?.id;if(typeof xe!="string"||!xe)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,xe,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(E?.files,ne);return le.length>0&&N().merge(X,le),H}if(C==="action"){let le=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!le)return H;X.lastAction={buttonId:le,at:ne},X.lastActionText=`${le} @ ${ne}`;}return H});}function Ge(s,C,E){let L=JSON.stringify(E),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,E){let L=await P(s);if(!L)throw Object.assign(new Error("Card not found"),{statusCode:404});let H=N().resolve(L.card_data,C,E);if(!H.ok&&H.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!H.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let ne=H.file,X=U(s),le=O(s),Ue=String(ne.stored_name||""),xe=`${X}/${Ue}`,He=le.files?await le.files.getBytes(xe):null;if(!He)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:ne,bytes:He}}async function ft(s,C,E,L){let{fileRecord:H,bytes:ne}=await Xe(C,E,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,E){let L=s.split(/\r?\n/);return (C==="head"?L.slice(0,E):L.slice(-E)).join(`
7
+ `)}async function mt(s){let C=[];for await(let L of s)C.push(L);let E=typeof Buffer<"u"?Buffer.concat(C).toString("utf-8").trim():new TextDecoder().decode(Pr(C)).trim();return E?JSON.parse(E):{}}async function Bt(s,C){let E=typeof C.ref=="string"?C.ref.trim():"";if(!E)return {status:"fail",error:"board-worker success callback requires body.ref"};let L=i[0];return L?L.boardOps.sourceDataFetched({params:{token:s,ref:E}}):{status:"fail",error:"no board context"}}async function Vt(s,C){let E=typeof C.reason=="string"&&C.reason.trim()?C.reason:"unknown",L=i[0];return L?L.boardOps.sourceDataFetchFailure({params:{token:s,reason:E}}):{status:"fail",error:"no board context"}}let tn=Co({sseHub:A,queueSseHub:g,corsHeaders:r,json:Ge,buildPublishedRuntimePayload:()=>tt(),onSseClientConnected:S,onChannelSubscribed:T,onChannelUnsubscribed:I,apiBasePath:t,readJsonBody:s=>mt(s),initBoardAndSetup:()=>B(),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,E)=>Xe(s,C,E),isLikelyTextMimeType:s=>_t(s),sliceTextByLines:(s,C,E)=>Et(s,C,E)}).handleAgentfaceApi,vr=ko({apiBasePath:t,json:Ge,readJsonBody:s=>mt(s),initBoardAndSetup:()=>B(),createMcpWebhookToolRegistry:()=>Se()}).handleWebhooksApi,ht=_r({apiBasePath:t,json:Ge,readJsonBody:s=>mt(s),bootstrapBoard:()=>x(),createMcpControlplaneToolRegistry:()=>Ke(),retriggerCard:s=>W(s),applyCardAction:(s,C,E)=>Ye(s,C,E),resolveChatHandlerTarget:s=>Re(s),sendCardFileDownloadResponse:(s,C,E,L)=>ft(s,C,E,L)}).handleRuntimeApi,Ht=bo({apiBasePath:t,emitNotifications:s=>te(s),readJsonBody:s=>mt(s),json:(s,C,E)=>Ge(s,C,E)}).handleNotifyRoute;async function Y(s,C,E){return !!(await vt(s,C,E)||await vr(s,C,E)||await tn(s,C,E)||await Ht(s,C,E)||await ht(s,C,E))}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:F,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 k(A){let g=String(A||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return g.length>0&&g.length<=64?g:null}function R(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 b(A,g,l){let i=JSON.stringify(l),d=typeof Buffer<"u"?Buffer.byteLength(i):new TextEncoder().encode(i).length;A.writeHead(g,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":d}),A.end(i);}async function S(A,g,l){let i=A.method||"GET",d=l.pathname;if(i==="GET"&&d===t)return b(g,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(),h={};try{h=p?JSON.parse(p):{};}catch{h={};}let w=k(h.id);if(!w)return b(g,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 b(g,409,{error:`Board "${w}" is already registered`}),true;let N=typeof h.label=="string"&&h.label.trim()?h.label.trim():w,U={id:w,label:N};for(let[J,ae]of Object.entries(h))J==="id"||J==="label"||ae!=null&&(U[J]=ae);return O.boards.push(U),f(O),b(g,200,{ok:true,board:U}),true}return false}async function _(A,g,l){let d=l.pathname.match(new RegExp(`^${st(t)}/([^/]+)(/|$)`));if(!d)return false;let m=k(decodeURIComponent(d[1]));return m?u().boards.some(w=>w.id===m)?!!await R(m).handleRuntimeApi(A,g,l):(b(g,404,{error:`Board "${m}" not registered. POST ${t} with {id} to register it first.`}),true):(b(g,400,{error:"Invalid board id"}),true)}async function T(A,g,l){return !!(await S(A,g,l)||await _(A,g,l))}function I(A){if(!u().boards.some(l=>l.id===A))throw Object.assign(new Error(`Board "${A}" not registered`),{statusCode:404});return {service:R(A)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:T,requireBoardService:I}}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