yaml-flow 8.5.2 → 8.6.1

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 (166) hide show
  1. package/browser/asset-integrity.json +3 -3
  2. package/examples/board/demo-shell-with-server.html +2 -2
  3. package/examples/board/doc.html +2 -2
  4. package/examples/board/server/board-server.js +266 -5
  5. package/examples/board/server/board-worker/task-executor.js +166 -51
  6. package/examples/board/server/chat-flow/copilot-chat/assistant.js +25 -12
  7. package/examples/board/server/chat-flow/copilot-chat/probe.js +7 -0
  8. package/examples/board/server/chat-flow/copilot-chat/shared.js +97 -0
  9. package/examples/board/server/chat-flow/flow-steps.json +109 -51
  10. package/examples/board/server-config.json +1 -0
  11. package/examples/board/test/server-http-test.js +870 -67
  12. package/examples/board-local/demo-shell-localstorage.html +3 -3
  13. package/lib/{artifacts-store-lib-D-k-E8Vy.d.ts → artifacts-store-lib-C1rtrkxm.d.ts} +1 -1
  14. package/lib/{artifacts-store-lib-CVgtQrNZ.d.cts → artifacts-store-lib-CLOtsiav.d.cts} +1 -1
  15. package/lib/artifacts-store-public.cjs +1 -1
  16. package/lib/artifacts-store-public.d.cts +3 -3
  17. package/lib/artifacts-store-public.d.ts +3 -3
  18. package/lib/artifacts-store-public.js +1 -1
  19. package/lib/batch/index.cjs +1 -1
  20. package/lib/batch/index.js +1 -1
  21. package/lib/board-live-cards-mcp.cjs +1 -1
  22. package/lib/board-live-cards-mcp.d.cts +36 -16
  23. package/lib/board-live-cards-mcp.d.ts +36 -16
  24. package/lib/board-live-cards-mcp.js +1 -1
  25. package/lib/board-live-cards-node.cjs +8 -16
  26. package/lib/board-live-cards-node.d.cts +32 -12
  27. package/lib/board-live-cards-node.d.ts +32 -12
  28. package/lib/board-live-cards-node.js +8 -16
  29. package/lib/{board-live-cards-public-BGS22cMb.d.ts → board-live-cards-public-CBVjm327.d.ts} +59 -24
  30. package/lib/{board-live-cards-public-B13InXhC.d.cts → board-live-cards-public-CPJy-aGW.d.cts} +59 -24
  31. package/lib/board-live-cards-public.cjs +1 -2
  32. package/lib/board-live-cards-public.d.cts +2 -2
  33. package/lib/board-live-cards-public.d.ts +2 -2
  34. package/lib/board-live-cards-public.js +1 -2
  35. package/lib/board-live-cards-server-runtime.cjs +1 -7
  36. package/lib/board-live-cards-server-runtime.d.cts +5 -5
  37. package/lib/board-live-cards-server-runtime.d.ts +5 -5
  38. package/lib/board-live-cards-server-runtime.js +1 -7
  39. package/lib/board-livegraph-runtime/index.cjs +1 -2
  40. package/lib/board-livegraph-runtime/index.js +1 -2
  41. package/lib/board-worker-adapter.cjs +21 -7
  42. package/lib/board-worker-adapter.d.cts +17 -2
  43. package/lib/board-worker-adapter.d.ts +17 -2
  44. package/lib/board-worker-adapter.js +21 -7
  45. package/lib/card-compute/index.cjs +1 -9
  46. package/lib/card-compute/index.js +1 -9
  47. package/lib/card-store-public.cjs +1 -1
  48. package/lib/card-store-public.d.cts +2 -2
  49. package/lib/card-store-public.d.ts +2 -2
  50. package/lib/card-store-public.js +1 -1
  51. package/lib/card-validation.cjs +1 -9
  52. package/lib/card-validation.js +1 -9
  53. package/lib/{chat-storage-lib-CJn7a6OH.d.ts → chat-storage-lib-Bce-xx6l.d.ts} +1 -1
  54. package/lib/{chat-storage-lib-0imhRX3l.d.cts → chat-storage-lib-CKylihjm.d.cts} +1 -1
  55. package/lib/chat-store-public.cjs +1 -1
  56. package/lib/chat-store-public.d.cts +3 -3
  57. package/lib/chat-store-public.d.ts +3 -3
  58. package/lib/chat-store-public.js +1 -1
  59. package/lib/chunk-2MZUYY65.cjs +2 -0
  60. package/lib/chunk-5DB54ZX2.cjs +2 -0
  61. package/lib/chunk-5EA2ESS4.cjs +16 -0
  62. package/lib/chunk-6APH25VI.js +2 -0
  63. package/lib/chunk-76ON3V7R.js +2 -0
  64. package/lib/chunk-7BKNHFNH.js +2 -0
  65. package/lib/chunk-CWREBRXS.js +3 -0
  66. package/lib/chunk-DAXACY63.js +2 -0
  67. package/lib/chunk-FW4363Y4.js +2 -0
  68. package/lib/chunk-FZ2SBU5M.js +3 -0
  69. package/lib/chunk-G4XXRHL2.cjs +3 -0
  70. package/lib/chunk-GNFE24S7.cjs +2 -0
  71. package/lib/chunk-GYQXDNNI.cjs +2 -0
  72. package/lib/chunk-H5KD3JPY.cjs +2 -0
  73. package/lib/chunk-HLJH7LGW.js +16 -0
  74. package/lib/chunk-I4WH5U5D.cjs +2 -0
  75. package/lib/chunk-IXZG74EW.cjs +2 -0
  76. package/lib/chunk-JAL25FGA.cjs +2 -0
  77. package/lib/chunk-JM5EKT57.js +2 -0
  78. package/lib/chunk-JMDHDY6M.js +2 -0
  79. package/lib/chunk-KBELAKIY.js +2 -0
  80. package/lib/chunk-KHJABJ45.cjs +3 -0
  81. package/lib/chunk-KLRUISRY.cjs +2 -0
  82. package/lib/chunk-KNFFDVLD.cjs +2 -0
  83. package/lib/chunk-LBMEVV4U.js +2 -0
  84. package/lib/chunk-LDAP75GN.js +2 -0
  85. package/lib/chunk-LODXIALE.cjs +2 -0
  86. package/lib/chunk-LVNQCE5X.cjs +3 -0
  87. package/lib/chunk-M7EQRS6W.js +3 -0
  88. package/lib/chunk-MNEOJWPS.js +10 -0
  89. package/lib/chunk-NJJ7WEDT.cjs +2 -0
  90. package/lib/chunk-NMZ6XNLB.cjs +3 -0
  91. package/lib/chunk-OPNGCSXJ.js +2 -0
  92. package/lib/chunk-P64UKI3L.cjs +8 -0
  93. package/lib/chunk-P7ZCDICS.cjs +2 -0
  94. package/lib/chunk-Q6H7NINN.cjs +5 -0
  95. package/lib/chunk-Q6VSL327.js +8 -0
  96. package/lib/chunk-QWBNDVUA.js +5 -0
  97. package/lib/chunk-S6DRP2HX.cjs +2 -0
  98. package/lib/chunk-UJ7ZTV4J.cjs +10 -0
  99. package/lib/chunk-UVE65IPR.cjs +3 -0
  100. package/lib/chunk-VCCTAUIG.js +2 -0
  101. package/lib/chunk-VGT3TRQG.js +3 -0
  102. package/lib/chunk-VLBB3D6B.js +3 -0
  103. package/lib/chunk-WDPOGXTY.js +2 -0
  104. package/lib/chunk-X3LC4LII.js +2 -0
  105. package/lib/chunk-YGKDQLYP.js +2 -0
  106. package/lib/chunk-YMEIPKLW.cjs +2 -0
  107. package/lib/config/index.cjs +1 -1
  108. package/lib/config/index.js +1 -1
  109. package/lib/continuous-event-graph/index.cjs +1 -2
  110. package/lib/continuous-event-graph/index.js +1 -2
  111. package/lib/event-graph/index.cjs +1 -22
  112. package/lib/event-graph/index.js +1 -22
  113. package/lib/execution-refs.cjs +1 -2
  114. package/lib/execution-refs.d.cts +3 -2
  115. package/lib/execution-refs.d.ts +3 -2
  116. package/lib/execution-refs.js +1 -2
  117. package/lib/index.cjs +2 -24
  118. package/lib/index.d.cts +1 -1
  119. package/lib/index.d.ts +1 -1
  120. package/lib/index.js +2 -24
  121. package/lib/server-runtime/index.cjs +1 -7
  122. package/lib/server-runtime/index.d.cts +6 -6
  123. package/lib/server-runtime/index.d.ts +6 -6
  124. package/lib/server-runtime/index.js +1 -7
  125. package/lib/step-machine/index.cjs +1 -11
  126. package/lib/step-machine/index.js +1 -11
  127. package/lib/step-machine-public/index.cjs +1 -4
  128. package/lib/step-machine-public/index.d.cts +1 -1
  129. package/lib/step-machine-public/index.d.ts +1 -1
  130. package/lib/step-machine-public/index.js +1 -4
  131. package/lib/{storage-interface-B2WD9D5n.d.cts → storage-interface-Ct-C4tlz.d.cts} +28 -1
  132. package/lib/{storage-interface-B2WD9D5n.d.ts → storage-interface-Ct-C4tlz.d.ts} +28 -1
  133. package/lib/stores/index.cjs +1 -2
  134. package/lib/stores/index.d.cts +1 -1
  135. package/lib/stores/index.d.ts +1 -1
  136. package/lib/stores/index.js +1 -2
  137. package/lib/stores/kv.cjs +1 -2
  138. package/lib/stores/kv.d.cts +1 -1
  139. package/lib/stores/kv.d.ts +1 -1
  140. package/lib/stores/kv.js +1 -2
  141. package/lib/stores/memory.cjs +1 -1
  142. package/lib/stores/memory.js +1 -1
  143. package/lib/{types-30R357js.d.ts → types-BuK2UMxk.d.ts} +4 -4
  144. package/lib/{types-CIgsh56O.d.cts → types-DRl0Hy_p.d.cts} +4 -4
  145. package/package.json +2 -16
  146. package/cli/board-live-cards-lib-COi4bSpk.d.ts +0 -322
  147. package/cli/browser-api/board-live-cards-browser-adapter.d.ts +0 -36
  148. package/cli/browser-api/board-live-cards-browser-adapter.js +0 -4
  149. package/cli/browser-api/card-store-browser-api.d.ts +0 -25
  150. package/cli/browser-api/card-store-browser-api.js +0 -2
  151. package/cli/browser-api/jsonata-sync.cjs +0 -7623
  152. package/cli/bundled/artifacts-store-cli.mjs +0 -12
  153. package/cli/bundled/batch-runner-cli.mjs +0 -3
  154. package/cli/bundled/board-live-cards-cli.mjs +0 -29
  155. package/cli/bundled/card-store-cli.mjs +0 -154
  156. package/cli/bundled/chat-store-cli.mjs +0 -16
  157. package/cli/bundled/jsonata-sync.cjs +0 -7623
  158. package/cli/bundled/step-machine-cli.mjs +0 -150
  159. package/cli/execution-interface-BCIhu1gO.d.ts +0 -442
  160. package/cli/types-H3EMBPY2.d.ts +0 -398
  161. package/examples/board/server/README-mcp-api.md +0 -680
  162. package/examples/board/test/server-http-mcp-test.js +0 -1163
  163. package/lib/board-livegraph-runtime/jsonata-sync.cjs +0 -7623
  164. package/lib/card-compute/jsonata-sync.cjs +0 -7623
  165. package/lib/continuous-event-graph/jsonata-sync.cjs +0 -7623
  166. package/lib/server-runtime/jsonata-sync.cjs +0 -7623
@@ -1,3 +1,2 @@
1
- import {createRequire}from'module';import'ajv-formats';var Ie="b64:";function Vt(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 s="";for(let o of t)s+=String.fromCharCode(o);n=btoa(s);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Bt(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),s=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function re(e){return `${Ie}${Vt(JSON.stringify(e))}`}function Oe(e){if(!e.startsWith(Ie))throw new Error(`Invalid ref format (expected ${Ie}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Bt(e.slice(Ie.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 et(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}var fe={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ne(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function pe(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function tt(e){return e.tasks??{}}function Me(e){return e?e.status===fe.FAILED||e.status===fe.INACTIVATED:false}function rt(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function nt(e){return e.maxExecutions}function ot(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===fe.COMPLETED){let o=e.tasks[n];o&&ne(o).forEach(u=>r.add(u));}return Array.from(r)}function st(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;ne(s).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function at(e,t,r){let n=e.tasks[t]??je(),s={};if(r){let a=r.tasks[t],u=pe(a);for(let f of u)for(let[C,I]of Object.entries(r.tasks))if(ne(I).includes(f)){let F=e.tasks[C];F?.lastDataHash&&(s[f]=F.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function it(e,t,r,n,s,o){let a=e.tasks[r]??je(),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=ne(u);let C=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let G=u.requires??[];for(let $ of G)for(let[k,R]of Object.entries(t.tasks))if(ne(R).includes($)){let P=e.tasks[k];P?.lastDataHash&&(C[$]=P.lastDataHash);break}}let I={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:C,error:void 0},F=[...new Set([...e.availableOutputs,...f])];return {...e,tasks:{...e.tasks,[r]:I},availableOutputs:F,lastUpdated:new Date().toISOString()}}function ut(e,t,r,n){let s=e.tasks[r]??je(),o=t.tasks[r];if(o?.retry){let f=s.retryCount+1;if(f<=o.retry.max_attempts){let C={...s,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:C},lastUpdated:new Date().toISOString()}}}let a={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},u=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&a.executionCount>=o.circuit_breaker.max_executions){let f=o.circuit_breaker.on_break;u=[...new Set([...u,...f])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:u,lastUpdated:new Date().toISOString()}}function ct(e,t,r,n){let s=e.tasks[t]??je(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function dt(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 je(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function qe(e,t){let r=`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=ft();let s={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:s}}function Kt(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:at(n,t.taskName,r)};case "task-completed":return {config:r,state:it(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:ut(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:ct(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:dt(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:Xt(n,t.action)};case "task-upsert":return Mt(e,t.taskName,t.taskConfig);case "task-removal":return Ut(e,t.taskName);case "node-requires-add":return Ht(e,t.nodeName,t.tokens);case "node-requires-remove":return Jt(e,t.nodeName,t.tokens);case "node-provides-add":return zt(e,t.nodeName,t.tokens);case "node-provides-remove":return Yt(e,t.nodeName,t.tokens);default:return e}}function lt(e,t){return t.reduce((r,n)=>Kt(r,n),e)}function Mt(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]:ft()},lastUpdated:new Date().toISOString()}}}function Ut(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function Ht(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=pe(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function Jt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=pe(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function zt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=ne(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function Yt(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=ne(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function we(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Ne(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 ft(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Xt(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 xe(e){let{config:t,state:r}=e,n=tt(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=Wt(n),a=ot(t,r.tasks),u=new Set([...a,...r.availableOutputs]),f=[],C=[],I=[],F=[];for(let[$,k]of Object.entries(n)){let R=r.tasks[$],P=rt(k,t.settings),K=P!=="once";if(R?.status===fe.RUNNING||Me(R))continue;let H=nt(k);if(H!==void 0&&R&&R.executionCount>=H||k.circuit_breaker&&R&&R.executionCount>=k.circuit_breaker.max_executions||!K&&R?.status===fe.COMPLETED)continue;if(K&&R?.status===fe.COMPLETED){let c=pe(k),l=false;switch(P){case "data-changed":{c.length>0&&c.some(b=>{for(let[w,O]of Object.entries(n))if(ne(O).includes(b)){let j=r.tasks[w];if(!j)continue;let J=R.lastConsumedHashes?.[b];return j.lastDataHash==null?j.executionCount>R.lastEpoch:j.lastDataHash!==J}return false})||(l=true);break}case "epoch-changed":{c.length>0&&c.some(b=>{for(let[w,O]of Object.entries(n))if(ne(O).includes(b)){let j=r.tasks[w];if(j&&j.executionCount>R.lastEpoch)return true}return false})||(l=true);break}case "time-based":{let h=k.refreshInterval??0;if(h<=0){l=true;break}let b=R.completedAt;if(!b){l=true;break}(Date.now()-Date.parse(b))/1e3<h&&(l=true);break}case "manual":l=true;break}if(l)continue}let m=pe(k);if(m.length===0){f.push($);continue}let A=[],p=[],d=[];for(let c of m){if(u.has(c))continue;let l=o[c]||[];l.length===0?A.push(c):l.every(b=>Me(r.tasks[b]))?d.push({token:c,failedProducer:l[0]}):p.push(c);}A.length>0?I.push({taskName:$,missingTokens:A}):d.length>0?F.push({taskName:$,failedTokens:d.map(c=>c.token),failedProducers:[...new Set(d.map(c=>c.failedProducer))]}):p.length>0?C.push({taskName:$,waitingOn:p}):f.push($);}let G={};if(f.length>1){let $=st(f,n);for(let[k,R]of Object.entries($))R.length>1&&(G[k]=R);}return {eligible:f,pending:C,unresolved:I,blocked:F,conflicts:G}}function Wt(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of ne(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var Ee=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Ue(e){let t=He(e);return Qt(t)}function He(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(He).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+He(t[n])).join(",")+"}"}function Qt(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Zt(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 er(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),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function pt(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Zt(t)}function tr(e){try{let t=JSON.parse(er(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function gt(e,t,r){let{handlers:n,onNodeRemoved:s,onDrain:o}=t,a=new Ee,u="state"in e&&"config"in e?e:qe(e),f=false,C=new Set,I=new Map(Object.entries(n)),F=new Ee,G=false,$=false;function k(){if(!f){if(G){$=true;return}G=true;try{do $=!1,R();while($)}finally{G=false;}}}function R(){let m=F.drain(),A=a.drain(),p=[...m,...A];if(p.length>0&&(u=lt(u,p),s)){for(let c of p)if(c.type==="task-removal")try{s(c.taskName);}catch(l){console.warn("[reactive] onNodeRemoved failed:",l instanceof Error?l.message:String(l));}}let d=xe(u);p.length>0&&o?.(p,u,d);for(let c of d.eligible)H(c);for(let c of p)if(c.type==="task-progress"){let{taskName:l,update:h}=c;if(!u.config.tasks[l])continue;let w=u.state.tasks[l];if(!w||w.status!=="running")continue;let O=pt(l),j=K(l,O,h).catch(J=>{f||(F.append({type:"task-failed",taskName:l,error:J.message??String(J),timestamp:new Date().toISOString()}),k());}).finally(()=>{C.delete(j);});C.add(j);}}function P(m){let p=u.config.tasks[m].requires??[],d=new Map;for(let[l,h]of Object.entries(u.config.tasks))for(let b of h.provides??[])d.set(b,l);let c={};for(let l of p){let h=d.get(l);h?c[l]=u.state.tasks[h]?.data:c[l]=void 0;}return c}async function K(m,A,p){let d=u.config.tasks[m],c=d.taskHandlers??[],l=P(m);for(let h of c){let b=I.get(h);if(!b)throw new Error(`Handler '${h}' not found in registry (task '${m}')`);let w={nodeId:m,state:l,taskState:u.state.tasks[m],config:d,callbackToken:A,update:p};if(await b(w)==="task-initiate-failure")throw new Error(`Handler '${h}' returned task-initiate-failure (task '${m}')`)}}function H(m){let p=u.config.tasks[m]?.taskHandlers;if(!p||p.length===0)return;F.append({type:"task-started",taskName:m,timestamp:new Date().toISOString()}),k();let d=pt(m),c=K(m,d).catch(l=>{f||(F.append({type:"task-failed",taskName:m,error:l.message??String(l),timestamp:new Date().toISOString()}),k());}).finally(()=>{C.delete(c);});C.add(c);}return {push(m){f||(m.type==="task-completed"&&m.data&&!m.dataHash&&(m={...m,dataHash:Ue(m.data)}),a.append(m),k());},pushAll(m){if(!f){for(let A of m)A.type==="task-completed"&&A.data&&!A.dataHash?a.append({...A,dataHash:Ue(A.data)}):a.append(A);k();}},resolveCallback(m,A,p){if(f)return;let d=tr(m);if(!d)return;let{taskName:c}=d;if(u.config.tasks[c]){if(p&&p.length>0)a.append({type:"task-failed",taskName:c,error:p.join("; "),timestamp:new Date().toISOString()});else {let l=A&&Object.keys(A).length>0?Ue(A):void 0;a.append({type:"task-completed",taskName:c,data:A,dataHash:l,timestamp:new Date().toISOString()});}k();}},addNode(m,A){f||(a.append({type:"task-upsert",taskName:m,taskConfig:A,timestamp:new Date().toISOString()}),k());},removeNode(m){f||(a.append({type:"task-removal",taskName:m,timestamp:new Date().toISOString()}),k());},addRequires(m,A){f||(a.append({type:"node-requires-add",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),k());},removeRequires(m,A){f||(a.append({type:"node-requires-remove",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),k());},addProvides(m,A){f||(a.append({type:"node-provides-add",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),k());},removeProvides(m,A){f||(a.append({type:"node-provides-remove",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),k());},registerHandler(m,A){I.set(m,A);},unregisterHandler(m){I.delete(m);},retrigger(m){f||u.config.tasks[m]&&(a.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()}),k());},retriggerAll(m){if(!f){for(let A of m)u.config.tasks[A]&&a.append({type:"task-restart",taskName:A,timestamp:new Date().toISOString()});k();}},snapshot(){return we(u)},getState(){return u},getSchedule(){return xe(u)},async waitForHandlers(){C.size>0&&await Promise.allSettled([...C]);},async dispose(m){m?.wait&&C.size>0&&await Promise.allSettled([...C]),f=true;}}}var nr=createRequire(import.meta.url);nr("./jsonata-sync.cjs");var sr=createRequire(import.meta.url),De=sr("./jsonata-sync.cjs"),kt=De;function mt(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function yt(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function ar(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 s of e.compute)try{let o=await De(s.expr).evaluate(n);yt(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function ir(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},s=[];for(let o of e.compute)try{let a=kt(o.expr).evaluate(n);yt(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch(a){let u=a instanceof Error?a.message:String(a);s.push({bindTo:o.bindTo,error:u});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function ur(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return De(e).evaluate(n)}function cr(e,t){return t.startsWith("fetched_sources.")?mt(e._sourcesData??{},t.slice(16)):mt(e,t)}var ht=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),dr=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function lr(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))dr.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,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: 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,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: 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,s=new Set;r.source_defs.forEach((o,a)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${a}]: must be an object`);else {let u=o;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(u.bindTo)&&t.push(`source_defs[${a}]: bindTo "${u.bindTo}" is not unique across source_defs`),n.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(s.has(u.outputFile)&&t.push(`source_defs[${a}]: outputFile "${u.outputFile}" is not unique across source_defs`),s.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):ht.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...ht].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function fr(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 s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=await De(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function pr(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=kt(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var ge={run:ar,runSync:ir,eval:ur,resolve:cr,validate:lr,enrichSources:fr,enrichSourcesSync:pr};function St(e){return JSON.stringify(e)}function Ct(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 Je(e,t){function r(){return e.readIndex()??{}}function n(s,o,a){let u=String(o||"").split(".").filter(Boolean);if(u.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let f={...s},C=f;for(let I=0;I<u.length-1;I++){let F=u[I],G=C[F],$=G&&typeof G=="object"&&!Array.isArray(G)?{...G}:{};C[F]=$,C=$;}return C[u[u.length-1]]=a,f}return {readCard(s){let o=r()[s];return !o||!e.cardExists(o.key)?null:e.readCard(o.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[o,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let u=e.readCard(a.key);u?s.push(u):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,a]of Object.entries(r()))s[o]=a.checksum;return s},changedSince(s){let o=r(),a=[];for(let[u,f]of Object.entries(o))s[u]!==f.checksum&&a.push(u);for(let u of Object.keys(s))o[u]||a.push(u);return a},validateUpsert(s,o){let a=r(),u=a[s],f=Object.entries(a).find(([,C])=>C.key===o);return u&&u.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${u.key}", cannot remap to "${o}"`}:f&&f[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${f[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,a){let u=r(),f=a??u[s]?.key??e.defaultCardKey(s),C=e.writeCard(f,o);u[s]={key:f,checksum:C,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(s,o,a){let u=r(),f=u[s];if(!f||!e.cardExists(f.key))throw new Error(`card "${s}" not found`);let C=e.readCard(f.key);if(!C||typeof C!="object"||Array.isArray(C))throw new Error(`card "${s}" is not patchable`);let I=n(C,o,a),F=e.writeCard(f.key,I);u[s]={key:f.key,checksum:F,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(s){let o=r(),a=o[s];a&&(e.removeCard(a.key),delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function Fe(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let o=s.trim();if(!o)return null;try{return JSON.parse(o)}catch{return o}},ingestSourceDataStaged(r,n,s,o){let a=t(s);e.write(`${r}/.staged/${o}/${n}`,a);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,a=e.read(o);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)},listSources(r){return e.listKeys(`${r}/`).filter(n=>!n.includes("/.staged/")).map(n=>n.slice(`${r}/`.length))}}}function xt(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(o=>o.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function Et(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let o of s)try{n(o);}catch(a){let u=a instanceof Error?a.message:String(a);try{t(o,u);}catch{}}e.delete(r);}}}}var Pe="v1",ye="board/graph",Tt="board/lastJournalProcessedId";function Rt(e){return `cards/${e}/runtime`}function At(e){return {readRuntime(t){return e.read(Rt(t))??{_sources:{}}},writeRuntime(t,r){e.write(Rt(t),r);}}}function gr(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function _t(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==Pe)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=gr(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function ze(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 Ct(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",St(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",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);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){e.write("archive-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);}}}function It(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function bt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function mr(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function vt(e,t){return e?.lastRequestedToken?mr(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function hr(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function wt(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function $e(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=xe(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let k of o.pending)u.set(k.taskName,k.waitingOn);for(let k of o.unresolved)u.set(k.taskName,k.missingTokens);for(let k of o.blocked)u.set(k.taskName,k.failedTokens);let f=new Map;for(let[k,R]of Object.entries(n))for(let P of R.requires??[]){let K=f.get(P)??[];K.push(k),f.set(P,K);}let C=s.sort().map(k=>{let R=r[k],P=n[k]??{requires:[],provides:[]};R.status==="completed"?a.completed+=1:R.status==="failed"?a.failed+=1:R.status==="in-progress"&&(a.in_progress+=1);let K=P.requires??[],H=P.provides??[],m=Object.keys(R.data??{}).sort(),A=K.filter(b=>t.state.availableOutputs.includes(b)),p=K.filter(b=>!t.state.availableOutputs.includes(b)),d=u.get(k)??p,c=new Set;for(let b of H)for(let w of f.get(b)??[])w!==k&&c.add(w);let l=R.failedAt,h=R.error?{message:R.error,code:"TASK_FAILED",at:l,source:"task-runtime"}:void 0;return {name:k,status:R.status,error:h,requires:K,requires_satisfied:A,requires_missing:p,provides_declared:H,provides_runtime:m,blocked_by:d,unblocks:Array.from(c).sort(),runtime:{attempt_count:R.executionCount??0,restart_count:R.retryCount??0,in_progress_since:R.status==="in-progress"?R.startedAt??null:null,last_transition_at:R.lastUpdated??null,last_completed_at:R.completedAt??null,last_restarted_at:R.startedAt??null,status_age_ms:R.lastUpdated?0:null}}});a.pending=o.pending.length,a.blocked=o.blocked.length,a.unresolved=o.unresolved.length;let I=C.map(k=>({name:k.name,fanOut:k.unblocks.length})).sort((k,R)=>R.fanOut-k.fanOut||k.name.localeCompare(R.name)),F=I.length>0?I[0]:{name:null,fanOut:0},G=new Set;for(let k of Object.values(n))for(let R of k.requires??[])G.add(R);let $=0;for(let[k,R]of Object.entries(n)){let P=(R.requires??[]).length===0,H=(R.provides??[]).some(m=>(f.get(m)??[]).some(A=>A!==k));P&&!H&&($+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:a.completed,eligible:o.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:$,topology:{edge_count:Array.from(G).length,max_fan_out_card:F.name,max_fan_out:F.fanOut}},cards:C}}function kr(){return new Date().toISOString()}function Ot(e,t,r,n,s,o,a){return async u=>{let f=[],C=r.cardStore.readCard(u.nodeId);if(!C)return "task-initiate-failure";let I=C.id,F=C.card_data??{},G=C.source_defs??[],$=G.filter(E=>E.optionalForCompletionGating!==true),k=r.cardRuntimeStore.readRuntime(I),R=false,P=()=>{R&&(r.cardRuntimeStore.writeRuntime(I,k),R=false);},K=E=>bt(k._sources[E]),H=(E,_)=>{k._sources[E]=bt(_),R=true;},m=u.taskState?.executionCount??0;if(k._lastExecutionCount!==m&&(k._sources={},k._lastExecutionCount=m,R=true),u.update){let E=u.update,_=E.outputFile;if(_){let V=K(_);if(E.failure){let U=E.rqt??V.lastRequestedToken??V.queueRequestedToken;U&&H(_,wt(V,U));}else {let U=E.rqt;if(!V.lastCompletedToken||U>V.lastCompletedToken){let ee=typeof E.deliveryToken=="string"?E.deliveryToken:void 0,ae=false;ee&&(ae=r.fetchedSourcesStore.commitSourceData(I,_,ee)),ae?H(_,hr(V,U)):H(_,wt(V,U));}}P();}}let p={};for(let E of G)if(E.outputFile){let _=r.fetchedSourcesStore.readSourceData(I,E.outputFile);_!==null&&(p[E.bindTo]=_);}let d={};for(let[E,_]of Object.entries(u.state??{}))if(_!==null&&typeof _=="object"&&!Array.isArray(_)){let V=_[E];d[E]=V!==void 0?V:_;}else d[E]=_;let c={id:I,card_data:{...F},requires:d,source_defs:G,compute:C.compute};c._sourcesData=p,C.compute&&ge.runSync(c,{sourcesData:p}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(I,c.computed_values??{});let l={...C},h=ge.enrichSourcesSync(Array.isArray(C.source_defs)?C.source_defs:void 0,{card_data:C.card_data,requires:d}),b=e.value;l.source_defs=Array.isArray(h)?h.map(E=>({...E,boardDir:typeof E.boardDir=="string"&&E.boardDir?E.boardDir:b})):h;let w=kr(),O=u.update?void 0:w,j=$.filter(E=>{let _=E.outputFile;if(typeof _!="string"||!_)return true;let V=K(_);O&&(V={...V,queueRequestedToken:O},H(_,V));let U=V.queueRequestedToken??V.lastRequestedToken??w,ee=vt(V,U);return ee==="in-flight"?false:ee==="dispatch"});if(P(),j.length>0){let E=false,_=w;for(let V of j){let U=V.outputFile;if(typeof U!="string"||!U)continue;let ee=K(U),ae=ee.queueRequestedToken??w;H(U,{...ee,lastRequestedToken:ae}),_=ae,E=true;}return E&&P(),E&&(f.push({taskKind:"source-fetch",payload:{boardRef:re(e),enrichedCard:l,callbackToken:u.callbackToken,rqt:_}}),r.executionRequestStore.appendEntries(t,f)),"task-initiated"}if($.some(E=>{let _=E.outputFile;if(typeof _!="string"||!_)return false;let V=K(_),U=V.queueRequestedToken??V.lastRequestedToken??w;return vt(V,U)==="in-flight"}))return "task-initiated";let z=C.provides??[],Q={};for(let{bindTo:E,ref:_}of z)Q[E]=ge.resolve(c,_);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(Q),G.filter(E=>{if(E.optionalForCompletionGating!==true)return false;let _=K(E.outputFile);return !_.lastRequestedToken||!_.lastCompletedToken?true:_.lastCompletedToken<=_.lastRequestedToken}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:re(e),enrichedCard:l,callbackToken:u.callbackToken,rqt:w}}),n(u.nodeId,Q),f.length>0&&r.executionRequestStore.appendEntries(t,f),"task-initiated"}}var Ye={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function jt(e){return {[ye]:e.graph,[Tt]:e.lastDrainedJournalId}}function qt(e){let t=e[ye],r=e[Tt];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ye}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function Nt(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function Dt(e){function t(o){return {status:"success",data:o}}function r(o){return {status:"fail",error:o}}function n(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}function s(o){if(Array.isArray(o))return o;if(o&&typeof o=="object"){let a=o;return Array.isArray(a.files)?a.files:[o]}return null}return {get(o){try{let a=o.params?.id;if(a){let u=e.readCard(a);return u?t({cards:[u]}):r(`card "${a}" not found`)}return t({cards:e.readAllCards()})}catch(a){return n(a)}},set(o){try{let a=o.body;if(a==null)return r("set requires a body (card object or array of cards)");let u=Array.isArray(a)?a:[a];for(let f of u){if(typeof f.id!="string")return r("each card must have a string `id` field");e.writeCard(f.id,f);}return t({count:u.length})}catch(a){return n(a)}},del(o){try{let a=o.body?.ids??[],u=o.params?.id,f=u?[...a,u]:a;if(f.length===0)return r("del requires body.ids (string[]) or params.id");for(let C of f)e.removeCard(C);return t({count:f.length})}catch(a){return n(a)}},patch(o){try{let a=o.params?.id,u=o.params?.path;if(!a)return r("patch requires params.id");if(!u)return r("patch requires params.path");let f=o.body,C=f&&Object.prototype.hasOwnProperty.call(f,"value")?f.value:o.body;return e.patchCard(a,u,C),t({count:1})}catch(a){return n(a)}},appendFiles(o){try{let a=o.params?.id;if(!a)return r("appendFiles requires params.id");let u=e.readCard(a);if(!u)return r(`card "${a}" not found`);let f=s(o.body);if(!f||f.length===0)return r("appendFiles requires a file metadata object, array, or body.files array");let C=u.card_data&&typeof u.card_data=="object"&&!Array.isArray(u.card_data)?u.card_data:{},I=Array.isArray(C.files)?C.files:[],F=[...I,...f],G=f.map((k,R)=>({idx:I.length+R,entry:k})),$=this.patch({params:{id:a,path:"card_data.files"},body:{value:F}});return $.status!=="success"?$:t({files_added:G})}catch(a){return n(a)}}}}function q(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function x(e){return {status:"fail",error:e}}function D(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function yr(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 Pt(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(s)}function Ge(e){try{let t=JSON.parse(Pt(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Sr(e){return yr(JSON.stringify(e))}function Ft(e){try{let t=JSON.parse(Pt(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Y(){return new Date().toISOString()}function fn(e,t){let r=t.onWarn??(()=>{}),n=re(e);function s(g){if(g.length!==0)try{let i=t.publishBoardChangeNotifications?.(g);i&&typeof i.catch=="function"&&i.catch(y=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${y instanceof Error?y.message:String(y)}`));}catch(i){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${i instanceof Error?i.message:String(i)}`);}}function o(){let g=u().readCardStoreRef();if(!g)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(g);return {readIndex(){return i.read("_index")},writeIndex(y){i.write("_index",y);},readCard(y){return i.read(y)},writeCard(y,v){return i.write(y,v),t.hashFn(v)},removeCard(y){i.delete(y);},cardExists(y){return i.read(y)!==null},defaultCardKey(y){return y}}}let a={readValues(g){let i=t.kvStorage("state-snapshot"),y=i.listKeys().sort();if(y.length===0)return {version:null,values:{}};let v={};for(let N of y)v[N]=i.read(N);return {version:t.hashFn(v),values:v}},writeValues(g,i,y){let v=t.kvStorage("state-snapshot");for(let N of y)v.delete(N);for(let[N,L]of Object.entries(i))v.write(N,L);return t.hashFn(i)}},u=()=>ze(t.kvStorage("config")),f=()=>_t(a),C=()=>xt(t.journalAdapter()),I=()=>Je(o(),r),F=()=>{let g=u().readOutputsStoreRef();if(!g)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return It(t.kvStorageForRef(g))},G=()=>{let g=u().readArchiveStoreRef();return g?t.archiveFactoryForRef(g):t.archiveFactory()};function $(){return !!f().readSnapshot(e.value).values[ye]}function k(){let g=f().readSnapshot(e.value);if(!g.values[ye])throw new Error(`Board not initialized at ${e.value}`);return qt(g.values)}function R(g,i){let y=f().commitSnapshot(e.value,{schemaVersion:Pe,expectedVersion:i,commitId:t.genId(),committedAt:Y(),deleteKeys:[],shallowMerge:jt(g)});if(!y.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${i??"null"} current=${y.currentVersion??"null"}`)}function P(g){C().appendEvent(g);}async function K(){let g=(S,T)=>{let B=S.payload,ue=(B?.enrichedCard??{}).id??B?.cardId??"unknown";P({type:"task-failed",taskName:ue,error:T,timestamp:Y()});},i=Et(t.kvStorage("execution-requests"),g),y=At(t.kvStorage("card-runtime")),v=Fe(t.blobStorage("sources"),S=>t.resolveBlob(S)),N=new Map,L={readRuntime(S){return N.get(S)??y.readRuntime(S)},writeRuntime(S,T){N.set(S,T);}},Z=[],M=new Map,te={readSourceData(S,T){let B=`${S}/${T}`;return M.has(B)?M.get(B):v.readSourceData(S,T)},ingestSourceDataStaged(S,T,B,le){v.ingestSourceDataStaged(S,T,B,le);},commitSourceData(S,T,B){let le=`${S}/.staged/${B}/${T}`,_e=t.blobStorage("sources").read(le);if(_e==null)return false;let be=`${S}/${T}`,Ze=_e.trim();try{M.set(be,JSON.parse(Ze));}catch{M.set(be,Ze);}return Z.push({cardId:S,outputFile:T,deliveryToken:B}),true},hasSource(S,T){let B=`${S}/${T}`;return M.has(B)?true:v.hasSource(S,T)},listSources(S){let T=v.listSources(S),B=new Set;for(let ue of M.keys())ue.startsWith(`${S}/`)&&B.add(ue.slice(`${S}/`.length));let le=new Set([...T,...B]);return Array.from(le)}},W={cardStore:I(),cardRuntimeStore:L,fetchedSourcesStore:te,outputStore:F(),executionRequestStore:i},me=k(),he=Ne(me.graph),{events:Se,newCursor:Ce}=C().readEntriesAfterCursor(me.lastDrainedJournalId),ke=[],Ve=[],Be=[],Ke=new Map,Xe=new Set,$t=(S,T)=>{ke.push({type:"task-completed",taskName:S,data:T,timestamp:Y()});try{G().stream("exec-history").append({taskName:S,status:"completed",completedAt:Y()});}catch{}},We=(S,T)=>{P({type:"task-failed",taskName:S,error:T,timestamp:Y()});try{G().stream("exec-history").append({taskName:S,status:"failed",error:T,completedAt:Y()});}catch{}},Te=gt(he,{handlers:{"card-handler":Ot(e,Ce,W,$t,We,(S,T)=>{Ve.push({cardId:S,values:T});},S=>{Be.push(S);})},onNodeRemoved:S=>{Ke.delete(S),N.delete(S),Xe.add(S);}});for(ke=Se;ke.length>0;){let S=ke;ke=[];for(let T of S)if(T.type==="task-restart"){let B=W.cardStore.readCard(T.taskName);B&&Ke.set(T.taskName,B);}Te.pushAll(S),await Te.waitForHandlers();}let Qe=Te.getState();await Te.dispose({wait:true});let Gt=f().readSnapshot(e.value).version;R({lastDrainedJournalId:Ce,graph:we(Qe)},Gt);for(let{cardId:S,values:T}of Ve)W.outputStore.writeComputedValues(S,T);for(let S of Be)W.outputStore.writeDataObjects(S);for(let[S,T]of N)y.writeRuntime(S,T);for(let{cardId:S,outputFile:T,deliveryToken:B}of Z)v.commitSourceData(S,T,B);let Ae;try{Ae=$e(n,Qe),W.outputStore.writeStatusSnapshot(Ae);}catch(S){r(`[board-live-cards-public] status publish failed: ${S instanceof Error?S.message:String(S)}`);}let Re=[];for(let{cardId:S,values:T}of Ve)Re.push({kind:"computed_values",cardId:S,values:T});for(let S of Be)for(let[T,B]of Object.entries(S))T&&Re.push({kind:"data_object",key:T,payload:B});for(let[S,T]of Ke)Re.push({kind:"card_refreshed",cardId:S,card:T});for(let S of Xe)Re.push({kind:"card_removed",cardId:S});Ae!==void 0&&Re.push({kind:"status",status:Ae}),s(Re);let Lt=u().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:re({kind:"built-in",value:"source-cli-task-executor"})};i.dispatchEntriesForJournalId(Ce,S=>{if(S.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${S.taskKind}" \u2014 skipping`);return}let T=S.payload,B=T.enrichedCard?.id??"unknown",le=T.enrichedCard?.source_defs??[];for(let ue of le){if(!ue.outputFile){r(`[dispatch] source "${ue.bindTo}" has no outputFile \u2014 skipping`);continue}let _e=Sr({cbk:T.callbackToken,rg:e.value,br:re(e),cid:B,b:ue.bindTo,d:ue.outputFile,cs:void 0,rqt:T.rqt});t.dispatchExecution(Lt,{source_def:ue,base_ref:re(e),callback:{token:_e,via:t.selfRef}}).catch(be=>We(B,be instanceof Error?be.message:String(be)));}});}async function H(){try{let g=()=>{let y=k(),{events:v}=C().readEntriesAfterCursor(y.lastDrainedJournalId);v.length<=0||(H(),t.requestProcessAccumulated?.());},i=await et(t.lock,K,g);return q({ran:i!==!1})}catch(g){return D(g)}}function m(){H(),t.requestProcessAccumulated?.();}function A(g){try{let i=g.params?.cardStoreRef;if(!i)return x("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!$()){let W=qe(Ye);R({lastDrainedJournalId:"",graph:we(W)},null);}let y=g.params?.outputsStoreRef;if(!y)return x("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let v=g.params?.scratchStoreRef,N=g.params?.archiveStoreRef,L=g.params?.chatStoreRef,Z=g.params?.artifactsStoreRef,M=u();M.writeCardStoreRef(i),M.writeOutputsStoreRef(y),v&&M.writeScratchStoreRef(v),N&&M.writeArchiveStoreRef(N),L&&M.writeChatStoreRef(L),Z&&M.writeArtifactsStoreRef(Z);let te=g.body??{};te["task-executor-ref"]&&M.writeTaskExecutorRef(te["task-executor-ref"]),Object.prototype.hasOwnProperty.call(te,"chat-handler-flow")&&M.writeChatHandlerFlow(te["chat-handler-flow"]);try{F().writeStatusSnapshot($e(n,Ne(k().graph)));}catch{}return q()}catch(i){return D(i)}}function p(g){try{let i=F().readStatusSnapshot();if(!i){i=$e(n,Ne(k().graph));try{F().writeStatusSnapshot(i);}catch{}}return q(i)}catch(i){return D(i)}}function d(g){try{let i=g.params?.id;return i?(P({type:"task-removal",taskName:i,timestamp:Y()}),m(),q()):x("removeCard requires params.id")}catch(i){return D(i)}}function c(g){try{let i=g.params?.cardId;if(!i)return x("addCardFiles requires params.cardId");let y=Dt(I()).appendFiles({params:{id:i},body:g.body});if(y.status!=="success")return y;let v=l({params:{cardId:i}});return v.status!=="success"?v:q({cardId:i,files_added:y.data.files_added,notified:!0})}catch(i){return D(i)}}function l(g){try{let i=g.params?.cardId;if(!i)return x("cardRefreshedNotify requires params.cardId");let y=I().readCard(i);return y?(s([{kind:"card_refreshed",cardId:i,card:y}]),q({cardId:i,notified:!0})):x(`Card "${i}" not found in board at ${e.value}`)}catch(i){return D(i)}}function h(g){try{let i=g.params?.id;return i?(P({type:"task-restart",taskName:i,timestamp:Y()}),m(),q()):x("retrigger requires params.id")}catch(i){return D(i)}}async function b(g){return H()}function w(g){try{let i=g.params?.cardId,y=g.params?.all,v=!!g.params?.restart;if(!i&&!y)return x("upsertCard requires --card-id <id> or --all");let N=y?I().readAllCards().map(L=>L.id):[i];for(let L of N)if(!I().readCard(L))return x(`Card "${L}" not found in board at ${e.value}`);for(let L of N){let Z=I().readCard(L),M=Nt(Z),te=t.hashFn(M),W=t.kvStorage("card-upsert"),me=W.read(L),he=me?.taskConfigHash!==te;if(!(!he&&!v)){if(he){let Se=me?.blobRef??I().readCardKey(L)??L;P({type:"task-upsert",taskName:L,taskConfig:M,timestamp:Y()}),W.write(L,{blobRef:Se,taskConfigHash:te,updatedAt:Y()});}v&&P({type:"task-restart",taskName:L,timestamp:Y()});}}return m(),q()}catch(i){return D(i)}}function O(g){try{let i=g.params?.token;if(!i)return x("taskFailed requires params.token");let y=g.params?.error??"unknown error",v=Ge(i);if(!v)return x("Invalid callback token");P({type:"task-failed",taskName:v.taskName,error:y,timestamp:Y()});try{G().stream("exec-history").append({taskName:v.taskName,status:"failed",error:y,completedAt:Y()});}catch{}return m(),q()}catch(i){return D(i)}}function j(g){try{let i=g.params?.token;if(!i)return x("taskProgress requires params.token");let v=(g.body??{}).update??{},N=Ge(i);return N?(P({type:"task-progress",taskName:N.taskName,update:v,timestamp:Y()}),m(),q()):x("Invalid callback token")}catch(i){return D(i)}}function J(g){try{let i=g.params?.token,y=g.params?.ref;if(!i)return x("sourceDataFetched requires params.token");if(!y)return x("sourceDataFetched requires params.ref");let v=Ft(i);if(!v)return x("Invalid source token");let{cbk:N,cid:L,b:Z,d:M,cs:te,rqt:W}=v,me=Fe(t.blobStorage("sources"),ke=>t.resolveBlob(ke)),he=t.genId();me.ingestSourceDataStaged(L,M,Oe(y),he);let Se=Ge(N);if(!Se)return x("Invalid callback token embedded in source token");let Ce=Y();return P({type:"task-progress",taskName:Se.taskName,update:{bindTo:Z,outputFile:M,fetchedAt:Ce,deliveryToken:he,sourceChecksum:te,rqt:W},timestamp:Ce}),m(),q()}catch(i){return D(i)}}function z(g){try{let i=g.params?.token,y=g.params?.reason??"unknown";if(!i)return x("sourceDataFetchFailure requires params.token");let v=Ft(i);if(!v)return x("Invalid source token");let{cbk:N,b:L,d:Z,cs:M,rqt:te}=v,W=Ge(N);return W?(P({type:"task-progress",taskName:W.taskName,update:{bindTo:L,outputFile:Z,failure:!0,reason:y,sourceChecksum:M,rqt:te},timestamp:Y()}),m(),q()):x("Invalid callback token embedded in source token")}catch(i){return D(i)}}function Q(g){try{let i=u().readCardStoreRef();return i?q({storeRef:i}):x(`Board at ${e.value} has no card store configured`)}catch(i){return D(i)}}function oe(g){try{let i=u().readOutputsStoreRef();return i?q({storeRef:i}):x(`Board at ${e.value} has no outputs store configured`)}catch(i){return D(i)}}function E(g){try{let i=u().readScratchStoreRef();return q({storeRef:i})}catch(i){return D(i)}}function _(g){try{let i=u().readArchiveStoreRef();return q({storeRef:i})}catch(i){return D(i)}}function V(g){try{let i=u().readChatStoreRef();return q({storeRef:i})}catch(i){return D(i)}}function U(g){try{let i=u().readArtifactsStoreRef();return q({storeRef:i})}catch(i){return D(i)}}function ee(g){try{let i=g.params?.key;if(!i)return x("getConfig requires params.key");let y=u(),v;switch(i){case "task-executor":v=y.readTaskExecutorRef()??null;break;case "chat-handler-flow":v=y.readChatHandlerFlow()??null;break;case "card-store-ref":v=y.readCardStoreRef();break;case "outputs-store-ref":v=y.readOutputsStoreRef();break;case "scratch-store-ref":v=y.readScratchStoreRef();break;case "archive-store-ref":v=y.readArchiveStoreRef();break;case "chat-store-ref":v=y.readChatStoreRef();break;case "artifacts-store-ref":v=y.readArtifactsStoreRef();break;default:return x(`getConfig: unknown key "${i}"`)}return q({value:v})}catch(i){return D(i)}}function ae(g){try{let i=g.params?.key;if(!i)return x("getOutputsDataObject requires params.key");let y=F().readDataObject(i);return q(y)}catch(i){return D(i)}}function Le(g){try{return q(F().readAllDataObjects())}catch(i){return D(i)}}function X(g){try{let i=g.params?.key;if(!i)return x("getOutputsComputedValues requires params.key");let y=F().readComputedValues(i);return q(y)}catch(i){return D(i)}}function se(g){try{return q(F().readAllComputedValues())}catch(i){return D(i)}}function ie(){return Fe(t.blobStorage("sources"),g=>t.resolveBlob(g))}function de(g){let i=t.blobStorage("sources").keyRef?.(g);return i?re(i):g}function ve(g){try{let i=g.params?.key;if(!i)return x("getOutputsFetchedSources requires params.key");let y=ie().listSources(i),v={};for(let N of y)v[N]=de(`${i}/${N}`);return q(v)}catch(i){return D(i)}}function ce(g){try{let i=ie(),y=new Set;for(let N of t.blobStorage("sources").listKeys()){let L=N.indexOf("/");L>0&&!N.includes("/.staged/")&&y.add(N.slice(0,L));}let v={};for(let N of y){let L=i.listSources(N);if(L.length>0){v[N]={};for(let Z of L)v[N][Z]=de(`${N}/${Z}`);}}return q(v)}catch(i){return D(i)}}return {init:A,status:p,getCardStoreRef:Q,getOutputsStoreRef:oe,getScratchStoreRef:E,getArchiveStoreRef:_,getChatStoreRef:V,getArtifactsStoreRef:U,getConfig:ee,getOutputsDataObject:ae,getAllOutputsDataObjects:Le,getOutputsComputedValues:X,getAllOutputsComputedValues:se,getOutputsFetchedSources:ve,getAllOutputsFetchedSources:ce,removeCard:d,addCardFiles:c,cardRefreshedNotify:l,retrigger:h,processAccumulatedEvents:b,upsertCard:w,taskFailed:O,taskProgress:j,sourceDataFetched:J,sourceDataFetchFailure:z}}function pn(e,t){let r=()=>ze(t.kvStorage("config"));function n(){let p=r().readCardStoreRef();if(!p)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let d=t.kvStorageForRef(p);return {readIndex(){return d.read("_index")},writeIndex(c){d.write("_index",c);},readCard(c){return d.read(c)},writeCard(c,l){return d.write(c,l),t.hashFn(l)},removeCard(c){d.delete(c);},cardExists(c){return d.read(c)!==null},defaultCardKey(c){return c}}}let s=()=>Je(n(),t.onWarn??(()=>{})),o=()=>{let p=r().readScratchStoreRef();return p?t.scratchStorageForRef(p):t.scratchStorage()};function a(p,d){let c=t.validateSchema(d),l=[],h=r().readTaskExecutorRef();if(h&&Array.isArray(d.source_defs))for(let w of d.source_defs){let O=typeof w.bindTo=="string"?w.bindTo:"(unknown)";try{let j;try{j=t.invokeExecutorSync(h,"validate-source-def",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(w)});}catch(z){let Q=z;if(j=typeof Q?.stdout=="string"?Q.stdout:"",!j.trim()){l.push(`source "${O}": executor validate-source-def failed \u2014 ${z instanceof Error?z.message:String(z)}`);continue}}let J=JSON.parse(j.trim());if(!J.ok&&Array.isArray(J.errors))for(let z of J.errors)l.push(`source "${O}": ${z}`);}catch(j){l.push(`source "${O}": executor validate-source-def failed \u2014 ${j instanceof Error?j.message:String(j)}`);}}let b=[...c.errors,...l];return q({cardId:p,isValid:b.length===0,issues:b})}function u(p,d){let c=r().readTaskExecutorRef();if(!c)throw new Error("No task-executor registered for this board");let l=typeof p.bindTo=="string"?p.bindTo:"source",h=o(),b={...p,boardDir:e.value,_projections:d},w=h.create(JSON.stringify(b,null,2),`probe-in-${l}`,".json"),O=h.getUniqueKey(`probe-out-${l}`,".json"),j=h.getUniqueKey(`probe-err-${l}`,".txt"),J=re(h.keyRef(w)),z=re(h.keyRef(O)),Q=re(h.keyRef(j)),oe=null;try{if(t.invokeExecutorSync(c,"run-source-fetch",["--in-ref",J,"--out-ref",z,"--err-ref",Q],{timeout:p.timeout??t.executorTimeouts?.probeMs??6e4}),oe=h.read(O),oe===null)throw new Error("Executor produced no output file")}catch(E){let _=h.read(j)?.trim()??(E instanceof Error?E.message:String(E));throw new Error(`Probe failed: ${_}`)}finally{try{h.remove(w);}catch{}try{h.remove(j);}catch{}}return {bindTo:l,result:oe}}function f(p,d,c){let l;try{l=u(p,d);}catch(h){return x(h instanceof Error?h.message:String(h))}if(c){let h=Oe(c);t.absoluteBlob.write(h.value,l.result);}return q({bindTo:l.bindTo,resultSizeBytes:l.result.length})}function C(p,d){let c=p.params?.sourceIdx,l=p.params?.outRef;if(c===void 0)return x(`${d} requires params.sourceIdx`);if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x(`${d} requires card JSON object in body`);let h=p.body,b=h["card-content"]??h,w=h["mock-projections"]??{},O=b.source_defs??[];if(c<0||c>=O.length)return x(`sourceIdx ${c} out of range (card has ${O.length} source(s))`);let j=O[c],J=typeof j.bindTo=="string"?j.bindTo:"source";return {src:j,bindTo:J,outRef:l,mockProjections:w}}function I(p){try{let d=p.params?.cardId,c=p.params?.all;if(!d&&!c)return x("validateCard requires --card-id <id> or --all");let l=c?s().readAllCards().map(b=>b.id):[d],h=[];for(let b of l){let w=s().readCard(b);if(!w){h.push({cardId:b,isValid:!1,issues:[`Card "${b}" not found`]});continue}let O=a(b,w);if(O.status!=="success")return O;h.push(O.data);}return q(h)}catch(d){return D(d)}}function F(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("validateCardPreflight requires card JSON object in body");let d=p.body,c=d["card-content"]??d,l=typeof c.id=="string"?c.id:"(unknown)";return a(l,c)}catch(d){return D(d)}}function G(p){try{let d=p.params?.cardId,c=p.params?.sourceIdx,l=p.params?.outRef;if(!d)return x("probeSource requires params.cardId");if(c===void 0)return x("probeSource requires params.sourceIdx");let b=(p.body??{})["mock-projections"]??{},w=s().readCard(d);if(!w)return x(`Card "${d}" not found`);let O=w.source_defs??[];return c<0||c>=O.length?x(`sourceIdx ${c} out of range (card has ${O.length} source(s))`):f(O[c],b,l)}catch(d){return D(d)}}function $(p){try{let d=p.params?.outRef,c=p.body;if(!c)return x('probeTmpSource requires body with "source-def" and "mock-projections"');let l=c["source-def"],h=c["mock-projections"]??{};return l?f(l,h,d):x('probeTmpSource body requires "source-def"')}catch(d){return D(d)}}function k(p){try{let d=C(p,"probeSourcePreflight");if("status"in d)return d;let c=r().readTaskExecutorRef();if(!c)return x("No task-executor registered for this board");try{let l={...d.src,_projections:d.mockProjections},h=t.invokeExecutorSync(c,"probe-source-preflight",[],{timeout:d.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(l)}),b=JSON.parse(h.trim());return b.ok?q({bindTo:d.bindTo,reachable:b.reachable,latencyMs:b.latencyMs,note:b.note}):x(b.error??"Preflight probe failed")}catch{return x("Executor does not support probe-source-preflight")}}catch(d){return D(d)}}function R(p){try{let d=C(p,"runSourcePreflight");if("status"in d)return d;try{let c=u(d.src,d.mockProjections);if(d.outRef){let h=Oe(d.outRef);t.absoluteBlob.write(h.value,c.result);}let l=c.result;try{l=JSON.parse(c.result);}catch{}return q({bindTo:c.bindTo,ok:!0,result:l,issues:[]})}catch(c){let l=c instanceof Error?c.message:String(c);return l==="No task-executor registered for this board"?x(l):q({bindTo:d.bindTo,ok:!1,result:null,issues:[l]})}}catch(d){return D(d)}}function P(p){try{let d=r().readTaskExecutorRef();if(!d)return x("No task-executor registered for this board");let c=t.invokeExecutorSync(d,"describe-capabilities",[],{timeout:t.executorTimeouts?.describeMs??1e4});return q(JSON.parse(c.trim()))}catch(d){return D(d)}}function K(p){try{let d=p.body;if(!d||!Array.isArray(d.ops))return x("updatesInCardStore requires body.ops array");let c=d.ops,l=s();for(let h of c){let b=h.op,w=h.id;if(!w)return x('op is missing "id"');if(b==="update"){let O=h["card-content"];if(!O)return x(`update op for "${w}" is missing "card-content"`);l.writeCard(w,O);}else return x(`Unknown op type: "${b??"(none)"}"`)}return q()}catch(d){return D(d)}}function H(p){try{let d=p.body;if(!d||!Array.isArray(d.ids))return x("readFromCardStore requires body.ids array");let c=d.ids,l=s(),h=c.map(b=>({id:b,"card-content":l.readCard(b)}));return q({cards:h})}catch(d){return D(d)}}function m(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("evalCardCompute requires a JSON object in body");let d=p.body,c=d["card-content"]??d,l=typeof c.id=="string"?c.id:"(unknown)",h=d["mock-fetched-sources"]??{},b=d["mock-requires"]??{},w=c.compute;if(!w||!Array.isArray(w)||w.length===0)return q({cardId:l,ok:!0,computed_values:{},errors:[]});let O={id:l,card_data:c.card_data??{},requires:b,source_defs:c.source_defs,compute:w},j=ge.runSync(O,{sourcesData:h}),J=j.node.computed_values??{},z=j.errors??[];return q({cardId:l,ok:z.length===0,computed_values:J,errors:z})}catch(d){return D(d)}}function A(p){try{if(!p.body||typeof p.body!="object"||Array.isArray(p.body))return x("simulateCardCycle requires a JSON object in body");let d=p.body,c=d["card-content"]??d,l=typeof c.id=="string"?c.id:"(unknown)",h=d["mock-fetched-sources"]??{},b=d["mock-requires"]??{},w=a(l,c),O=w.status==="success"?{isValid:w.data.isValid,issues:w.data.issues}:{isValid:!1,issues:[w.status==="fail"?w.error:"internal error"]},j=c.source_defs??[],J=c.card_data??{},z=[],Q=[];if(j.length>0){z=ge.enrichSourcesSync(j,{card_data:J,requires:b});for(let X of z){let se=X.projections,ie=X._projections;if(se&&ie){for(let de of Object.keys(se))if(ie[de]===void 0){let ve=typeof X.bindTo=="string"?X.bindTo:"(unknown)";Q.push({bindTo:ve,key:de,error:`Projection "${de}" resolved to undefined`});}}}}let oe=[],E={...h},_=d["task-executor-ref"],V=(_?.howToRun&&_?.whatToRun?_:void 0)??r().readTaskExecutorRef();for(let X=0;X<z.length;X++){let se=z[X],ie=typeof se.bindTo=="string"?se.bindTo:`source_${X}`;if(!V){oe.push({bindTo:ie,skipped:!0,error:"No task executor configured"});continue}try{let de={...se},ve=t.invokeExecutorSync(V,"run-source-preflight",[],{timeout:se.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(de)}),ce=JSON.parse(ve.trim());ce.ok&&!Object.prototype.hasOwnProperty.call(h,ie)&&Object.prototype.hasOwnProperty.call(ce,"resultValue")&&(E[ie]=ce.resultValue),oe.push({bindTo:ie,reachable:ce.reachable,latencyMs:ce.latencyMs,error:ce.ok?void 0:ce.error});}catch{oe.push({bindTo:ie,skipped:!0,error:"Executor does not support run-source-preflight"});}}let U=c.compute,ee={},ae=[];if(U&&Array.isArray(U)&&U.length>0){let X={id:l,card_data:J,requires:b,source_defs:c.source_defs,compute:U},se=ge.runSync(X,{sourcesData:E});ee=se.node.computed_values??{},ae=se.errors??[];}let Le=O.isValid&&Q.length===0&&ae.length===0&&oe.every(X=>X.reachable!==!1);return q({cardId:l,ok:Le,validation:O,source_probes:oe,projection_errors:Q,fetched_sources:E,computed_values:ee,compute_errors:ae})}catch(d){return D(d)}}return {validateCard:I,validateCardPreflight:F,probeSource:G,probeTmpSource:$,probeSourcePreflight:k,runSourcePreflight:R,evalCardCompute:m,simulateCardCycle:A,describeTaskExecutorCapabilities:P,updatesInCardStore:K,readFromCardStore:H}}
2
- export{ye as BOARD_GRAPH_KEY,Ye as EMPTY_CONFIG,Pe as SNAPSHOT_SCHEMA_VERSION_V1,pn as createBoardLiveCardsNonCorePublic,fn as createBoardLiveCardsPublic};//# sourceMappingURL=board-live-cards-public.js.map
1
+ export{c as BOARD_GRAPH_KEY,d as EMPTY_CONFIG,b as SNAPSHOT_SCHEMA_VERSION_V1,f as createBoardLiveCardsNonCorePublic,e as createBoardLiveCardsPublic}from'./chunk-M7EQRS6W.js';import'./chunk-LBMEVV4U.js';import'./chunk-CWREBRXS.js';import'./chunk-VGT3TRQG.js';import'./chunk-WDPOGXTY.js';import'./chunk-JMDHDY6M.js';import'./chunk-VLBB3D6B.js';import'./chunk-KBELAKIY.js';import'./chunk-MNEOJWPS.js';import'./chunk-FW4363Y4.js';//# sourceMappingURL=board-live-cards-public.js.map
3
2
  //# sourceMappingURL=board-live-cards-public.js.map
@@ -1,8 +1,2 @@
1
- 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var bt="b64:";function rn(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,s;if(r)s=r.from(t).toString("base64");else if(typeof btoa=="function"){let a="";for(let i of t)a+=String.fromCharCode(i);s=btoa(a);}else throw new Error("No base64 encoder available in this runtime");return s.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function nn(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 s=atob(t),a=new Uint8Array(s.length);for(let i=0;i<s.length;i+=1)a[i]=s.charCodeAt(i);return new TextDecoder().decode(a)}throw new Error("No base64 decoder available in this runtime")}function Fe(e){return `${bt}${rn(JSON.stringify(e))}`}function ot(e){if(!e.startsWith(bt))throw new Error(`Invalid ref format (expected ${bt}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(nn(e.slice(bt.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 Zt(e,t,r){let s=e.tryAcquire();if(!s)return false;try{await t();}finally{s();}return r?.(),true}var Ze={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function qe(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function Qe(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Qt(e){return e.tasks??{}}function Pt(e){return e?e.status===Ze.FAILED||e.status===Ze.INACTIVATED:false}function er(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function tr(e){return e.maxExecutions}function rr(e,t){let r=new Set;for(let[s,a]of Object.entries(t))if(a.status===Ze.COMPLETED){let i=e.tasks[s];i&&qe(i).forEach(u=>r.add(u));}return Array.from(r)}function nr(e,t){let r={};return e.forEach(s=>{let a=t[s];if(!a)return;qe(a).forEach(c=>{r[c]||(r[c]=[]),r[c].push(s);});}),r}function or(e,t,r){let s=e.tasks[t]??St(),a={};if(r){let c=r.tasks[t],u=Qe(c);for(let m of u)for(let[O,$]of Object.entries(r.tasks))if(qe($).includes(m)){let k=e.tasks[O];k?.lastDataHash&&(a[m]=k.lastDataHash);break}}let i={...s,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:a};return {...e,tasks:{...e.tasks,[t]:i},lastUpdated:new Date().toISOString()}}function sr(e,t,r,s,a,i){let c=e.tasks[r]??St(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let m;s&&u.on&&u.on[s]?m=u.on[s]:m=qe(u);let O=c.startConsumedHashes?{...c.startConsumedHashes}:{...c.lastConsumedHashes};if(!c.startConsumedHashes){let v=u.requires??[];for(let T of v)for(let[w,q]of Object.entries(t.tasks))if(qe(q).includes(T)){let x=e.tasks[w];x?.lastDataHash&&(O[T]=x.lastDataHash);break}}let $={...c,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:c.executionCount+1,lastEpoch:c.executionCount+1,lastDataHash:a,data:i,lastConsumedHashes:O,error:void 0},k=[...new Set([...e.availableOutputs,...m])];return {...e,tasks:{...e.tasks,[r]:$},availableOutputs:k,lastUpdated:new Date().toISOString()}}function ar(e,t,r,s){let a=e.tasks[r]??St(),i=t.tasks[r];if(i?.retry){let m=a.retryCount+1;if(m<=i.retry.max_attempts){let O={...a,status:"not-started",retryCount:m,lastUpdated:new Date().toISOString(),error:s};return {...e,tasks:{...e.tasks,[r]:O},lastUpdated:new Date().toISOString()}}}let c={...a,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:s,executionCount:a.executionCount+1},u=e.availableOutputs;if(i?.on_failure&&i.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...i.on_failure])]),i?.circuit_breaker&&c.executionCount>=i.circuit_breaker.max_executions){let m=i.circuit_breaker.on_break;u=[...new Set([...u,...m])];}return {...e,tasks:{...e.tasks,[r]:c},availableOutputs:u,lastUpdated:new Date().toISOString()}}function ir(e,t,r,s){let a=e.tasks[t]??St(),i={...a,progress:typeof s=="number"?s:a.progress,messages:[...a.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:a.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:i},lastUpdated:new Date().toISOString()}}function dr(e,t){let r=e.tasks[t];if(!r)return e;let s={...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]:s},lastUpdated:new Date().toISOString()}}function St(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function wt(e,t){let r=`live-${Date.now()}`,s={};for(let i of Object.keys(e.tasks))s[i]=ur();let a={status:"running",tasks:s,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:a}}function on(e,t){let{config:r,state:s}=e;if("executionId"in t&&t.executionId&&t.executionId!==s.executionId)return e;switch(t.type){case "task-started":return {config:r,state:or(s,t.taskName,r)};case "task-completed":return {config:r,state:sr(s,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:ar(s,r,t.taskName,t.error)};case "task-progress":return {config:r,state:ir(s,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:dr(s,t.taskName)};case "inject-tokens":return {config:r,state:{...s,availableOutputs:[...new Set([...s.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:fn(s,t.action)};case "task-upsert":return sn(e,t.taskName,t.taskConfig);case "task-removal":return an(e,t.taskName);case "node-requires-add":return dn(e,t.nodeName,t.tokens);case "node-requires-remove":return cn(e,t.nodeName,t.tokens);case "node-provides-add":return un(e,t.nodeName,t.tokens);case "node-provides-remove":return ln(e,t.nodeName,t.tokens);default:return e}}function cr(e,t){return t.reduce((r,s)=>on(r,s),e)}function sn(e,t,r){let s=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:s?e.state.tasks[t]:ur()},lastUpdated:new Date().toISOString()}}}function an(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...s}=e.config.tasks,{[t]:a,...i}=e.state.tasks;return {config:{...e.config,tasks:s},state:{...e.state,tasks:i,lastUpdated:new Date().toISOString()}}}function dn(e,t,r){let s=e.config.tasks[t];if(!s)return e;let a=Qe(s),i=r.filter(c=>!a.includes(c));return i.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...s,requires:[...a,...i]}}},state:e.state}}function cn(e,t,r){let s=e.config.tasks[t];if(!s)return e;let a=Qe(s),i=a.filter(c=>!r.includes(c));return i.length===a.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...s,requires:i}}},state:e.state}}function un(e,t,r){let s=e.config.tasks[t];if(!s)return e;let a=qe(s),i=r.filter(c=>!a.includes(c));return i.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...s,provides:[...a,...i]}}},state:e.state}}function ln(e,t,r){let s=e.config.tasks[t];if(!s)return e;let a=qe(s),i=a.filter(c=>!r.includes(c));return i.length===a.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...s,provides:i}}},state:e.state}}function ft(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function vt(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,s=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(!s.tasks||typeof s.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(s.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:s}}function ur(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function fn(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function pt(e){let{config:t,state:r}=e,s=Qt(t);if(Object.keys(s).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let i=pn(s),c=rr(t,r.tasks),u=new Set([...c,...r.availableOutputs]),m=[],O=[],$=[],k=[];for(let[T,w]of Object.entries(s)){let q=r.tasks[T],x=er(w,t.settings),L=x!=="once";if(q?.status===Ze.RUNNING||Pt(q))continue;let J=tr(w);if(J!==void 0&&q&&q.executionCount>=J||w.circuit_breaker&&q&&q.executionCount>=w.circuit_breaker.max_executions||!L&&q?.status===Ze.COMPLETED)continue;if(L&&q?.status===Ze.COMPLETED){let y=Qe(w),l=false;switch(x){case "data-changed":{y.length>0&&y.some(S=>{for(let[A,_]of Object.entries(s))if(qe(_).includes(S)){let j=r.tasks[A];if(!j)continue;let Q=q.lastConsumedHashes?.[S];return j.lastDataHash==null?j.executionCount>q.lastEpoch:j.lastDataHash!==Q}return false})||(l=true);break}case "epoch-changed":{y.length>0&&y.some(S=>{for(let[A,_]of Object.entries(s))if(qe(_).includes(S)){let j=r.tasks[A];if(j&&j.executionCount>q.lastEpoch)return true}return false})||(l=true);break}case "time-based":{let p=w.refreshInterval??0;if(p<=0){l=true;break}let S=q.completedAt;if(!S){l=true;break}(Date.now()-Date.parse(S))/1e3<p&&(l=true);break}case "manual":l=true;break}if(l)continue}let I=Qe(w);if(I.length===0){m.push(T);continue}let M=[],R=[],C=[];for(let y of I){if(u.has(y))continue;let l=i[y]||[];l.length===0?M.push(y):l.every(S=>Pt(r.tasks[S]))?C.push({token:y,failedProducer:l[0]}):R.push(y);}M.length>0?$.push({taskName:T,missingTokens:M}):C.length>0?k.push({taskName:T,failedTokens:C.map(y=>y.token),failedProducers:[...new Set(C.map(y=>y.failedProducer))]}):R.length>0?O.push({taskName:T,waitingOn:R}):m.push(T);}let v={};if(m.length>1){let T=nr(m,s);for(let[w,q]of Object.entries(T))q.length>1&&(v[w]=q);}return {eligible:m,pending:O,unresolved:$,blocked:k,conflicts:v}}function pn(e){let t={};for(let[r,s]of Object.entries(e)){for(let a of qe(s))t[a]||(t[a]=[]),t[a].push(r);if(s.on)for(let a of Object.values(s.on))for(let i of a)t[i]||(t[i]=[]),t[i].includes(r)||t[i].push(r);if(s.on_failure)for(let a of s.on_failure)t[a]||(t[a]=[]),t[a].includes(r)||t[a].push(r);}return t}var gt=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function $t(e){let t=Dt(e);return gn(t)}function Dt(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Dt).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(s=>JSON.stringify(s)+":"+Dt(t[s])).join(",")+"}"}function gn(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,s=0xffffffffffffffffn;for(let a=0;a<e.length;a++)t^=BigInt(e.charCodeAt(a)),t=t*r&s;return t.toString(16).padStart(16,"0")}function mn(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 s of t)r+=String.fromCharCode(s);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function hn(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),s=atob(r),a=new Uint8Array(s.length);for(let i=0;i<s.length;i++)a[i]=s.charCodeAt(i);return new TextDecoder().decode(a)}throw new Error("No base64 decoder available in this runtime")}function lr(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return mn(t)}function yn(e){try{let t=JSON.parse(hn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function fr(e,t,r){let{handlers:s,onNodeRemoved:a,onDrain:i}=t,c=new gt,u="state"in e&&"config"in e?e:wt(e),m=false,O=new Set,$=new Map(Object.entries(s)),k=new gt,v=false,T=false;function w(){if(!m){if(v){T=true;return}v=true;try{do T=!1,q();while(T)}finally{v=false;}}}function q(){let I=k.drain(),M=c.drain(),R=[...I,...M];if(R.length>0&&(u=cr(u,R),a)){for(let y of R)if(y.type==="task-removal")try{a(y.taskName);}catch(l){console.warn("[reactive] onNodeRemoved failed:",l instanceof Error?l.message:String(l));}}let C=pt(u);R.length>0&&i?.(R,u,C);for(let y of C.eligible)J(y);for(let y of R)if(y.type==="task-progress"){let{taskName:l,update:p}=y;if(!u.config.tasks[l])continue;let A=u.state.tasks[l];if(!A||A.status!=="running")continue;let _=lr(l),j=L(l,_,p).catch(Q=>{m||(k.append({type:"task-failed",taskName:l,error:Q.message??String(Q),timestamp:new Date().toISOString()}),w());}).finally(()=>{O.delete(j);});O.add(j);}}function x(I){let R=u.config.tasks[I].requires??[],C=new Map;for(let[l,p]of Object.entries(u.config.tasks))for(let S of p.provides??[])C.set(S,l);let y={};for(let l of R){let p=C.get(l);p?y[l]=u.state.tasks[p]?.data:y[l]=void 0;}return y}async function L(I,M,R){let C=u.config.tasks[I],y=C.taskHandlers??[],l=x(I);for(let p of y){let S=$.get(p);if(!S)throw new Error(`Handler '${p}' not found in registry (task '${I}')`);let A={nodeId:I,state:l,taskState:u.state.tasks[I],config:C,callbackToken:M,update:R};if(await S(A)==="task-initiate-failure")throw new Error(`Handler '${p}' returned task-initiate-failure (task '${I}')`)}}function J(I){let R=u.config.tasks[I]?.taskHandlers;if(!R||R.length===0)return;k.append({type:"task-started",taskName:I,timestamp:new Date().toISOString()}),w();let C=lr(I),y=L(I,C).catch(l=>{m||(k.append({type:"task-failed",taskName:I,error:l.message??String(l),timestamp:new Date().toISOString()}),w());}).finally(()=>{O.delete(y);});O.add(y);}return {push(I){m||(I.type==="task-completed"&&I.data&&!I.dataHash&&(I={...I,dataHash:$t(I.data)}),c.append(I),w());},pushAll(I){if(!m){for(let M of I)M.type==="task-completed"&&M.data&&!M.dataHash?c.append({...M,dataHash:$t(M.data)}):c.append(M);w();}},resolveCallback(I,M,R){if(m)return;let C=yn(I);if(!C)return;let{taskName:y}=C;if(u.config.tasks[y]){if(R&&R.length>0)c.append({type:"task-failed",taskName:y,error:R.join("; "),timestamp:new Date().toISOString()});else {let l=M&&Object.keys(M).length>0?$t(M):void 0;c.append({type:"task-completed",taskName:y,data:M,dataHash:l,timestamp:new Date().toISOString()});}w();}},addNode(I,M){m||(c.append({type:"task-upsert",taskName:I,taskConfig:M,timestamp:new Date().toISOString()}),w());},removeNode(I){m||(c.append({type:"task-removal",taskName:I,timestamp:new Date().toISOString()}),w());},addRequires(I,M){m||(c.append({type:"node-requires-add",nodeName:I,tokens:M,timestamp:new Date().toISOString()}),w());},removeRequires(I,M){m||(c.append({type:"node-requires-remove",nodeName:I,tokens:M,timestamp:new Date().toISOString()}),w());},addProvides(I,M){m||(c.append({type:"node-provides-add",nodeName:I,tokens:M,timestamp:new Date().toISOString()}),w());},removeProvides(I,M){m||(c.append({type:"node-provides-remove",nodeName:I,tokens:M,timestamp:new Date().toISOString()}),w());},registerHandler(I,M){$.set(I,M);},unregisterHandler(I){$.delete(I);},retrigger(I){m||u.config.tasks[I]&&(c.append({type:"task-restart",taskName:I,timestamp:new Date().toISOString()}),w());},retriggerAll(I){if(!m){for(let M of I)u.config.tasks[M]&&c.append({type:"task-restart",taskName:M,timestamp:new Date().toISOString()});w();}},snapshot(){return ft(u)},getState(){return u},getSchedule(){return pt(u)},async waitForHandlers(){O.size>0&&await Promise.allSettled([...O]);},async dispose(I){I?.wait&&O.size>0&&await Promise.allSettled([...O]),m=true;}}}var kn=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-server-runtime.cjs', document.baseURI).href)));kn("./jsonata-sync.cjs");var bn=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('board-live-cards-server-runtime.cjs', document.baseURI).href))),xt=bn("./jsonata-sync.cjs"),mr=xt;function pr(e,t){if(!t||!e)return;let r=t.split("."),s=e;for(let a=0;a<r.length;a++){if(s==null)return;s=s[r[a]];}return s}function hr(e,t,r){let s=t.split("."),a=e;for(let i=0;i<s.length-1;i++)(a[s[i]]==null||typeof a[s[i]]!="object")&&(a[s[i]]={}),a=a[s[i]];a[s[s.length-1]]=r;}async function Sn(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??{},s={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 a of e.compute)try{let i=await xt(a.expr).evaluate(s);hr(e.computed_values,a.bindTo,i),s.computed_values=e.computed_values;}catch{}return e}function wn(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??{},s={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},a=[];for(let i of e.compute)try{let c=mr(i.expr).evaluate(s);hr(e.computed_values,i.bindTo,c),s.computed_values=e.computed_values;}catch(c){let u=c instanceof Error?c.message:String(c);a.push({bindTo:i.bindTo,error:u});}return a.length>0?{ok:true,node:e,errors:a}:{ok:true,node:e}}async function vn(e,t,r){let s={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return xt(e).evaluate(s)}function xn(e,t){return t.startsWith("fetched_sources.")?pr(e._sourcesData??{},t.slice(16)):pr(e,t)}var gr=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),An=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function In(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 s of Object.keys(r))An.has(s)||t.push(`Unknown top-level key: "${s}"`);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 s=r.meta;s.title!=null&&typeof s.title!="string"&&t.push("meta.title: must be a string"),s.tags!=null&&!Array.isArray(s.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((s,a)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`provides[${a}]: must be an object with bindTo and ref`);else {let i=s;(typeof i.bindTo!="string"||!i.bindTo)&&t.push(`provides[${a}]: missing required "bindTo" string`),(typeof i.ref!="string"||!i.ref)&&t.push(`provides[${a}]: 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((s,a)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`compute[${a}]: must be a compute step object`);else {let i=s;(typeof i.bindTo!="string"||!i.bindTo)&&t.push(`compute[${a}]: missing required "bindTo" property`),(typeof i.expr!="string"||!i.expr)&&t.push(`compute[${a}]: 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 s=new Set,a=new Set;r.source_defs.forEach((i,c)=>{if(!i||typeof i!="object"||Array.isArray(i))t.push(`source_defs[${c}]: must be an object`);else {let u=i;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${c}]: missing required "bindTo" property`):(s.has(u.bindTo)&&t.push(`source_defs[${c}]: bindTo "${u.bindTo}" is not unique across source_defs`),s.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${c}]: missing required "outputFile" property`):(a.has(u.outputFile)&&t.push(`source_defs[${c}]: outputFile "${u.outputFile}" is not unique across source_defs`),a.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${c}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let s=r.view;!Array.isArray(s.elements)||s.elements.length===0?t.push("view.elements: required, must be a non-empty array"):s.elements.forEach((a,i)=>{if(!a||typeof a!="object"){t.push(`view.elements[${i}]: must be an object`);return}!a.kind||typeof a.kind!="string"?t.push(`view.elements[${i}].kind: required, must be a string`):gr.has(a.kind)||t.push(`view.elements[${i}].kind: unknown kind "${a.kind}". Valid: ${[...gr].join(", ")}`),a.data!=null&&(typeof a.data!="object"||Array.isArray(a.data))&&t.push(`view.elements[${i}].data: must be an object`);}),s.layout!=null&&(typeof s.layout!="object"||Array.isArray(s.layout))&&t.push("view.layout: must be an object"),s.features!=null&&(typeof s.features!="object"||Array.isArray(s.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function _n(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async s=>{let a={};if(s.projections&&typeof s.projections=="object"&&!Array.isArray(s.projections)){for(let[i,c]of Object.entries(s.projections))if(typeof c=="string"&&c.trim().length>0)try{a[i]=await xt(c).evaluate(r);}catch{a[i]=void 0;}}return {...s,_projections:a}}))}function Tn(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(s=>{let a={};if(s.projections&&typeof s.projections=="object"&&!Array.isArray(s.projections)){for(let[i,c]of Object.entries(s.projections))if(typeof c=="string"&&c.trim().length>0)try{a[i]=mr(c).evaluate(r);}catch{a[i]=void 0;}}return {...s,_projections:a}})}var Ve={run:Sn,runSync:wn,eval:vn,resolve:xn,validate:In,enrichSources:_n,enrichSourcesSync:Tn};function yr(e){return JSON.stringify(e)}function Cr(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 mt(e,t){function r(){return e.readIndex()??{}}function s(a,i,c){let u=String(i||"").split(".").filter(Boolean);if(u.length===0)return c&&typeof c=="object"&&!Array.isArray(c)?c:{value:c};let m={...a},O=m;for(let $=0;$<u.length-1;$++){let k=u[$],v=O[k],T=v&&typeof v=="object"&&!Array.isArray(v)?{...v}:{};O[k]=T,O=T;}return O[u[u.length-1]]=c,m}return {readCard(a){let i=r()[a];return !i||!e.cardExists(i.key)?null:e.readCard(i.key)},readCardKey(a){return r()[a]?.key??null},readAllCards(){let a=[];for(let[i,c]of Object.entries(r())){if(!e.cardExists(c.key))continue;let u=e.readCard(c.key);u?a.push(u):t?.(`[card-store] could not read card "${i}" at key "${c.key}"`);}return a},readChecksumIndex(){let a={};for(let[i,c]of Object.entries(r()))a[i]=c.checksum;return a},changedSince(a){let i=r(),c=[];for(let[u,m]of Object.entries(i))a[u]!==m.checksum&&c.push(u);for(let u of Object.keys(a))i[u]||c.push(u);return c},validateUpsert(a,i){let c=r(),u=c[a],m=Object.entries(c).find(([,O])=>O.key===i);return u&&u.key!==i?{ok:false,error:`Card id "${a}" is already mapped to key "${u.key}", cannot remap to "${i}"`}:m&&m[0]!==a?{ok:false,error:`Key "${i}" is already mapped to card id "${m[0]}", cannot remap to "${a}"`}:{ok:true}},writeCard(a,i,c){let u=r(),m=c??u[a]?.key??e.defaultCardKey(a),O=e.writeCard(m,i);u[a]={key:m,checksum:O,updatedAt:new Date().toISOString()},e.writeIndex(u);},patchCard(a,i,c){let u=r(),m=u[a];if(!m||!e.cardExists(m.key))throw new Error(`card "${a}" not found`);let O=e.readCard(m.key);if(!O||typeof O!="object"||Array.isArray(O))throw new Error(`card "${a}" is not patchable`);let $=s(O,i,c),k=e.writeCard(m.key,$);u[a]={key:m.key,checksum:k,updatedAt:new Date().toISOString()},e.writeIndex(u);},removeCard(a){let i=r(),c=i[a];c&&(e.removeCard(c.key),delete i[a],e.writeIndex(i));},readIndex(){return r()}}}function At(e,t){return {readSourceData(r,s){let a=e.read(`${r}/${s}`);if(a==null)return null;let i=a.trim();if(!i)return null;try{return JSON.parse(i)}catch{return i}},ingestSourceDataStaged(r,s,a,i){let c=t(a);e.write(`${r}/.staged/${i}/${s}`,c);},commitSourceData(r,s,a){let i=`${r}/.staged/${a}/${s}`,c=e.read(i);return c==null?false:(e.write(`${r}/${s}`,c),e.remove(i),true)},hasSource(r,s){return e.exists(`${r}/${s}`)},listSources(r){return e.listKeys(`${r}/`).filter(s=>!s.includes("/.staged/")).map(s=>s.slice(`${r}/`.length))}}}function wr(e){function t(r){let s=e.readAllEntries();if(!r)return s;let a=s.findIndex(i=>i.id===r);return a===-1?s:s.slice(a+1)}return {readEntriesAfterCursor(r){let s=t(r);return s.length===0?{events:[],newCursor:r}:{events:s.map(a=>a.event),newCursor:s[s.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function vr(e,t){return {appendEntries(r,s){if(!r||s.length===0)return;let a=e.read(r)??[];e.write(r,[...a,...s]);},dispatchEntriesForJournalId(r,s){if(!r)return;let a=e.read(r);if(!(!a||a.length===0)){for(let i of a)try{s(i);}catch(c){let u=c instanceof Error?c.message:String(c);try{t(i,u);}catch{}}e.delete(r);}}}}var It="v1",rt="board/graph",xr="board/lastJournalProcessedId";function kr(e){return `cards/${e}/runtime`}function Ar(e){return {readRuntime(t){return e.read(kr(t))??{_sources:{}}},writeRuntime(t,r){e.write(kr(t),r);}}}function En(e,t){let r={...e};for(let s of t.deleteKeys)delete r[s];return {...r,...t.shallowMerge}}function Ir(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==It)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let s=e.readValues(t);if(s.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:s.version};let a=En(s.values,r);return {ok:true,newVersion:e.writeValues(t,a,r.deleteKeys)}}}}function Lt(e){function t(r){let s=e.read(r);return s==null?null:typeof s=="string"?s:JSON.stringify(s)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Cr(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",yr(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",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);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){e.write("archive-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);}}}function _r(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let s=r.match(/^cards\/([^/]+)\/computed_values$/);s&&(t[s[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,s]of Object.entries(t))r&&e.write(`data-objects/${r}`,s);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Rr(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function On(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function br(e,t){return e?.lastRequestedToken?On(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function jn(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Sr(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function _t(e,t){let r=t.state.tasks,s=t.config.tasks,a=Object.keys(r),i=pt(t),c={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let w of i.pending)u.set(w.taskName,w.waitingOn);for(let w of i.unresolved)u.set(w.taskName,w.missingTokens);for(let w of i.blocked)u.set(w.taskName,w.failedTokens);let m=new Map;for(let[w,q]of Object.entries(s))for(let x of q.requires??[]){let L=m.get(x)??[];L.push(w),m.set(x,L);}let O=a.sort().map(w=>{let q=r[w],x=s[w]??{requires:[],provides:[]};q.status==="completed"?c.completed+=1:q.status==="failed"?c.failed+=1:q.status==="in-progress"&&(c.in_progress+=1);let L=x.requires??[],J=x.provides??[],I=Object.keys(q.data??{}).sort(),M=L.filter(S=>t.state.availableOutputs.includes(S)),R=L.filter(S=>!t.state.availableOutputs.includes(S)),C=u.get(w)??R,y=new Set;for(let S of J)for(let A of m.get(S)??[])A!==w&&y.add(A);let l=q.failedAt,p=q.error?{message:q.error,code:"TASK_FAILED",at:l,source:"task-runtime"}:void 0;return {name:w,status:q.status,error:p,requires:L,requires_satisfied:M,requires_missing:R,provides_declared:J,provides_runtime:I,blocked_by:C,unblocks:Array.from(y).sort(),runtime:{attempt_count:q.executionCount??0,restart_count:q.retryCount??0,in_progress_since:q.status==="in-progress"?q.startedAt??null:null,last_transition_at:q.lastUpdated??null,last_completed_at:q.completedAt??null,last_restarted_at:q.startedAt??null,status_age_ms:q.lastUpdated?0:null}}});c.pending=i.pending.length,c.blocked=i.blocked.length,c.unresolved=i.unresolved.length;let $=O.map(w=>({name:w.name,fanOut:w.unblocks.length})).sort((w,q)=>q.fanOut-w.fanOut||w.name.localeCompare(q.name)),k=$.length>0?$[0]:{name:null,fanOut:0},v=new Set;for(let w of Object.values(s))for(let q of w.requires??[])v.add(q);let T=0;for(let[w,q]of Object.entries(s)){let x=(q.requires??[]).length===0,J=(q.provides??[]).some(I=>(m.get(I)??[]).some(M=>M!==w));x&&!J&&(T+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:a.length,completed:c.completed,eligible:i.eligible.length,pending:c.pending,blocked:c.blocked,unresolved:c.unresolved,failed:c.failed,in_progress:c.in_progress,orphan_cards:T,topology:{edge_count:Array.from(v).length,max_fan_out_card:k.name,max_fan_out:k.fanOut}},cards:O}}function Bn(){return new Date().toISOString()}function Tr(e,t,r,s,a,i,c){return async u=>{let m=[],O=r.cardStore.readCard(u.nodeId);if(!O)return "task-initiate-failure";let $=O.id,k=O.card_data??{},v=O.source_defs??[],T=v.filter(F=>F.optionalForCompletionGating!==true),w=r.cardRuntimeStore.readRuntime($),q=false,x=()=>{q&&(r.cardRuntimeStore.writeRuntime($,w),q=false);},L=F=>Rr(w._sources[F]),J=(F,N)=>{w._sources[F]=Rr(N),q=true;},I=u.taskState?.executionCount??0;if(w._lastExecutionCount!==I&&(w._sources={},w._lastExecutionCount=I,q=true),u.update){let F=u.update,N=F.outputFile;if(N){let K=L(N);if(F.failure){let oe=F.rqt??K.lastRequestedToken??K.queueRequestedToken;oe&&J(N,Sr(K,oe));}else {let oe=F.rqt;if(!K.lastCompletedToken||oe>K.lastCompletedToken){let Y=typeof F.deliveryToken=="string"?F.deliveryToken:void 0,ve=false;Y&&(ve=r.fetchedSourcesStore.commitSourceData($,N,Y)),ve?J(N,jn(K,oe)):J(N,Sr(K,oe));}}x();}}let R={};for(let F of v)if(F.outputFile){let N=r.fetchedSourcesStore.readSourceData($,F.outputFile);N!==null&&(R[F.bindTo]=N);}let C={};for(let[F,N]of Object.entries(u.state??{}))if(N!==null&&typeof N=="object"&&!Array.isArray(N)){let K=N[F];C[F]=K!==void 0?K:N;}else C[F]=N;let y={id:$,card_data:{...k},requires:C,source_defs:v,compute:O.compute};y._sourcesData=R,O.compute&&Ve.runSync(y,{sourcesData:R}),(i??r.outputStore.writeComputedValues.bind(r.outputStore))($,y.computed_values??{});let l={...O},p=Ve.enrichSourcesSync(Array.isArray(O.source_defs)?O.source_defs:void 0,{card_data:O.card_data,requires:C}),S=e.value;l.source_defs=Array.isArray(p)?p.map(F=>({...F,boardDir:typeof F.boardDir=="string"&&F.boardDir?F.boardDir:S})):p;let A=Bn(),_=u.update?void 0:A,j=T.filter(F=>{let N=F.outputFile;if(typeof N!="string"||!N)return true;let K=L(N);_&&(K={...K,queueRequestedToken:_},J(N,K));let oe=K.queueRequestedToken??K.lastRequestedToken??A,Y=br(K,oe);return Y==="in-flight"?false:Y==="dispatch"});if(x(),j.length>0){let F=false,N=A;for(let K of j){let oe=K.outputFile;if(typeof oe!="string"||!oe)continue;let Y=L(oe),ve=Y.queueRequestedToken??A;J(oe,{...Y,lastRequestedToken:ve}),N=ve,F=true;}return F&&x(),F&&(m.push({taskKind:"source-fetch",payload:{boardRef:Fe(e),enrichedCard:l,callbackToken:u.callbackToken,rqt:N}}),r.executionRequestStore.appendEntries(t,m)),"task-initiated"}if(T.some(F=>{let N=F.outputFile;if(typeof N!="string"||!N)return false;let K=L(N),oe=K.queueRequestedToken??K.lastRequestedToken??A;return br(K,oe)==="in-flight"}))return "task-initiated";let te=O.provides??[],ne={};for(let{bindTo:F,ref:N}of te)ne[F]=Ve.resolve(y,N);return (c??r.outputStore.writeDataObjects.bind(r.outputStore))(ne),v.filter(F=>{if(F.optionalForCompletionGating!==true)return false;let N=L(F.outputFile);return !N.lastRequestedToken||!N.lastCompletedToken?true:N.lastCompletedToken<=N.lastRequestedToken}).length>0&&m.push({taskKind:"source-fetch",payload:{boardRef:Fe(e),enrichedCard:l,callbackToken:u.callbackToken,rqt:A}}),s(u.nodeId,ne),m.length>0&&r.executionRequestStore.appendEntries(t,m),"task-initiated"}}var Mt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Er(e){return {[rt]:e.graph,[xr]:e.lastDrainedJournalId}}function Or(e){let t=e[rt],r=e[xr];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${rt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function jr(e){let t=e.requires,r=e.provides?.map(s=>s.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function Tt(e){function t(i){return {status:"success",data:i}}function r(i){return {status:"fail",error:i}}function s(i){return {status:"error",error:i instanceof Error?i.message:String(i)}}function a(i){if(Array.isArray(i))return i;if(i&&typeof i=="object"){let c=i;return Array.isArray(c.files)?c.files:[i]}return null}return {get(i){try{let c=i.params?.id;if(c){let u=e.readCard(c);return u?t({cards:[u]}):r(`card "${c}" not found`)}return t({cards:e.readAllCards()})}catch(c){return s(c)}},set(i){try{let c=i.body;if(c==null)return r("set requires a body (card object or array of cards)");let u=Array.isArray(c)?c:[c];for(let m of u){if(typeof m.id!="string")return r("each card must have a string `id` field");e.writeCard(m.id,m);}return t({count:u.length})}catch(c){return s(c)}},del(i){try{let c=i.body?.ids??[],u=i.params?.id,m=u?[...c,u]:c;if(m.length===0)return r("del requires body.ids (string[]) or params.id");for(let O of m)e.removeCard(O);return t({count:m.length})}catch(c){return s(c)}},patch(i){try{let c=i.params?.id,u=i.params?.path;if(!c)return r("patch requires params.id");if(!u)return r("patch requires params.path");let m=i.body,O=m&&Object.prototype.hasOwnProperty.call(m,"value")?m.value:i.body;return e.patchCard(c,u,O),t({count:1})}catch(c){return s(c)}},appendFiles(i){try{let c=i.params?.id;if(!c)return r("appendFiles requires params.id");let u=e.readCard(c);if(!u)return r(`card "${c}" not found`);let m=a(i.body);if(!m||m.length===0)return r("appendFiles requires a file metadata object, array, or body.files array");let O=u.card_data&&typeof u.card_data=="object"&&!Array.isArray(u.card_data)?u.card_data:{},$=Array.isArray(O.files)?O.files:[],k=[...$,...m],v=m.map((w,q)=>({idx:$.length+q,entry:w})),T=this.patch({params:{id:c,path:"card_data.files"},body:{value:k}});return T.status!=="success"?T:t({files_added:v})}catch(c){return s(c)}}}}function se(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function W(e){return {status:"fail",error:e}}function ie(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Fn(e){let t=new TextEncoder().encode(e),r=Array.from(t,s=>String.fromCharCode(s)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Fr(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),s=atob(r),a=Uint8Array.from(s,i=>i.charCodeAt(0));return new TextDecoder().decode(a)}function Et(e){try{let t=JSON.parse(Fr(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function qn(e){return Fn(JSON.stringify(e))}function Br(e){try{let t=JSON.parse(Fr(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function je(){return new Date().toISOString()}function qr(e,t){let r=t.onWarn??(()=>{}),s=Fe(e);function a(E){if(E.length!==0)try{let g=t.publishBoardChangeNotifications?.(E);g&&typeof g.catch=="function"&&g.catch(P=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${P instanceof Error?P.message:String(P)}`));}catch(g){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${g instanceof Error?g.message:String(g)}`);}}function i(){let E=u().readCardStoreRef();if(!E)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let g=t.kvStorageForRef(E);return {readIndex(){return g.read("_index")},writeIndex(P){g.write("_index",P);},readCard(P){return g.read(P)},writeCard(P,V){return g.write(P,V),t.hashFn(V)},removeCard(P){g.delete(P);},cardExists(P){return g.read(P)!==null},defaultCardKey(P){return P}}}let c={readValues(E){let g=t.kvStorage("state-snapshot"),P=g.listKeys().sort();if(P.length===0)return {version:null,values:{}};let V={};for(let re of P)V[re]=g.read(re);return {version:t.hashFn(V),values:V}},writeValues(E,g,P){let V=t.kvStorage("state-snapshot");for(let re of P)V.delete(re);for(let[re,le]of Object.entries(g))V.write(re,le);return t.hashFn(g)}},u=()=>Lt(t.kvStorage("config")),m=()=>Ir(c),O=()=>wr(t.journalAdapter()),$=()=>mt(i(),r),k=()=>{let E=u().readOutputsStoreRef();if(!E)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return _r(t.kvStorageForRef(E))},v=()=>{let E=u().readArchiveStoreRef();return E?t.archiveFactoryForRef(E):t.archiveFactory()};function T(){return !!m().readSnapshot(e.value).values[rt]}function w(){let E=m().readSnapshot(e.value);if(!E.values[rt])throw new Error(`Board not initialized at ${e.value}`);return Or(E.values)}function q(E,g){let P=m().commitSnapshot(e.value,{schemaVersion:It,expectedVersion:g,commitId:t.genId(),committedAt:je(),deleteKeys:[],shallowMerge:Er(E)});if(!P.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${g??"null"} current=${P.currentVersion??"null"}`)}function x(E){O().appendEvent(E);}async function L(){let E=(D,X)=>{let ye=D.payload,Be=(ye?.enrichedCard??{}).id??ye?.cardId??"unknown";x({type:"task-failed",taskName:Be,error:X,timestamp:je()});},g=vr(t.kvStorage("execution-requests"),E),P=Ar(t.kvStorage("card-runtime")),V=At(t.blobStorage("sources"),D=>t.resolveBlob(D)),re=new Map,le={readRuntime(D){return re.get(D)??P.readRuntime(D)},writeRuntime(D,X){re.set(D,X);}},Ae=[],he=new Map,Ie={readSourceData(D,X){let ye=`${D}/${X}`;return he.has(ye)?he.get(ye):V.readSourceData(D,X)},ingestSourceDataStaged(D,X,ye,$e){V.ingestSourceDataStaged(D,X,ye,$e);},commitSourceData(D,X,ye){let $e=`${D}/.staged/${ye}/${X}`,Xe=t.blobStorage("sources").read($e);if(Xe==null)return false;let De=`${D}/${X}`,ut=Xe.trim();try{he.set(De,JSON.parse(ut));}catch{he.set(De,ut);}return Ae.push({cardId:D,outputFile:X,deliveryToken:ye}),true},hasSource(D,X){let ye=`${D}/${X}`;return he.has(ye)?true:V.hasSource(D,X)},listSources(D){let X=V.listSources(D),ye=new Set;for(let Be of he.keys())Be.startsWith(`${D}/`)&&ye.add(Be.slice(`${D}/`.length));let $e=new Set([...X,...ye]);return Array.from($e)}},_e={cardStore:$(),cardRuntimeStore:le,fetchedSourcesStore:Ie,outputStore:k(),executionRequestStore:g},Ue=w(),Ge=vt(Ue.graph),{events:We,newCursor:Ye}=O().readEntriesAfterCursor(Ue.lastDrainedJournalId),Ke=[],st=[],et=[],at=new Map,yt=new Set,it=(D,X)=>{Ke.push({type:"task-completed",taskName:D,data:X,timestamp:je()});try{v().stream("exec-history").append({taskName:D,status:"completed",completedAt:je()});}catch{}},dt=(D,X)=>{x({type:"task-failed",taskName:D,error:X,timestamp:je()});try{v().stream("exec-history").append({taskName:D,status:"failed",error:X,completedAt:je()});}catch{}},ee=fr(Ge,{handlers:{"card-handler":Tr(e,Ye,_e,it,dt,(D,X)=>{st.push({cardId:D,values:X});},D=>{et.push(D);})},onNodeRemoved:D=>{at.delete(D),re.delete(D),yt.add(D);}});for(Ke=We;Ke.length>0;){let D=Ke;Ke=[];for(let X of D)if(X.type==="task-restart"){let ye=_e.cardStore.readCard(X.taskName);ye&&at.set(X.taskName,ye);}ee.pushAll(D),await ee.waitForHandlers();}let ct=ee.getState();await ee.dispose({wait:true});let Ct=m().readSnapshot(e.value).version;q({lastDrainedJournalId:Ye,graph:ft(ct)},Ct);for(let{cardId:D,values:X}of st)_e.outputStore.writeComputedValues(D,X);for(let D of et)_e.outputStore.writeDataObjects(D);for(let[D,X]of re)P.writeRuntime(D,X);for(let{cardId:D,outputFile:X,deliveryToken:ye}of Ae)V.commitSourceData(D,X,ye);let nt;try{nt=_t(s,ct),_e.outputStore.writeStatusSnapshot(nt);}catch(D){r(`[board-live-cards-public] status publish failed: ${D instanceof Error?D.message:String(D)}`);}let He=[];for(let{cardId:D,values:X}of st)He.push({kind:"computed_values",cardId:D,values:X});for(let D of et)for(let[X,ye]of Object.entries(D))X&&He.push({kind:"data_object",key:X,payload:ye});for(let[D,X]of at)He.push({kind:"card_refreshed",cardId:D,card:X});for(let D of yt)He.push({kind:"card_removed",cardId:D});nt!==void 0&&He.push({kind:"status",status:nt}),a(He);let Pe=u().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:Fe({kind:"built-in",value:"source-cli-task-executor"})};g.dispatchEntriesForJournalId(Ye,D=>{if(D.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${D.taskKind}" \u2014 skipping`);return}let X=D.payload,ye=X.enrichedCard?.id??"unknown",$e=X.enrichedCard?.source_defs??[];for(let Be of $e){if(!Be.outputFile){r(`[dispatch] source "${Be.bindTo}" has no outputFile \u2014 skipping`);continue}let Xe=qn({cbk:X.callbackToken,rg:e.value,br:Fe(e),cid:ye,b:Be.bindTo,d:Be.outputFile,cs:void 0,rqt:X.rqt});t.dispatchExecution(Pe,{source_def:Be,base_ref:Fe(e),callback:{token:Xe,via:t.selfRef}}).catch(De=>dt(ye,De instanceof Error?De.message:String(De)));}});}async function J(){try{let E=()=>{let P=w(),{events:V}=O().readEntriesAfterCursor(P.lastDrainedJournalId);V.length<=0||(J(),t.requestProcessAccumulated?.());},g=await Zt(t.lock,L,E);return se({ran:g!==!1})}catch(E){return ie(E)}}function I(){J(),t.requestProcessAccumulated?.();}function M(E){try{let g=E.params?.cardStoreRef;if(!g)return W("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!T()){let _e=wt(Mt);q({lastDrainedJournalId:"",graph:ft(_e)},null);}let P=E.params?.outputsStoreRef;if(!P)return W("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let V=E.params?.scratchStoreRef,re=E.params?.archiveStoreRef,le=E.params?.chatStoreRef,Ae=E.params?.artifactsStoreRef,he=u();he.writeCardStoreRef(g),he.writeOutputsStoreRef(P),V&&he.writeScratchStoreRef(V),re&&he.writeArchiveStoreRef(re),le&&he.writeChatStoreRef(le),Ae&&he.writeArtifactsStoreRef(Ae);let Ie=E.body??{};Ie["task-executor-ref"]&&he.writeTaskExecutorRef(Ie["task-executor-ref"]),Object.prototype.hasOwnProperty.call(Ie,"chat-handler-flow")&&he.writeChatHandlerFlow(Ie["chat-handler-flow"]);try{k().writeStatusSnapshot(_t(s,vt(w().graph)));}catch{}return se()}catch(g){return ie(g)}}function R(E){try{let g=k().readStatusSnapshot();if(!g){g=_t(s,vt(w().graph));try{k().writeStatusSnapshot(g);}catch{}}return se(g)}catch(g){return ie(g)}}function C(E){try{let g=E.params?.id;return g?(x({type:"task-removal",taskName:g,timestamp:je()}),I(),se()):W("removeCard requires params.id")}catch(g){return ie(g)}}function y(E){try{let g=E.params?.cardId;if(!g)return W("addCardFiles requires params.cardId");let P=Tt($()).appendFiles({params:{id:g},body:E.body});if(P.status!=="success")return P;let V=l({params:{cardId:g}});return V.status!=="success"?V:se({cardId:g,files_added:P.data.files_added,notified:!0})}catch(g){return ie(g)}}function l(E){try{let g=E.params?.cardId;if(!g)return W("cardRefreshedNotify requires params.cardId");let P=$().readCard(g);return P?(a([{kind:"card_refreshed",cardId:g,card:P}]),se({cardId:g,notified:!0})):W(`Card "${g}" not found in board at ${e.value}`)}catch(g){return ie(g)}}function p(E){try{let g=E.params?.id;return g?(x({type:"task-restart",taskName:g,timestamp:je()}),I(),se()):W("retrigger requires params.id")}catch(g){return ie(g)}}async function S(E){return J()}function A(E){try{let g=E.params?.cardId,P=E.params?.all,V=!!E.params?.restart;if(!g&&!P)return W("upsertCard requires --card-id <id> or --all");let re=P?$().readAllCards().map(le=>le.id):[g];for(let le of re)if(!$().readCard(le))return W(`Card "${le}" not found in board at ${e.value}`);for(let le of re){let Ae=$().readCard(le),he=jr(Ae),Ie=t.hashFn(he),_e=t.kvStorage("card-upsert"),Ue=_e.read(le),Ge=Ue?.taskConfigHash!==Ie;if(!(!Ge&&!V)){if(Ge){let We=Ue?.blobRef??$().readCardKey(le)??le;x({type:"task-upsert",taskName:le,taskConfig:he,timestamp:je()}),_e.write(le,{blobRef:We,taskConfigHash:Ie,updatedAt:je()});}V&&x({type:"task-restart",taskName:le,timestamp:je()});}}return I(),se()}catch(g){return ie(g)}}function _(E){try{let g=E.params?.token;if(!g)return W("taskFailed requires params.token");let P=E.params?.error??"unknown error",V=Et(g);if(!V)return W("Invalid callback token");x({type:"task-failed",taskName:V.taskName,error:P,timestamp:je()});try{v().stream("exec-history").append({taskName:V.taskName,status:"failed",error:P,completedAt:je()});}catch{}return I(),se()}catch(g){return ie(g)}}function j(E){try{let g=E.params?.token;if(!g)return W("taskProgress requires params.token");let V=(E.body??{}).update??{},re=Et(g);return re?(x({type:"task-progress",taskName:re.taskName,update:V,timestamp:je()}),I(),se()):W("Invalid callback token")}catch(g){return ie(g)}}function Q(E){try{let g=E.params?.token,P=E.params?.ref;if(!g)return W("sourceDataFetched requires params.token");if(!P)return W("sourceDataFetched requires params.ref");let V=Br(g);if(!V)return W("Invalid source token");let{cbk:re,cid:le,b:Ae,d:he,cs:Ie,rqt:_e}=V,Ue=At(t.blobStorage("sources"),Ke=>t.resolveBlob(Ke)),Ge=t.genId();Ue.ingestSourceDataStaged(le,he,ot(P),Ge);let We=Et(re);if(!We)return W("Invalid callback token embedded in source token");let Ye=je();return x({type:"task-progress",taskName:We.taskName,update:{bindTo:Ae,outputFile:he,fetchedAt:Ye,deliveryToken:Ge,sourceChecksum:Ie,rqt:_e},timestamp:Ye}),I(),se()}catch(g){return ie(g)}}function te(E){try{let g=E.params?.token,P=E.params?.reason??"unknown";if(!g)return W("sourceDataFetchFailure requires params.token");let V=Br(g);if(!V)return W("Invalid source token");let{cbk:re,b:le,d:Ae,cs:he,rqt:Ie}=V,_e=Et(re);return _e?(x({type:"task-progress",taskName:_e.taskName,update:{bindTo:le,outputFile:Ae,failure:!0,reason:P,sourceChecksum:he,rqt:Ie},timestamp:je()}),I(),se()):W("Invalid callback token embedded in source token")}catch(g){return ie(g)}}function ne(E){try{let g=u().readCardStoreRef();return g?se({storeRef:g}):W(`Board at ${e.value} has no card store configured`)}catch(g){return ie(g)}}function ce(E){try{let g=u().readOutputsStoreRef();return g?se({storeRef:g}):W(`Board at ${e.value} has no outputs store configured`)}catch(g){return ie(g)}}function F(E){try{let g=u().readScratchStoreRef();return se({storeRef:g})}catch(g){return ie(g)}}function N(E){try{let g=u().readArchiveStoreRef();return se({storeRef:g})}catch(g){return ie(g)}}function K(E){try{let g=u().readChatStoreRef();return se({storeRef:g})}catch(g){return ie(g)}}function oe(E){try{let g=u().readArtifactsStoreRef();return se({storeRef:g})}catch(g){return ie(g)}}function Y(E){try{let g=E.params?.key;if(!g)return W("getConfig requires params.key");let P=u(),V;switch(g){case "task-executor":V=P.readTaskExecutorRef()??null;break;case "chat-handler-flow":V=P.readChatHandlerFlow()??null;break;case "card-store-ref":V=P.readCardStoreRef();break;case "outputs-store-ref":V=P.readOutputsStoreRef();break;case "scratch-store-ref":V=P.readScratchStoreRef();break;case "archive-store-ref":V=P.readArchiveStoreRef();break;case "chat-store-ref":V=P.readChatStoreRef();break;case "artifacts-store-ref":V=P.readArtifactsStoreRef();break;default:return W(`getConfig: unknown key "${g}"`)}return se({value:V})}catch(g){return ie(g)}}function ve(E){try{let g=E.params?.key;if(!g)return W("getOutputsDataObject requires params.key");let P=k().readDataObject(g);return se(P)}catch(g){return ie(g)}}function ae(E){try{return se(k().readAllDataObjects())}catch(g){return ie(g)}}function Ce(E){try{let g=E.params?.key;if(!g)return W("getOutputsComputedValues requires params.key");let P=k().readComputedValues(g);return se(P)}catch(g){return ie(g)}}function be(E){try{return se(k().readAllComputedValues())}catch(g){return ie(g)}}function pe(){return At(t.blobStorage("sources"),E=>t.resolveBlob(E))}function Se(E){let g=t.blobStorage("sources").keyRef?.(E);return g?Fe(g):E}function Ne(E){try{let g=E.params?.key;if(!g)return W("getOutputsFetchedSources requires params.key");let P=pe().listSources(g),V={};for(let re of P)V[re]=Se(`${g}/${re}`);return se(V)}catch(g){return ie(g)}}function ke(E){try{let g=pe(),P=new Set;for(let re of t.blobStorage("sources").listKeys()){let le=re.indexOf("/");le>0&&!re.includes("/.staged/")&&P.add(re.slice(0,le));}let V={};for(let re of P){let le=g.listSources(re);if(le.length>0){V[re]={};for(let Ae of le)V[re][Ae]=Se(`${re}/${Ae}`);}}return se(V)}catch(g){return ie(g)}}return {init:M,status:R,getCardStoreRef:ne,getOutputsStoreRef:ce,getScratchStoreRef:F,getArchiveStoreRef:N,getChatStoreRef:K,getArtifactsStoreRef:oe,getConfig:Y,getOutputsDataObject:ve,getAllOutputsDataObjects:ae,getOutputsComputedValues:Ce,getAllOutputsComputedValues:be,getOutputsFetchedSources:Ne,getAllOutputsFetchedSources:ke,removeCard:C,addCardFiles:y,cardRefreshedNotify:l,retrigger:p,processAccumulatedEvents:S,upsertCard:A,taskFailed:_,taskProgress:j,sourceDataFetched:Q,sourceDataFetchFailure:te}}function Nr(e,t){let r=()=>Lt(t.kvStorage("config"));function s(){let R=r().readCardStoreRef();if(!R)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let C=t.kvStorageForRef(R);return {readIndex(){return C.read("_index")},writeIndex(y){C.write("_index",y);},readCard(y){return C.read(y)},writeCard(y,l){return C.write(y,l),t.hashFn(l)},removeCard(y){C.delete(y);},cardExists(y){return C.read(y)!==null},defaultCardKey(y){return y}}}let a=()=>mt(s(),t.onWarn??(()=>{})),i=()=>{let R=r().readScratchStoreRef();return R?t.scratchStorageForRef(R):t.scratchStorage()};function c(R,C){let y=t.validateSchema(C),l=[],p=r().readTaskExecutorRef();if(p&&Array.isArray(C.source_defs))for(let A of C.source_defs){let _=typeof A.bindTo=="string"?A.bindTo:"(unknown)";try{let j;try{j=t.invokeExecutorSync(p,"validate-source-def",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(A)});}catch(te){let ne=te;if(j=typeof ne?.stdout=="string"?ne.stdout:"",!j.trim()){l.push(`source "${_}": executor validate-source-def failed \u2014 ${te instanceof Error?te.message:String(te)}`);continue}}let Q=JSON.parse(j.trim());if(!Q.ok&&Array.isArray(Q.errors))for(let te of Q.errors)l.push(`source "${_}": ${te}`);}catch(j){l.push(`source "${_}": executor validate-source-def failed \u2014 ${j instanceof Error?j.message:String(j)}`);}}let S=[...y.errors,...l];return se({cardId:R,isValid:S.length===0,issues:S})}function u(R,C){let y=r().readTaskExecutorRef();if(!y)throw new Error("No task-executor registered for this board");let l=typeof R.bindTo=="string"?R.bindTo:"source",p=i(),S={...R,boardDir:e.value,_projections:C},A=p.create(JSON.stringify(S,null,2),`probe-in-${l}`,".json"),_=p.getUniqueKey(`probe-out-${l}`,".json"),j=p.getUniqueKey(`probe-err-${l}`,".txt"),Q=Fe(p.keyRef(A)),te=Fe(p.keyRef(_)),ne=Fe(p.keyRef(j)),ce=null;try{if(t.invokeExecutorSync(y,"run-source-fetch",["--in-ref",Q,"--out-ref",te,"--err-ref",ne],{timeout:R.timeout??t.executorTimeouts?.probeMs??6e4}),ce=p.read(_),ce===null)throw new Error("Executor produced no output file")}catch(F){let N=p.read(j)?.trim()??(F instanceof Error?F.message:String(F));throw new Error(`Probe failed: ${N}`)}finally{try{p.remove(A);}catch{}try{p.remove(j);}catch{}}return {bindTo:l,result:ce}}function m(R,C,y){let l;try{l=u(R,C);}catch(p){return W(p instanceof Error?p.message:String(p))}if(y){let p=ot(y);t.absoluteBlob.write(p.value,l.result);}return se({bindTo:l.bindTo,resultSizeBytes:l.result.length})}function O(R,C){let y=R.params?.sourceIdx,l=R.params?.outRef;if(y===void 0)return W(`${C} requires params.sourceIdx`);if(!R.body||typeof R.body!="object"||Array.isArray(R.body))return W(`${C} requires card JSON object in body`);let p=R.body,S=p["card-content"]??p,A=p["mock-projections"]??{},_=S.source_defs??[];if(y<0||y>=_.length)return W(`sourceIdx ${y} out of range (card has ${_.length} source(s))`);let j=_[y],Q=typeof j.bindTo=="string"?j.bindTo:"source";return {src:j,bindTo:Q,outRef:l,mockProjections:A}}function $(R){try{let C=R.params?.cardId,y=R.params?.all;if(!C&&!y)return W("validateCard requires --card-id <id> or --all");let l=y?a().readAllCards().map(S=>S.id):[C],p=[];for(let S of l){let A=a().readCard(S);if(!A){p.push({cardId:S,isValid:!1,issues:[`Card "${S}" not found`]});continue}let _=c(S,A);if(_.status!=="success")return _;p.push(_.data);}return se(p)}catch(C){return ie(C)}}function k(R){try{if(!R.body||typeof R.body!="object"||Array.isArray(R.body))return W("validateCardPreflight requires card JSON object in body");let C=R.body,y=C["card-content"]??C,l=typeof y.id=="string"?y.id:"(unknown)";return c(l,y)}catch(C){return ie(C)}}function v(R){try{let C=R.params?.cardId,y=R.params?.sourceIdx,l=R.params?.outRef;if(!C)return W("probeSource requires params.cardId");if(y===void 0)return W("probeSource requires params.sourceIdx");let S=(R.body??{})["mock-projections"]??{},A=a().readCard(C);if(!A)return W(`Card "${C}" not found`);let _=A.source_defs??[];return y<0||y>=_.length?W(`sourceIdx ${y} out of range (card has ${_.length} source(s))`):m(_[y],S,l)}catch(C){return ie(C)}}function T(R){try{let C=R.params?.outRef,y=R.body;if(!y)return W('probeTmpSource requires body with "source-def" and "mock-projections"');let l=y["source-def"],p=y["mock-projections"]??{};return l?m(l,p,C):W('probeTmpSource body requires "source-def"')}catch(C){return ie(C)}}function w(R){try{let C=O(R,"probeSourcePreflight");if("status"in C)return C;let y=r().readTaskExecutorRef();if(!y)return W("No task-executor registered for this board");try{let l={...C.src,_projections:C.mockProjections},p=t.invokeExecutorSync(y,"probe-source-preflight",[],{timeout:C.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(l)}),S=JSON.parse(p.trim());return S.ok?se({bindTo:C.bindTo,reachable:S.reachable,latencyMs:S.latencyMs,note:S.note}):W(S.error??"Preflight probe failed")}catch{return W("Executor does not support probe-source-preflight")}}catch(C){return ie(C)}}function q(R){try{let C=O(R,"runSourcePreflight");if("status"in C)return C;try{let y=u(C.src,C.mockProjections);if(C.outRef){let p=ot(C.outRef);t.absoluteBlob.write(p.value,y.result);}let l=y.result;try{l=JSON.parse(y.result);}catch{}return se({bindTo:y.bindTo,ok:!0,result:l,issues:[]})}catch(y){let l=y instanceof Error?y.message:String(y);return l==="No task-executor registered for this board"?W(l):se({bindTo:C.bindTo,ok:!1,result:null,issues:[l]})}}catch(C){return ie(C)}}function x(R){try{let C=r().readTaskExecutorRef();if(!C)return W("No task-executor registered for this board");let y=t.invokeExecutorSync(C,"describe-capabilities",[],{timeout:t.executorTimeouts?.describeMs??1e4});return se(JSON.parse(y.trim()))}catch(C){return ie(C)}}function L(R){try{let C=R.body;if(!C||!Array.isArray(C.ops))return W("updatesInCardStore requires body.ops array");let y=C.ops,l=a();for(let p of y){let S=p.op,A=p.id;if(!A)return W('op is missing "id"');if(S==="update"){let _=p["card-content"];if(!_)return W(`update op for "${A}" is missing "card-content"`);l.writeCard(A,_);}else return W(`Unknown op type: "${S??"(none)"}"`)}return se()}catch(C){return ie(C)}}function J(R){try{let C=R.body;if(!C||!Array.isArray(C.ids))return W("readFromCardStore requires body.ids array");let y=C.ids,l=a(),p=y.map(S=>({id:S,"card-content":l.readCard(S)}));return se({cards:p})}catch(C){return ie(C)}}function I(R){try{if(!R.body||typeof R.body!="object"||Array.isArray(R.body))return W("evalCardCompute requires a JSON object in body");let C=R.body,y=C["card-content"]??C,l=typeof y.id=="string"?y.id:"(unknown)",p=C["mock-fetched-sources"]??{},S=C["mock-requires"]??{},A=y.compute;if(!A||!Array.isArray(A)||A.length===0)return se({cardId:l,ok:!0,computed_values:{},errors:[]});let _={id:l,card_data:y.card_data??{},requires:S,source_defs:y.source_defs,compute:A},j=Ve.runSync(_,{sourcesData:p}),Q=j.node.computed_values??{},te=j.errors??[];return se({cardId:l,ok:te.length===0,computed_values:Q,errors:te})}catch(C){return ie(C)}}function M(R){try{if(!R.body||typeof R.body!="object"||Array.isArray(R.body))return W("simulateCardCycle requires a JSON object in body");let C=R.body,y=C["card-content"]??C,l=typeof y.id=="string"?y.id:"(unknown)",p=C["mock-fetched-sources"]??{},S=C["mock-requires"]??{},A=c(l,y),_=A.status==="success"?{isValid:A.data.isValid,issues:A.data.issues}:{isValid:!1,issues:[A.status==="fail"?A.error:"internal error"]},j=y.source_defs??[],Q=y.card_data??{},te=[],ne=[];if(j.length>0){te=Ve.enrichSourcesSync(j,{card_data:Q,requires:S});for(let Ce of te){let be=Ce.projections,pe=Ce._projections;if(be&&pe){for(let Se of Object.keys(be))if(pe[Se]===void 0){let Ne=typeof Ce.bindTo=="string"?Ce.bindTo:"(unknown)";ne.push({bindTo:Ne,key:Se,error:`Projection "${Se}" resolved to undefined`});}}}}let ce=[],F={...p},N=C["task-executor-ref"],K=(N?.howToRun&&N?.whatToRun?N:void 0)??r().readTaskExecutorRef();for(let Ce=0;Ce<te.length;Ce++){let be=te[Ce],pe=typeof be.bindTo=="string"?be.bindTo:`source_${Ce}`;if(!K){ce.push({bindTo:pe,skipped:!0,error:"No task executor configured"});continue}try{let Se={...be},Ne=t.invokeExecutorSync(K,"run-source-preflight",[],{timeout:be.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(Se)}),ke=JSON.parse(Ne.trim());ke.ok&&!Object.prototype.hasOwnProperty.call(p,pe)&&Object.prototype.hasOwnProperty.call(ke,"resultValue")&&(F[pe]=ke.resultValue),ce.push({bindTo:pe,reachable:ke.reachable,latencyMs:ke.latencyMs,error:ke.ok?void 0:ke.error});}catch{ce.push({bindTo:pe,skipped:!0,error:"Executor does not support run-source-preflight"});}}let oe=y.compute,Y={},ve=[];if(oe&&Array.isArray(oe)&&oe.length>0){let Ce={id:l,card_data:Q,requires:S,source_defs:y.source_defs,compute:oe},be=Ve.runSync(Ce,{sourcesData:F});Y=be.node.computed_values??{},ve=be.errors??[];}let ae=_.isValid&&ne.length===0&&ve.length===0&&ce.every(Ce=>Ce.reachable!==!1);return se({cardId:l,ok:ae,validation:_,source_probes:ce,projection_errors:ne,fetched_sources:F,computed_values:Y,compute_errors:ve})}catch(C){return ie(C)}}return {validateCard:$,validateCardPreflight:k,probeSource:v,probeTmpSource:T,probeSourcePreflight:w,runSourcePreflight:q,evalCardCompute:I,simulateCardCycle:M,describeTaskExecutorCapabilities:x,updatesInCardStore:L,readFromCardStore:J}}function Te(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 Nn(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 we(e){return Array.isArray(e)?e:[]}function Vt(e,t){if(typeof t!="string"||t.length===0)return;let r=e,s=t;s.startsWith("fetched_sources.")&&(r=Z(e).fetched_sources,s=s.slice(16));for(let a of s.split(".")){if(r==null||typeof r!="object")return;r=r[a];}return r}function Ut(e,t){let r=Z(e.view),s=we(r.elements);return {layout:r.layout,features:r.features,elements:s.map((a,i)=>{let c=Z(a),u=Z(c.data),m=typeof c.visible=="string"?!!Vt(t,c.visible):true,O=typeof u.bind=="string"?u.bind:void 0,$=typeof u.maxRows=="number"?u.maxRows:void 0,k=O?Vt(t,O):void 0,v={id:typeof c.id=="string"&&c.id?c.id:`element-${i}`,kind:c.kind,label:c.label,visible:m};return k!==void 0&&(v.resolved=Array.isArray(k)&&typeof $=="number"?k.slice(0,$):k),v})}}function Pr(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",s=we(e.provides),a=s.length>0?s:[{bindTo:r,ref:"card_data"}],i={};for(let c of a){let u=Z(c),m=typeof u.bindTo=="string"?u.bindTo:"",O=typeof u.ref=="string"?u.ref:"";if(!m||!O)continue;let $=Vt(t,O);$!==void 0&&(i[m]=$);}return i}function Pn(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 $n(e){return {"card-content":e}}function ht(e,t){let r=Te(e.get({params:{id:t}}),"cardStore.get"),s=Array.isArray(r?.cards)?r.cards:[];if(s.length===0)throw new Error(`Card "${t}" not found`);return s[0]}function $r(e){let{board:t,nonCore:r,cardStore:s,chatStore:a,uploadCardFile:i,buildFileDownloadUrl:c,readFetchedSourceJsonByRef:u}=e;function m(l){if(Array.isArray(l.bytes))return new Uint8Array(l.bytes.map(p=>Math.max(0,Math.min(255,Number(p)||0))));if(typeof l.text=="string")return new TextEncoder().encode(l.text);if(typeof l.base64=="string"){let p=String(l.base64).replace(/-/g,"+").replace(/_/g,"/"),S=p+"=".repeat((4-p.length%4)%4),A=atob(S);return Uint8Array.from(A,_=>_.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}function O(){let l=Z(Te(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:l.version,commonSourceFields:Z(l.commonSourceDefFields),sourceKinds:Z(l.sourceKinds)}}function $(){let l=Z(Te(t.status({}),"status")),p=Z(l.summary),S=we(l.cards);return {meta:Z(l.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:S.map(A=>{let _=Z(A);return {"card-id":typeof _.name=="string"?_.name:null,status:_.status??null,error:_.error??null,requires:we(_.requires),requires_satisfied:we(_.requires_satisfied),requires_missing:we(_.requires_missing),provides_declared:we(_.provides_declared),provides_runtime:we(_.provides_runtime)}})}}function k(l){let p=String(l.cardId||"").trim();if(!p)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let S=Z(Te(t.status({}),"status")),_=we(S.cards).map(Z).find(ae=>ae.name===p);if(!_)throw new Error(`card "${p}" not found in board status`);let j=Z(ht(s,p)),Q=we(_.requires_satisfied).filter(ae=>typeof ae=="string"&&!!ae),te=we(_.provides_runtime).filter(ae=>typeof ae=="string"&&!!ae),ne=Object.fromEntries(Q.map(ae=>[ae,Te(t.getOutputsDataObject({params:{key:ae}}),`getOutputsDataObject(${ae})`)])),ce=Object.fromEntries(te.map(ae=>[ae,Te(t.getOutputsDataObject({params:{key:ae}}),`getOutputsDataObject(${ae})`)])),F=Z(Te(t.getOutputsComputedValues({params:{key:p}}),"getOutputsComputedValues")),N=Te(t.getOutputsFetchedSources({params:{key:p}}),"getOutputsFetchedSources"),K=we(j.source_defs).map(Z),oe={};for(let ae of K)typeof ae.bindTo=="string"&&typeof ae.outputFile=="string"&&(oe[ae.outputFile]=ae.bindTo);let Y={};for(let[ae,Ce]of Object.entries(N)){let be=oe[ae]??ae;if(!u||typeof Ce!="string"){Y[be]=null;continue}try{Y[be]=u({cardId:p,ref:Ce});}catch{Y[be]=null;}}let ve={card_data:Z(j.card_data),requires:ne,fetched_sources:Y,computed_values:F};return {cardId:p,card_status_in_board:_,card_definition_and_static_data:j,refs_for_fetched_source_files:N,runtime_data:{requires:ne,provides:ce,computed_values:F,rendered_view:Ut(j,ve)}}}function v(l){let p=String(l.cardId||"").trim();if(!p)throw new Error("inspectChatMessagesOnCards requires cardId");let S=typeof l.turnId=="string"?l.turnId:"",A=l.allTurns===true,_=typeof l.tailTurnsBeforeId=="string"?l.tailTurnsBeforeId:"",j=A?void 0:l.lastUserTurns??(S?void 0:1),Q=l.tail,te={...j===void 0?{}:{tailTurns:j},...S?{turnId:S}:{},...A?{allTurns:true}:{},..._?{tailTurnsBeforeId:_}:{}},ne=Object.keys(te).length>0?{params:{cardId:p},body:te}:{params:{cardId:p}},ce=Te(a.readAll(ne),"chatStore.readAll"),F=Z(ht(s,p)),N=we(Z(F.card_data).files).map((Y,ve)=>({idx:ve,stored_name:Z(Y).stored_name})).filter(Y=>typeof Y.stored_name=="string"&&Y.stored_name.length>0),oe=(Array.isArray(ce.records)?ce.records:[]).map(Y=>{let ae=Z(Y.payload),Ce={...Y},be=typeof Y?.role=="string"?Y.role:typeof ae.role=="string"?String(ae.role):"",pe=typeof Y?.text=="string"?Y.text:typeof ae.text=="string"?String(ae.text):"";if(be==="system"){let Se=Pn(pe);if(Se!==null&&N.some(ke=>ke.idx===Se)){let ke=`Retrieve using inspect-file-contents --card-id ${p} --file-idx ${Se}`;Ce.retrieval_hint=ke,Object.keys(ae).length>0&&typeof Y.role!="string"&&(Ce.payload={...ae,retrieval_hint:ke});}}return Ce});return {cardId:p,messages:typeof Q=="number"&&Q>=0?oe.slice(-Q):oe}}function T(l){let p=String(l.cardId||"").trim(),S=Number(l.fileIdx);if(!p)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(S)||S<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let A=Z(ht(s,p)),_=we(Z(A.card_data).files).map(Z);if(S>=_.length)throw new Error(`attachment index ${S} is out of range for card "${p}"`);let j=_[S],Q=typeof j.stored_name=="string"?j.stored_name:null;return {cardId:p,fileIdx:S,downloadUrl:c({cardId:p,fileIdx:S,storedName:Q}),...typeof j.name=="string"?{name:j.name}:{},...typeof j.stored_name=="string"?{stored_name:j.stored_name}:{},...typeof j.mime_type=="string"?{mime_type:j.mime_type}:{},...typeof j.size=="number"?{size:j.size}:{},...typeof j.uploaded_at=="string"?{uploaded_at:j.uploaded_at}:{}}}function w(l){return r.validateCardPreflight({body:$n(l.candidateCardContent)})}function q(l){if(!l.mockRequires||typeof l.mockRequires!="object"||Array.isArray(l.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!l.mockFetchedSources||typeof l.mockFetchedSources!="object"||Array.isArray(l.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let p=r.evalCardCompute({body:{"card-content":l.candidateCardContent,"mock-requires":l.mockRequires,"mock-fetched-sources":l.mockFetchedSources}});if(p.status!=="success")return p;let S=Z(Nn(p,"evalCardCompute")),A=Z(l.candidateCardContent),_={card_data:Z(A.card_data),requires:Z(l.mockRequires),fetched_sources:Z(l.mockFetchedSources),computed_values:Z(S.computed_values)};return {status:"success",data:{cardId:typeof S.cardId=="string"?S.cardId:typeof A.id=="string"?A.id:"(unknown)",ok:S.ok===true,computed_values:Z(S.computed_values),errors:we(S.errors).map(j=>{let Q=Z(j);return {bindTo:typeof Q.bindTo=="string"?Q.bindTo:"",error:typeof Q.error=="string"?Q.error:""}}),provides_outputs:Pr(A,_),rendered_view:Ut(A,_)}}}function x(l){return r.probeSourcePreflight({params:{sourceIdx:l.sourceIdx},body:{"card-content":l.candidateCardContent,"mock-projections":l.mockProjections}})}function L(l){return r.runSourcePreflight({params:{sourceIdx:l.sourceIdx},body:{"card-content":l.candidateCardContent,"mock-projections":l.mockProjections}})}function J(l){let p=String(l.cardId||"").trim();if(!p)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!l.mockRequires||typeof l.mockRequires!="object"||Array.isArray(l.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let S=Z(ht(s,p)),A=we(S.source_defs).filter(j=>!!j&&typeof j=="object"&&!Array.isArray(j)),_={};if(l.sourceIdx>=0&&l.sourceIdx<A.length){let j=A[l.sourceIdx],Q=Ve.enrichSourcesSync([j],{card_data:Z(S.card_data),requires:l.mockRequires});Array.isArray(Q)&&Q.length>0&&(_=Z(Q[0]._projections));}return r.runSourcePreflight({params:{sourceIdx:l.sourceIdx},body:{"card-content":S,"mock-requires":l.mockRequires,"mock-projections":_}})}function I(l){let p=Z(Te(r.simulateCardCycle({body:{"card-content":l.candidateCardContent,"mock-requires":l.mockRequires}}),"simulateCardCycle")),S=Z(l.candidateCardContent),A=Z(p.validation),_=we(p.source_probes),j=we(p.projection_errors),Q=Z(p.fetched_sources),te=we(p.compute_errors),ne=Z(p.computed_values),ce={card_data:Z(S.card_data),requires:l.mockRequires,fetched_sources:Q,computed_values:ne},F=[];for(let N of we(A.issues))typeof N=="string"&&N&&F.push(N);for(let N of _){let K=Z(N),oe=typeof K.bindTo=="string"?K.bindTo:"source",Y=typeof K.error=="string"?K.error:"";Y&&F.push(`${oe}: ${Y}`);}for(let N of j){let K=Z(N),oe=typeof K.bindTo=="string"?K.bindTo:"source",Y=typeof K.key=="string"?K.key:"projection",ve=typeof K.error=="string"?K.error:"projection failed";F.push(`${oe}.${Y}: ${ve}`);}for(let N of te){let K=Z(N),oe=typeof K.bindTo=="string"?K.bindTo:"compute",Y=typeof K.error=="string"?K.error:"compute failed";F.push(`${oe}: ${Y}`);}return {status:"success",data:{cardId:typeof p.cardId=="string"?p.cardId:"(unknown)",ok:p.ok===true,issues:F,provides_outputs:Pr(S,ce),rendered_view:Ut(S,ce)}}}function M(l){let p=String(l.cardId||"").trim();if(!p)throw new Error("manageReadCard requires cardId");let S=Te(s.get({params:{id:p}}),"cardStore.get");return Array.isArray(S.cards)?S.cards:[]}function R(l){let p=String(l.cardId||"").trim(),S=String(l.role||"").trim(),A=typeof l.text=="string"?l.text:"",_=typeof l.turn=="string"?l.turn:"";if(!p)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!S)throw new Error("manageAddChatEntryAndAnyAttachments requires role");let j=we(l.files).map(te=>{let ne=Z(te),ce=String(ne.file_name??ne.fileName??ne.name??"").trim(),F=String(ne.content_type??ne.contentType??"application/octet-stream");if(!ce)throw new Error("file entry requires file_name");return i({cardId:p,fileName:ce,contentType:F,bytes:m(ne)}).file});j.forEach((te,ne)=>{let ce=S==="assistant"?`AI generated: ${String(te.name||"")} as ${String(te.stored_name||"")} #${ne}`:`file uploaded: ${String(te.name||"")} as ${String(te.stored_name||"")} #${ne}`;Te(a.append({params:{cardId:p},body:{role:"system",text:ce,files:[],turn:_}}),"chatStore.append(system attachment message)");});let Q=Te(a.append({params:{cardId:p},body:{role:S,text:A,files:j,turn:_}}),"chatStore.append");return {status:"success",data:{cardId:p,id:String(Q.id),role:S,turn:_,files:j}}}function C(l){let p=String(l.cardId||"").trim(),S=Z(l.candidateCardContent);if(!p)throw new Error("manageUpsertCard requires cardId");if(typeof S.id!="string"||!S.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(S.id!==p)throw new Error(`candidateCardContent.id must match cardId (${p})`);let A=w({candidateCardContent:S}),_=Z(A),j=Z(_.data);if(_.status!=="success"||j.isValid!==true)return {status:"fail",step:"validate",validation:A};let Q=null;try{Q=ht(s,p);}catch{Q=null;}let te=s.set({body:S});Te(te,"cardStore.set");let ne;try{ne=t.upsertCard({params:{cardId:p,restart:!0}}),Te(ne,"upsertCard");}catch(F){try{Q&&s.set({body:Q});}catch{}throw F}let ce=null;try{ce=t.cardRefreshedNotify({params:{cardId:p}}),Te(ce,"cardRefreshedNotify");}catch{ce=null;}return {status:"success",data:{validation:A,card_saved:null,board_result:ne,refresh_notify:ce}}}function y(l){let p=String(l.cardId||"").trim();if(!p)throw new Error("manageDeprecate requires cardId");let S=t.removeCard({params:{id:p}});return Te(S,"removeCard"),S}return {discoverSourceKinds:O,inspectBoardRuntimeStatus:$,inspectCardDefinitionAndRuntime:k,inspectChatMessagesOnCards:v,inspectFileContents:T,preflightValidateCandidateCardDefinition:w,preflightMaterializeCandidateCard:q,preflightProbeSingleSourceInCandidateCard:x,preflightRunSingleSourceInCandidateCard:L,preflightRunSingleSourceInLiveCard:J,preflightRunOneCycleWithCandidateCard:I,manageReadCard:M,manageAddChatEntryAndAnyAttachments:R,manageUpsertCard:C,manageDeprecate:y}}function Dr(){return new Date().toISOString()}function Lr(e){return new TextEncoder().encode(e).byteLength}function Dn(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Ln(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function Mn(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 Un(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Vn(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function Gn(e){let t=Mn(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function Kn(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function Mr(e){function t(r){let s=e.stat?Dn(e.stat(r)):null;if(s)return s;if(!e.exists(r))return null;let a=e.read(r);return a===null?{key:r}:{key:r,size:Lr(a)}}return {exists(r){return e.exists(r)},putText(r,s,a="text/plain; charset=utf-8"){e.write(r,s);let i=t(r)??{key:r};return i.contentType=a,i.updatedAt=i.updatedAt??Dr(),i.size=i.size??Lr(s),i},putBytes(r,s,a="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,s);else {let c=JSON.stringify({__kind:"bytes-array",data:[...s]});e.write(r,c);}let i=t(r)??{key:r};return i.contentType=a,i.updatedAt=i.updatedAt??Dr(),i.size=i.size??s.byteLength,i},getText(r){let s=e.read(r);if(s===null){if(!e.readBytes)return null;let a=e.readBytes(r);return a===null?null:Buffer.from(a).toString("utf-8")}try{let a=JSON.parse(s);if(a&&a.__kind==="bytes-array"&&Array.isArray(a.data))return new TextDecoder("utf-8").decode(new Uint8Array(a.data))}catch{}return s},getBytes(r){if(e.readBytes){let a=e.readBytes(r);if(a!==null)return a}let s=e.read(r);if(s===null)return null;try{let a=JSON.parse(s);if(a&&a.__kind==="bytes-array"&&Array.isArray(a.data))return new Uint8Array(a.data)}catch{}return new TextEncoder().encode(s)},head:t,list(r=""){return e.listKeys(r).map(s=>t(s)??{key:s}).sort((s,a)=>s.key.localeCompare(a.key))},remove(r){e.remove(r);}}}function Ur(e){function t(a,i){let c=0,u=[];Array.isArray(i)&&u.push(...i);for(let m of e.list(`${a}/`))u.push(Kn(m.key));for(let m of u){let O=Ln(m);Number.isFinite(O)&&O>c&&(c=O);}return c+1}function r(a,i,c){let u=Number(c?.maxLen||32),{stem:m,ext:O}=Gn(a),$=Vn(O),k=Un(m),v=`${String(i).padStart(3,"0")}-`,T=$,w=u-v.length-T.length;w<1&&(T="",w=u-v.length);let q=k.slice(0,Math.max(1,w)),x=`${v}${q}${T}`;return x.length>u&&(x=x.slice(0,u).replace(/\.$/,"")),x}function s(a,i,c){let u=t(a,c?.seedNames),m=r(i,u,{maxLen:c?.maxLen});for(;e.exists(`${a}/${m}`);)u+=1,m=r(i,u,{maxLen:c?.maxLen});return m}return {nextSerial:t,buildStoredName:r,allocateStoredName:s}}function Vr(){function e(a,i){if(!Array.isArray(a))return [];let c=[];for(let u of a){if(!u||typeof u!="object")continue;let m=u;typeof m.stored_name=="string"&&c.push({name:typeof m.name=="string"?m.name:m.stored_name,stored_name:m.stored_name,size:typeof m.size=="number"&&Number.isFinite(m.size)?m.size:null,mime_type:typeof m.mime_type=="string"?m.mime_type:null,uploaded_at:typeof m.uploaded_at=="string"?m.uploaded_at:i||null,chat:m.chat===true});}return c}function t(a){return !a||typeof a!="object"?[]:e(a.files,void 0)}function r(a,i){let c=t(a);if(i.length===0)return a.files=c,c;let u=new Set(c.map(m=>m.stored_name));for(let m of i)u.has(m.stored_name)||(c.push(m),u.add(m.stored_name));return a.files=c,c}function s(a,i,c){let u=t(a);if(!Number.isInteger(i)||i<0||i>=u.length)return {ok:false,reason:"index_out_of_range"};let m=u[i];return !m||!m.stored_name?{ok:false,reason:"missing_stored_name"}:c&&c!==m.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:m}}return {read:t,normalizeIncoming:e,merge:r,resolve:s}}function Hn(){let e=globalThis.crypto;return typeof e?.randomUUID=="function"?String(e.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function Gr(){let e=new Map,t=new Map;function r(s){return e.has(s)||e.set(s,[]),e.get(s)}return {append(s,a,i,c=[],u=""){let m={id:Hn(),role:a,text:i,files:c,turn:u,updated_at:new Date().toISOString()};return r(s).push(m),m.id},readAll(s){return r(s).slice()},readAfter(s,a){let i=r(s);if(!a)return {records:i.slice(),cursor:i.length>0?i[i.length-1].id:null};let c=i.findIndex(m=>m.id===a),u=c===-1?i.slice():i.slice(c+1);return {records:u,cursor:u.length>0?u[u.length-1].id:a}},clear(s){e.set(s,[]);},setProcessing(s,a){a?t.set(`p:${s}`,true):t.delete(`p:${s}`);},isProcessing(s){return t.get(`p:${s}`)===true},getConfig(s){return t.get(`c:${s}`)??{}},setConfig(s,a){let i=t.get(`c:${s}`)??{};t.set(`c:${s}`,{...i,...a});}}}function Kr(e){function t(k){let v=typeof k=="number"?k:Number(k);return Number.isInteger(v)&&v>0?v:null}function r(k,v){let T=v;for(let w=k.length-1;w>=0;w-=1)if(k[w]?.role==="user"&&(T-=1,T===0))return k.slice(w);return k}function s(k){return k.some(v=>typeof v?.turn=="string"&&v.turn!=="")}function a(k,v){if(v<=0)return [];if(!s(k))return r(k,v);let T=new Map,w=[];for(let x of k){let L=typeof x?.turn=="string"?x.turn:"";T.has(L)||(T.set(L,[]),w.push(L)),T.get(L).push(x);}return w.slice(Math.max(0,w.length-v)).flatMap(x=>T.get(x)??[])}function i(k){return {status:"success",data:k}}function c(k){return {status:"fail",error:k}}function u(k){return {status:"error",error:k instanceof Error?k.message:String(k)}}function m(k,v="command envelope"){let T=typeof k.cardId=="string"?k.cardId:void 0;if(!k.command)return c(`chat-store: ${v} missing "command"`);if(!T)return c(`chat-store: ${v} missing "cardId"`);if(k.command==="append")return $.append({params:{cardId:T},body:{role:k.role,text:k.text,files:k.files,turn:k.turn}});if(k.command==="read-all")return $.readAll({params:{cardId:T},body:{lastUserTurns:k.lastUserTurns,tailTurns:k.tailTurns,turnId:k.turnId,allTurns:k.allTurns,tailTurnsBeforeId:k.tailTurnsBeforeId}});if(k.command==="read-after")return $.readAfter({params:{cardId:T},body:{cursor:k.cursor??null}});if(k.command==="clear")return $.clear({params:{cardId:T}});if(k.command==="set-processing")return $.setProcessing({params:{cardId:T},body:{active:k.active}});if(k.command==="is-processing")return $.isProcessing({params:{cardId:T}});if(k.command==="get-config")return $.getConfig({params:{cardId:T}});if(k.command==="set-config"){let{command:w,cardId:q,...x}=k;return $.setConfig({params:{cardId:T},body:x})}return c(`chat-store: unknown command "${String(k.command)}"`)}function O(k){if(!Array.isArray(k.commands)||k.commands.length===0)return c('chat-store: command envelope must include a non-empty "commands" array');let v=[];for(let T=0;T<k.commands.length;T+=1){let w=k.commands[T];if(!w||typeof w!="object"||Array.isArray(w))return c(`chat-store: command envelope entry ${T} must be an object`);let q={cardId:k.cardId,...w},x=m(q,`command envelope entry ${T}`);if(x.status!=="success")return x;v.push({index:T,command:String(q.command),data:x.data});}return i({results:v})}let $={append(k){try{let v=k.params?.cardId;if(!v)return c("append requires params.cardId");let T=k.body??{},w=typeof T.role=="string"?T.role:"",q=typeof T.text=="string"?T.text:"",x=Array.isArray(T.files)?T.files:[],L=typeof T.turn=="string"?T.turn:"";if(!w)return c("append requires body.role");let J=e.append(v,w,q,x,L);return i({id:J})}catch(v){return u(v)}},readAll(k){try{let v=k.params?.cardId;if(!v)return c("readAll requires params.cardId");let T=k.body??{},w=typeof T.turnId=="string"?T.turnId:"",q=T.allTurns===!0,x=typeof T.tailTurnsBeforeId=="string"?T.tailTurnsBeforeId:"",L=T.tailTurns===void 0?T.lastUserTurns:T.tailTurns,J=L===void 0?q||w?void 0:1:t(L);if(L!==void 0&&J===null)return c("readAll requires body.tailTurns (positive integer)");let I=e.readAll(v),M=I.filter(R=>!w||String(R.turn||"")===w);if(x){let R=J;if(typeof R!="number"||!Number.isInteger(R)||R<=0)return c("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let C=new Map,y=[];for(let A of I){let _=String(A.turn||"");C.has(_)||(C.set(_,[]),y.push(_)),C.get(_).push(A);}let l=y.findIndex(A=>A===x),p=Math.max(0,l-R);return M=(l===-1?[]:y.slice(p,l)).flatMap(A=>C.get(A)??[]),i({records:M})}return i(typeof J=="number"?{records:a(M,J)}:{records:M})}catch(v){return u(v)}},readAfter(k){try{let v=k.params?.cardId;if(!v)return c("readAfter requires params.cardId");let w=(k.body??{}).cursor??null;return i(e.readAfter(v,w))}catch(v){return u(v)}},clear(k){try{let v=k.params?.cardId;return v?(e.clear(v),i({ok:!0})):c("clear requires params.cardId")}catch(v){return u(v)}},setProcessing(k){try{let v=k.params?.cardId;if(!v)return c("setProcessing requires params.cardId");let T=k.body??{};return typeof T.active!="boolean"?c("setProcessing requires body.active (boolean)"):(e.setProcessing(v,T.active),i({ok:!0}))}catch(v){return u(v)}},isProcessing(k){try{let v=k.params?.cardId;return v?i({active:e.isProcessing(v)}):c("isProcessing requires params.cardId")}catch(v){return u(v)}},getConfig(k){try{let v=k.params?.cardId;return v?i({config:e.getConfig(v)}):c("getConfig requires params.cardId")}catch(v){return u(v)}},setConfig(k){try{let v=k.params?.cardId;if(!v)return c("setConfig requires params.cardId");let T=k.body??{};return e.setConfig(v,T),i({ok:!0})}catch(v){return u(v)}},run:m,runBatch:O};return $}var Hr={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Jn=32;function zn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Jr(e){if(!e||typeof e!="object")return false;let t=e.summary;return !t||typeof t!="object"?false:Number(t.card_count||0)>0}function zr(e,t){if(!t||typeof t!="object")return;let r=t;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let s of r.notifications)zr(e,s);return}r.kind==="status"&&Jr(r.status)&&(e.status=r.status),r.kind==="computed_values"&&r.cardId&&(e.computedValues[r.cardId]=r.values),r.kind==="data_object"&&r.key&&(e.dataObjects[r.key]=r.payload),r.kind==="card_refreshed"&&r.cardId&&(e.cards[r.cardId]=r.card),r.kind==="card_removed"&&r.cardId&&(delete e.cards[r.cardId],delete e.computedValues[r.cardId]);}function rs(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...Hr,...e.corsHeaders||{}},s=e.boardId||"",a=e.logger||{info:console.log,warn:console.warn,error:console.error},i=e.invocationAdapter,c=e.chatFlowRunner||null,u=e.chatStorage??Gr(),m=Kr(u),O=e.notificationTransport||null,$=e.serverUrl||null,k=e.executionExtra||{},v=e.onSseClientConnected,T=e.onSseClientDisconnected,w=e.onChannelSubscribed,q=e.onChannelUnsubscribed,x=new Map,L=new Map,J=new Map,I=null;function M(o){let n=qr(o.baseRef,o.boardAdapter),d=o.nonCoreAdapter??(l(o.boardAdapter)?o.boardAdapter:null),f=d?Nr(o.baseRef,d):null,h=o.boardAdapter.kvStorageForRef(o.cardStoreRef),B=Tt(mt({readIndex:()=>h.read("_index"),writeIndex:ge=>h.write("_index",ge),readCard:ge=>h.read(ge),writeCard:(ge,xe)=>(h.write(ge,xe),ge),cardExists:ge=>h.read(ge)!==null,defaultCardKey:ge=>ge},a.warn)),U=o.artifactsAdapter||o.boardAdapter,G=o.filesArtifactsStore??null,ue=o.artifactsAdapter?U.blobStorage(""):U.blobStorage("files"),fe=null;return {label:o.label,board:n,nonCore:f,cardStore:B,get filesArtifacts(){return fe??=G??Mr(ue)},boardAdapter:o.boardAdapter,cardStoreRef:o.cardStoreRef,outputsStoreRef:o.outputsStoreRef,artifactsStoreRef:o.artifactsStoreRef,scratchStoreRef:o.scratchStoreRef,archiveStoreRef:o.archiveStoreRef,notifyRef:o.notifyRef,taskExecutorRef:o.taskExecutorRef,chatHandlerRef:o.chatHandlerRef,chatHandlerFlow:o.chatHandlerFlow,inferenceAdapterRef:o.inferenceAdapterRef,notification:zn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let R=e.boards.map(M),C=new Map;function y(o){return C.get(o)??0}function l(o){let n=o;return typeof n.invokeExecutorSync=="function"&&typeof n.validateSchema=="function"}function p(o){let n=R[y(o)];return {files:n?n.filesArtifacts:null}}function S(o){let n=p(o);return n.files?Ur(n.files):null}function A(){return Vr()}function _(o){return String(o||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function j(o){if(!o||o.notificationTeardown||!O||!o.notifyRef)return;let n=await O.subscribe(o.notifyRef,d=>{zr(o.notification,d);let f=d.kind==="notification-batch"?d.notifications:[d];Jt(f);});o.notificationTeardown=n;}async function Q(o){if(!o||o.initialized)return;let n={cardStoreRef:o.cardStoreRef,outputsStoreRef:o.outputsStoreRef};o.artifactsStoreRef&&(n.artifactsStoreRef=o.artifactsStoreRef),o.scratchStoreRef&&(n.scratchStoreRef=o.scratchStoreRef),o.archiveStoreRef&&(n.archiveStoreRef=o.archiveStoreRef);let d={};o.taskExecutorRef&&(d["task-executor-ref"]=o.taskExecutorRef),o.chatHandlerFlow!==void 0&&(d["chat-handler-flow"]=o.chatHandlerFlow),o.inferenceAdapterRef&&(d["inference-adapter-ref"]=o.inferenceAdapterRef);let f=o.board.init({params:n,body:d});if(f.status!=="success")throw Object.assign(new Error(f.error||`init failed for ${o.label}`),{statusCode:500});if(await j(o),!o.chatHandlerFlow&&o.chatHandlerRef&&i.describe)try{let h=await i.describe(o.chatHandlerRef);h&&h.kind!=="chat-handler"?a.warn(`[init] chat-handler describe returned kind="${h.kind}", expected "chat-handler" for ${o.label}`):h&&a.info(`[init] chat-handler validated: ${h.name} (protocol ${h.protocolVersion}) for ${o.label}`);}catch(h){a.warn(`[init] chat-handler describe failed for ${o.label}: ${h?.message||String(h)}`);}o.initialized=true;}function te(o){if(!o.boardAdapter.publishBoardChangeNotifications)return;let n=[],d=o.board.status({});d.status==="success"&&d.data!=null&&Jr(d.data)&&n.push({kind:"status",status:d.data});let f=o.board.getAllOutputsDataObjects({});if(f.status==="success"&&f.data!=null)for(let[b,B]of Object.entries(f.data))b&&n.push({kind:"data_object",key:b,payload:B});let h=o.board.getAllOutputsComputedValues({});if(h.status==="success"&&h.data!=null)for(let[b,B]of Object.entries(h.data))b&&n.push({kind:"computed_values",cardId:b,values:B});n.length>0&&o.boardAdapter.publishBoardChangeNotifications(n);}function ne(o,n){if(!o||o.cardsBootstrapped)return;let d=o.cardStore.get({}),f=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let h of f)typeof h.id=="string"&&(C.set(h.id,n),o.board.upsertCard({params:{cardId:h.id}}));o.cardsBootstrapped=true;}async function ce(){for(let o of R)await Q(o);}async function F(){await ce();for(let o=0;o<R.length;o++)te(R[o]),ne(R[o],o);}function N(o){return R[y(o)]??null}function K(o){let n=N(o);if(!n)return null;let d=n.cardStore.get({params:{id:o}});if(d.status!=="success")return null;let f=Array.isArray(d.data?.cards)?d.data.cards:[];return f.length>0?f[0]:null}function oe(){let o=d=>{if(!d||!d.cardStore)return [];let f=d.cardStore.get({});return f.status!=="success"||!Array.isArray(f.data?.cards)?[]:f.data.cards},n=[];for(let d of R)n.push(...o(d));return n}function Y(){return R[0]??null}function ve(){return {status(){let o=re();return o==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:o}},getOutputsDataObject(o){let n=o?.params?.key;return n?{status:"success",data:Ae()[n]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},getOutputsComputedValues(o){let n=o?.params?.key;return n?{status:"success",data:le()[n]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},getOutputsFetchedSources(o){let n=o?.params?.key;if(!n)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let d=N(n)??Y();return d?d.board.getOutputsFetchedSources({params:{key:n}}):{status:"fail",error:"Board context is unavailable"}},removeCard(o){let n=o?.params?.id;if(!n)return {status:"fail",error:"removeCard requires params.id"};let d=N(n)??Y();return d?d.board.removeCard({params:{id:n}}):{status:"fail",error:"Board context is unavailable"}},cardRefreshedNotify(o){let n=o?.params?.cardId;if(!n)return {status:"fail",error:"cardRefreshedNotify requires params.cardId"};let d=N(n)??Y();return d?d.board.cardRefreshedNotify({params:{cardId:n}}):{status:"fail",error:"Board context is unavailable"}},upsertCard(o){let n=o?.params?.cardId;if(!n)return {status:"fail",error:"upsertCard requires params.cardId"};let d=N(n)??Y();return d?d.board.upsertCard({params:{cardId:n,restart:o.params.restart===true}}):{status:"fail",error:"Board context is unavailable"}}}}function ae(){let o=()=>{let n=Y();if(!n?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return n.nonCore};return {describeTaskExecutorCapabilities(n){return o().describeTaskExecutorCapabilities(n)},validateCardPreflight(n){return o().validateCardPreflight(n)},evalCardCompute(n){return o().evalCardCompute(n)},probeSourcePreflight(n){return o().probeSourcePreflight(n)},runSourcePreflight(n){return o().runSourcePreflight(n)},simulateCardCycle(n){return o().simulateCardCycle(n)}}}function Ce(){return {get(o){let n=typeof o.params?.id=="string"?o.params.id:void 0;if(n){let d=K(n);return d?{status:"success",data:{cards:[d]}}:{status:"fail",error:`card "${n}" not found`}}return {status:"success",data:{cards:oe()}}},set(o){let n=o.body;if(n==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let d=Array.isArray(n)?n:[n];for(let f of d){let h=f,b=typeof h.id=="string"?h.id:"";if(!b)return {status:"fail",error:"each card must have a string `id` field"};let B=C.get(b)??0,U=R[B]??Y();if(!U)return {status:"fail",error:"Board context is unavailable"};let G=U.cardStore.set({body:h});if(G.status!=="success")return G;C.set(b,B);}return {status:"success",data:{count:d.length}}},del(o){let n=[o.params?.id,...o.body?.ids??[]].filter(d=>typeof d=="string"&&!!d);if(n.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let d of n){let f=N(d)??Y();if(!f)return {status:"fail",error:"Board context is unavailable"};let h=f.cardStore.del({params:{id:d}});if(h.status!=="success")return h;C.delete(d);}return {status:"success",data:{count:n.length}}},patch(o){let n=typeof o.params?.id=="string"?o.params.id:void 0,d=typeof o.params?.path=="string"?o.params.path:void 0;if(!n||!d)return {status:"fail",error:"patch requires params.id and params.path"};let f=N(n)??Y();return f?f.cardStore.patch(o):{status:"fail",error:"Board context is unavailable"}},appendFiles(o){let n=typeof o.params?.id=="string"?o.params.id:void 0;if(!n)return {status:"fail",error:"appendFiles requires params.id"};let d=N(n)??Y();return d?d.cardStore.appendFiles(o):{status:"fail",error:"Board context is unavailable"}}}}function be(){return $r({board:ve(),nonCore:ae(),cardStore:Ce(),chatStore:m,uploadCardFile({cardId:o,fileName:n,contentType:d,bytes:f}){return it(o,n,d,f,{inChat:false})},buildFileDownloadUrl({cardId:o,fileIdx:n,storedName:d}){let f=`${$||""}${t}/cards/${encodeURIComponent(o)}/files/${n}`;return d?`${f}?sn=${encodeURIComponent(d)}`:f},readFetchedSourceJsonByRef({cardId:o,ref:n}){let d=N(o)??Y();if(!d)return null;let h=d.boardAdapter.resolveBlob(ot(n)).trim();return h?JSON.parse(h):null}})}function pe(o,...n){for(let d of n)if(typeof o[d]=="string")return String(o[d]);return ""}function Se(o,...n){for(let d of n)if(o[d]!==void 0)return Number(o[d])}function Ne(o,...n){for(let d of n){let f=o[d];if(f&&typeof f=="object"&&!Array.isArray(f))return f}return {}}function ke(o,n,...d){for(let f of d){let h=o[f];if(h&&typeof h=="object"&&!Array.isArray(h))return h}throw Object.assign(new Error(`MCP tool requires ${n}`),{statusCode:400})}function E(o,n,...d){for(let f of d){let h=o[f];if(h!==void 0){let b=Number(h);if(Number.isFinite(b))return b}}throw Object.assign(new Error(`MCP tool requires ${n}`),{statusCode:400})}function g(o){return {"discover.source-kinds":()=>o.discoverSourceKinds(),"inspect.board-runtime-status":()=>o.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":n=>o.inspectCardDefinitionAndRuntime({cardId:pe(n,"card_id","cardId")}),"inspect.chat-messages-on-cards":n=>{let d=Se(n,"tail-turns"),f=Se(n,"tail"),h=pe(n,"turn-id"),b=n["all-turns"]===true,B=pe(n,"tail-turns-before-id");return o.inspectChatMessagesOnCards({cardId:pe(n,"card_id","cardId"),...d!==void 0?{lastUserTurns:d}:{},...f!==void 0?{tail:f}:{},...h?{turnId:h}:{},...b?{allTurns:true}:{},...B?{tailTurnsBeforeId:B}:{}})},"inspect.file-contents":n=>o.inspectFileContents({cardId:pe(n,"card_id","cardId"),fileIdx:Number(Se(n,"file_idx","fileIdx"))}),"preflight.validate-candidate-card-definition":n=>o.preflightValidateCandidateCardDefinition({candidateCardContent:ke(n,"candidate_card_content","candidate_card_content","candidateCardContent")}),"preflight.materialize-candidate-card":n=>o.preflightMaterializeCandidateCard({candidateCardContent:ke(n,"candidate_card_content","candidate_card_content","candidateCardContent"),mockRequires:ke(n,"mock_requires","mock_requires","mockRequires"),mockFetchedSources:ke(n,"mock_fetched_sources","mock_fetched_sources","mockFetchedSources")}),"preflight.probe-single-source-in-candidate-card":n=>o.preflightProbeSingleSourceInCandidateCard({candidateCardContent:ke(n,"candidate_card_content","candidate_card_content","candidateCardContent"),mockProjections:Ne(n,"mock_projections","mockProjections"),sourceIdx:E(n,"source_idx","source_idx","sourceIdx")}),"preflight.run-single-source-in-candidate-card":n=>o.preflightRunSingleSourceInCandidateCard({candidateCardContent:ke(n,"candidate_card_content","candidate_card_content","candidateCardContent"),mockProjections:Ne(n,"mock_projections","mockProjections"),sourceIdx:E(n,"source_idx","source_idx","sourceIdx")}),"preflight.run-single-source-in-live-card":n=>o.preflightRunSingleSourceInLiveCard({cardId:pe(n,"card_id","cardId"),sourceIdx:E(n,"source_idx","source_idx","sourceIdx"),mockRequires:ke(n,"mock_requires","mock_requires","mockRequires")}),"preflight.run-one-cycle-with-candidate-card":n=>o.preflightRunOneCycleWithCandidateCard({candidateCardContent:ke(n,"candidate_card_content","candidate_card_content","candidateCardContent"),mockRequires:Ne(n,"mock_requires","mockRequires")}),"manage.read-card":n=>o.manageReadCard({cardId:pe(n,"card_id","cardId")}),"stage-ai-response-and-any-attachments":n=>o.manageAddChatEntryAndAnyAttachments({cardId:pe(n,"card_id","cardId"),role:"assistant",...typeof n.text=="string"?{text:n.text}:{},...typeof pe(n,"turn-id","turnId","turn")=="string"&&pe(n,"turn-id","turnId","turn")!==""?{turn:pe(n,"turn-id","turnId","turn")}:{},...Array.isArray(n.files)?{files:n.files}:{}}),"manage.upload-card-file":n=>{let d=pe(n,"card_id","cardId"),f=pe(n,"file_name","fileName","name"),h=pe(n,"content_type","contentType")||"application/octet-stream",b=null;if(Array.isArray(n.bytes))b=new Uint8Array(n.bytes.map(B=>Math.max(0,Math.min(255,Number(B)||0))));else if(typeof n.text=="string")b=new TextEncoder().encode(n.text);else if(typeof n.base64=="string"){let B=String(n.base64).replace(/-/g,"+").replace(/_/g,"/"),U=B+"=".repeat((4-B.length%4)%4),G=atob(U);b=Uint8Array.from(G,ue=>ue.charCodeAt(0));}if(!d)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!f)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 it(d,f,h,b,{inChat:false})},"manage.upsert-card":n=>o.manageUpsertCard({cardId:pe(n,"card_id","cardId"),candidateCardContent:Ne(n,"candidate_card_content","candidateCardContent")}),"manage.deprecate":n=>o.manageDeprecate({cardId:pe(n,"card_id","cardId")})}}function P(o,n){let d=g(be())[o];if(!d)throw Object.assign(new Error(`Unknown MCP tool: ${o}`),{statusCode:400});let f=d(n);if(f&&typeof f=="object"&&!Array.isArray(f)){let h=f,b=h.status;if(b==="success")return Object.prototype.hasOwnProperty.call(h,"data")?f:{status:"success",data:{}};if(b==="fail"||b==="error")return f}return {status:"success",data:f}}function V(o,n){if(!o||typeof o!="object"||Array.isArray(o))return n;let d=o;if(typeof d.error=="string"&&d.error.trim())return d.error;if(d.step==="validate"){let f=d.validation;if(f&&typeof f=="object"&&!Array.isArray(f)){let b=f.data;if(b&&typeof b=="object"&&!Array.isArray(b)){let B=b.issues;if(Array.isArray(B)){let G=B.find(ue=>typeof ue=="string"&&ue.trim());if(typeof G=="string")return `Validation failed: ${G}`}let U=b.errors;if(Array.isArray(U)&&U.length>0)return "Validation failed"}}return "Validation failed"}return n}function re(){let o=R.map(b=>{try{let U=b.boardAdapter.kvStorageForRef(b.outputsStoreRef).read("status");if(U!=null)return U}catch{}return b.notification.status}).filter(Boolean);if(o.length===0)return null;if(o.length===1)return o[0];let n=[],d=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],f={};for(let b of d)f[b]=0;for(let b of o){let B=b,U=Array.isArray(B.cards)?B.cards:[];n.push(...U);for(let G of d)f[G]+=Number(B?.summary?.[G]||0);}let h=o[0];return {...h,cards:n,summary:{...h.summary||{},card_count:n.length,...f}}}function le(){let o={},n=d=>{for(let[f,h]of Object.entries(d.notification.computedValues)){let b=d.notification.cards[f];o[f]={schema_version:"v1",card_id:f,card_data:b?.card_data??{},computed_values:h??{}};}};for(let d of R)n(d);return o}function Ae(){let o={};for(let n of R)Object.assign(o,n.notification.dataObjects||{});return o}function he(){let o=oe(),n=le(),d=Ae(),f={};for(let b of o){if(!b?.id)continue;let B=b.id,U=n[B]||{},G={...U.card_data&&typeof U.card_data=="object"?U.card_data:b.card_data&&typeof b.card_data=="object"?b.card_data:{}};f[B]={schema_version:U.schema_version||"v1",card_id:U.card_id||B,card_data:G,computed_values:U.computed_values&&typeof U.computed_values=="object"?U.computed_values:{}};}let h={};for(let b of o){if(!b?.id)continue;let B=b.id;try{let U=et(B),G=u.isProcessing(B);(U.length>0||G)&&(h[B]={messages:U.map(ue=>({role:String(ue.role||"system"),text:String(ue.text||""),files:Array.isArray(ue.files)?ue.files:[]})),receiving:!1,processing:G});}catch{}}return {boardId:s,cardDefinitions:o,statusSnapshot:re(),dataObjectsByToken:d,cardRuntimeById:f,cardChatsByCardId:h}}function Ie(o,n,d){let f=d?.syncBoard!==false,h=d?.restartOnlyIfChanged===true,b=N(o);if(!b)throw Object.assign(new Error(`Card not found: ${o}`),{statusCode:404});let B=K(o);if(!B)throw Object.assign(new Error(`Card not found: ${o}`),{statusCode:404});let U=h?JSON.stringify(B):null,G=n(B)||B;if(h&&JSON.stringify(G)===U)return;let ue=b.cardStore.set({body:G});if(ue.status!=="success")throw Object.assign(new Error(ue.error||`Failed to persist card: ${o}`),{statusCode:500});if(f){let fe=b.board.upsertCard({params:{cardId:o,restart:true}});if(fe.status!=="success")throw Object.assign(new Error(fe.error||`Failed to upsert card: ${o}`),{statusCode:500})}}function _e(o,n){Ie(o,n,{syncBoard:true});}function Ue(o,n){Ie(o,n,{syncBoard:false});}function Ge(o){let n=N(o);if(!n)throw Object.assign(new Error(`Card not found: ${o}`),{statusCode:404});if(!K(o))throw Object.assign(new Error(`Card not found: ${o}`),{statusCode:404});let f=n.board.upsertCard({params:{cardId:o,restart:true}});if(f.status!=="success")throw Object.assign(new Error(f.error||`Failed to retrigger card: ${o}`),{statusCode:500})}function We(o,n){Ie(o,d=>{if(!n||typeof n!="object"||Object.keys(n).length===0)return d;function f(h,b,B){let U=String(b||"").split(".").filter(Boolean);if(!U.length)return;let G=h;for(let ue=0;ue<U.length-1;ue++){let fe=U[ue];(!G[fe]||typeof G[fe]!="object")&&(G[fe]={}),G=G[fe];}G[U[U.length-1]]=B;}if(n.fieldValues!==void 0&&n.fieldValues!==null){let h=null,b=d.view;if(b&&Array.isArray(b.elements)){for(let B of b.elements)if(B?.data&&B.data.writeTo){h=B.data.writeTo;break}}h?f(d,h,n.fieldValues):typeof n.fieldValues=="object"&&!Array.isArray(n.fieldValues)&&(d.card_data={...d.card_data||{},...n.fieldValues});}else {if(Array.isArray(n._stagedFiles)&&n._stagedFiles.length>0)return d;for(let[h,b]of Object.entries(n))h!=="_stagedFiles"&&(b!==null&&typeof b=="object"&&!Array.isArray(b)&&d[h]!==null&&typeof d[h]=="object"&&!Array.isArray(d[h])?d[h]={...d[h],...b}:d[h]=b);}return d},{syncBoard:true,restartOnlyIfChanged:true});}function Ye(o){let n=String(o||"").trim();if(!n)return "upload.bin";let d=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));return (d>=0?n.slice(d+1):n)||"upload.bin"}function Ke(o){u.clear(o),u.setProcessing(o,false);}function st(o,n,d,f,h=""){let b=typeof d=="string"?d.trim():"";return u.append(o,n,b,f,h)}function et(o){return u.readAll(o)}function at(o){let n=[];try{let d=K(o);if(!d)return n;let f=A().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let h of f)n.push(h.stored_name);}catch{}return n}function yt(o,n,d,f){let h=_(o),b=p(o),B=Ye(n),U=S(o),G=U?U.allocateStoredName(h,B,{seedNames:at(o),maxLen:Jn}):`${String(Date.now())}-${B}`;return b.files&&b.files.putBytes(`${h}/${G}`,new Uint8Array(f),d||"application/octet-stream"),{name:B,stored_name:G,size:f.length,mime_type:d||"application/octet-stream",uploaded_at:new Date().toISOString()}}function it(o,n,d,f,h){if(!f.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let b=h?.inChat===true,B=yt(o,n,d,f),U=null;if(Ue(o,G=>{let ue=new Date().toISOString(),fe=G.card_data&&typeof G.card_data=="object"?G.card_data:{};G.card_data=fe;let ge=A().normalizeIncoming([{name:B.name,stored_name:B.stored_name,size:B.size,mime_type:B.mime_type,uploaded_at:B.uploaded_at||ue,chat:b}],ue);return U=A().merge(fe,ge).findIndex(tt=>tt.stored_name===B.stored_name),G}),b){let G=typeof U=="number"&&U>=0?` #${U}`:"";st(o,"system",`file uploaded: ${B.name} as ${B.stored_name}${G}`,[],h?.turnId??"");}return {ok:true,file:B}}function dt(o){let n=N(o);if(!n)return null;let d=n.board.getConfig({params:{key:"chat-handler-flow"}}),f=d.status==="success"?d.data?.value:null,h=n.chatHandlerRef;return f==null&&(!h||typeof h!="object")?null:{ctx:n,handlerFlow:f,handlerRef:h}}function Gt(o,n,d=false,f=""){let h=dt(o);if(!h)return;let{ctx:b,handlerFlow:B,handlerRef:U}=h;if(!d)try{u.setProcessing(o,!0);}catch{}let G={boardId:s,cardId:String(o),lastChatEntryId:n,...f?{turnId:f}:{},...k,...$?{serverUrl:$}:{}};if(!c&&B!=null){try{u.setProcessing(o,!1);}catch{}a.warn(`[chat-handler-flow] configured for card "${o}" but no chatFlowRunner was provided`);return}if(B!=null){let fe=c;if(!fe)return;fe.run(B,G,{boardId:s,cardId:String(o),label:b.label,logger:a,serverUrl:$,executionExtra:k}).then(ge=>{if(ge.dispatched)a.info(`[chat-handler-flow] invoked for card "${o}" (boardId: "${s}")`);else {try{u.setProcessing(o,!1);}catch{}a.warn(`[chat-handler-flow] dispatch failed for card "${o}": ${ge.error||"unknown"}`);}},ge=>{try{u.setProcessing(o,!1);}catch{}a.warn(`[chat-handler-flow] invoke failed for card "${o}": ${ge?.message||String(ge)}`);});return}let ue=U;ue&&i.invoke(ue,G).then(fe=>{if(fe.dispatched)a.info(`[chat-handler] invoked for card "${o}" (boardId: "${s}")`);else {try{u.setProcessing(o,!1);}catch{}a.warn(`[chat-handler] dispatch failed for card "${o}": ${fe.error||"unknown"}`);}},fe=>{try{u.setProcessing(o,!1);}catch{}a.warn(`[chat-handler] invoke failed for card "${o}": ${fe?.message||String(fe)}`);});}function Kt(o,n,d){let f=n==="chat-send"?Ue:_e,h;f(o,b=>{let B=new Date().toISOString(),U=b.card_data&&typeof b.card_data=="object"?b.card_data:{};if(b.card_data=U,n==="chat-send"){let G=d&&typeof d.text=="string"?d.text.trim():"",ue=d&&typeof d["turn-id"]=="string"?d["turn-id"]:d&&typeof d.turnId=="string"?d.turnId:d&&typeof d.turn=="string"?d.turn:"",fe=[];if(Array.isArray(d?.files)){for(let ge of d.files)if(ge){if(typeof ge=="string"){fe.push({name:ge});continue}if(typeof ge=="object"){let xe=ge;typeof xe.name=="string"&&fe.push({name:xe.name,size:xe.size,mime_type:xe.mime_type,uploaded_at:xe.uploaded_at,stored_name:xe.stored_name,chat:xe.chat===true});}}}if(G||fe.length>0){let ge=m.runBatch({cardId:o,commands:[{command:"append",role:"user",text:G,files:fe,turn:ue},{command:"set-processing",active:true}]});if(ge.status!=="success")throw new Error(ge.error);let xe=ge.data.results[0]?.data?.id;if(typeof xe!="string"||!xe)throw new Error(`chat-send did not return an append id for card ${o}`);h={cardId:o,lastEntryId:xe,processingAlreadySet:true,turnId:ue};try{let lt=et(o);Jt([{kind:"card_chats",cardId:o,messages:lt.map(z=>({role:String(z.role||"system"),text:String(z.text||""),files:Array.isArray(z.files)?z.files:[]})),receiving:!0,processing:u.isProcessing(o)}]);}catch{}}return b}if(n==="file-upload"){let G=A().normalizeIncoming(d?.files,B);return G.length>0&&A().merge(U,G),b}if(n==="action"){let G=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!G)return b;U.lastAction={buttonId:G,at:B},U.lastActionText=`${G} @ ${B}`;}return b}),h&&Gt(h.cardId,h.lastEntryId,h.processingAlreadySet,h.turnId??"");}function ee(o,n,d){let f=JSON.stringify(d),h=typeof Buffer<"u"?Buffer.byteLength(f):new TextEncoder().encode(f).length;o.writeHead(n,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":h}),o.end(f);}function ct(o,n,d){let f=K(o);if(!f)throw Object.assign(new Error("Card not found"),{statusCode:404});let h=A().resolve(f.card_data,n,d);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 b=h.file,B=_(o),U=p(o),G=String(b.stored_name||""),ue=`${B}/${G}`,fe=U.files?U.files.getBytes(ue):null;if(!fe)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:b,bytes:fe}}function Ct(o,n,d,f){let{fileRecord:h,bytes:b}=ct(n,d,f),B=String(h.name||h.stored_name||"download.bin"),U=String(h.mime_type||"application/octet-stream");o.writeHead(200,{"Content-Type":U,"Content-Disposition":`attachment; filename="${B}"`,"Content-Length":b.length}),o.end(b);}function nt(o){let n=String(o||"").toLowerCase();return n.startsWith("text/")||n.includes("json")||n.includes("xml")||n.includes("javascript")||n.includes("typescript")||n.includes("yaml")||n.includes("csv")}function He(o,n,d){let f=o.split(/\r?\n/);return (n==="head"?f.slice(0,d):f.slice(-d)).join(`
2
- `)}async function Pe(o){let n=[];for await(let f of o)n.push(f);let d=typeof Buffer<"u"?Buffer.concat(n).toString("utf-8").trim():new TextDecoder().decode(X(n)).trim();return d?JSON.parse(d):{}}async function D(o){let n=[];for await(let d of o)n.push(d);return typeof Buffer<"u"?Buffer.concat(n):X(n)}function X(o){let n=o.reduce((h,b)=>h+b.length,0),d=new Uint8Array(n),f=0;for(let h of o)d.set(h,f),f+=h.length;return d}let ye=0;function $e(o){let n=JSON.stringify(o);return ye++,`id: ${ye}
3
- data: ${n}
4
-
5
- `}function Be(o){let n=o;try{n.flushHeaders?.();}catch{}try{n.flush?.();}catch{}try{n.socket?.setNoDelay?.(!0);}catch{}try{n.socket?.uncork?.();}catch{}}function Xe(o,n){let d=x.get(o);if(d&&!(n&&d.res!==n)){x.delete(o),Bt();try{T?.(o);}catch{}try{d.res.end();}catch{}}}function De(o,n){let d=x.get(o);if(!d)return;let f=$e(n);try{d.res.write(f),Be(d.res);}catch{Xe(o,d.res);}}function ut(o,n,d,f,h){if(!x.has(n)){ee(o,404,{error:`SSE client not connected: ${n}`});return}h?w?.(n,d,f):q?.(n,d,f),ee(o,200,{ok:true,clientId:n,channelName:d,...f.cardId?{cardId:f.cardId}:{},subscribed:h});}function Ot(){let o=new Set;for(let n of x.values())for(let d of n.subscribedChatCardIds)o.add(d);return Array.from(o)}function Wr(o){let n=L.has(o)?L.get(o):null,{cursor:d}=u.readAfter(o,n),f=u.isProcessing(o),h=f!==(J.get(o)??false),b=d!==n;return b&&L.set(o,d),J.set(o,f),b||h}function Ht(o,n=true){let d=et(o),f=Date.now();return {kind:"card_chats",cardId:o,sentAt:new Date(f).toISOString(),sentAtMs:f,messages:d.map(h=>({role:String(h.role||"system"),text:String(h.text||""),files:Array.isArray(h.files)?h.files:[]})),receiving:n,processing:u.isProcessing(o)}}function jt(o,n=true){let d={kind:"notification-batch",notifications:[Ht(o,n)]};for(let[f,h]of x.entries())h.subscribedChatCardIds.has(o)&&De(f,d);}function Bt(){Ot().length>0||(I&&(clearInterval(I),I=null),L.clear(),J.clear());}function Yr(){if(I)return;let o=()=>{let n=Ot();if(n.length===0){Bt();return}let d=new Set(n);for(let f of Array.from(L.keys()))d.has(f)||L.delete(f);for(let f of Array.from(J.keys()))d.has(f)||J.delete(f);for(let f of n)Wr(f)&&jt(f,true);};o(),I=setInterval(o,1e3);}function Xr(o,n){let d=x.get(o);if(!d)return false;d.subscribedChatCardIds.add(n);let{cursor:f}=u.readAfter(n,null);return L.set(n,f),J.set(n,u.isProcessing(n)),Yr(),De(o,{kind:"notification-batch",notifications:[Ht(n,true)]}),true}function Zr(o,n){let d=x.get(o);return d?(d.subscribedChatCardIds.delete(n),Ot().includes(n)||(L.delete(n),J.delete(n)),Bt(),true):false}function Qr(o){if(!o||typeof o!="object")return false;let n=o.kind;return n==="card_chats"||n==="chat_messages"}function Jt(o){if(!o||o.length===0)return;let n=[],d=new Set;for(let f of o)Qr(f)&&typeof f.cardId=="string"?d.add(String(f.cardId)):n.push(f);if(n.length>0){let f={kind:"notification-batch",notifications:n};for(let h of x.keys())De(h,f);}for(let f of d)jt(f,true);}function en(o,n,d){let f=x.get(d),h=f?new Set(f.subscribedChatCardIds):new Set;f&&Xe(d,f.res),n.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),Be(n),x.set(d,{res:n,subscribedChatCardIds:h});let b=he(),B=$e(b);n.write(B);try{v?.(d,G=>{De(d,G);});}catch{}let U=setInterval(()=>{try{n.write(`: keepalive
6
-
7
- `);}catch{}},15e3);o.on("close",()=>{clearInterval(U),Xe(d,n);});}async function tn(o,n,d){let f=o.method||"GET",h=d,b=h.pathname;try{if(f==="GET"&&b===`${t}/init-board`)return await ce(),ee(n,200,he()),!0;if(f==="GET"&&b===`${t}/sse`){await ce();let z=String(h.searchParams.get("clientId")||"").trim();if(!z)return ee(n,400,{error:"clientId query param is required for SSE"}),!0;en(o,n,z);for(let H=0;H<R.length;H++)te(R[H]),ne(R[H],H);return !0}if(f==="GET"&&b===`${t}/board-status`)return ee(n,200,he()),!0;if(f==="POST"&&b===`${t}/mcp`){await F();let z=await Pe(o),H=typeof z.tool=="string"?z.tool.trim():"",de=z.args&&typeof z.args=="object"&&!Array.isArray(z.args)?z.args:{};if(!H)return ee(n,400,{error:"tool is required"}),!0;if(H==="inspect.file-contents")return ee(n,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;let me=P(H,de);if(me&&typeof me=="object"&&!Array.isArray(me)){let Re=me;if(Re.status==="fail")return ee(n,400,{error:V(me,"Request failed")}),!0;if(Re.status==="error")return ee(n,500,{error:V(me,"Internal error")}),!0}return ee(n,200,me),!0}if(f==="POST"&&b===`${t}/mcp-raw`){await F();let z=await Pe(o),H=typeof z.tool=="string"?z.tool.trim():"",de=z.args&&typeof z.args=="object"&&!Array.isArray(z.args)?z.args:{};if(!H)return ee(n,400,{error:"tool is required"}),!0;if(H!=="inspect.file-contents")return ee(n,400,{error:`Tool does not support raw response: ${H}`}),!0;let me=pe(de,"card_id","cardId"),Re=Se(de,"file_idx","fileIdx"),Ee=Se(de,"head-lines","headLines"),Oe=Se(de,"tail-lines","tailLines"),Le=Se(de,"head-bytes","headBytes"),kt=Se(de,"tail-bytes","tailBytes");if(!me)return ee(n,400,{error:"inspect.file-contents requires card_id"}),!0;if(Re===void 0||!Number.isInteger(Re)||Re<0)return ee(n,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([Ee,Oe,Le,kt].filter(Je=>Je!==void 0).length>1)return ee(n,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[Je,ze]of [["head-lines",Ee],["tail-lines",Oe],["head-bytes",Le],["tail-bytes",kt]])if(ze!==void 0&&(!Number.isInteger(ze)||ze<0))return ee(n,400,{error:`inspect.file-contents requires ${Je} to be a non-negative integer`}),!0;let zt=be().inspectFileContents({cardId:me,fileIdx:Re}),Wt=typeof zt?.stored_name=="string"?zt.stored_name:null,{fileRecord:qt,bytes:Rt}=ct(me,Re,Wt),Yt=String(qt.name||qt.stored_name||"download.bin"),Nt=String(qt.mime_type||"application/octet-stream");if(Ee!==void 0||Oe!==void 0){if(!nt(Nt))return ee(n,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let Je=new TextDecoder().decode(Rt),ze=Ee!==void 0?He(Je,"head",Ee):He(Je,"tail",Oe),Xt=typeof Buffer<"u"?Buffer.from(ze,"utf8"):new TextEncoder().encode(ze);return n.writeHead(200,{"Content-Type":Nt,"Content-Disposition":`attachment; filename="${Yt}"`,"Content-Length":Xt.length}),n.end(Xt),!0}if(Le!==void 0||kt!==void 0){let Je=Le??kt,ze=Le!==void 0?Rt.slice(0,Je):Rt.slice(Math.max(0,Rt.length-Je));return n.writeHead(200,{"Content-Type":Nt,"Content-Disposition":`attachment; filename="${Yt}"`,"Content-Length":ze.length}),n.end(ze),!0}return Ct(n,me,Re,Wt),!0}let B=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)$`));if(f==="GET"&&B){await F();let z=decodeURIComponent(B[1]),H=K(z);return H?(ee(n,200,H),!0):(ee(n,404,{error:`card not found: ${z}`}),!0)}if(f==="PATCH"&&B){await F();let z=decodeURIComponent(B[1]),H=await Pe(o);return We(z,H),ee(n,200,{ok:!0}),!0}let U=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)/retrigger$`));if(f==="POST"&&U){await F();let z=decodeURIComponent(U[1]);return Ge(z),ee(n,200,{ok:!0}),!0}let G=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)/actions$`));if(f==="POST"&&G){await F();let z=decodeURIComponent(G[1]),H=Date.now(),de=new Date(H).toISOString(),me=await Pe(o),Re=me?.actionType;if(Re==="chat-send"&&!dt(z)){let Oe=Date.now();return ee(n,409,{error:`chat handler is not configured for card: ${z}`,requestReceivedAt:de,requestReceivedAtMs:H,responseSentAt:new Date(Oe).toISOString(),responseSentAtMs:Oe,responseStatus:409}),!0}Kt(z,Re,me?.payload);let Ee=Date.now();return ee(n,200,{ok:!0,requestReceivedAt:de,requestReceivedAtMs:H,responseSentAt:new Date(Ee).toISOString(),responseSentAtMs:Ee,responseStatus:200}),!0}let ue=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)/chats$`));if(f==="GET"&&ue){await F();let z=decodeURIComponent(ue[1]),H=String(h.searchParams.get("turn-id")||""),de=String(h.searchParams.get("all-turns")||"").toLowerCase()==="true",me=String(h.searchParams.get("tail-turns-before-id")||""),Re=h.searchParams.get("tail-turns"),Ee=Re==null||Re===""?de||H?void 0:1:Number.parseInt(Re,10),Oe=m.readAll({params:{cardId:z},body:{...Ee===void 0?{}:{tailTurns:Ee},...H?{turnId:H}:{},...de?{allTurns:!0}:{},...me?{tailTurnsBeforeId:me}:{}}});if(Oe.status!=="success")return ee(n,400,{error:Oe.error||"Failed to read chats"}),!0;let Le=Oe.data.records;return ee(n,200,{ok:!0,messages:Le}),!0}if(f==="POST"&&ue){await F();let z=decodeURIComponent(ue[1]),H=await Pe(o),de=typeof H?.role=="string"?H.role:"assistant",me=typeof H?.text=="string"?H.text:"",Re=Array.isArray(H?.files)?H.files:[],Ee=typeof H?.turn=="string"?H.turn:typeof H?.["turn-id"]=="string"?H["turn-id"]:typeof H?.turnId=="string"?H.turnId:"",Oe=H?.done===!0,Le=u.append(z,de,me,Re,Ee);return Oe&&u.setProcessing(z,!1),jt(z,!Oe),ee(n,200,{ok:!0,id:Le}),!0}let fe=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(f==="POST"&&fe){await F();let z=decodeURIComponent(fe[1]),H=await Pe(o),de=typeof H?.clientId=="string"?H.clientId.trim():"";return de?Xr(de,z)?(ee(n,200,{ok:!0,clientId:de,cardId:z,subscribed:!0}),!0):(ee(n,404,{error:`SSE client not connected: ${de}`}),!0):(ee(n,400,{error:"clientId is required"}),!0)}let ge=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(f==="POST"&&ge){await F();let z=decodeURIComponent(ge[1]),H=await Pe(o),de=typeof H?.clientId=="string"?H.clientId.trim():"";return de?Zr(de,z)?(ee(n,200,{ok:!0,clientId:de,cardId:z,subscribed:!1}),!0):(ee(n,404,{error:`SSE client not connected: ${de}`}),!0):(ee(n,400,{error:"clientId is required"}),!0)}let xe=b.match(new RegExp(`^${Me(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&xe){await F();let z=decodeURIComponent(xe[1]),H=xe[2]==="subscribe",de=await Pe(o),me=typeof de?.clientId=="string"?de.clientId.trim():"";return me?(ut(n,me,z,{},H),!0):(ee(n,400,{error:"clientId is required"}),!0)}let tt=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&tt){await F();let z=decodeURIComponent(tt[1]),H=decodeURIComponent(tt[2]),de=tt[3]==="subscribe",me=await Pe(o),Re=typeof me?.clientId=="string"?me.clientId.trim():"";return Re?(ut(n,Re,H,{cardId:z},de),!0):(ee(n,400,{error:"clientId is required"}),!0)}let Ft=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)/files$`));if(f==="POST"&&Ft){await F();let z=decodeURIComponent(Ft[1]),H=String(h.searchParams.get("inChat")||"").toLowerCase()==="true",de=String(h.searchParams.get("turn-id")||""),me=o.headers["x-file-name"],Re=String(o.headers["content-type"]||"application/octet-stream"),Ee=Array.isArray(me)?me[0]:me,Oe=Ee?decodeURIComponent(String(Ee)):"upload.bin",Le=await D(o);return ee(n,200,it(z,Oe,Re,Le,{inChat:H,turnId:de})),!0}let lt=b.match(new RegExp(`^${Me(t)}/cards/([^/]+)/files/(\\d+)$`));if(f==="GET"&&lt){let z=decodeURIComponent(lt[1]),H=parseInt(lt[2],10),de=h.searchParams.get("sn");return Ct(n,z,H,de),!0}return !1}catch(B){let U=B?.statusCode||500;return ee(n,U,{error:String(B?.message||B)}),true}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleRuntimeApi:tn,buildPublishedRuntimePayload:he,clearChatRecords:Ke,reportSourceFetched(o,n){let d=R[0];return d?d.board.sourceDataFetched({params:{token:o,ref:n}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(o,n){let d=R[0];return d?d.board.sourceDataFetchFailure({params:{token:o,reason:n}}):{status:"fail",error:"no board context"}},get cardStore(){return R[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function ns(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...Hr,...e.corsHeaders||{}},s=e.serverMetaStore,a=e.boardRuntimeFactory,i=new Map,c="boards-config.json";function u(){let x=s.getText(c);if(!x)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(x)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function m(x){s.putText(c,JSON.stringify(x,null,2));}function O(x){let L=String(x||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return L.length>0&&L.length<=64?L:null}function $(x){if(i.has(x))return i.get(x);let J=u().boards.find(M=>M.id===x)||{},I=a(x,J);return i.set(x,I),I}function k(x,L,J){let I=JSON.stringify(J),M=typeof Buffer<"u"?Buffer.byteLength(I):new TextEncoder().encode(I).length;x.writeHead(L,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":M}),x.end(I);}async function v(x,L,J){let I=x.method||"GET",M=J.pathname;if(I==="GET"&&M===t)return k(L,200,{ok:true,boards:u().boards}),true;if(I==="POST"&&M===t){let R=[];for await(let _ of x)R.push(_);let C=typeof Buffer<"u"?Buffer.concat(R).toString("utf-8").trim():new TextDecoder().decode(Wn(R)).trim(),y={};try{y=C?JSON.parse(C):{};}catch{y={};}let l=O(y.id);if(!l)return k(L,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let p=u();if(p.boards.some(_=>_.id===l))return k(L,409,{error:`Board "${l}" is already registered`}),true;let S=typeof y.label=="string"&&y.label.trim()?y.label.trim():l,A={id:l,label:S};for(let[_,j]of Object.entries(y))_==="id"||_==="label"||j!=null&&(A[_]=j);return p.boards.push(A),m(p),k(L,200,{ok:true,board:A}),true}return false}async function T(x,L,J){let M=J.pathname.match(new RegExp(`^${Me(t)}/([^/]+)(/|$)`));if(!M)return false;let R=O(decodeURIComponent(M[1]));return R?u().boards.some(l=>l.id===R)?!!await $(R).handleRuntimeApi(x,L,J):(k(L,404,{error:`Board "${R}" not registered. POST ${t} with {id} to register it first.`}),true):(k(L,400,{error:"Invalid board id"}),true)}async function w(x,L,J){return !!(await v(x,L,J)||await T(x,L,J))}function q(x){if(!u().boards.some(J=>J.id===x))throw Object.assign(new Error(`Board "${x}" not registered`),{statusCode:404});return {service:$(x)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:w,requireBoardService:q}}function Me(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Wn(e){let t=e.reduce((a,i)=>a+i.length,0),r=new Uint8Array(t),s=0;for(let a of e)r.set(a,s),s+=a.length;return r}exports.createMultiBoardServerRuntime=ns;exports.createSingleBoardServerRuntime=rs;//# sourceMappingURL=board-live-cards-server-runtime.cjs.map
1
+ 'use strict';var chunkP64UKI3L_cjs=require('./chunk-P64UKI3L.cjs');require('./chunk-NJJ7WEDT.cjs'),require('./chunk-LVNQCE5X.cjs'),require('./chunk-5DB54ZX2.cjs'),require('./chunk-UVE65IPR.cjs'),require('./chunk-G4XXRHL2.cjs'),require('./chunk-LODXIALE.cjs'),require('./chunk-KNFFDVLD.cjs'),require('./chunk-IXZG74EW.cjs'),require('./chunk-NMZ6XNLB.cjs'),require('./chunk-YMEIPKLW.cjs'),require('./chunk-GYQXDNNI.cjs'),require('./chunk-UJ7ZTV4J.cjs'),require('./chunk-GNFE24S7.cjs');Object.defineProperty(exports,"createMultiBoardServerRuntime",{enumerable:true,get:function(){return chunkP64UKI3L_cjs.b}});Object.defineProperty(exports,"createSingleBoardServerRuntime",{enumerable:true,get:function(){return chunkP64UKI3L_cjs.a}});//# sourceMappingURL=board-live-cards-server-runtime.cjs.map
8
2
  //# sourceMappingURL=board-live-cards-server-runtime.cjs.map
@@ -1,8 +1,8 @@
1
- export { B as BoardContextConfig, C as ChatHandlerFlowRunner, D as DescribeEnvelope, I as InvocationAdapter, a as MultiBoardRuntime, M as MultiBoardRuntimeOptions, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse, b as SingleBoardRuntime, S as SingleBoardRuntimeOptions } from './types-CIgsh56O.cjs';
2
- export { B as BlobStorage, K as KVStorage, a as KindValueRef } from './storage-interface-B2WD9D5n.cjs';
3
- export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardNonCorePlatformAdapter, e as BoardPlatformAdapter, a as CommandInput, C as CommandResult } from './board-live-cards-public-B13InXhC.cjs';
4
- export { c as ChatStorage } from './chat-storage-lib-0imhRX3l.cjs';
1
+ export { B as BoardContextConfig, C as ChatHandlerFlowRunner, D as DescribeEnvelope, I as InvocationAdapter, a as MultiBoardRuntime, M as MultiBoardRuntimeOptions, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse, b as SingleBoardRuntime, S as SingleBoardRuntimeOptions } from './types-DRl0Hy_p.cjs';
2
+ export { B as BlobStorage, K as KVStorage, a as KindValueRef } from './storage-interface-Ct-C4tlz.cjs';
3
+ export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardNonCorePlatformAdapter, e as BoardPlatformAdapter, a as CommandInput, C as CommandResult } from './board-live-cards-public-CPJy-aGW.cjs';
4
+ export { c as ChatStorage } from './chat-storage-lib-CKylihjm.cjs';
5
5
  export { ExecutionRef } from './execution-refs.cjs';
6
6
  export { createMultiBoardServerRuntime, createSingleBoardServerRuntime } from './server-runtime/index.cjs';
7
- import './artifacts-store-lib-CVgtQrNZ.cjs';
7
+ import './artifacts-store-lib-CLOtsiav.cjs';
8
8
  import './types-BBhqYGhE.cjs';
@@ -1,8 +1,8 @@
1
- export { B as BoardContextConfig, C as ChatHandlerFlowRunner, D as DescribeEnvelope, I as InvocationAdapter, a as MultiBoardRuntime, M as MultiBoardRuntimeOptions, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse, b as SingleBoardRuntime, S as SingleBoardRuntimeOptions } from './types-30R357js.js';
2
- export { B as BlobStorage, K as KVStorage, a as KindValueRef } from './storage-interface-B2WD9D5n.js';
3
- export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardNonCorePlatformAdapter, e as BoardPlatformAdapter, a as CommandInput, C as CommandResult } from './board-live-cards-public-BGS22cMb.js';
4
- export { c as ChatStorage } from './chat-storage-lib-CJn7a6OH.js';
1
+ export { B as BoardContextConfig, C as ChatHandlerFlowRunner, D as DescribeEnvelope, I as InvocationAdapter, a as MultiBoardRuntime, M as MultiBoardRuntimeOptions, N as NotificationTransport, R as RuntimeLogger, c as RuntimeRequest, d as RuntimeResponse, b as SingleBoardRuntime, S as SingleBoardRuntimeOptions } from './types-BuK2UMxk.js';
2
+ export { B as BlobStorage, K as KVStorage, a as KindValueRef } from './storage-interface-Ct-C4tlz.js';
3
+ export { B as BoardChangeNotification, c as BoardLiveCardsPublic, d as BoardNonCorePlatformAdapter, e as BoardPlatformAdapter, a as CommandInput, C as CommandResult } from './board-live-cards-public-CBVjm327.js';
4
+ export { c as ChatStorage } from './chat-storage-lib-Bce-xx6l.js';
5
5
  export { ExecutionRef } from './execution-refs.js';
6
6
  export { createMultiBoardServerRuntime, createSingleBoardServerRuntime } from './server-runtime/index.js';
7
- import './artifacts-store-lib-D-k-E8Vy.js';
7
+ import './artifacts-store-lib-C1rtrkxm.js';
8
8
  import './types-BBhqYGhE.js';