yaml-flow 8.6.4 → 8.7.0

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 (146) hide show
  1. package/browser/adapters/firebase-storage.js +3 -0
  2. package/browser/adapters/firestore-storage.js +3 -0
  3. package/browser/adapters/localstorage-storage.js +4 -0
  4. package/browser/asset-integrity.json +20 -4
  5. package/browser/server-runtime-controlface.js +8 -0
  6. package/examples/ARCHITECTURE.md +5 -32
  7. package/examples/board/demo-shell-with-server.html +2 -2
  8. package/examples/board/doc.html +2 -2
  9. package/examples/board/server/board-server.js +4 -2
  10. package/examples/board-firestore/README.md +81 -0
  11. package/examples/board-firestore/browser/board-runtime.js +263 -0
  12. package/examples/board-firestore/firestore.indexes.json +29 -0
  13. package/examples/board-firestore/package.json +14 -0
  14. package/examples/board-firestore/server/adapters/firestore-archive-factory.js +59 -0
  15. package/examples/board-firestore/server/adapters/firestore-blob-storage.js +82 -0
  16. package/examples/board-firestore/server/adapters/firestore-board-adapter.js +127 -0
  17. package/examples/board-firestore/server/adapters/firestore-journal-storage.js +54 -0
  18. package/examples/board-firestore/server/adapters/firestore-kv-storage.js +47 -0
  19. package/examples/board-firestore/server/adapters/firestore-lock.js +62 -0
  20. package/examples/board-firestore/server/adapters/firestore-queue-storage.js +186 -0
  21. package/examples/board-firestore/server/adapters/firestore-scratch-storage.js +50 -0
  22. package/examples/board-firestore/server/worker.js +146 -0
  23. package/lib/{artifacts-store-lib-BR-Samty.d.cts → artifacts-store-lib-D9nMkVcE.d.cts} +1 -1
  24. package/lib/{artifacts-store-lib-DT7XlWUL.d.ts → artifacts-store-lib-DSSMqVL2.d.ts} +1 -1
  25. package/lib/artifacts-store-public.d.cts +2 -2
  26. package/lib/artifacts-store-public.d.ts +2 -2
  27. package/lib/board-live-cards-mcp.cjs +1 -1
  28. package/lib/board-live-cards-mcp.d.cts +50 -3
  29. package/lib/board-live-cards-mcp.d.ts +50 -3
  30. package/lib/board-live-cards-mcp.js +1 -1
  31. package/lib/board-live-cards-node.cjs +8 -8
  32. package/lib/board-live-cards-node.d.cts +13 -9
  33. package/lib/board-live-cards-node.d.ts +13 -9
  34. package/lib/board-live-cards-node.js +8 -8
  35. package/lib/{board-live-cards-public-BMUIPOrc.d.ts → board-live-cards-public-D-DJek3X.d.ts} +1 -1
  36. package/lib/{board-live-cards-public-wkNmBIRC.d.cts → board-live-cards-public-DQzPe7A9.d.cts} +1 -1
  37. package/lib/board-live-cards-public-async-3hUuHxDx.d.ts +55 -0
  38. package/lib/board-live-cards-public-async-CgMCYYft.d.cts +55 -0
  39. package/lib/board-live-cards-public.d.cts +1 -1
  40. package/lib/board-live-cards-public.d.ts +1 -1
  41. package/lib/board-live-cards-server-runtime.cjs +1 -1
  42. package/lib/board-live-cards-server-runtime.d.cts +10 -6
  43. package/lib/board-live-cards-server-runtime.d.ts +10 -6
  44. package/lib/board-live-cards-server-runtime.js +1 -1
  45. package/lib/board-platform-adapter-async-DOfEq_HC.d.cts +129 -0
  46. package/lib/board-platform-adapter-async-JZPCzZnH.d.ts +129 -0
  47. package/lib/board-worker-adapter.cjs +3 -3
  48. package/lib/board-worker-adapter.js +3 -3
  49. package/lib/card-store-public.d.cts +1 -1
  50. package/lib/card-store-public.d.ts +1 -1
  51. package/lib/{chat-storage-lib-BIUbE-fM.d.cts → chat-storage-lib-B9Q34Dyv.d.cts} +1 -1
  52. package/lib/{chat-storage-lib-BlG-sobS.d.ts → chat-storage-lib-DB9iSai2.d.ts} +1 -1
  53. package/lib/chat-store-public.d.cts +2 -2
  54. package/lib/chat-store-public.d.ts +2 -2
  55. package/lib/chunk-272IYUKT.cjs +2 -0
  56. package/lib/chunk-5XHOHTLZ.cjs +2 -0
  57. package/lib/chunk-6APH25VI.js +2 -0
  58. package/lib/chunk-7FGPOGRV.cjs +2 -0
  59. package/lib/chunk-7ICPAABP.cjs +7 -0
  60. package/lib/chunk-CPAXTVBQ.cjs +2 -0
  61. package/lib/chunk-DDYSXP2A.cjs +3 -0
  62. package/lib/chunk-EGRHWZRV.js +2 -0
  63. package/lib/chunk-GL2OHR2E.cjs +2 -0
  64. package/lib/chunk-IPLSRN6P.cjs +4 -0
  65. package/lib/chunk-J5J6BG7B.js +2 -0
  66. package/lib/chunk-KAWQPLIE.cjs +2 -0
  67. package/lib/chunk-LPXVVMQT.cjs +2 -0
  68. package/lib/chunk-M3OU6IS5.cjs +2 -0
  69. package/lib/chunk-M6STQR5F.cjs +2 -0
  70. package/lib/chunk-NJJ7WEDT.cjs +2 -0
  71. package/lib/chunk-NKIQRCOM.cjs +2 -0
  72. package/lib/chunk-NM6O35RY.cjs +2 -0
  73. package/lib/chunk-NTICU4OK.js +2 -0
  74. package/lib/chunk-O7NOHKVR.js +2 -0
  75. package/lib/chunk-PRHQBGPT.js +2 -0
  76. package/lib/chunk-S44QZUDX.js +2 -0
  77. package/lib/chunk-SGV7PU4H.js +2 -0
  78. package/lib/chunk-TSN3RTXT.js +4 -0
  79. package/lib/chunk-VXJHBWK3.js +2 -0
  80. package/lib/chunk-WHDEBJLT.js +7 -0
  81. package/lib/chunk-XYN5D3GL.js +2 -0
  82. package/lib/chunk-YGALANRO.js +2 -0
  83. package/lib/chunk-ZJ5M5COT.js +2 -0
  84. package/lib/chunk-ZXQR7GHT.js +3 -0
  85. package/lib/cloud-storage.cjs +1 -1
  86. package/lib/cloud-storage.d.cts +5 -3
  87. package/lib/cloud-storage.d.ts +5 -3
  88. package/lib/cloud-storage.js +1 -1
  89. package/lib/firebase-storage/index.cjs +3 -0
  90. package/lib/firebase-storage/index.d.cts +57 -0
  91. package/lib/firebase-storage/index.d.ts +57 -0
  92. package/lib/firebase-storage/index.js +3 -0
  93. package/lib/firestore-storage/index.cjs +3 -0
  94. package/lib/firestore-storage/index.d.cts +98 -0
  95. package/lib/firestore-storage/index.d.ts +98 -0
  96. package/lib/firestore-storage/index.js +3 -0
  97. package/lib/localstorage-storage/index.cjs +2 -0
  98. package/lib/localstorage-storage/index.d.cts +39 -0
  99. package/lib/localstorage-storage/index.d.ts +39 -0
  100. package/lib/localstorage-storage/index.js +2 -0
  101. package/lib/mcp-tool-registries-BBObLYga.d.ts +41 -0
  102. package/lib/mcp-tool-registries-W3TRj6O5.d.cts +41 -0
  103. package/lib/queue-lane-registry-PaZuFpwp.d.cts +30 -0
  104. package/lib/queue-lane-registry-PaZuFpwp.d.ts +30 -0
  105. package/lib/server-jobs-queue-runner/index.cjs +2 -0
  106. package/lib/server-jobs-queue-runner/index.d.cts +22 -0
  107. package/lib/server-jobs-queue-runner/index.d.ts +22 -0
  108. package/lib/server-jobs-queue-runner/index.js +2 -0
  109. package/lib/server-runtime/index.cjs +1 -1
  110. package/lib/server-runtime/index.d.cts +11 -17
  111. package/lib/server-runtime/index.d.ts +11 -17
  112. package/lib/server-runtime/index.js +1 -1
  113. package/lib/server-runtime-agentface/index.cjs +2 -0
  114. package/lib/server-runtime-agentface/index.d.cts +53 -0
  115. package/lib/server-runtime-agentface/index.d.ts +53 -0
  116. package/lib/server-runtime-agentface/index.js +2 -0
  117. package/lib/server-runtime-controlface/index.cjs +2 -0
  118. package/lib/server-runtime-controlface/index.d.cts +80 -0
  119. package/lib/server-runtime-controlface/index.d.ts +80 -0
  120. package/lib/server-runtime-controlface/index.js +2 -0
  121. package/lib/server-runtime-core/index.cjs +2 -0
  122. package/lib/server-runtime-core/index.d.cts +376 -0
  123. package/lib/server-runtime-core/index.d.ts +376 -0
  124. package/lib/server-runtime-core/index.js +2 -0
  125. package/lib/server-runtime-watchers/index.cjs +2 -0
  126. package/lib/server-runtime-watchers/index.d.cts +127 -0
  127. package/lib/server-runtime-watchers/index.d.ts +127 -0
  128. package/lib/server-runtime-watchers/index.js +2 -0
  129. package/lib/server-runtime-webhooks/index.cjs +2 -0
  130. package/lib/server-runtime-webhooks/index.d.cts +34 -0
  131. package/lib/server-runtime-webhooks/index.d.ts +34 -0
  132. package/lib/server-runtime-webhooks/index.js +2 -0
  133. package/lib/storage-async-interface-BRR4eBjx.d.cts +81 -0
  134. package/lib/storage-async-interface-DhlOVPSp.d.ts +81 -0
  135. package/lib/{queue-lane-registry-BPKWWgd4.d.cts → types-BzQY45dH.d.cts} +8 -34
  136. package/lib/{queue-lane-registry-Be6c0ftj.d.ts → types-CF2xUcZW.d.ts} +8 -34
  137. package/package.json +46 -2
  138. package/examples/board-local/demo-shell-localstorage.html +0 -843
  139. package/lib/board-live-cards-public-async-DKZqbJVU.d.ts +0 -256
  140. package/lib/board-live-cards-public-async-dMWNbWq6.d.cts +0 -256
  141. package/lib/chunk-KXWT3CY6.cjs +0 -8
  142. package/lib/chunk-MLVTJASJ.js +0 -2
  143. package/lib/chunk-OJLA6NLU.js +0 -8
  144. package/lib/chunk-R5L5WUKN.js +0 -2
  145. package/lib/chunk-WOALA3V5.cjs +0 -2
  146. package/lib/chunk-YEB5QHGE.cjs +0 -2
@@ -0,0 +1,3 @@
1
+ var FirebaseStorage=(function(exports){'use strict';var h=new TextEncoder;function y(o){let r="";for(let i of h.encode(String(o)))r+=String.fromCharCode(i);return (typeof btoa=="function"?btoa(r):Buffer.from(r,"binary").toString("base64")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function p(o){let r=String(o).replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-String(o).length%4)%4),s=typeof atob=="function"?atob(r):Buffer.from(r,"base64").toString("binary"),i=new Uint8Array(s.length);for(let n=0;n<s.length;n+=1)i[n]=s.charCodeAt(n);return new TextDecoder().decode(i)}function g(...o){return o.map(r=>String(r??"").trim()).filter(Boolean).join("/")}function u(o){return !!(o&&typeof o=="object"&&o.code==="storage/object-not-found")}function S(o,r){let s=o.ref(r);function i(e){return s.child(y(e))}async function n(e){let t=await e.getDownloadURL(),c=await fetch(t,{cache:"no-store"});if(!c.ok)throw new Error(`Failed to fetch storage object ${e.fullPath}: ${c.status}`);return c.text()}async function a(e){let t=await e.getDownloadURL(),c=await fetch(t,{cache:"no-store"});if(!c.ok)throw new Error(`Failed to fetch storage object ${e.fullPath}: ${c.status}`);return new Uint8Array(await c.arrayBuffer())}async function l(){let e=[];async function t(c){let d=await c.listAll();for(let f of d.prefixes)await t(f);for(let f of d.items){let w=f.name||f.fullPath.slice(s.fullPath.length+1);e.push(p(w));}}try{await t(s);}catch(c){if(u(c))return [];throw c}return e.sort()}return {async read(e){try{return await n(i(e))}catch(t){if(u(t))return null;throw t}},async write(e,t){await i(e).putString(String(t),"raw",{contentType:"text/plain; charset=utf-8"});},async exists(e){try{return await i(e).getMetadata(),!0}catch(t){if(u(t))return false;throw t}},async remove(e){try{await i(e).delete();}catch(t){if(!u(t))throw t}},async readBytes(e){try{return await a(i(e))}catch(t){if(u(t))return null;throw t}},async writeBytes(e,t){await i(e).put(t,{contentType:"application/octet-stream"});},async listKeys(e=""){let t=await l();return e?t.filter(c=>c.startsWith(e)):t},async stat(e){try{let t=await i(e).getMetadata();return {key:e,size:Number(t.size??0),updatedAt:t.updated??void 0,contentType:t.contentType??void 0}}catch(t){if(u(t))return null;throw t}},keyRef(e){return {kind:"firebase-storage",value:g(r,y(e))}}}}function b(o,r){let s=S(o,r);async function i(n="scratch-",a=""){let l=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`;return `${n}${l}${a}`}return {...s,getUniqueKey:i,async create(n,a="scratch-",l=""){let e=await i(a,l);return await s.write(e,n),e},keyRef(n){return {kind:"firebase-storage",value:g(r,y(n))}},config:{async get(n){let a=await s.read(`__config__/${n}`);if(a==null)return null;try{return JSON.parse(a)}catch{return a}},async set(n,a){await s.write(`__config__/${n}`,JSON.stringify(a));}}}}function m(o,r,s){let i=g("boards",s,"blobs"),n=g("boards",s,"scratch");return {...o,blobStorage(a){return S(r,g(i,a||"root"))},scratchStorage(){return b(r,n)},scratchStorageForRef(){return b(r,n)},async resolveBlob(a){if(a?.kind==="firebase-storage"&&typeof a.value=="string"){let l=await r.ref(a.value).getDownloadURL(),e=await fetch(l,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to resolve storage blob ${a.value}: ${e.status}`);return e.text()}return typeof o.resolveBlob=="function"?o.resolveBlob(a):null}}}
2
+ exports.createFirebaseStorageBlobStore=S;exports.createFirebaseStorageScratchStore=b;exports.wrapWithFirebaseStorageBlobs=m;return exports;})({});//# sourceMappingURL=firebase-storage.js.map
3
+ //# sourceMappingURL=firebase-storage.js.map
@@ -0,0 +1,3 @@
1
+ var FirestoreStorage=(function(exports){'use strict';var w="b64:";function Z(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 ee(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 g(e){return `${w}${Z(JSON.stringify(e))}`}function m(e){if(!e.startsWith(w))throw new Error(`Invalid ref format (expected ${w}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(ee(e.slice(w.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}}function v(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function oe(e){return typeof e=="string"?e.startsWith("b64:")?m(e).value:e:e.value}function h(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...v(r),leaseToken:r.leaseToken,leaseExpiresAt:r.leaseExpiresAt}))},ackRequest(t,r){return e.ack(t,r)},nackRequest(t,r,n){return e.nack(t,r,n)},async peekActive(){return (await e.peekActive()).map(v)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...v(t),reason:t.reason}))}}}function A(e){let t,r,n,s=e.callbackTransport,o=e.resolveBlob??(async a=>{let u=await e.blobStorage("").read(a.value);if(u==null)throw new Error(`Blob not found for ref ${a.kind}:${a.value}`);return u});async function i(a,u){if(a.howToRun==="queue-storage"){let d=e.boardWorkerStore??t??(e.queueStorage?h(e.queueStorage):void 0);return d?(t||(t=d),await d.enqueueRequest({boardId:typeof a.extra?.boardId=="string"?a.extra.boardId:e.boardId,ref:a,args:u}),{dispatched:true}):{dispatched:false,error:"queue-storage dispatch requires queueStorage or boardWorkerStore"}}if(a.howToRun==="http:post"){let d=e.fetch??globalThis.fetch;if(!d)return {dispatched:false,error:"http:post dispatch requires fetch support"};let p=await d(oe(a.whatToRun),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...u,...a.extra?{extra:a.extra}:{}})});if(!p.ok){let S=await p.text().catch(()=>"");return {dispatched:false,error:`HTTP ${p.status}: ${S}`}}return {dispatched:true}}return {dispatched:false,error:`Unsupported hosted async transport "${a.howToRun}"`}}return {kvStorage:e.kvStorage,kvStorageForRef:e.kvStorageForRef,blobStorage:e.blobStorage,scratchStorage:e.scratchStorage,scratchStorageForRef:e.scratchStorageForRef,archiveFactory:e.archiveFactory,archiveFactoryForRef:e.archiveFactoryForRef,journalStorage:e.journalStorage,boardWorkerStore:()=>{if(!t)if(e.boardWorkerStore)t=e.boardWorkerStore;else if(e.queueStorage)t=h(e.queueStorage);else throw new Error("Hosted async board adapter requires queueStorage or boardWorkerStore");return t},chatAgentStore:()=>{if(!r)if(e.chatAgentStore)r=e.chatAgentStore;else if(e.chatAgentQueueStorage)r=h(e.chatAgentQueueStorage);else if(e.boardWorkerStore)r=e.boardWorkerStore;else if(e.queueStorage)r=h(e.queueStorage);else throw new Error("Hosted async board adapter requires chatAgentStore, chatAgentQueueStorage, queueStorage, or boardWorkerStore");return r},processAccumulatedStore:()=>{if(n||(n=e.processAccumulatedStore??e.processAccumulatedQueueStorage??e.queueStorage),!n)throw new Error("Hosted async board adapter requires processAccumulatedStore, processAccumulatedQueueStorage, or queueStorage");return n},lock:e.lock,get callbackTransport(){return s},set callbackTransport(a){s=a;},dispatchExecution:(a,u)=>e.dispatchExecution?.(a,u)??i(a,u),supportsDirectSourceOutput:e.supportsDirectSourceOutput,resolveBlob:o,hashFn:e.hashFn,genId:e.genId,requestProcessAccumulated:e.requestProcessAccumulated,publishBoardChangeNotifications:e.publishBoardChangeNotifications,warn:e.onWarn}}function x(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(x).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${x(t[n])}`).join(",")}}`}function C(e,t){let r=t>>>0;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r}function M(e){let t=x(e),r=C(t,2166136261),n=C(t,3735928559),s=C(t,19088743),o=C(t,4277009102);return [r,n,s,o].map(i=>i.toString(16).padStart(8,"0")).join("")}function Q(e){let t="";for(let r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return btoa(t)}function Te(e){let t=atob(e),r=new Uint8Array(t.length);for(let n=0;n<t.length;n++)r[n]=t.charCodeAt(n);return r}function Ee(e){let t=new TextEncoder().encode(e);return Q(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Ie(e){return M(e).slice(0,16)}function W(){return globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():`${Date.now().toString(16)}-${Math.random().toString(16).slice(2,10)}`}function c(e){return Ee(String(e))}function k(){let e=String(Date.now()).padStart(13,"0"),t=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `${e}-${t}`}function z(e){try{return m(e)}catch{return null}}function J(e,t){let r=z(e);return r?.kind==="firestore"&&r.value?r.value:t}function Y(e,t){return e.collection("boards").doc(t)}function f(e,t,r){return Y(e,t).collection(r)}function E(e){return {kind:"firestore",value:String(e)}}function y(e){return g(E(e))}function Pe(e){return {baseRef:E(`boards/${e}`),cardStoreRef:y(`boards/${e}/cards`),outputsStoreRef:y(`boards/${e}/runtime-out`),scratchStoreRef:y(`boards/${e}/scratch`),archiveStoreRef:y(`boards/${e}/archive`),chatStoreRef:y(`boards/${e}/chat`),artifactsStoreRef:y(`boards/${e}/files`)}}function G(e){return {async read(t){let r=await e.doc(c(t)).get();return r.exists?r.data()?.value??null:null},async write(t,r){await e.doc(c(t)).set({k:t,value:r});},async delete(t){await e.doc(c(t)).delete();},async listKeys(t=""){return (await(t?e.where("k",">=",t).where("k","<",`${t}\uF8FF`).orderBy("k"):e.orderBy("k")).get()).docs.map(s=>s.data()?.k??s.id)}}}function X(e){return {async append(t){let r=k();return await e.doc(r).set({id:r,createdAt:new Date().toISOString(),payload:t}),{id:r,payload:t}},async readAll(){return (await e.orderBy("id").get()).docs.map(r=>{let n=r.data()??{};return {id:String(n.id??r.id),payload:n.payload}})},async readAfter(t){let s=(await(t?e.where("id",">",t).orderBy("id"):e.orderBy("id")).get()).docs.map(o=>{let i=o.data()??{};return {id:String(i.id??o.id),payload:i.payload}});return {entries:s,newCursor:s.length>0?s[s.length-1].id:t}},async clear(){let t=await e.get();if(typeof e.firestore.batch=="function"){let r=e.firestore.batch();for(let n of t.docs)r.delete(e.doc(n.id));await r.commit();return}await Promise.all(t.docs.map(r=>e.doc(r.id).delete()));}}}function I(e){return {async read(t){let r=await e.doc(c(t)).get();return r.exists?r.data()?.content??null:null},async write(t,r){await e.doc(c(t)).set({k:t,content:r});},async exists(t){return (await e.doc(c(t)).get()).exists},async remove(t){await e.doc(c(t)).delete();},async readBytes(t){let r=await e.doc(c(t)).get();if(!r.exists)return null;let n=r.data()??{};return typeof n.bytesBase64=="string"?Te(n.bytesBase64):typeof n.content=="string"?new TextEncoder().encode(n.content):null},async writeBytes(t,r){await e.doc(c(t)).set({k:t,bytesBase64:Q(r)});},async listKeys(t=""){return (await(t?e.where("k",">=",t).where("k","<",`${t}\uF8FF`).orderBy("k"):e.orderBy("k")).get()).docs.map(s=>s.data()?.k??s.id)},async stat(t){let r=await e.doc(c(t)).get();if(!r.exists)return null;let n=r.data()??{},s=typeof n.bytesBase64=="string"?Math.floor(n.bytesBase64.length*3/4):typeof n.content=="string"?n.content.length:0;return {key:t,size:s,contentType:String(n.contentType??"application/octet-stream")}}}}function H(e){let t=I(e);return {...t,async getUniqueKey(r="scratch-",n=""){return `${r}${k()}${n}`},async create(r,n="scratch-",s=""){let o=`${n}${k()}${s}`;return await t.write(o,r),o},keyRef(r){return E(`${e.path}/${c(r)}`)},config:{async get(r){let n=await t.read(`__config__/${r}`);if(n==null)return null;try{return JSON.parse(n)}catch{return n}},async set(r,n){await t.write(`__config__/${r}`,JSON.stringify(n));}}}}function U(e,t){let r=Y(e,t);return {stream(n){return X(r.collection(`archive-stream-${n}`))},blob(n){return I(r.collection(`archive-blob-${n}`))},async listStreams(n=""){return typeof r.listCollections!="function"?[]:(await r.listCollections()).map(o=>o.path.split("/").at(-1)??"").filter(o=>o.startsWith(`archive-stream-${n}`)).map(o=>o.slice(15))},async listBlobs(n=""){return typeof r.listCollections!="function"?[]:(await r.listCollections()).map(o=>o.path.split("/").at(-1)??"").filter(o=>o.startsWith(`archive-blob-${n}`)).map(o=>o.slice(13))},config:{async get(n){let s=await r.collection("archive-config").doc("main").get();return s.exists?s.data()?.[n]??null:null},async set(n,s){await r.collection("archive-config").doc("main").set({[n]:s},{merge:true});}}}}function Oe(e,t={}){let r=t.holderId??W(),n=t.ttlMs??3e4;return {async tryAcquire(){try{await e.firestore.runTransaction(async s=>{let o=await s.get(e),i=new Date().toISOString();if(o.exists){let a=o.data()??{};if(a.held===!0&&typeof a.expiresAt=="string"&&a.expiresAt>i)throw Object.assign(new Error("locked"),{code:"locked"})}s.set(e,{held:!0,holderId:r,acquiredAt:i,expiresAt:new Date(Date.now()+n).toISOString()});});}catch(s){if(s?.code==="locked")return null;throw s}return async()=>{try{await e.firestore.runTransaction(async s=>{let o=await s.get(e);if(!o.exists)return;(o.data()??{}).holderId===r&&s.update(e,{held:!1,holderId:null});});}catch{}}}}}function T(e,t={}){let r=t.defaultVisibilityMs??3e4;return {async enqueue(n){let s=k(),o=new Date().toISOString();return await e.doc(s).set({id:s,body:n,enqueuedAt:o,attempt:0,visibleAfter:o,leaseToken:null,leaseExpiresAt:null,dead:false,deadReason:null}),{id:s,body:n,enqueuedAt:o,attempt:0}},async enqueueIfAbsent(n,s){if((await e.where("dedupKey","==",s).where("dead","==",false).limit(1).get()).docs.length>0)return null;let i=k(),a=new Date().toISOString();return await e.doc(i).set({id:i,body:n,dedupKey:s,enqueuedAt:a,attempt:0,visibleAfter:a,leaseToken:null,leaseExpiresAt:null,dead:false,deadReason:null}),{id:i,body:n,enqueuedAt:a,attempt:0}},async lease(n={}){let s=Math.max(1,Number(n.max??1)),o=Math.max(1,Number(n.visibilityMs??r)),i=new Date().toISOString(),a=await e.where("dead","==",false).where("visibleAfter","<=",i).orderBy("visibleAfter").limit(s*4).get(),u=[];for(let d of a.docs){if(u.length>=s)break;let p=e.doc(d.id);try{let S=null;await e.firestore.runTransaction(async P=>{let O=await P.get(p);if(!O.exists)throw new Error("gone");let l=O.data()??{},b=new Date().toISOString();if(l.dead===!0)throw new Error("dead");if(typeof l.visibleAfter=="string"&&l.visibleAfter>b)throw new Error("hidden");if(l.leaseToken&&typeof l.leaseExpiresAt=="string"&&l.leaseExpiresAt>b)throw new Error("leased");let _=W(),F=new Date(Date.now()+o).toISOString(),q=Number(l.attempt??0)+1;P.update(p,{leaseToken:_,leaseExpiresAt:F,attempt:q}),S={id:String(l.id??d.id),body:l.body,enqueuedAt:String(l.enqueuedAt??b),attempt:q,leaseToken:_,leaseExpiresAt:F};}),S&&u.push(S);}catch{}}return u},async ack(n,s){try{return await e.firestore.runTransaction(async o=>{let i=e.doc(n),a=await o.get(i);if(!a.exists)return;if((a.data()??{}).leaseToken!==s)throw new Error("token mismatch");o.delete(i);}),!0}catch{return false}},async nack(n,s,o={}){try{return await e.firestore.runTransaction(async i=>{let a=e.doc(n),u=await i.get(a);if(!u.exists)return;if((u.data()??{}).leaseToken!==s)throw new Error("token mismatch");o.dead===!0?i.update(a,{dead:!0,deadReason:o.reason??"nacked",leaseToken:null,leaseExpiresAt:null}):i.update(a,{leaseToken:null,leaseExpiresAt:null,visibleAfter:new Date().toISOString()});}),!0}catch{return false}},async peekActive(n=""){return (await e.where("dead","==",false).orderBy("enqueuedAt").get()).docs.map(o=>o.data()??{}).filter(o=>!n||String(o.id??"").startsWith(n)).map(o=>({id:String(o.id??""),body:o.body,enqueuedAt:String(o.enqueuedAt??""),attempt:Number(o.attempt??0)}))},async peekDeadLetter(n=""){return (await e.where("dead","==",true).orderBy("enqueuedAt").get()).docs.map(o=>o.data()??{}).filter(o=>!n||String(o.id??"").startsWith(n)).map(o=>({id:String(o.id??""),body:o.body,enqueuedAt:String(o.enqueuedAt??""),attempt:Number(o.attempt??0),reason:o.deadReason}))}}}function _e(e,t,r={}){return A({boardId:t,kvStorage(n){return G(f(e,t,`kv-${n||"root"}`))},kvStorageForRef(n){return G(e.collection(J(n,`boards/${t}/kv-root`)))},blobStorage(n){return I(f(e,t,`blobs-${n||"root"}`))},scratchStorage(){return H(f(e,t,"scratch"))},scratchStorageForRef(n){return H(e.collection(J(n,`boards/${t}/scratch`)))},archiveFactory(){return U(e,t)},archiveFactoryForRef(n){let s=z(n),o=s?.kind==="firestore-board"?s.value:t;return U(e,o)},journalStorage(){return X(f(e,t,"journal"))},queueStorage:T(f(e,t,"worker-queue")),chatAgentQueueStorage:T(f(e,t,"chat-queue")),processAccumulatedQueueStorage:T(f(e,t,"process-queue")),lock:Oe(f(e,t,"locks").doc("board-lock"),{holderId:r.holderId}),hashFn(n){return Ie(n)},genId(){return k()},requestProcessAccumulated:r.requestProcessAccumulated,publishBoardChangeNotifications:r.publishBoardChangeNotifications,onWarn:n=>console.warn(`[firestore-board-adapter:${t}] ${n}`)})}function Cn(e,t,r={}){return {refs:{...Pe(t),...r.refs??{}},boardAdapter:_e(e,t,r)}}
2
+ exports.createFirestoreArchiveFactory=U;exports.createFirestoreBlobStorage=I;exports.createFirestoreBoardAdapter=_e;exports.createFirestoreBoardRefs=Pe;exports.createFirestoreBoardRuntimeBundle=Cn;exports.createFirestoreJournalStorage=X;exports.createFirestoreKvStorage=G;exports.createFirestoreLock=Oe;exports.createFirestoreQueueStorage=T;exports.createFirestoreScratchStorage=H;exports.makeFirestoreRef=E;exports.serializeFirestoreRef=y;return exports;})({});//# sourceMappingURL=firestore-storage.js.map
3
+ //# sourceMappingURL=firestore-storage.js.map
@@ -0,0 +1,4 @@
1
+ var LocalStorageStorage=(function(exports){'use strict';var A="b64:";function se(t){let r=new TextEncoder().encode(t),e=globalThis.Buffer,n;if(e)n=e.from(r).toString("base64");else if(typeof btoa=="function"){let a="";for(let u of r)a+=String.fromCharCode(u);n=btoa(a);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function ae(t){let r=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),e=globalThis.Buffer;if(e)return e.from(r,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(r),a=new Uint8Array(n.length);for(let u=0;u<n.length;u+=1)a[u]=n.charCodeAt(u);return new TextDecoder().decode(a)}throw new Error("No base64 decoder available in this runtime")}function S(t){return `${A}${se(JSON.stringify(t))}`}function C(t){if(!t.startsWith(A))throw new Error(`Invalid ref format (expected ${A}<base64url(json)>): ${t}`);let r;try{r=JSON.parse(ae(t.slice(A.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!r||typeof r!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let e=r;if(typeof e.kind!="string"||typeof e.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:e.kind,value:e.value}}function O(t){return {messageId:t.id,enqueuedAt:t.enqueuedAt,attempt:t.attempt,request:t.body}}function de(t){return typeof t=="string"?t.startsWith("b64:")?C(t).value:t:t.value}function v(t){return {async enqueueRequest(r){return (await t.enqueue(r)).id},async leaseRequests(r){return (await t.lease(r)).map(e=>({...O(e),leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt}))},ackRequest(r,e){return t.ack(r,e)},nackRequest(r,e,n){return t.nack(r,e,n)},async peekActive(){return (await t.peekActive()).map(O)},async peekDeadLetter(){return (await t.peekDeadLetter()).map(r=>({...O(r),reason:r.reason}))}}}function _(t){let r,e,n,a=t.callbackTransport,u=t.resolveBlob??(async o=>{let d=await t.blobStorage("").read(o.value);if(d==null)throw new Error(`Blob not found for ref ${o.kind}:${o.value}`);return d});async function i(o,d){if(o.howToRun==="queue-storage"){let l=t.boardWorkerStore??r??(t.queueStorage?v(t.queueStorage):void 0);return l?(r||(r=l),await l.enqueueRequest({boardId:typeof o.extra?.boardId=="string"?o.extra.boardId:t.boardId,ref:o,args:d}),{dispatched:true}):{dispatched:false,error:"queue-storage dispatch requires queueStorage or boardWorkerStore"}}if(o.howToRun==="http:post"){let l=t.fetch??globalThis.fetch;if(!l)return {dispatched:false,error:"http:post dispatch requires fetch support"};let g=await l(de(o.whatToRun),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...d,...o.extra?{extra:o.extra}:{}})});if(!g.ok){let s=await g.text().catch(()=>"");return {dispatched:false,error:`HTTP ${g.status}: ${s}`}}return {dispatched:true}}return {dispatched:false,error:`Unsupported hosted async transport "${o.howToRun}"`}}return {kvStorage:t.kvStorage,kvStorageForRef:t.kvStorageForRef,blobStorage:t.blobStorage,scratchStorage:t.scratchStorage,scratchStorageForRef:t.scratchStorageForRef,archiveFactory:t.archiveFactory,archiveFactoryForRef:t.archiveFactoryForRef,journalStorage:t.journalStorage,boardWorkerStore:()=>{if(!r)if(t.boardWorkerStore)r=t.boardWorkerStore;else if(t.queueStorage)r=v(t.queueStorage);else throw new Error("Hosted async board adapter requires queueStorage or boardWorkerStore");return r},chatAgentStore:()=>{if(!e)if(t.chatAgentStore)e=t.chatAgentStore;else if(t.chatAgentQueueStorage)e=v(t.chatAgentQueueStorage);else if(t.boardWorkerStore)e=t.boardWorkerStore;else if(t.queueStorage)e=v(t.queueStorage);else throw new Error("Hosted async board adapter requires chatAgentStore, chatAgentQueueStorage, queueStorage, or boardWorkerStore");return e},processAccumulatedStore:()=>{if(n||(n=t.processAccumulatedStore??t.processAccumulatedQueueStorage??t.queueStorage),!n)throw new Error("Hosted async board adapter requires processAccumulatedStore, processAccumulatedQueueStorage, or queueStorage");return n},lock:t.lock,get callbackTransport(){return a},set callbackTransport(o){a=o;},dispatchExecution:(o,d)=>t.dispatchExecution?.(o,d)??i(o,d),supportsDirectSourceOutput:t.supportsDirectSourceOutput,resolveBlob:u,hashFn:t.hashFn,genId:t.genId,requestProcessAccumulated:t.requestProcessAccumulated,publishBoardChangeNotifications:t.publishBoardChangeNotifications,warn:t.onWarn}}function q(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return `[${t.map(q).join(",")}]`;let r=t;return `{${Object.keys(r).sort().map(n=>`${JSON.stringify(n)}:${q(r[n])}`).join(",")}}`}function T(t,r){let e=r>>>0;for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=Math.imul(e,16777619)>>>0;return e}function Q(t){let r=q(t),e=T(r,2166136261),n=T(r,3735928559),a=T(r,19088743),u=T(r,4277009102);return [e,n,a,u].map(i=>i.toString(16).padStart(8,"0")).join("")}function I(t){function r(u){return `${t}:blob:${u}`}let e=new TextEncoder;function n(u){if(typeof btoa=="function"){let i="";for(let o=0;o<u.length;o++)i+=String.fromCharCode(u[o]);return btoa(i)}return ""}function a(u){if(typeof atob=="function"){let i=atob(u),o=new Uint8Array(i.length);for(let d=0;d<i.length;d++)o[d]=i.charCodeAt(d);return o}return new Uint8Array}return {read(u){return globalThis.localStorage.getItem(r(u))},write(u,i){globalThis.localStorage.setItem(r(u),i);},exists(u){return globalThis.localStorage.getItem(r(u))!==null},remove(u){globalThis.localStorage.removeItem(r(u));},readBytes(u){let i=globalThis.localStorage.getItem(r(u));if(i===null)return null;try{let o=JSON.parse(i);if(o&&o.__kind==="bytes-b64"&&typeof o.data=="string")return a(o.data)}catch{}return e.encode(i)},writeBytes(u,i){let o=JSON.stringify({__kind:"bytes-b64",data:n(i)});globalThis.localStorage.setItem(r(u),o);},listKeys(u){let i=r(u??""),o=[];for(let d=0;d<globalThis.localStorage.length;d++){let l=globalThis.localStorage.key(d);l&&l.startsWith(i)&&o.push(l.slice(r("").length));}return o.sort()},stat(u){let i=globalThis.localStorage.getItem(r(u));if(i===null)return null;let o=e.encode(i).byteLength;try{let d=JSON.parse(i);d&&d.__kind==="bytes-b64"&&typeof d.data=="string"&&(o=a(d.data).byteLength);}catch{}return {key:u,size:o}}}}var Fe=":scratch-marker",qe=":scratch-config",E=":scratch:",Be=1440*60*1e3,Le=720*60*1e3,De=200;function G(t,r){if(!t)return r;let e=t.replace(/[^A-Za-z0-9._-]/g,"_");return e.length>0?e:r}function W(t){let r=`${t}${Fe}`,e=`${t}${qe}`,n=s=>`${t}${E}${s}`,a=s=>`${t}${E}${s}:__ts`,u=globalThis.localStorage.getItem(r)===null;if(u)try{globalThis.localStorage.setItem(r,`scratch-store
2
+ ${new Date().toISOString()}`);}catch{}function i(){let s=globalThis.localStorage.getItem(e);if(s===null)return {};try{let c=JSON.parse(s);return c&&typeof c=="object"&&!Array.isArray(c)?c:{}}catch{return {}}}function o(s){try{globalThis.localStorage.setItem(e,JSON.stringify(s));}catch{}}if(u){let s=i();typeof s["retention.lastSweepAt"]!="number"&&(s["retention.lastSweepAt"]=Date.now(),o(s));}function d(){if(globalThis.localStorage.getItem(r)===null)return;let s=i(),c=typeof s["retention.maxAgeMs"]=="number"?s["retention.maxAgeMs"]:Be,f=typeof s["retention.sweepIntervalMs"]=="number"?s["retention.sweepIntervalMs"]:Le;if(c<=0||f<=0)return;let p=typeof s["retention.lastSweepAt"]=="number"?s["retention.lastSweepAt"]:0,m=Date.now();if(m-p<f)return;s["retention.lastSweepAt"]=m,o(s);let y=m,k=`${t}${E}`,h=[];for(let R=0;R<globalThis.localStorage.length;R++){let w=globalThis.localStorage.key(R);w&&w.startsWith(k)&&!w.endsWith(":__ts")&&h.push(w);}for(let R of h){if(Date.now()-y>De)break;let w=globalThis.localStorage.getItem(`${R}:__ts`),P=w===null?0:Number(w);if(Number.isFinite(P)&&P>0&&m-P>c){try{globalThis.localStorage.removeItem(R);}catch{}try{globalThis.localStorage.removeItem(`${R}:__ts`);}catch{}}}}function l(s,c){let f=G(s,"scratch"),p=G(c,".json"),m=p.startsWith(".")?p:`.${p}`,y=Math.random().toString(36).slice(2,10);return `${f}-${Date.now()}-${y}${m}`}function g(s,c){globalThis.localStorage.setItem(n(s),c),globalThis.localStorage.setItem(a(s),String(Date.now()));}return {read(s){return globalThis.localStorage.getItem(n(s))},write(s,c){g(s,c);try{d();}catch{}},exists(s){return globalThis.localStorage.getItem(n(s))!==null},remove(s){try{globalThis.localStorage.removeItem(n(s));}catch{}try{globalThis.localStorage.removeItem(a(s));}catch{}},readBytes(s){let c=globalThis.localStorage.getItem(n(s));return c===null?null:new TextEncoder().encode(c)},writeBytes(s,c){let f="";for(let p=0;p<c.length;p++)f+=String.fromCharCode(c[p]);g(s,f);try{d();}catch{}},stat(s){let c=globalThis.localStorage.getItem(n(s));if(c===null)return null;let f=globalThis.localStorage.getItem(a(s)),p=f===null?null:Number(f);return {key:s,size:new TextEncoder().encode(c).byteLength,updatedAt:p!==null&&Number.isFinite(p)?new Date(p).toISOString():void 0}},listKeys(s){let c=`${t}${E}`,f=[];for(let p=0;p<globalThis.localStorage.length;p++){let m=globalThis.localStorage.key(p);if(m&&m.startsWith(c)&&!m.endsWith(":__ts")){let y=m.slice(c.length);(!s||y.startsWith(s))&&f.push(y);}}return f.sort()},getUniqueKey(s,c){return l(s,c)},create(s,c,f){let p=l(c,f);g(p,s);try{d();}catch{}return p},keyRef(s){return {kind:"local-storage-scratch",value:s,extra:{prefix:t}}},config:{get(s){return i()[s]??null},set(s,c){let f=i();c==null?delete f[s]:f[s]=c,o(f);}}}}var je=":archive-marker",Ne=":archive-config",F=":archive:stream:",U=":archive:blob:";function H(t){let r=t.replace(/[^A-Za-z0-9._-]/g,"_");if(!r)throw new Error("Archive segment name cannot be empty after sanitization");return r}function z(t){let r=`${t}${je}`,e=`${t}${Ne}`,n=o=>`${t}${F}${o}`;if(globalThis.localStorage.getItem(r)===null)try{globalThis.localStorage.setItem(r,`archive-store
3
+ ${new Date().toISOString()}`);}catch{}function a(){let o=globalThis.localStorage.getItem(e);if(o===null)return {};try{let d=JSON.parse(o);return d&&typeof d=="object"&&!Array.isArray(d)?d:{}}catch{return {}}}function u(o){try{globalThis.localStorage.setItem(e,JSON.stringify(o));}catch{}}function i(){if(globalThis.localStorage.getItem(r)===null)return;let o=a(),d=typeof o["retention.maxAgeMs"]=="number"?o["retention.maxAgeMs"]:0,l=typeof o["retention.sweepIntervalMs"]=="number"?o["retention.sweepIntervalMs"]:0;if(d<=0||l<=0)return;let g=typeof o["retention.lastSweepAt"]=="number"?o["retention.lastSweepAt"]:0,s=Date.now();if(s-g<l)return;o["retention.lastSweepAt"]=s,u(o);let c=`${t}${F}`;for(let f=0;f<globalThis.localStorage.length;f++){let p=globalThis.localStorage.key(f);if(!p||!p.startsWith(c))continue;let m=globalThis.localStorage.getItem(p);if(m)try{let y=JSON.parse(m),k=y.filter(h=>typeof h.__ts!="number"||s-h.__ts<=d);k.length!==y.length&&globalThis.localStorage.setItem(p,JSON.stringify(k));}catch{}}}return {stream(o){let d=H(o),l=n(d);function g(){let c=globalThis.localStorage.getItem(l);if(!c)return [];try{return JSON.parse(c)}catch{return []}}function s(c){try{globalThis.localStorage.setItem(l,JSON.stringify(c));}catch{}}return {append(c){let f={id:globalThis.crypto.randomUUID(),payload:c,__ts:Date.now()},p=g();p.push(f),s(p);try{i();}catch{}return {id:f.id,payload:f.payload}},readAll(){return g().map(c=>({id:c.id,payload:c.payload}))},readAfter(c){let f=g();if(!c){let k=f.map(h=>({id:h.id,payload:h.payload}));return {entries:k,newCursor:k.length>0?k[k.length-1].id:null}}let p=f.findIndex(k=>k.id===c),y=(p===-1?f:f.slice(p+1)).map(k=>({id:k.id,payload:k.payload}));return {entries:y,newCursor:y.length>0?y[y.length-1].id:c}},clear(){try{globalThis.localStorage.removeItem(l);}catch{}}}},blob(o){let d=H(o),l=I(`${t}${U}${d}`);return {read:g=>l.read(g),write:(g,s)=>{l.write(g,s);try{i();}catch{}},exists:g=>l.exists(g),remove:g=>l.remove(g),readBytes:l.readBytes?g=>l.readBytes(g):void 0,writeBytes:l.writeBytes?(g,s)=>{l.writeBytes(g,s);try{i();}catch{}}:void 0,listKeys:g=>l.listKeys(g),stat:l.stat?g=>l.stat(g):void 0}},listStreams(o){let d=`${t}${F}`,l=[];for(let g=0;g<globalThis.localStorage.length;g++){let s=globalThis.localStorage.key(g);if(!s||!s.startsWith(d))continue;let c=s.slice(d.length);(!o||c.startsWith(o))&&l.push(c);}return l.sort()},listBlobs(o){let d=`${t}${U}`,l=new Set;for(let g=0;g<globalThis.localStorage.length;g++){let s=globalThis.localStorage.key(g);if(!s||!s.startsWith(d))continue;let c=s.slice(d.length),f=c.indexOf(":"),p=f===-1?c:c.slice(0,f);(!o||p.startsWith(o))&&l.add(p);}return Array.from(l).sort()},config:{get(o){return a()[o]??null},set(o,d){let l=a();d==null?delete l[o]:l[o]=d,u(l);}}}}function Y(t){function r(e){return `${t}:kv:${e}`}return {read(e){let n=globalThis.localStorage.getItem(r(e));if(n===null)return null;try{return JSON.parse(n)}catch{return null}},write(e,n){globalThis.localStorage.setItem(r(e),JSON.stringify(n));},delete(e){globalThis.localStorage.removeItem(r(e));},listKeys(e){let n=r(e??""),a=[];for(let u=0;u<globalThis.localStorage.length;u++){let i=globalThis.localStorage.key(u);i!==null&&i.startsWith(n)&&a.push(i.slice(r("").length));}return a}}}function X(t){function r(){let n=globalThis.localStorage.getItem(t);if(!n)return [];try{return JSON.parse(n)}catch{return []}}function e(n){globalThis.localStorage.setItem(t,JSON.stringify(n));}return {readAllEntries(){return r()},appendEntry(n){let a=r();a.push(n),e(a);},generateId(){return globalThis.crypto.randomUUID()}}}function Ke(){let t=false;return {async tryAcquire(){return t?null:(t=true,()=>{t=false;})}}}function B(){let t=new Map,r=new Map;return {async enqueue(e){let n={id:globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`,body:e,enqueuedAt:new Date().toISOString(),attempt:0};return t.set(n.id,n),n},async enqueueIfAbsent(e,n){for(let u of t.values())if(u.dedupKey===n)return null;let a={id:globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`,body:e,enqueuedAt:new Date().toISOString(),attempt:0,dedupKey:n};return t.set(a.id,a),a},async lease(e){let n=Math.max(1,Math.floor(e?.max??1)),a=Math.max(1,Math.floor(e?.visibilityMs??6e4)),u=Date.now();for(let o of t.values())o.leaseExpiresAt&&Date.parse(o.leaseExpiresAt)<=u&&(delete o.leaseToken,delete o.leaseExpiresAt);let i=[];for(let o of t.values()){if(i.length>=n)break;o.leaseToken||(o.attempt+=1,o.leaseToken=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`,o.leaseExpiresAt=new Date(Date.now()+a).toISOString(),i.push({id:o.id,body:o.body,enqueuedAt:o.enqueuedAt,attempt:o.attempt,leaseToken:o.leaseToken,leaseExpiresAt:o.leaseExpiresAt}));}return i},async ack(e,n){let a=t.get(e);return !a||a.leaseToken!==n?false:(t.delete(e),true)},async nack(e,n,a){let u=t.get(e);return !u||u.leaseToken!==n?false:(delete u.leaseToken,delete u.leaseExpiresAt,a?.dead&&(t.delete(e),r.set(e,{...u,reason:a.reason})),true)},async peekActive(e=""){return Array.from(t.values()).filter(n=>!n.leaseToken).filter(n=>!e||n.id.startsWith(e)).map(n=>({id:n.id,body:n.body,enqueuedAt:n.enqueuedAt,attempt:n.attempt}))},async peekDeadLetter(e=""){return Array.from(r.values()).filter(n=>!e||n.id.startsWith(e)).map(n=>({id:n.id,body:n.body,enqueuedAt:n.enqueuedAt,attempt:n.attempt,reason:n.reason}))}}}function Z(t){let r=Y(t);return {async read(e){return r.read(e)},async write(e,n){r.write(e,n);},async delete(e){r.delete(e);},async listKeys(e){return r.listKeys(e)}}}function $e(t){let r=I(t);return {async read(e){return r.read(e)},async write(e,n){r.write(e,n);},async exists(e){return r.exists(e)},async remove(e){r.remove(e);},async readBytes(e){return r.readBytes?.(e)??null},async writeBytes(e,n){await r.writeBytes?.(e,n);},async listKeys(e){return r.listKeys(e)},async stat(e){return r.stat?.(e)??null}}}function ee(t){let r=W(t);return {async read(e){return r.read(e)},async write(e,n){r.write(e,n);},async exists(e){return r.exists(e)},async remove(e){r.remove(e);},async readBytes(e){return r.readBytes?.(e)??null},async writeBytes(e,n){await r.writeBytes?.(e,n);},async listKeys(e){return r.listKeys(e)},async stat(e){return r.stat?.(e)??null},async getUniqueKey(e,n){return r.getUniqueKey(e,n)},async create(e,n,a){return r.create(e,n,a)},keyRef(e){return r.keyRef(e)},config:{async get(e){return r.config.get(e)},async set(e,n){r.config.set(e,n);}}}}function Ve(t){let r=X(t);function e(n){return {id:n.id,payload:n.event}}return {async append(n){let a={id:r.generateId(),event:n};return r.appendEntry(a),e(a)},async readAll(){return r.readAllEntries().map(e)},async readAfter(n){let a=r.readAllEntries().map(e);if(!n)return {entries:a,newCursor:a.length>0?a[a.length-1].id:null};let u=a.findIndex(o=>o.id===n),i=u===-1?a:a.slice(u+1);return {entries:i,newCursor:i.length>0?i[i.length-1].id:n}}}}function te(t){let r=z(t);return {stream(e){let n=r.stream(e);return {async append(a){return n.append(a)},async readAll(){return n.readAll()},async readAfter(a){return n.readAfter(a)},async clear(){n.clear?.();}}},blob(e){let n=r.blob(e);return {async read(a){return n.read(a)},async write(a,u){n.write(a,u);},async exists(a){return n.exists(a)},async remove(a){n.remove(a);},async readBytes(a){return n.readBytes?.(a)??null},async writeBytes(a,u){await n.writeBytes?.(a,u);},async listKeys(a){return n.listKeys(a)},async stat(a){return n.stat?.(a)??null}}},async listStreams(e){return r.listStreams(e)},async listBlobs(e){return r.listBlobs(e)},config:{async get(e){return r.config.get(e)},async set(e,n){r.config.set(e,n);}}}}function re(t){return String(t||"").trim()}function ne(t){return {kind:"local-storage",value:re(t)}}function b(t){return S(ne(t))}function oe(t){let r=`boards:${t}`;return {baseRef:ne(r),cardStoreRef:b(`${r}:cards`),outputsStoreRef:b(`${r}:runtime-out`),scratchStoreRef:b(`${r}:scratch`),archiveStoreRef:b(`${r}:archive`),chatStoreRef:b(`${r}:chat`),artifactsStoreRef:b(`${r}:files`)}}function L(t,r){try{let e=C(t);if(e?.kind==="local-storage"&&e.value)return re(e.value)}catch{}return r}function Me(t,r={}){let e=oe(t),n=B(),a=B(),u=B();return _({boardId:t,kvStorage(i){return Z(`${e.baseRef.value}:${i||"root"}`)},kvStorageForRef(i){return Z(L(i,`${e.baseRef.value}:root`))},blobStorage(i){return $e(i?`${e.baseRef.value}:${i}`:e.baseRef.value)},scratchStorage(){return ee(`${e.baseRef.value}:scratch`)},scratchStorageForRef(i){return ee(L(i,`${e.baseRef.value}:scratch`))},archiveFactory(){return te(`${e.baseRef.value}:archive`)},archiveFactoryForRef(i){return te(L(i,`${e.baseRef.value}:archive`))},journalStorage(){return Ve(`${e.baseRef.value}:journal`)},queueStorage:n,chatAgentQueueStorage:a,processAccumulatedQueueStorage:u,lock:Ke(),resolveBlob:async i=>{let o=i?.kind==="local-storage"?i:null;if(!o?.value)throw new Error(`Unsupported localStorage ref: ${S(i)}`);let d=I(o.value),l=await Promise.resolve(d.read(""));if(l===null)throw new Error(`Blob not found: ${S(i)}`);try{let g=JSON.parse(l);if(g?.__kind==="bytes-b64"&&typeof g.data=="string"){let s=await Promise.resolve(d.readBytes?.(""));if(s)return new TextDecoder().decode(s)}}catch{}return l},hashFn:Q,genId:()=>(globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`).replace(/-/g,""),requestProcessAccumulated:r.requestProcessAccumulated,publishBoardChangeNotifications:r.publishBoardChangeNotifications,onWarn:i=>console.warn(`[localstorage-board-adapter:${t}] ${i}`)})}function On(t,r={}){return {refs:{...oe(t),...r.refs??{}},boardAdapter:Me(t,r)}}exports.createLocalStorageBoardAdapter=Me;exports.createLocalStorageBoardRefs=oe;exports.createLocalStorageBoardRuntimeBundle=On;exports.makeLocalStorageRef=ne;exports.serializeLocalStorageRef=b;return exports;})({});//# sourceMappingURL=localstorage-storage.js.map
4
+ //# sourceMappingURL=localstorage-storage.js.map
@@ -1,10 +1,26 @@
1
1
  {
2
- "generatedAt": "2026-06-01T16:07:01.910Z",
2
+ "generatedAt": "2026-06-02T17:05:13.645Z",
3
3
  "algorithm": "sha256",
4
4
  "files": {
5
- "browser/board-livecards-localstorage.js": {
6
- "sha256": "sha256-zz+4/87Be26ZK7Zt1BhnfdM7fOOdEdBualRUgpqvqY0=",
7
- "bytes": 188564
5
+ "browser/board-livecards-client.js": {
6
+ "sha256": "sha256-OzqYS0wVXEYOZydAwyqGY+YJr6cMlsAn6EPO1bUGthc=",
7
+ "bytes": 19408
8
+ },
9
+ "browser/server-runtime-controlface.js": {
10
+ "sha256": "sha256-/ltOD5JTaj7AEPMQWkFgMTU7WukWhKJl0NcUYXmiFtM=",
11
+ "bytes": 171365
12
+ },
13
+ "browser/adapters/firestore-storage.js": {
14
+ "sha256": "sha256-KaqOw1Mu8kjd3MeWg7mViNL65hF5cFYa6DQ4e7J8IgU=",
15
+ "bytes": 14638
16
+ },
17
+ "browser/adapters/localstorage-storage.js": {
18
+ "sha256": "sha256-iUFAlxT8V8bT7Jxo+NZ11PDJwT4WKXcyuUeMXayzipo=",
19
+ "bytes": 19820
20
+ },
21
+ "browser/adapters/firebase-storage.js": {
22
+ "sha256": "sha256-Y5mw3knoasYOFGPVjI3dyHRz17hCvajnfb8UCUFpeI8=",
23
+ "bytes": 3639
8
24
  },
9
25
  "browser/live-cards.schema.json": {
10
26
  "sha256": "sha256-F5nfqDzZ5L3p0lLTMxGt4YtMa2sVzdNPh8sbQ8OiXHE=",
@@ -0,0 +1,8 @@
1
+ var ServerRuntimeControlface=(function(exports){'use strict';var Xn=Object.defineProperty;var Zn=(e,t,r)=>t in e?Xn(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var Br=(e,t,r)=>Zn(e,t+"",r);var _t="b64:";function eo(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function to(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ve(e){return `${_t}${eo(JSON.stringify(e))}`}function Xe(e){if(!e.startsWith(_t))throw new Error(`Invalid ref format (expected ${_t}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(to(e.slice(_t.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 Fr(e,t,r){let n=e.tryAcquire();if(!n)return false;try{await t();}finally{n();}return r?.(),true}function Ze(e){return typeof e.journalStorage=="function"}function jr(e){return typeof e.whatToRun=="string"?e.whatToRun.startsWith("b64:")?Xe(e.whatToRun).value:e.whatToRun:e.whatToRun.value}function Ve(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Et(e){let t=e.reduce((o,s)=>o+s.length,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.length;return r}async function ht(e,t,r){let n=r[e];if(!n)throw Object.assign(new Error(`Unknown MCP tool: ${e}`),{statusCode:400});let o=await n(t);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o,a=s.status;if(a==="success")return Object.prototype.hasOwnProperty.call(s,"data")?o:{status:"success",data:{}};if(a==="fail"||a==="error")return o}return {status:"success",data:o}}function rt(e,t){if(!e||typeof e!="object"||Array.isArray(e))return t;let r=e;if(typeof r.error=="string"&&r.error.trim())return r.error;if(r.step==="validate"){let n=r.validation;if(n&&typeof n=="object"&&!Array.isArray(n)){let s=n.data;if(s&&typeof s=="object"&&!Array.isArray(s)){let a=s.issues;if(Array.isArray(a)){let u=a.find(b=>typeof b=="string"&&b.trim());if(typeof u=="string")return `Validation failed: ${u}`}let i=s.errors;if(Array.isArray(i)&&i.length>0)return "Validation failed"}}return "Validation failed"}return t}function pr(e){let{apiBasePath:t,json:r,readJsonBody:n,readRawBody:o,initBoardAndSetup:s,bootstrapBoard:a,buildPublishedRuntimePayload:i,createMcpControlplaneToolRegistry:u,readCardFromStore:b,patchCard:v,retriggerCard:l,applyCardAction:g,resolveChatHandlerTarget:A,createMcpFacade:S,chatStorePublic:C,uploadCardFile:f,sendCardFileDownloadResponse:y}=e;async function B(R,I,m){let p=R.method||"GET",k=m,w=k.pathname;try{if(p==="GET"&&w===`${t}/init-board`)return await s(),r(I,200,await i()),!0;if(p==="GET"&&w===`${t}/board-status`)return r(I,200,await i()),!0;if(p==="POST"&&w===`${t}/mcp-controlplane`){await a();let L=await n(R),j=typeof L.tool=="string"?L.tool.trim():"",H=L.args&&typeof L.args=="object"&&!Array.isArray(L.args)?L.args:{};if(!j)return r(I,400,{error:"tool is required"}),!0;try{let D=await ht(j,H,u());if(D&&typeof D=="object"&&!Array.isArray(D)){let $=D;if($.status==="fail")return r(I,400,{error:rt(D,"Request failed")}),!0;if($.status==="error")return r(I,500,{error:rt(D,"Internal error")}),!0}r(I,200,D);}catch(D){let $=typeof D?.statusCode=="number"?Number(D.statusCode):500,G=D instanceof Error?D.message:String(D);r(I,$,{error:G});}return !0}let q=w.match(new RegExp(`^${Ve(t)}/cards/([^/]+)$`));if(p==="GET"&&q){await a();let L=decodeURIComponent(q[1]),j=await b(L);return j?(r(I,200,j),!0):(r(I,404,{error:`card not found: ${L}`}),!0)}if(p==="PATCH"&&q){await a();let L=decodeURIComponent(q[1]),j=await n(R);return await v(L,j),r(I,200,{ok:!0}),!0}let T=w.match(new RegExp(`^${Ve(t)}/cards/([^/]+)/retrigger$`));if(p==="POST"&&T){await a();let L=decodeURIComponent(T[1]);return await l(L),r(I,200,{ok:!0}),!0}let h=w.match(new RegExp(`^${Ve(t)}/cards/([^/]+)/actions$`));if(p==="POST"&&h){await a();let L=decodeURIComponent(h[1]),j=Date.now(),H=new Date(j).toISOString(),D=await n(R),$=D?.actionType;if($==="chat-send"&&!await A(L)){let ee=Date.now();return r(I,409,{error:`chat handler is not configured for card: ${L}`,requestReceivedAt:H,requestReceivedAtMs:j,responseSentAt:new Date(ee).toISOString(),responseSentAtMs:ee,responseStatus:409}),!0}if($==="chat-send"){let ee=D?.payload??{},ce=typeof ee["turn-id"]=="string"?ee["turn-id"]:typeof ee.turnId=="string"?ee.turnId:typeof ee.turn=="string"?ee.turn:"";if(!ce||!String(ce).trim()){let P=Date.now();return r(I,400,{error:`chat-send requires a non-empty 'turn-id' (or 'turnId'/'turn') in payload for card: ${L}`,requestReceivedAt:H,requestReceivedAtMs:j,responseSentAt:new Date(P).toISOString(),responseSentAtMs:P,responseStatus:400}),!0}}await g(L,$,D?.payload);let G=Date.now();return r(I,200,{ok:!0,requestReceivedAt:H,requestReceivedAtMs:j,responseSentAt:new Date(G).toISOString(),responseSentAtMs:G,responseStatus:200}),!0}let U=w.match(new RegExp(`^${Ve(t)}/cards/([^/]+)/chats$`));if(p==="GET"&&U){await a();let L=decodeURIComponent(U[1]),j=String(k.searchParams.get("turn-id")||""),H=String(k.searchParams.get("all-turns")||"").toLowerCase()==="true",D=String(k.searchParams.get("tail-turns-before-id")||""),$=k.searchParams.get("tail-turns"),G=$==null||$===""?H||j?void 0:1:Number.parseInt($,10),ee=C.readAll({params:{cardId:L},body:{...G===void 0?{}:{tailTurns:G},...j?{turnId:j}:{},...H?{allTurns:!0}:{},...D?{tailTurnsBeforeId:D}:{}}});if(ee.status!=="success")return r(I,400,{error:ee.error||"Failed to read chats"}),!0;let ce=ee.data.records;return r(I,200,{ok:!0,messages:ce}),!0}if(p==="POST"&&U){await a();let L=decodeURIComponent(U[1]),j=await n(R),H=typeof j?.role=="string"?j.role:"assistant",D=typeof j?.text=="string"?j.text:"",$=Array.isArray(j?.files)?j.files:[],G=typeof j?.turn=="string"?j.turn:typeof j?.["turn-id"]=="string"?j["turn-id"]:typeof j?.turnId=="string"?j.turnId:"",ee=j?.done===!0,ce=S(),_=(await ce.manageAddChatEntryAndAnyAttachments({cardId:L,role:H,text:D,files:$,turn:G})).data.id;return ee&&ce.setChatProcessing({cardId:L,active:!1}),r(I,200,{ok:!0,id:_}),!0}let M=w.match(new RegExp(`^${Ve(t)}/cards/([^/]+)/files$`));if(p==="POST"&&M){await a();let L=decodeURIComponent(M[1]),j=String(k.searchParams.get("inChat")||"").toLowerCase()==="true",H=String(k.searchParams.get("turn-id")||"").trim();if(j&&!H)return r(I,400,{error:`file upload with inChat=true requires a non-empty 'turn-id' query parameter for card: ${L}`}),!0;let D=R.headers["x-file-name"],$=String(R.headers["content-type"]||"application/octet-stream"),G=Array.isArray(D)?D[0]:D,ee=G?decodeURIComponent(String(G)):"upload.bin",ce=await o(R);return r(I,200,await f(L,ee,$,ce,{inChat:j,turnId:H})),!0}let X=w.match(new RegExp(`^${Ve(t)}/cards/([^/]+)/files/(\\d+)$`));if(p==="GET"&&X){let L=decodeURIComponent(X[1]),j=parseInt(X[2],10),H=k.searchParams.get("sn");return await y(I,L,j,H),!0}return !1}catch(q){let T=q?.statusCode||500;return r(I,T,{error:String(q?.message||q)}),true}}return {handleRuntimeApi:B}}function Ot(e,t){if(!e||typeof e!="object")throw new Error(`${t}: adapter.callbackTransport is required`);if(typeof e.createCallback!="function")throw new Error(`${t}: adapter.callbackTransport.createCallback is required`)}var it={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function We(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function dt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function qr(e){return e.tasks??{}}function mr(e){return e?e.status===it.FAILED||e.status===it.INACTIVATED:false}function Lr(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Mr(e){return e.maxExecutions}function Dr(e,t){let r=new Set;for(let[n,o]of Object.entries(t))if(o.status===it.COMPLETED){let s=e.tasks[n];s&&We(s).forEach(i=>r.add(i));}return Array.from(r)}function Nr(e,t){let r={};return e.forEach(n=>{let o=t[n];if(!o)return;We(o).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function $r(e,t,r){let n=e.tasks[t]??Bt(),o={};if(r){let a=r.tasks[t],i=dt(a);for(let u of i)for(let[b,v]of Object.entries(r.tasks))if(We(v).includes(u)){let l=e.tasks[b];l?.lastDataHash&&(o[u]=l.lastDataHash);break}}let s={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Ur(e,t,r,n,o,s){let a=e.tasks[r]??Bt(),i=t.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let u;n&&i.on&&i.on[n]?u=i.on[n]:u=We(i);let b=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let g=i.requires??[];for(let A of g)for(let[S,C]of Object.entries(t.tasks))if(We(C).includes(A)){let f=e.tasks[S];f?.lastDataHash&&(b[A]=f.lastDataHash);break}}let v={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:b,error:void 0},l=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:v},availableOutputs:l,lastUpdated:new Date().toISOString()}}function Vr(e,t,r,n){let o=e.tasks[r]??Bt(),s=t.tasks[r];if(s?.retry){let u=o.retryCount+1;if(u<=s.retry.max_attempts){let b={...o,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:b},lastUpdated:new Date().toISOString()}}}let a={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:o.executionCount+1},i=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(i=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&a.executionCount>=s.circuit_breaker.max_executions){let u=s.circuit_breaker.on_break;i=[...new Set([...i,...u])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:i,lastUpdated:new Date().toISOString()}}function Kr(e,t,r,n){let o=e.tasks[t]??Bt(),s={...o,progress:typeof n=="number"?n:o.progress,messages:[...o.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function Hr(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 Bt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function kt(e,t){let r=`live-${Date.now()}`,n={};for(let s of Object.keys(e.tasks))n[s]=Jr();let o={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:o}}function ro(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:$r(n,t.taskName,r)};case "task-completed":return {config:r,state:Ur(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:Vr(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:Kr(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:Hr(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:uo(n,t.action)};case "task-upsert":return no(e,t.taskName,t.taskConfig);case "task-removal":return oo(e,t.taskName);case "node-requires-add":return so(e,t.nodeName,t.tokens);case "node-requires-remove":return ao(e,t.nodeName,t.tokens);case "node-provides-add":return io(e,t.nodeName,t.tokens);case "node-provides-remove":return co(e,t.nodeName,t.tokens);default:return e}}function Gr(e,t){return t.reduce((r,n)=>ro(r,n),e)}function no(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]:Jr()},lastUpdated:new Date().toISOString()}}}function oo(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:o,...s}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function so(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=dt(n),s=r.filter(a=>!o.includes(a));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...o,...s]}}},state:e.state}}function ao(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=dt(n),s=o.filter(a=>!r.includes(a));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:s}}},state:e.state}}function io(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=We(n),s=r.filter(a=>!o.includes(a));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...o,...s]}}},state:e.state}}function co(e,t,r){let n=e.config.tasks[t];if(!n)return e;let o=We(n),s=o.filter(a=>!r.includes(a));return s.length===o.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:s}}},state:e.state}}function ct(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function ut(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 Jr(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function uo(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 St(e){let{config:t,state:r}=e,n=qr(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=lo(n),a=Dr(t,r.tasks),i=new Set([...a,...r.availableOutputs]),u=[],b=[],v=[],l=[];for(let[A,S]of Object.entries(n)){let C=r.tasks[A],f=Lr(S,t.settings),y=f!=="once";if(C?.status===it.RUNNING||mr(C))continue;let B=Mr(S);if(B!==void 0&&C&&C.executionCount>=B||S.circuit_breaker&&C&&C.executionCount>=S.circuit_breaker.max_executions||!y&&C?.status===it.COMPLETED)continue;if(y&&C?.status===it.COMPLETED){let k=dt(S),w=false;switch(f){case "data-changed":{k.length>0&&k.some(T=>{for(let[h,U]of Object.entries(n))if(We(U).includes(T)){let M=r.tasks[h];if(!M)continue;let X=C.lastConsumedHashes?.[T];return M.lastDataHash==null?M.executionCount>C.lastEpoch:M.lastDataHash!==X}return false})||(w=true);break}case "epoch-changed":{k.length>0&&k.some(T=>{for(let[h,U]of Object.entries(n))if(We(U).includes(T)){let M=r.tasks[h];if(M&&M.executionCount>C.lastEpoch)return true}return false})||(w=true);break}case "time-based":{let q=S.refreshInterval??0;if(q<=0){w=true;break}let T=C.completedAt;if(!T){w=true;break}(Date.now()-Date.parse(T))/1e3<q&&(w=true);break}case "manual":w=true;break}if(w)continue}let R=dt(S);if(R.length===0){u.push(A);continue}let I=[],m=[],p=[];for(let k of R){if(i.has(k))continue;let w=s[k]||[];w.length===0?I.push(k):w.every(T=>mr(r.tasks[T]))?p.push({token:k,failedProducer:w[0]}):m.push(k);}I.length>0?v.push({taskName:A,missingTokens:I}):p.length>0?l.push({taskName:A,failedTokens:p.map(k=>k.token),failedProducers:[...new Set(p.map(k=>k.failedProducer))]}):m.length>0?b.push({taskName:A,waitingOn:m}):u.push(A);}let g={};if(u.length>1){let A=Nr(u,n);for(let[S,C]of Object.entries(A))C.length>1&&(g[S]=C);}return {eligible:u,pending:b,unresolved:v,blocked:l,conflicts:g}}function lo(e){let t={};for(let[r,n]of Object.entries(e)){for(let o of We(n))t[o]||(t[o]=[]),t[o].push(r);if(n.on)for(let o of Object.values(n.on))for(let s of o)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(n.on_failure)for(let o of n.on_failure)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);}return t}var bt=class{constructor(){Br(this,"buffer",[]);}append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function gr(e){let t=yr(e);return fo(t)}function yr(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(yr).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+yr(t[n])).join(",")+"}"}function fo(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let o=0;o<e.length;o++)t^=BigInt(e.charCodeAt(o)),t=t*r&n;return t.toString(16).padStart(16,"0")}function po(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 mo(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Wr(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return po(t)}function go(e){try{let t=JSON.parse(mo(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Ft(e,t,r){let{handlers:n,onNodeRemoved:o,onDrain:s}=t,a=new bt,i="state"in e&&"config"in e?e:kt(e),u=false,b=new Set,v=new Map(Object.entries(n)),l=new bt,g=false,A=false;function S(){if(!u){if(g){A=true;return}g=true;try{do A=!1,C();while(A)}finally{g=false;}}}function C(){let R=l.drain(),I=a.drain(),m=[...R,...I];if(m.length>0&&(i=Gr(i,m),o)){for(let k of m)if(k.type==="task-removal")try{o(k.taskName);}catch(w){console.warn("[reactive] onNodeRemoved failed:",w instanceof Error?w.message:String(w));}}let p=St(i);m.length>0&&s?.(m,i,p);for(let k of p.eligible)B(k);for(let k of m)if(k.type==="task-progress"){let{taskName:w,update:q}=k;if(!i.config.tasks[w])continue;let h=i.state.tasks[w];if(!h||h.status!=="running")continue;let U=Wr(w),M=y(w,U,q).catch(X=>{u||(l.append({type:"task-failed",taskName:w,error:X.message??String(X),timestamp:new Date().toISOString()}),S());}).finally(()=>{b.delete(M);});b.add(M);}}function f(R){let m=i.config.tasks[R].requires??[],p=new Map;for(let[w,q]of Object.entries(i.config.tasks))for(let T of q.provides??[])p.set(T,w);let k={};for(let w of m){let q=p.get(w);q?k[w]=i.state.tasks[q]?.data:k[w]=void 0;}return k}async function y(R,I,m){let p=i.config.tasks[R],k=p.taskHandlers??[],w=f(R);for(let q of k){let T=v.get(q);if(!T)throw new Error(`Handler '${q}' not found in registry (task '${R}')`);let h={nodeId:R,state:w,taskState:i.state.tasks[R],config:p,callbackToken:I,update:m};if(await T(h)==="task-initiate-failure")throw new Error(`Handler '${q}' returned task-initiate-failure (task '${R}')`)}}function B(R){let m=i.config.tasks[R]?.taskHandlers;if(!m||m.length===0)return;l.append({type:"task-started",taskName:R,timestamp:new Date().toISOString()}),S();let p=Wr(R),k=y(R,p).catch(w=>{u||(l.append({type:"task-failed",taskName:R,error:w.message??String(w),timestamp:new Date().toISOString()}),S());}).finally(()=>{b.delete(k);});b.add(k);}return {push(R){u||(R.type==="task-completed"&&R.data&&!R.dataHash&&(R={...R,dataHash:gr(R.data)}),a.append(R),S());},pushAll(R){if(!u){for(let I of R)I.type==="task-completed"&&I.data&&!I.dataHash?a.append({...I,dataHash:gr(I.data)}):a.append(I);S();}},resolveCallback(R,I,m){if(u)return;let p=go(R);if(!p)return;let{taskName:k}=p;if(i.config.tasks[k]){if(m&&m.length>0)a.append({type:"task-failed",taskName:k,error:m.join("; "),timestamp:new Date().toISOString()});else {let w=I&&Object.keys(I).length>0?gr(I):void 0;a.append({type:"task-completed",taskName:k,data:I,dataHash:w,timestamp:new Date().toISOString()});}S();}},addNode(R,I){u||(a.append({type:"task-upsert",taskName:R,taskConfig:I,timestamp:new Date().toISOString()}),S());},removeNode(R){u||(a.append({type:"task-removal",taskName:R,timestamp:new Date().toISOString()}),S());},addRequires(R,I){u||(a.append({type:"node-requires-add",nodeName:R,tokens:I,timestamp:new Date().toISOString()}),S());},removeRequires(R,I){u||(a.append({type:"node-requires-remove",nodeName:R,tokens:I,timestamp:new Date().toISOString()}),S());},addProvides(R,I){u||(a.append({type:"node-provides-add",nodeName:R,tokens:I,timestamp:new Date().toISOString()}),S());},removeProvides(R,I){u||(a.append({type:"node-provides-remove",nodeName:R,tokens:I,timestamp:new Date().toISOString()}),S());},registerHandler(R,I){v.set(R,I);},unregisterHandler(R){v.delete(R);},retrigger(R){u||i.config.tasks[R]&&(a.append({type:"task-restart",taskName:R,timestamp:new Date().toISOString()}),S());},retriggerAll(R){if(!u){for(let I of R)i.config.tasks[I]&&a.append({type:"task-restart",taskName:I,timestamp:new Date().toISOString()});S();}},snapshot(){return ct(i)},getState(){return i},getSchedule(){return St(i)},async waitForHandlers(){b.size>0&&await Promise.allSettled([...b]);},async dispose(R){R?.wait&&b.size>0&&await Promise.allSettled([...b]),u=true;}}}function jt(){return function(e){if(e==="./jsonata-sync.cjs")return typeof globalThis<"u"&&globalThis.__jsonataSync||typeof globalThis<"u"&&globalThis.jsonataSync;throw new Error("Unsupported require in browser bundle: "+e)}}var yo=jt();yo("./jsonata-sync.cjs");var ho=jt(),qt=ho("./jsonata-sync.cjs"),Yr=qt;function Qr(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function Xr(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function ko(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await qt(o.expr).evaluate(n);Xr(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function Co(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let a=Yr(s.expr).evaluate(n);Xr(e.computed_values,s.bindTo,a),n.computed_values=e.computed_values;}catch(a){let i=a instanceof Error?a.message:String(a);o.push({bindTo:s.bindTo,error:i});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function Ro(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return qt(e).evaluate(n)}function wo(e,t){return t.startsWith("fetched_sources.")?Qr(e._sourcesData??{},t.slice(16)):Qr(e,t)}var zr=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),So=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function bo(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))So.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,a)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${a}]: must be an object`);else {let i=s;typeof i.bindTo!="string"||!i.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(o.has(i.outputFile)&&t.push(`source_defs[${a}]: outputFile "${i.outputFile}" is not unique across source_defs`),o.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.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((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):zr.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...zr].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function vo(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{o[s]=await qt(a).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function Ao(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{o[s]=Yr(a).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var Ke={run:ko,runSync:Co,eval:Ro,resolve:wo,validate:bo,enrichSources:vo,enrichSourcesSync:Ao};function Lt(e){return JSON.stringify(e)}function Mt(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 Dt(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function hr(e,t){return Dt(e)?e.then(t):t(e)}function en(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function kr(e,t){return {readValues(n){let o=e(n);return hr(o.listKeys(),s=>{let a=[...s].sort();if(a.length===0)return {version:null,values:{}};let i={},u=null;for(let b of a){let v=o.read(b);Dt(v)?u=(u??Promise.resolve()).then(async()=>{i[b]=await v;}):i[b]=v;}return u?u.then(()=>({version:t(i),values:i})):{version:t(i),values:i}})},writeValues(n,o,s){let a=e(n),i=null;for(let u of s){let b=a.delete(u);Dt(b)&&(i=(i??Promise.resolve()).then(()=>b).then(()=>{}));}for(let[u,b]of Object.entries(o)){let v=a.write(u,b);Dt(v)&&(i=(i??Promise.resolve()).then(()=>v).then(()=>{}));}return i?i.then(()=>t(o)):t(o)}}}function Nt(e,t){return {readSnapshot(r){return e.readValues(r)},commitSnapshot(r,n){if(n.schemaVersion!==t)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);return hr(e.readValues(r),o=>{if(o.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:o.version};let s=en(o.values,n);return hr(e.writeValues(r,s,n.deleteKeys),a=>({ok:true,newVersion:a}))})}}}function Zr(e,t){if(!t)return e;let r=e.findIndex(n=>n.id===t);return r===-1?e:e.slice(r+1)}function tn(e){return {readEntriesAfterCursor(t){let r=Zr(e.readAllEntries(),t);return r.length===0?{events:[],newCursor:t}:{events:r.map(n=>n.event),newCursor:r[r.length-1].id}},pendingCount(t){return Zr(e.readAllEntries(),t).length},appendEvent(t){e.appendEntry({id:e.generateId(),event:t});}}}function rn(e){return {appendEvent(t){return e.append(t).then(()=>{})},async readEntriesAfterCursor(t){let r=await e.readAfter(t||null);return {events:r.entries.map(n=>n.payload),newCursor:r.newCursor??t}}}}function $t(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function De(e,t){return $t(e)?e.then(t):t(e)}function Cr(e,t){let r=null;for(let n of e){if(r){r=r.then(()=>t(n)).then(()=>{});continue}let o=t(n);$t(o)&&(r=Promise.resolve(o).then(()=>{}));}return r??void 0}function xo(e){if(e==null)return null;let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return t}}function Io(e,t){let r=e.match(t);return r?r[1]:null}function nn(e,t,r){let n={},o=Cr(e,s=>{let a=r(s);if(a)return De(t(s),i=>{n[a]=i;})});return $t(o)?o.then(()=>n):n}function Ut(e,t){let r=n=>De(e.read(n),o=>o??(e.keyRef?De(e.keyRef(n),s=>s?De(t(s),a=>a??null):null):null));return {readSourceData(n,o){return De(e.read(`${n}/${o}`),xo)},ingestSourceDataStaged(n,o,s,a){return De(t(s),i=>e.write(`${n}/.staged/${a}/${o}`,i))},commitSourceData(n,o,s){let a=`${n}/.staged/${s}/${o}`;return De(r(a),i=>i==null?false:De(e.write(`${n}/${o}`,i),()=>De(e.remove(a),()=>true)))},hasSource(n,o){return e.exists(`${n}/${o}`)},listSources(n){return De(e.listKeys(`${n}/`),o=>o.filter(s=>!s.includes("/.staged/")).map(s=>s.slice(`${n}/`.length)))}}}function Vt(e,t){let r=(n,o)=>{try{let s=o(n);return $t(s)?s.catch(a=>t(n,a instanceof Error?a.message:String(a))):void 0}catch(s){try{return t(n,s instanceof Error?s.message:String(s))}catch{return}}};return {appendEntries(n,o){if(!(!n||o.length===0))return De(e.read(n),s=>e.write(n,[...s??[],...o]))},dispatchEntriesForJournalId(n,o){if(n)return De(e.read(n),s=>{let a=s;if(!(!a||a.length===0))return De(Cr(a,i=>r(i,o)),()=>e.delete(n))})}}}function Kt(e,t,r){return {readRuntime(n){return De(e.read(t(n)),o=>o??r())},writeRuntime(n,o){return e.write(t(n),o)}}}function Ht(e){return {writeComputedValues(t,r){return e.write(`cards/${t}/computed_values`,r)},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){return De(e.listKeys("cards/"),t=>nn(t,r=>e.read(r),r=>Io(r,/^cards\/([^/]+)\/computed_values$/)))},writeDataObjects(t){return Cr(Object.entries(t),([r,n])=>{if(r)return e.write(`data-objects/${r}`,n)})},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){return De(e.listKeys("data-objects/"),t=>nn(t,r=>e.read(r),r=>r.slice(13)))},writeStatusSnapshot(t){return e.write("status",t)},readStatusSnapshot(){return e.read("status")}}}function It(e,t){function r(){return e.readIndex()??{}}function n(o,s,a){let i=String(s||"").split(".").filter(Boolean);if(i.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let u={...o},b=u;for(let v=0;v<i.length-1;v++){let l=i[v],g=b[l],A=g&&typeof g=="object"&&!Array.isArray(g)?{...g}:{};b[l]=A,b=A;}return b[i[i.length-1]]=a,u}return {readCard(o){let s=r()[o];return !s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(o){return r()[o]?.key??null},readAllCards(){let o=[];for(let[s,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let i=e.readCard(a.key);i?o.push(i):t?.(`[card-store] could not read card "${s}" at key "${a.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,a]of Object.entries(r()))o[s]=a.checksum;return o},changedSince(o){let s=r(),a=[];for(let[i,u]of Object.entries(s))o[i]!==u.checksum&&a.push(i);for(let i of Object.keys(o))s[i]||a.push(i);return a},validateUpsert(o,s){let a=r(),i=a[o],u=Object.entries(a).find(([,b])=>b.key===s);return i&&i.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${i.key}", cannot remap to "${s}"`}:u&&u[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${u[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,a){let i=r(),u=a??i[o]?.key??e.defaultCardKey(o),b=e.writeCard(u,s);i[o]={key:u,checksum:b,updatedAt:new Date().toISOString()},e.writeIndex(i);},patchCard(o,s,a){let i=r(),u=i[o];if(!u||!e.cardExists(u.key))throw new Error(`card "${o}" not found`);let b=e.readCard(u.key);if(!b||typeof b!="object"||Array.isArray(b))throw new Error(`card "${o}" is not patchable`);let v=n(b,s,a),l=e.writeCard(u.key,v);i[o]={key:u.key,checksum:l,updatedAt:new Date().toISOString()},e.writeIndex(i);},removeCard(o){let s=r(),a=s[o];a&&(e.removeCard(a.key),delete s[o],e.writeIndex(s));},readIndex(){return r()}}}function Gt(e,t){return Ut(e,t)}function on(e){return tn(e)}function sn(e,t){return Vt(e,t)}var Jt="v1",et="board/graph",an="board/lastJournalProcessedId";function Rr(e){return `cards/${e}/runtime`}function dn(e){return Kt(e,Rr,()=>({_sources:{}}))}function cn(e){return Nt(e,Jt)}function wr(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 Mt(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Lt(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 un(e){return Ht(e)}function vt(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function To(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function At(e,t){return e?.lastRequestedToken?To(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Sr(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function xt(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function lt(e,t){let r=t.state.tasks,n=t.config.tasks,o=Object.keys(r),s=St(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let S of s.pending)i.set(S.taskName,S.waitingOn);for(let S of s.unresolved)i.set(S.taskName,S.missingTokens);for(let S of s.blocked)i.set(S.taskName,S.failedTokens);let u=new Map;for(let[S,C]of Object.entries(n))for(let f of C.requires??[]){let y=u.get(f)??[];y.push(S),u.set(f,y);}let b=o.sort().map(S=>{let C=r[S],f=n[S]??{requires:[],provides:[]};C.status==="completed"?a.completed+=1:C.status==="failed"?a.failed+=1:C.status==="in-progress"&&(a.in_progress+=1);let y=f.requires??[],B=f.provides??[],R=Object.keys(C.data??{}).sort(),I=y.filter(T=>t.state.availableOutputs.includes(T)),m=y.filter(T=>!t.state.availableOutputs.includes(T)),p=i.get(S)??m,k=new Set;for(let T of B)for(let h of u.get(T)??[])h!==S&&k.add(h);let w=C.failedAt,q=C.error?{message:C.error,code:"TASK_FAILED",at:w,source:"task-runtime"}:void 0;return {name:S,status:C.status,error:q,requires:y,requires_satisfied:I,requires_missing:m,provides_declared:B,provides_runtime:R,blocked_by:p,unblocks:Array.from(k).sort(),runtime:{attempt_count:C.executionCount??0,restart_count:C.retryCount??0,in_progress_since:C.status==="in-progress"?C.startedAt??null:null,last_transition_at:C.lastUpdated??null,last_completed_at:C.completedAt??null,last_restarted_at:C.startedAt??null,status_age_ms:C.lastUpdated?0:null}}});a.pending=s.pending.length,a.blocked=s.blocked.length,a.unresolved=s.unresolved.length;let v=b.map(S=>({name:S.name,fanOut:S.unblocks.length})).sort((S,C)=>C.fanOut-S.fanOut||S.name.localeCompare(C.name)),l=v.length>0?v[0]:{name:null,fanOut:0},g=new Set;for(let S of Object.values(n))for(let C of S.requires??[])g.add(C);let A=0;for(let[S,C]of Object.entries(n)){let f=(C.requires??[]).length===0,B=(C.provides??[]).some(R=>(u.get(R)??[]).some(I=>I!==S));f&&!B&&(A+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:o.length,completed:a.completed,eligible:s.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:A,topology:{edge_count:Array.from(g).length,max_fan_out_card:l.name,max_fan_out:l.fanOut}},cards:b}}function Po(){return new Date().toISOString()}function ln(e,t,r,n,o,s,a){return async i=>{let u=[],b=r.cardStore.readCard(i.nodeId);if(!b)return "task-initiate-failure";let v=b.id,l=b.card_data??{},g=b.source_defs??[],A=g.filter(D=>D.optionalForCompletionGating!==true),S=r.cardRuntimeStore.readRuntime(v),C=false,f=()=>{C&&(r.cardRuntimeStore.writeRuntime(v,S),C=false);},y=D=>vt(S._sources[D]),B=(D,$)=>{S._sources[D]=vt($),C=true;},R=i.taskState?.executionCount??0;if(S._lastExecutionCount!==R&&(S._sources={},S._lastExecutionCount=R,C=true),i.update){let D=i.update,$=D.outputFile;if($){let G=y($);if(D.failure){let ee=D.rqt??G.lastRequestedToken??G.queueRequestedToken;ee&&B($,xt(G,ee));}else {let ee=D.rqt;if(!G.lastCompletedToken||ee>G.lastCompletedToken){let ce=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,P=false;ce&&(P=r.fetchedSourcesStore.commitSourceData(v,$,ce)),P?B($,Sr(G,ee)):B($,xt(G,ee));}}f();}}let m={};for(let D of g)if(D.outputFile){let $=r.fetchedSourcesStore.readSourceData(v,D.outputFile);$!==null&&(m[D.bindTo]=$);}let p={};for(let[D,$]of Object.entries(i.state??{}))if($!==null&&typeof $=="object"&&!Array.isArray($)){let G=$[D];p[D]=G!==void 0?G:$;}else p[D]=$;let k={id:v,card_data:{...l},requires:p,source_defs:g,compute:b.compute};k._sourcesData=m,b.compute&&Ke.runSync(k,{sourcesData:m}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(v,k.computed_values??{});let w={...b},q=Ke.enrichSourcesSync(Array.isArray(b.source_defs)?b.source_defs:void 0,{card_data:b.card_data,requires:p}),T=e.value;w.source_defs=Array.isArray(q)?q.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:T})):q;let h=Po(),U=i.update?void 0:h,M=A.filter(D=>{let $=D.outputFile;if(typeof $!="string"||!$)return true;let G=y($);U&&(G={...G,queueRequestedToken:U},B($,G));let ee=G.queueRequestedToken??G.lastRequestedToken??h,ce=At(G,ee);return ce==="in-flight"?false:ce==="dispatch"});if(f(),M.length>0){let D=false,$=h;for(let G of M){let ee=G.outputFile;if(typeof ee!="string"||!ee)continue;let ce=y(ee),P=ce.queueRequestedToken??h;B(ee,{...ce,lastRequestedToken:P}),$=P,D=true;}return D&&f(),D&&(u.push({taskKind:"source-fetch",payload:{boardRef:ve(e),enrichedCard:w,callbackToken:i.callbackToken,rqt:$}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}if(A.some(D=>{let $=D.outputFile;if(typeof $!="string"||!$)return false;let G=y($),ee=G.queueRequestedToken??G.lastRequestedToken??h;return At(G,ee)==="in-flight"}))return "task-initiated";let L=b.provides??[],j={};for(let{bindTo:D,ref:$}of L)j[D]=Ke.resolve(k,$);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(j),g.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let $=y(D.outputFile);return !$.lastRequestedToken||!$.lastCompletedToken?true:$.lastCompletedToken<=$.lastRequestedToken}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:ve(e),enrichedCard:w,callbackToken:i.callbackToken,rqt:h}}),n(i.nodeId,j),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var Tt={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Wt(e){return {[et]:e.graph,[an]:e.lastDrainedJournalId}}function Qt(e){let t=e[et],r=e[an];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${et}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function zt(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 Yt(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}function o(s){if(Array.isArray(s))return s;if(s&&typeof s=="object"){let a=s;return Array.isArray(a.files)?a.files:[s]}return null}return {get(s){try{let a=s.params?.id;if(a){let i=e.readCard(a);return i?t({cards:[i]}):r(`card "${a}" not found`)}return t({cards:e.readAllCards()})}catch(a){return n(a)}},set(s){try{let a=s.body;if(a==null)return r("set requires a body (card object or array of cards)");let i=Array.isArray(a)?a:[a];for(let u of i){if(typeof u.id!="string")return r("each card must have a string `id` field");e.writeCard(u.id,u);}return t({count:i.length})}catch(a){return n(a)}},del(s){try{let a=s.body?.ids??[],i=s.params?.id,u=i?[...a,i]:a;if(u.length===0)return r("del requires body.ids (string[]) or params.id");for(let b of u)e.removeCard(b);return t({count:u.length})}catch(a){return n(a)}},patch(s){try{let a=s.params?.id,i=s.params?.path;if(!a)return r("patch requires params.id");if(!i)return r("patch requires params.path");let u=s.body,b=u&&Object.prototype.hasOwnProperty.call(u,"value")?u.value:s.body;return e.patchCard(a,i,b),t({count:1})}catch(a){return n(a)}},appendFiles(s){try{let a=s.params?.id;if(!a)return r("appendFiles requires params.id");let i=e.readCard(a);if(!i)return r(`card "${a}" not found`);let u=o(s.body);if(!u||u.length===0)return r("appendFiles requires a file metadata object, array, or body.files array");let b=i.card_data&&typeof i.card_data=="object"&&!Array.isArray(i.card_data)?i.card_data:{},v=Array.isArray(b.files)?b.files:[],l=[...v,...u],g=u.map((S,C)=>({idx:v.length+C,entry:S})),A=this.patch({params:{id:a,path:"card_data.files"},body:{value:l}});return A.status!=="success"?A:t({files_added:g})}catch(a){return n(a)}}}}function fe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ie(e){return {status:"fail",error:e}}function ge(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function _o(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function pn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function Xt(e){try{let t=JSON.parse(pn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Eo(e){return _o(JSON.stringify(e))}function fn(e){try{let t=JSON.parse(pn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Ne(){return new Date().toISOString()}function mn(e,t){Ot(t.callbackTransport,"createBoardLiveCardsPublic");let r=t.callbackTransport,n=t.onWarn??(()=>{}),o=ve(e);function s(F){if(F.length!==0)try{let c=t.publishBoardChangeNotifications?.(F);c&&typeof c.catch=="function"&&c.catch(O=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${O instanceof Error?O.message:String(O)}`));}catch(c){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${c instanceof Error?c.message:String(c)}`);}}function a(){let F=u().readCardStoreRef();if(!F)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let c=t.kvStorageForRef(F);return {readIndex(){return c.read("_index")},writeIndex(O){c.write("_index",O);},readCard(O){return c.read(O)},writeCard(O,N){return c.write(O,N),t.hashFn(N)},removeCard(O){c.delete(O);},cardExists(O){return c.read(O)!==null},defaultCardKey(O){return O}}}let i={readValues(F){let c=t.kvStorage("state-snapshot"),O=c.listKeys().sort();if(O.length===0)return {version:null,values:{}};let N={};for(let te of O)N[te]=c.read(te);return {version:t.hashFn(N),values:N}},writeValues(F,c,O){let N=t.kvStorage("state-snapshot");for(let te of O)N.delete(te);for(let[te,se]of Object.entries(c))N.write(te,se);return t.hashFn(c)}},u=()=>wr(t.kvStorage("config")),b=()=>cn(i),v=()=>on(t.journalAdapter()),l=()=>It(a(),n),g=()=>{let F=u().readOutputsStoreRef();if(!F)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return un(t.kvStorageForRef(F))},A=()=>{let F=u().readArchiveStoreRef();return F?t.archiveFactoryForRef(F):t.archiveFactory()};function S(){return !!b().readSnapshot(e.value).values[et]}function C(){let F=b().readSnapshot(e.value);if(!F.values[et])throw new Error(`Board not initialized at ${e.value}`);return Qt(F.values)}function f(F,c){let O=b().commitSnapshot(e.value,{schemaVersion:Jt,expectedVersion:c,commitId:t.genId(),committedAt:Ne(),deleteKeys:[],shallowMerge:Wt(F)});if(!O.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${c??"null"} current=${O.currentVersion??"null"}`)}function y(F){v().appendEvent(F);}async function B(){let F=(Z,ae)=>{let Re=Z.payload,x=(Re?.enrichedCard??{}).id??Re?.cardId??"unknown";y({type:"task-failed",taskName:x,error:ae,timestamp:Ne()});},c=sn(t.kvStorage("execution-requests"),F),O=dn(t.kvStorage("card-runtime")),N=Gt(t.blobStorage("sources"),Z=>t.resolveBlob(Z)),te=new Map,se={readRuntime(Z){return te.get(Z)??O.readRuntime(Z)},writeRuntime(Z,ae){te.set(Z,ae);}},ne=[],le=new Map,xe={readSourceData(Z,ae){let Re=`${Z}/${ae}`;return le.has(Re)?le.get(Re):N.readSourceData(Z,ae)},ingestSourceDataStaged(Z,ae,Re,d){N.ingestSourceDataStaged(Z,ae,Re,d);},commitSourceData(Z,ae,Re){let d=`${Z}/.staged/${Re}/${ae}`,x=t.blobStorage("sources"),E=x.read(d);if(E==null){let oe=x.keyRef?.(d);oe&&(E=t.resolveBlob(oe));}if(E==null)return false;let W=`${Z}/${ae}`,V=E.trim();try{le.set(W,JSON.parse(V));}catch{le.set(W,V);}return ne.push({cardId:Z,outputFile:ae,deliveryToken:Re}),true},hasSource(Z,ae){let Re=`${Z}/${ae}`;return le.has(Re)?true:N.hasSource(Z,ae)},listSources(Z){let ae=N.listSources(Z),Re=new Set;for(let x of le.keys())x.startsWith(`${Z}/`)&&Re.add(x.slice(`${Z}/`.length));let d=new Set([...ae,...Re]);return Array.from(d)}},Ce={cardStore:l(),cardRuntimeStore:se,fetchedSourcesStore:xe,outputStore:g(),executionRequestStore:c},Ue=C(),Le=ut(Ue.graph),{events:ot,newCursor:st}=v().readEntriesAfterCursor(Ue.lastDrainedJournalId),ze=[],Ye=[],gt=[],Rt=new Map,Pt=new Set,ir=(Z,ae)=>{ze.push({type:"task-completed",taskName:Z,data:ae,timestamp:Ne()});try{A().stream("exec-history").append({taskName:Z,status:"completed",completedAt:Ne()});}catch{}},pt=(Z,ae)=>{y({type:"task-failed",taskName:Z,error:ae,timestamp:Ne()});try{A().stream("exec-history").append({taskName:Z,status:"failed",error:ae,completedAt:Ne()});}catch{}},mt=Ft(Le,{handlers:{"card-handler":ln(e,st,Ce,ir,pt,(Z,ae)=>{Ye.push({cardId:Z,values:ae});},Z=>{gt.push(Z);})},onNodeRemoved:Z=>{Rt.delete(Z),te.delete(Z),Pt.add(Z);}});for(ze=ot;ze.length>0;){let Z=ze;ze=[];for(let ae of Z)if(ae.type==="task-restart"){let Re=Ce.cardStore.readCard(ae.taskName);Re&&Rt.set(ae.taskName,Re);}mt.pushAll(Z),await mt.waitForHandlers();}let cr=mt.getState();await mt.dispose({wait:true});let ur=b().readSnapshot(e.value).version;f({lastDrainedJournalId:st,graph:ct(cr)},ur);for(let{cardId:Z,values:ae}of Ye)Ce.outputStore.writeComputedValues(Z,ae);for(let Z of gt)Ce.outputStore.writeDataObjects(Z);for(let[Z,ae]of te)O.writeRuntime(Z,ae);for(let{cardId:Z,outputFile:ae,deliveryToken:Re}of ne)N.commitSourceData(Z,ae,Re);let wt;try{wt=lt(o,cr),Ce.outputStore.writeStatusSnapshot(wt);}catch(Z){n(`[board-live-cards-public] status publish failed: ${Z instanceof Error?Z.message:String(Z)}`);}let at=[];for(let{cardId:Z,values:ae}of Ye)at.push({kind:"computed_values",cardId:Z,values:ae});for(let Z of gt)for(let[ae,Re]of Object.entries(Z))ae&&at.push({kind:"data_object",key:ae,payload:Re});for(let[Z,ae]of Rt)at.push({kind:"card_refreshed",cardId:Z,card:ae});for(let Z of Pt)at.push({kind:"card_removed",cardId:Z});wt!==void 0&&at.push({kind:"status",status:wt}),s(at);let lr=u().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:ve({kind:"built-in",value:"source-cli-task-executor"})},fr=t.supportsDirectSourceOutput?.(lr)===true;c.dispatchEntriesForJournalId(st,Z=>{if(Z.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${Z.taskKind}" \u2014 skipping`);return}let ae=Z.payload,Re=ae.enrichedCard?.id??"unknown",d=ae.enrichedCard?.source_defs??[];for(let x of d){if(!x.outputFile){n(`[dispatch] source "${x.bindTo}" has no outputFile \u2014 skipping`);continue}let E;if(fr){let V=t.genId(),oe=`${Re}/.staged/${V}/${x.outputFile}`,me=t.blobStorage("sources").keyRef?.(oe);me?E={ref:ve(me),deliveryToken:V,outputFile:x.outputFile,cardId:Re}:n("[dispatch] hosted board-worker requested but sources BlobStorage cannot produce portable refs; falling back to scratch protocol");}let W=Eo({cbk:ae.callbackToken,rg:e.value,br:ve(e),cid:Re,b:x.bindTo,d:x.outputFile,cs:void 0,rqt:ae.rqt,...E?{dt:E.deliveryToken}:{}});t.dispatchExecution(lr,{source_def:x,base_ref:ve(e),callback:r.createCallback(W),...E?{output:E}:{}}).catch(V=>pt(Re,V instanceof Error?V.message:String(V)));}});}function R(){let F=t.processAccumulatedStore();F.enqueueIfAbsent?F.enqueueIfAbsent({boardRef:ve(e)},`process-accumulated:${ve(e)}`):F.enqueue({boardRef:ve(e)}),t.requestProcessAccumulated?.();}function I(){let F=t.processAccumulatedStore();for(;;){let c=F.lease({max:64,visibilityMs:1e3});if(c.length<=0)return;for(let O of c)F.ack(O.id,O.leaseToken);if(c.length<64)return}}async function m(){try{let F=()=>{let O=C(),{events:N}=v().readEntriesAfterCursor(O.lastDrainedJournalId);N.length<=0||R();},c=await Fr(t.lock,B,F);return fe({ran:c!==!1})}catch(F){return ge(F)}}function p(){R();}function k(F){try{let c=F.params?.cardStoreRef;if(!c)return ie("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!S()){let Ce=kt(Tt);f({lastDrainedJournalId:"",graph:ct(Ce)},null);}let O=F.params?.outputsStoreRef;if(!O)return ie("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let N=F.params?.scratchStoreRef,te=F.params?.archiveStoreRef,se=F.params?.chatStoreRef,ne=F.params?.artifactsStoreRef,le=u();le.writeCardStoreRef(c),le.writeOutputsStoreRef(O),N&&le.writeScratchStoreRef(N),te&&le.writeArchiveStoreRef(te),se&&le.writeChatStoreRef(se),ne&&le.writeArtifactsStoreRef(ne);let xe=F.body??{};xe["task-executor-ref"]&&le.writeTaskExecutorRef(xe["task-executor-ref"]),Object.prototype.hasOwnProperty.call(xe,"chat-handler-flow")&&le.writeChatHandlerFlow(xe["chat-handler-flow"]);try{g().writeStatusSnapshot(lt(o,ut(C().graph)));}catch{}return fe()}catch(c){return ge(c)}}function w(F){try{let c=g().readStatusSnapshot();if(!c){c=lt(o,ut(C().graph));try{g().writeStatusSnapshot(c);}catch{}}return fe(c)}catch(c){return ge(c)}}function q(F){try{let c=F.params?.id;if(!c)return ie("removeCard requires params.id");try{t.kvStorage("card-upsert").delete(c);}catch{}return y({type:"task-removal",taskName:c,timestamp:Ne()}),p(),fe()}catch(c){return ge(c)}}function T(F){try{let c=F.params?.cardId;if(!c)return ie("addCardFiles requires params.cardId");let O=Yt(l()).appendFiles({params:{id:c},body:F.body});if(O.status!=="success")return O;let N=h({params:{cardId:c}});return N.status!=="success"?N:fe({cardId:c,files_added:O.data.files_added,notified:!0})}catch(c){return ge(c)}}function h(F){try{let c=F.params?.cardId;if(!c)return ie("cardRefreshedNotify requires params.cardId");let O=l().readCard(c);return O?(s([{kind:"card_refreshed",cardId:c,card:O}]),fe({cardId:c,notified:!0})):ie(`Card "${c}" not found in board at ${e.value}`)}catch(c){return ge(c)}}function U(F){try{let c=F.params?.id;return c?(y({type:"task-restart",taskName:c,timestamp:Ne()}),p(),fe()):ie("retrigger requires params.id")}catch(c){return ge(c)}}async function M(F){return I(),m()}function X(F){try{let c=F.params?.cardId,O=F.params?.all,N=!!F.params?.restart;if(!c&&!O)return ie("upsertCard requires --card-id <id> or --all");let te=O?l().readAllCards().map(se=>se.id):[c];for(let se of te)if(!l().readCard(se))return ie(`Card "${se}" not found in board at ${e.value}`);for(let se of te){let ne=l().readCard(se),le=zt(ne),xe=t.hashFn(le),Ce=t.kvStorage("card-upsert"),Ue=Ce.read(se),Le=Ue?.taskConfigHash!==xe;if(!(!Le&&!N)){if(Le){let ot=Ue?.blobRef??l().readCardKey(se)??se;y({type:"task-upsert",taskName:se,taskConfig:le,timestamp:Ne()}),Ce.write(se,{blobRef:ot,taskConfigHash:xe,updatedAt:Ne()});}N&&y({type:"task-restart",taskName:se,timestamp:Ne()});}}return p(),fe()}catch(c){return ge(c)}}function L(F){try{let c=F.params?.token;if(!c)return ie("taskFailed requires params.token");let O=F.params?.error??"unknown error",N=Xt(c);if(!N)return ie("Invalid callback token");y({type:"task-failed",taskName:N.taskName,error:O,timestamp:Ne()});try{A().stream("exec-history").append({taskName:N.taskName,status:"failed",error:O,completedAt:Ne()});}catch{}return p(),fe()}catch(c){return ge(c)}}function j(F){try{let c=F.params?.token;if(!c)return ie("taskProgress requires params.token");let N=(F.body??{}).update??{},te=Xt(c);return te?(y({type:"task-progress",taskName:te.taskName,update:N,timestamp:Ne()}),p(),fe()):ie("Invalid callback token")}catch(c){return ge(c)}}function H(F){try{let c=F.params?.token,O=F.params?.ref;if(!c)return ie("sourceDataFetched requires params.token");if(!O)return ie("sourceDataFetched requires params.ref");let N=fn(c);if(!N)return ie("Invalid source token");let{cbk:te,cid:se,b:ne,d:le,cs:xe,rqt:Ce,dt:Ue}=N,Le=Gt(t.blobStorage("sources"),Ye=>t.resolveBlob(Ye)),ot=Ue||t.genId();Ue||Le.ingestSourceDataStaged(se,le,Xe(O),ot);let st=Xt(te);if(!st)return ie("Invalid callback token embedded in source token");let ze=Ne();return y({type:"task-progress",taskName:st.taskName,update:{bindTo:ne,outputFile:le,fetchedAt:ze,deliveryToken:ot,sourceChecksum:xe,rqt:Ce},timestamp:ze}),p(),fe()}catch(c){return ge(c)}}function D(F){try{let c=F.params?.token,O=F.params?.reason??"unknown";if(!c)return ie("sourceDataFetchFailure requires params.token");let N=fn(c);if(!N)return ie("Invalid source token");let{cbk:te,b:se,d:ne,cs:le,rqt:xe}=N,Ce=Xt(te);return Ce?(y({type:"task-progress",taskName:Ce.taskName,update:{bindTo:se,outputFile:ne,failure:!0,reason:O,sourceChecksum:le,rqt:xe},timestamp:Ne()}),p(),fe()):ie("Invalid callback token embedded in source token")}catch(c){return ge(c)}}function $(F){try{let c=u().readCardStoreRef();return c?fe({storeRef:c}):ie(`Board at ${e.value} has no card store configured`)}catch(c){return ge(c)}}function G(F){try{let c=u().readOutputsStoreRef();return c?fe({storeRef:c}):ie(`Board at ${e.value} has no outputs store configured`)}catch(c){return ge(c)}}function ee(F){try{let c=u().readScratchStoreRef();return fe({storeRef:c})}catch(c){return ge(c)}}function ce(F){try{let c=u().readArchiveStoreRef();return fe({storeRef:c})}catch(c){return ge(c)}}function P(F){try{let c=u().readChatStoreRef();return fe({storeRef:c})}catch(c){return ge(c)}}function _(F){try{let c=u().readArtifactsStoreRef();return fe({storeRef:c})}catch(c){return ge(c)}}function K(F){try{let c=F.params?.key;if(!c)return ie("getConfig requires params.key");let O=u(),N;switch(c){case "task-executor":N=O.readTaskExecutorRef()??null;break;case "chat-handler-flow":N=O.readChatHandlerFlow()??null;break;case "card-store-ref":N=O.readCardStoreRef();break;case "outputs-store-ref":N=O.readOutputsStoreRef();break;case "scratch-store-ref":N=O.readScratchStoreRef();break;case "archive-store-ref":N=O.readArchiveStoreRef();break;case "chat-store-ref":N=O.readChatStoreRef();break;case "artifacts-store-ref":N=O.readArtifactsStoreRef();break;default:return ie(`getConfig: unknown key "${c}"`)}return fe({value:N})}catch(c){return ge(c)}}function J(F){try{let c=F.params?.key;if(!c)return ie("getOutputsDataObject requires params.key");let O=g().readDataObject(c);return fe(O)}catch(c){return ge(c)}}function Q(F){try{return fe(g().readAllDataObjects())}catch(c){return ge(c)}}function re(F){try{let c=F.params?.key;if(!c)return ie("getOutputsComputedValues requires params.key");let O=g().readComputedValues(c);return fe(O)}catch(c){return ge(c)}}function ue(F){try{return fe(g().readAllComputedValues())}catch(c){return ge(c)}}function ye(){return Gt(t.blobStorage("sources"),F=>t.resolveBlob(F))}function Be(F){let c=t.blobStorage("sources").keyRef?.(F);return c?ve(c):F}function Ae(F){try{let c=F.params?.key;if(!c)return ie("getOutputsFetchedSources requires params.key");let O=ye().listSources(c),N={};for(let te of O)N[te]=Be(`${c}/${te}`);return fe(N)}catch(c){return ge(c)}}function Te(F){try{let c=ye(),O=new Set;for(let te of t.blobStorage("sources").listKeys()){let se=te.indexOf("/");se>0&&!te.includes("/.staged/")&&O.add(te.slice(0,se));}let N={};for(let te of O){let se=c.listSources(te);if(se.length>0){N[te]={};for(let ne of se)N[te][ne]=Be(`${te}/${ne}`);}}return fe(N)}catch(c){return ge(c)}}return {init:k,status:w,getCardStoreRef:$,getOutputsStoreRef:G,getScratchStoreRef:ee,getArchiveStoreRef:ce,getChatStoreRef:P,getArtifactsStoreRef:_,getConfig:K,getOutputsDataObject:J,getAllOutputsDataObjects:Q,getOutputsComputedValues:re,getAllOutputsComputedValues:ue,getOutputsFetchedSources:Ae,getAllOutputsFetchedSources:Te,removeCard:q,addCardFiles:T,cardRefreshedNotify:h,retrigger:U,processAccumulatedEvents:M,upsertCard:X,taskFailed:L,taskProgress:j,sourceDataFetched:H,sourceDataFetchFailure:D}}function gn(e,t){let r=()=>wr(t.kvStorage("config"));function n(){let C=r().readCardStoreRef();if(!C)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let f=t.kvStorageForRef(C);return {readIndex(){return f.read("_index")},writeIndex(y){f.write("_index",y);},readCard(y){return f.read(y)},writeCard(y,B){return f.write(y,B),t.hashFn(B)},removeCard(y){f.delete(y);},cardExists(y){return f.read(y)!==null},defaultCardKey(y){return y}}}let o=()=>It(n(),t.onWarn??(()=>{}));async function s(C,f){let y=t.validateSchema(f),B=[],R=r().readTaskExecutorRef();if(R&&Array.isArray(f.source_defs))for(let m of f.source_defs){let p=typeof m.bindTo=="string"?m.bindTo:"(unknown)";try{let k;try{k=await t.invokeExecutor(R,"validate-source-def",{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(m)});}catch(q){let T=q;if(k=typeof T?.stdout=="string"?T.stdout:"",!k.trim()){B.push(`source "${p}": executor validate-source-def failed \u2014 ${q instanceof Error?q.message:String(q)}`);continue}}let w=JSON.parse(k.trim());if(!w.ok&&Array.isArray(w.errors))for(let q of w.errors)B.push(`source "${p}": ${q}`);}catch(k){B.push(`source "${p}": executor validate-source-def failed \u2014 ${k instanceof Error?k.message:String(k)}`);}}let I=[...y.errors,...B];return fe({cardId:C,isValid:I.length===0,issues:I})}function a(C,f){let y=C.params?.sourceIdx,B=C.params?.outRef;if(y===void 0)return ie(`${f} requires params.sourceIdx`);if(!C.body||typeof C.body!="object"||Array.isArray(C.body))return ie(`${f} requires card JSON object in body`);let R=C.body,I=R["card-content"]??R,m=R["mock-projections"]??{},p=I.source_defs??[];if(y<0||y>=p.length)return ie(`sourceIdx ${y} out of range (card has ${p.length} source(s))`);let k=p[y],w=typeof k.bindTo=="string"?k.bindTo:"source";return {src:k,bindTo:w,outRef:B,mockProjections:m}}async function i(C){try{if(!C.body||typeof C.body!="object"||Array.isArray(C.body))return ie("validateCardPreflight requires card JSON object in body");let f=C.body,y=f["card-content"]??f,B=typeof y.id=="string"?y.id:"(unknown)";return await s(B,y)}catch(f){return ge(f)}}async function u(C){try{let f=a(C,"probeSourcePreflight");if("status"in f)return f;let y=r().readTaskExecutorRef();if(!y)return ie("No task-executor registered for this board");try{let B={...f.src,_projections:f.mockProjections},R=await t.invokeExecutor(y,"probe-source-preflight",{timeout:f.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(B)}),I=JSON.parse(R.trim());return I.ok?fe({bindTo:f.bindTo,reachable:I.reachable,latencyMs:I.latencyMs,note:I.note}):ie(I.error??"Preflight probe failed")}catch{return ie("Executor does not support probe-source-preflight")}}catch(f){return ge(f)}}async function b(C){try{let f=a(C,"runSourcePreflight");if("status"in f)return f;let y=r().readTaskExecutorRef();if(!y)return ie("No task-executor registered for this board");try{let B={...f.src,_projections:f.mockProjections},R=await t.invokeExecutor(y,"run-source-preflight",{timeout:f.src.timeout??t.executorTimeouts?.probeMs??6e4,input:JSON.stringify(B)}),I=JSON.parse(R.trim());if(!I.ok)return fe({bindTo:f.bindTo,ok:!1,result:null,issues:[I.error??"Preflight run failed"]});if(f.outRef){let m=Xe(f.outRef);t.absoluteBlob.write(m.value,JSON.stringify(I.resultValue,null,2));}return fe({bindTo:typeof I.bindTo=="string"?I.bindTo:f.bindTo,ok:!0,result:I.resultValue??null,issues:[]})}catch(B){let R=B instanceof Error?B.message:String(B);return fe({bindTo:f.bindTo,ok:!1,result:null,issues:[R]})}}catch(f){return ge(f)}}async function v(C){try{let f=r().readTaskExecutorRef();if(!f)return ie("No task-executor registered for this board");let y=await t.invokeExecutor(f,"describe-capabilities",{timeout:t.executorTimeouts?.describeMs??1e4});return fe(JSON.parse(y.trim()))}catch(f){return ge(f)}}function l(C){try{let f=C.body;if(!f||!Array.isArray(f.ops))return ie("updatesInCardStore requires body.ops array");let y=f.ops,B=o();for(let R of y){let I=R.op,m=R.id;if(!m)return ie('op is missing "id"');if(I==="update"){let p=R["card-content"];if(!p)return ie(`update op for "${m}" is missing "card-content"`);B.writeCard(m,p);}else return ie(`Unknown op type: "${I??"(none)"}"`)}return fe()}catch(f){return ge(f)}}function g(C){try{let f=C.body;if(!f||!Array.isArray(f.ids))return ie("readFromCardStore requires body.ids array");let y=f.ids,B=o(),R=y.map(I=>({id:I,"card-content":B.readCard(I)}));return fe({cards:R})}catch(f){return ge(f)}}function A(C){try{if(!C.body||typeof C.body!="object"||Array.isArray(C.body))return ie("evalCardCompute requires a JSON object in body");let f=C.body,y=f["card-content"]??f,B=typeof y.id=="string"?y.id:"(unknown)",R=f["mock-fetched-sources"]??{},I=f["mock-requires"]??{},m=y.compute;if(!m||!Array.isArray(m)||m.length===0)return fe({cardId:B,ok:!0,computed_values:{},errors:[]});let p={id:B,card_data:y.card_data??{},requires:I,source_defs:y.source_defs,compute:m},k=Ke.runSync(p,{sourcesData:R}),w=k.node.computed_values??{},q=k.errors??[];return fe({cardId:B,ok:q.length===0,computed_values:w,errors:q})}catch(f){return ge(f)}}async function S(C){try{if(!C.body||typeof C.body!="object"||Array.isArray(C.body))return ie("simulateCardCycle requires a JSON object in body");let f=C.body,y=f["card-content"]??f,B=typeof y.id=="string"?y.id:"(unknown)",R=f["mock-fetched-sources"]??{},I=f["mock-requires"]??{},m=await s(B,y),p=m.status==="success"?{isValid:m.data.isValid,issues:m.data.issues}:{isValid:!1,issues:[m.status==="fail"?m.error:"internal error"]},k=y.source_defs??[],w=y.card_data??{},q=[],T=[];if(k.length>0){q=Ke.enrichSourcesSync(k,{card_data:w,requires:I});for(let $ of q){let G=$.projections,ee=$._projections;if(G&&ee){for(let ce of Object.keys(G))if(ee[ce]===void 0){let P=typeof $.bindTo=="string"?$.bindTo:"(unknown)";T.push({bindTo:P,key:ce,error:`Projection "${ce}" resolved to undefined`});}}}}let h=[],U={...R},M=f["task-executor-ref"],X=(M?.howToRun&&M?.whatToRun?M:void 0)??r().readTaskExecutorRef();for(let $=0;$<q.length;$++){let G=q[$],ee=typeof G.bindTo=="string"?G.bindTo:`source_${$}`;if(!X){h.push({bindTo:ee,skipped:!0,error:"No task executor configured"});continue}try{let ce={...G},P=await t.invokeExecutor(X,"run-source-preflight",{timeout:G.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(ce)}),_=JSON.parse(P.trim());_.ok&&!Object.prototype.hasOwnProperty.call(R,ee)&&Object.prototype.hasOwnProperty.call(_,"resultValue")&&(U[ee]=_.resultValue),h.push({bindTo:ee,reachable:_.reachable,latencyMs:_.latencyMs,error:_.ok?void 0:_.error});}catch{h.push({bindTo:ee,skipped:!0,error:"Executor does not support run-source-preflight"});}}let L=y.compute,j={},H=[];if(L&&Array.isArray(L)&&L.length>0){let $={id:B,card_data:w,requires:I,source_defs:y.source_defs,compute:L},G=Ke.runSync($,{sourcesData:U});j=G.node.computed_values??{},H=G.errors??[];}let D=p.isValid&&T.length===0&&H.length===0&&h.every($=>$.reachable!==!1);return fe({cardId:B,ok:D,validation:p,source_probes:h,projection_errors:T,fetched_sources:U,computed_values:j,compute_errors:H})}catch(f){return ge(f)}}return {validateCardPreflight:i,probeSourcePreflight:u,runSourcePreflight:b,evalCardCompute:A,simulateCardCycle:S,describeTaskExecutorCapabilities:v,updatesInCardStore:l,readFromCardStore:g}}async function yn(e,t,r){let n=await e.tryAcquire();if(!n)return false;try{await t();}finally{await n();}return await r?.(),true}function hn(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return Mt(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Lt(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){return e.write("card-store-ref",r)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){return e.write("outputs-store-ref",r)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){return e.write("scratch-store-ref",r)},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){return e.write("archive-store-ref",r)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){return e.write("chat-store-ref",r)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){return e.write("artifacts-store-ref",r)}}}function Oo(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Zt(e,t){return Oo(e)?e.then(t):t(e)}function kn(e,t){let r={...e};for(let[n,o]of Object.entries(t))o!==null&&typeof o=="object"&&!Array.isArray(o)&&r[n]!==null&&typeof r[n]=="object"&&!Array.isArray(r[n])?r[n]=kn(r[n],o):r[n]=o;return r}function er(e,t,r){if(t.length===0)return e;let[n,...o]=t;if(o.length===0)return {...e,[n]:r};let s=e[n]!==null&&typeof e[n]=="object"&&!Array.isArray(e[n])?e[n]:{};return {...e,[n]:er(s,o,r)}}function Cn(e){return {read:r=>e.read(r),get(r,n){return Zt(e.read(r),o=>{if(o===null)return null;let s=o;for(let a of n.split(".").filter(Boolean)){if(s===null||typeof s!="object"||Array.isArray(s))return null;s=s[a]??null;}return s??null})},write:(r,n)=>e.write(r,n),delete:r=>e.delete(r),listKeys:r=>e.listKeys(r),shallowMerge(r,n){return Zt(e.read(r),o=>e.write(r,{...o??{},...n}))},deepMerge(r,n){return Zt(e.read(r),o=>e.write(r,kn(o??{},n)))},patch(r,n,o){return Zt(e.read(r),s=>{let a=n.split(".").filter(Boolean);return e.write(r,er(s??{},a,o))})}}}function tr(e){return Cn(e)}function rr(e,t){return {async readIndex(){return await e.read("_index")},writeIndex(r){return e.write("_index",r)},async readCard(r){return await e.read(r)},async writeCard(r,n){return await e.write(r,n),t(n)},removeCard(r){return e.delete(r)},async cardExists(r){return await e.read(r)!==null},defaultCardKey(r){return r}}}function nr(e,t){async function r(){return await e.readIndex()??{}}return {async readCard(n){let o=(await r())[n];return !o||!await e.cardExists(o.key)?null:await e.readCard(o.key)},async readCardKey(n){return (await r())[n]?.key??null},async readAllCards(){let n=[];for(let[o,s]of Object.entries(await r())){if(!await e.cardExists(s.key))continue;let a=await e.readCard(s.key);a?n.push(a):t?.(`[card-store] could not read card "${o}" at key "${s.key}"`);}return n},async readChecksumIndex(){let n={};for(let[o,s]of Object.entries(await r()))n[o]=s.checksum;return n},async changedSince(n){let o=await r(),s=[];for(let[a,i]of Object.entries(o))n[a]!==i.checksum&&s.push(a);for(let a of Object.keys(n))o[a]||s.push(a);return s},async validateUpsert(n,o){let s=await r(),a=s[n],i=Object.entries(s).find(([,u])=>u.key===o);return a&&a.key!==o?{ok:false,error:`Card id "${n}" is already mapped to key "${a.key}", cannot remap to "${o}"`}:i&&i[0]!==n?{ok:false,error:`Key "${o}" is already mapped to card id "${i[0]}", cannot remap to "${n}"`}:{ok:true}},async writeCard(n,o,s){let a=await r(),i=s??a[n]?.key??e.defaultCardKey(n),u=await e.writeCard(i,o);a[n]={key:i,checksum:u,updatedAt:new Date().toISOString()},await e.writeIndex(a);},async patchCard(n,o,s){let a=await r(),i=a[n];if(!i||!await e.cardExists(i.key))throw new Error(`card "${n}" not found`);let u=await e.readCard(i.key);if(!u||typeof u!="object"||Array.isArray(u))throw new Error(`card "${n}" is not patchable`);let b=String(o||"").split(".").filter(Boolean),v=er(u,b,s),l=await e.writeCard(i.key,v);a[n]={key:i.key,checksum:l,updatedAt:new Date().toISOString()},await e.writeIndex(a);},async removeCard(n){let o=await r(),s=o[n];s&&(await e.removeCard(s.key),delete o[n],await e.writeIndex(o));},readIndex(){return r()}}}function Pe(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function Se(e){return {status:"fail",error:e}}function _e(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function He(){return new Date().toISOString()}function Bo(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 wn(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),o=Uint8Array.from(n,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function or(e){try{let t=JSON.parse(wn(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Fo(e){return Bo(JSON.stringify(e))}function Rn(e){try{let t=JSON.parse(wn(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function jo(e){return Kt(e,Rr,()=>({_sources:{}}))}function qo(e,t){return Ut(e,t)}function Lo(e){return Ht(e)}function Mo(e,t){return Vt(e,t)}function Do(e,t,r,n,o,s){return async a=>{let i=[],u=await r.cardStore.readCard(a.nodeId);if(!u)return "task-initiate-failure";let b=u.id,v=u.card_data??{},l=u.source_defs??[],g=l.filter(L=>L.optionalForCompletionGating!==true),A=await r.cardRuntimeStore.readRuntime(b),S=false,C=async()=>{S&&(await r.cardRuntimeStore.writeRuntime(b,A),S=false);},f=L=>vt(A._sources[L]),y=(L,j)=>{A._sources[L]=vt(j),S=true;},B=a.taskState?.executionCount??0;if(A._lastExecutionCount!==B&&(A._sources={},A._lastExecutionCount=B,S=true),a.update){let L=a.update.outputFile;if(L){let j=f(L);if(a.update.failure){let H=a.update.rqt??j.lastRequestedToken??j.queueRequestedToken;H&&y(L,xt(j,H));}else {let H=a.update.rqt;if(!j.lastCompletedToken||H>j.lastCompletedToken){let D=typeof a.update.deliveryToken=="string"?a.update.deliveryToken:void 0,$=D?await r.fetchedSourcesStore.commitSourceData(b,L,D):false;y(L,$?Sr(j,H):xt(j,H));}}await C();}}let R={};for(let L of l){if(!L.outputFile)continue;let j=await r.fetchedSourcesStore.readSourceData(b,L.outputFile);j!==null&&(R[L.bindTo]=j);}let I={};for(let[L,j]of Object.entries(a.state??{}))if(j!==null&&typeof j=="object"&&!Array.isArray(j)){let H=j[L];I[L]=H!==void 0?H:j;}else I[L]=j;let m={id:b,card_data:{...v},requires:I,source_defs:l,compute:u.compute};m._sourcesData=R,u.compute&&Ke.runSync(m,{sourcesData:R}),(o??(()=>{}))(b,m.computed_values??{});let p=Ke.enrichSourcesSync(Array.isArray(u.source_defs)?u.source_defs:void 0,{card_data:u.card_data,requires:I}),k={...u,source_defs:Array.isArray(p)?p.map(L=>({...L,boardDir:typeof L.boardDir=="string"&&L.boardDir?L.boardDir:e.value})):p},w=He(),q=a.update?void 0:w,T=g.filter(L=>{let j=L.outputFile;if(typeof j!="string"||!j)return true;let H=f(j);q&&(H={...H,queueRequestedToken:q},y(j,H));let D=H.queueRequestedToken??H.lastRequestedToken??w;return At(H,D)==="dispatch"});if(await C(),T.length>0){let L=false,j=w;for(let H of T){let D=H.outputFile;if(typeof D!="string"||!D)continue;let $=f(D),G=$.queueRequestedToken??w;y(D,{...$,lastRequestedToken:G}),j=G,L=true;}return L&&await C(),L&&(i.push({taskKind:"source-fetch",payload:{boardRef:ve(e),enrichedCard:k,callbackToken:a.callbackToken,rqt:j}}),await r.executionRequestStore.appendEntries(t,i)),"task-initiated"}if(g.some(L=>{let j=L.outputFile;if(typeof j!="string"||!j)return false;let H=f(j),D=H.queueRequestedToken??H.lastRequestedToken??w;return At(H,D)==="in-flight"}))return "task-initiated";let U=u.provides??[],M={};for(let{bindTo:L,ref:j}of U)M[L]=Ke.resolve(m,j);return (s??(()=>{}))(M),l.filter(L=>{if(L.optionalForCompletionGating!==true)return false;let j=f(L.outputFile);return !j.lastRequestedToken||!j.lastCompletedToken?true:j.lastCompletedToken<=j.lastRequestedToken}).length>0&&i.push({taskKind:"source-fetch",payload:{boardRef:ve(e),enrichedCard:k,callbackToken:a.callbackToken,rqt:w}}),n(a.nodeId,M),i.length>0&&await r.executionRequestStore.appendEntries(t,i),"task-initiated"}}function Sn(e,t){Ot(t.callbackTransport,"createAsyncBoardLiveCardsPublic");let r=t.callbackTransport,n=t.warn??(()=>{}),o=ve(e),s=null;function a(T){if(T.length!==0)try{return Promise.resolve(t.publishBoardChangeNotifications?.(T)).catch(h=>{n(`[async-board-live-cards-public] publishBoardChangeNotifications failed: ${h instanceof Error?h.message:String(h)}`);})}catch(h){n(`[async-board-live-cards-public] publishBoardChangeNotifications failed: ${h instanceof Error?h.message:String(h)}`);return}}let i=()=>hn(t.kvStorage("config")),u=()=>t.kvStorage("state-snapshot"),b=e.value,v=()=>Nt(kr(()=>u(),t.hashFn),"v1"),l=async()=>{let T=await i().readOutputsStoreRef();if(!T)throw new Error(`Board at ${e.value} has no outputs store configured.`);return Lo(t.kvStorageForRef(T))},g=async()=>{let T=await i().readCardStoreRef();if(!T)throw new Error(`Board at ${e.value} has no card store configured.`);let h=t.kvStorageForRef(T);return nr(rr(tr(h),t.hashFn),n)};async function A(){return !!(await v().readSnapshot(b)).values[et]}async function S(){let T=await v().readSnapshot(b);if(!T.values[et])throw new Error(`Board not initialized at ${e.value}`);return Qt(T.values)}async function C(T,h){let U=await v().commitSnapshot(b,{schemaVersion:"v1",expectedVersion:h,deleteKeys:[],shallowMerge:Wt(T)});if(!U.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${h??"null"} current=${U.currentVersion??"null"}`)}let f=()=>rn(t.journalStorage());async function y(T){await f().appendEvent(T);}function B(){return qo(t.blobStorage("sources"),T=>t.resolveBlob(T))}async function R(T){let h=await Promise.resolve(t.blobStorage("sources").keyRef?.(T));return h?ve(h):T}async function I(){let T=Mo(t.kvStorage("execution-requests"),async(c,O)=>{let N=c.payload,se=(N.enrichedCard??{}).id??N.cardId??"unknown";await y({type:"task-failed",taskName:se,error:O,timestamp:He()});}),h=jo(t.kvStorage("card-runtime")),U=B(),M=await g(),X=await l(),L=new Map,j=new Map,H=[],D=[],$=[],G=new Map,ee=new Set,ce={async readRuntime(c){return L.get(c)??await h.readRuntime(c)},async writeRuntime(c,O){L.set(c,O);}},P={async readSourceData(c,O){let N=`${c}/${O}`;return j.has(N)?j.get(N):await U.readSourceData(c,O)},ingestSourceDataStaged(c,O,N,te){return U.ingestSourceDataStaged(c,O,N,te)},async commitSourceData(c,O,N){let te=`${c}/.staged/${N}/${O}`,se=t.blobStorage("sources"),ne=await se.read(te);if(ne==null){let Ce=await se.keyRef?.(te);Ce&&(ne=await t.resolveBlob(Ce));}if(ne==null)return false;let le=`${c}/${O}`,xe=ne.trim();try{j.set(le,JSON.parse(xe));}catch{j.set(le,xe);}return H.push({cardId:c,outputFile:O,deliveryToken:N}),true},async hasSource(c,O){let N=`${c}/${O}`;return j.has(N)||await U.hasSource(c,O)},async listSources(c){let O=await U.listSources(c),N=[...j.keys()].filter(te=>te.startsWith(`${c}/`)).map(te=>te.slice(`${c}/`.length));return [...new Set([...O,...N])]}},_=await S(),K=ut(_.graph),{events:J,newCursor:Q}=await f().readEntriesAfterCursor(_.lastDrainedJournalId),re=J,ue=Ft(K,{handlers:{"card-handler":Do(e,Q,{cardStore:M,cardRuntimeStore:ce,fetchedSourcesStore:P,executionRequestStore:T},(c,O)=>{re.push({type:"task-completed",taskName:c,data:O,timestamp:He()});},(c,O)=>{D.push({cardId:c,values:O});},c=>{$.push(c);})},onNodeRemoved:c=>{G.delete(c),L.delete(c),ee.add(c);}});for(;re.length>0;){let c=re;re=[];for(let O of c)if(O.type==="task-restart"){let N=await M.readCard(O.taskName);N&&G.set(O.taskName,N);}ue.pushAll(c),await ue.waitForHandlers();}let ye=ue.getState();await ue.dispose({wait:true}),await C({lastDrainedJournalId:Q,graph:ct(ye)},(await v().readSnapshot(b)).version);for(let{cardId:c,values:O}of D)await X.writeComputedValues(c,O);for(let c of $)await X.writeDataObjects(c);for(let[c,O]of L)await h.writeRuntime(c,O);for(let c of H)await U.commitSourceData(c.cardId,c.outputFile,c.deliveryToken);let Be=lt(o,ye);await X.writeStatusSnapshot(Be);let Ae=[];for(let{cardId:c,values:O}of D)Ae.push({kind:"computed_values",cardId:c,values:O});for(let c of $)for(let[O,N]of Object.entries(c))Ae.push({kind:"data_object",key:O,payload:N});for(let[c,O]of G)Ae.push({kind:"card_refreshed",cardId:c,card:O});for(let c of ee)Ae.push({kind:"card_removed",cardId:c});Ae.push({kind:"status",status:Be}),await a(Ae);let Te=await i().readTaskExecutorRef();if(!Te)return;let F=t.supportsDirectSourceOutput?.(Te)===true;await T.dispatchEntriesForJournalId(Q,async c=>{if(c.taskKind!=="source-fetch"){n(`[async-process-accumulated-events] unknown taskKind "${c.taskKind}" \u2014 skipping`);return}let O=c.payload,N=O.enrichedCard?.id??"unknown",te=O.enrichedCard?.source_defs??[];for(let se of te){if(!se.outputFile)continue;let ne;if(F){let Ce=t.genId(),Ue=`${N}/.staged/${Ce}/${se.outputFile}`,Le=await Promise.resolve(t.blobStorage("sources").keyRef?.(Ue));Le&&(ne={ref:ve(Le),deliveryToken:Ce,outputFile:se.outputFile,cardId:N});}let le=Fo({cbk:O.callbackToken,rg:e.value,br:ve(e),cid:N,b:se.bindTo,d:se.outputFile,cs:void 0,rqt:O.rqt,...ne?{dt:ne.deliveryToken}:{}}),xe=await t.dispatchExecution(Te,{source_def:se,base_ref:ve(e),callback:r.createCallback(le),...ne?{output:ne}:{}});xe.dispatched||await y({type:"task-failed",taskName:N,error:xe.error??"dispatch failed",timestamp:He()});}});}async function m(){try{let T=async()=>{let U=await S(),{events:M}=await f().readEntriesAfterCursor(U.lastDrainedJournalId);M.length>0&&await k();},h=await yn(t.lock,I,T);return Pe({ran:h!==!1})}catch(T){return _e(T)}}async function p(){return s||(s=m().finally(()=>{s=null;}),s)}async function k(){let T=t.processAccumulatedStore();T.enqueueIfAbsent?await T.enqueueIfAbsent({boardRef:ve(e)},`process-accumulated:${ve(e)}`):await T.enqueue({boardRef:ve(e)}),await t.requestProcessAccumulated?.();}async function w(){let T=t.processAccumulatedStore();for(;;){let h=await T.lease({max:64,visibilityMs:1e3});if(h.length<=0)return;for(let U of h)await T.ack(U.id,U.leaseToken);if(h.length<64)return}}function q(){k();}return {async init(T){try{let h=T.params?.cardStoreRef;if(!h)return Se("init requires params.cardStoreRef");let U=T.params?.outputsStoreRef;if(!U)return Se("init requires params.outputsStoreRef");await A()||await C({lastDrainedJournalId:"",graph:ct(kt(Tt))},null);let M=i();await M.writeCardStoreRef(h),await M.writeOutputsStoreRef(U);let X=T.params?.scratchStoreRef,L=T.params?.archiveStoreRef,j=T.params?.chatStoreRef,H=T.params?.artifactsStoreRef;X&&await M.writeScratchStoreRef(X),L&&await M.writeArchiveStoreRef(L),j&&await M.writeChatStoreRef(j),H&&await M.writeArtifactsStoreRef(H);let D=T.body??{};return D["task-executor-ref"]&&await M.writeTaskExecutorRef(D["task-executor-ref"]),Object.prototype.hasOwnProperty.call(D,"chat-handler-flow")&&await M.writeChatHandlerFlow(D["chat-handler-flow"]),await(await l()).writeStatusSnapshot(lt(o,ut((await S()).graph))),Pe()}catch(h){return _e(h)}},async status(T){try{let h=await l(),U=await h.readStatusSnapshot();return U||(U=lt(o,ut((await S()).graph)),await h.writeStatusSnapshot(U)),Pe(U)}catch(h){return _e(h)}},async getCardStoreRef(T){try{let h=await i().readCardStoreRef();return h?Pe({storeRef:h}):Se(`Board at ${e.value} has no card store configured`)}catch(h){return _e(h)}},async getOutputsStoreRef(T){try{let h=await i().readOutputsStoreRef();return h?Pe({storeRef:h}):Se(`Board at ${e.value} has no outputs store configured`)}catch(h){return _e(h)}},async getScratchStoreRef(T){try{return Pe({storeRef:await i().readScratchStoreRef()})}catch(h){return _e(h)}},async getArchiveStoreRef(T){try{return Pe({storeRef:await i().readArchiveStoreRef()})}catch(h){return _e(h)}},async getChatStoreRef(T){try{return Pe({storeRef:await i().readChatStoreRef()})}catch(h){return _e(h)}},async getArtifactsStoreRef(T){try{return Pe({storeRef:await i().readArtifactsStoreRef()})}catch(h){return _e(h)}},async getConfig(T){try{let h=T.params?.key;if(!h)return Se("getConfig requires params.key");let U=i(),M;switch(h){case "task-executor":M=await U.readTaskExecutorRef()??null;break;case "chat-handler-flow":M=await U.readChatHandlerFlow()??null;break;case "card-store-ref":M=await U.readCardStoreRef();break;case "outputs-store-ref":M=await U.readOutputsStoreRef();break;case "scratch-store-ref":M=await U.readScratchStoreRef();break;case "archive-store-ref":M=await U.readArchiveStoreRef();break;case "chat-store-ref":M=await U.readChatStoreRef();break;case "artifacts-store-ref":M=await U.readArtifactsStoreRef();break;default:return Se(`getConfig: unknown key "${h}"`)}return Pe({value:M})}catch(h){return _e(h)}},async getOutputsDataObject(T){try{let h=T.params?.key;return h?Pe(await(await l()).readDataObject(h)):Se("getOutputsDataObject requires params.key")}catch(h){return _e(h)}},async getAllOutputsDataObjects(T){try{return Pe(await(await l()).readAllDataObjects())}catch(h){return _e(h)}},async getOutputsComputedValues(T){try{let h=T.params?.key;return h?Pe(await(await l()).readComputedValues(h)):Se("getOutputsComputedValues requires params.key")}catch(h){return _e(h)}},async getAllOutputsComputedValues(T){try{return Pe(await(await l()).readAllComputedValues())}catch(h){return _e(h)}},async getOutputsFetchedSources(T){try{let h=T.params?.key;if(!h)return Se("getOutputsFetchedSources requires params.key");let U=await B().listSources(h),M={};for(let X of U)M[X]=await R(`${h}/${X}`);return Pe(M)}catch(h){return _e(h)}},async getAllOutputsFetchedSources(T){try{let h=B(),U=await t.blobStorage("sources").listKeys(),M=new Set;for(let L of U){let j=L.indexOf("/");j>0&&!L.includes("/.staged/")&&M.add(L.slice(0,j));}let X={};for(let L of M){let j=await h.listSources(L);if(j.length!==0){X[L]={};for(let H of j)X[L][H]=await R(`${L}/${H}`);}}return Pe(X)}catch(h){return _e(h)}},async addCardFiles(T){try{let h=T.params?.cardId;if(!h)return Se("addCardFiles requires params.cardId");let U=await g(),M=await U.readCard(h);if(!M)return Se(`card "${h}" not found`);let X=T.body,L=Array.isArray(X)?X:X&&typeof X=="object"&&Array.isArray(X.files)?X.files:X!=null?[X]:null;if(!L||L.length===0)return Se("addCardFiles requires a file metadata object, array, or body.files array");let j=M.card_data&&typeof M.card_data=="object"&&!Array.isArray(M.card_data)?M.card_data:{},H=Array.isArray(j.files)?j.files:[],D=[...H,...L],$=L.map((ee,ce)=>({idx:H.length+ce,entry:ee}));await U.writeCard(h,{...M,card_data:{...j,files:D}});let G=await this.cardRefreshedNotify({params:{cardId:h}});return G.status!=="success"?G:Pe({cardId:h,files_added:$,notified:!0})}catch(h){return _e(h)}},async cardRefreshedNotify(T){try{let h=T.params?.cardId;if(!h)return Se("cardRefreshedNotify requires params.cardId");let U=await(await g()).readCard(h);return U?(await a([{kind:"card_refreshed",cardId:h,card:U}]),Pe({cardId:h,notified:!0})):Se(`Card "${h}" not found in board at ${e.value}`)}catch(h){return _e(h)}},async removeCard(T){try{let h=T.params?.id;if(!h)return Se("removeCard requires params.id");try{await t.kvStorage("card-upsert").delete(h);}catch{}return await y({type:"task-removal",taskName:h,timestamp:He()}),q(),Pe()}catch(h){return _e(h)}},async retrigger(T){try{let h=T.params?.id;return h?(await y({type:"task-restart",taskName:h,timestamp:He()}),q(),Pe()):Se("retrigger requires params.id")}catch(h){return _e(h)}},async processAccumulatedEvents(T){return await w(),p()},async upsertCard(T){try{let h=T.params?.cardId,U=T.params?.all,M=!!T.params?.restart;if(!h&&!U)return Se("upsertCard requires --card-id <id> or --all");let X=await g(),L=U?(await X.readAllCards()).map(H=>H.id):[h];for(let H of L)if(!await X.readCard(H))return Se(`Card "${H}" not found in board at ${e.value}`);let j=t.kvStorage("card-upsert");for(let H of L){let D=await X.readCard(H);if(!D)continue;let $=zt(D),G=t.hashFn($),ee=await j.read(H),ce=ee?.taskConfigHash!==G;if(!(!ce&&!M)){if(ce){let P=ee?.blobRef??await X.readCardKey(H)??H;await y({type:"task-upsert",taskName:H,taskConfig:$,timestamp:He()}),await j.write(H,{blobRef:P,taskConfigHash:G,updatedAt:He()});}M&&await y({type:"task-restart",taskName:H,timestamp:He()});}}return q(),Pe()}catch(h){return _e(h)}},async taskFailed(T){try{let h=T.params?.token;if(!h)return Se("taskFailed requires params.token");let U=T.params?.error??"unknown error",M=or(h);return M?(await y({type:"task-failed",taskName:M.taskName,error:U,timestamp:He()}),q(),Pe()):Se("Invalid callback token")}catch(h){return _e(h)}},async taskProgress(T){try{let h=T.params?.token;if(!h)return Se("taskProgress requires params.token");let U=(T.body??{}).update??{},M=or(h);return M?(await y({type:"task-progress",taskName:M.taskName,update:U,timestamp:He()}),q(),Pe()):Se("Invalid callback token")}catch(h){return _e(h)}},async sourceDataFetched(T){try{let h=T.params?.token,U=T.params?.ref;if(!h)return Se("sourceDataFetched requires params.token");if(!U)return Se("sourceDataFetched requires params.ref");let M=Rn(h);if(!M)return Se("Invalid source token");let X=B(),L=M.dt||t.genId();M.dt||await X.ingestSourceDataStaged(M.cid,M.d,Xe(U),L);let j=or(M.cbk);return j?(await y({type:"task-progress",taskName:j.taskName,update:{bindTo:M.b,outputFile:M.d,fetchedAt:He(),deliveryToken:L,sourceChecksum:M.cs,rqt:M.rqt},timestamp:He()}),q(),Pe()):Se("Invalid callback token embedded in source token")}catch(h){return _e(h)}},async sourceDataFetchFailure(T){try{let h=T.params?.token,U=T.params?.reason??"unknown";if(!h)return Se("sourceDataFetchFailure requires params.token");let M=Rn(h);if(!M)return Se("Invalid source token");let X=or(M.cbk);return X?(await y({type:"task-progress",taskName:X.taskName,update:{bindTo:M.b,outputFile:M.d,failure:!0,reason:U,sourceChecksum:M.cs,rqt:M.rqt},timestamp:He()}),q(),Pe()):Se("Invalid callback token embedded in source token")}catch(h){return _e(h)}}}}function bn(){return new Date().toISOString()}function vn(e){return new TextEncoder().encode(e).byteLength}function No(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function An(e){function t(r){let n=e.stat?No(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let o=e.read(r);return o===null?{key:r}:{key:r,size:vn(o)}}return {exists(r){return e.exists(r)},putText(r,n,o="text/plain; charset=utf-8"){e.write(r,n);let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??bn(),s.size=s.size??vn(n),s},putBytes(r,n,o="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let a=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,a);}let s=t(r)??{key:r};return s.contentType=o,s.updatedAt=s.updatedAt??bn(),s.size=s.size??n.byteLength,s},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let o=e.readBytes(r);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return n},getBytes(r){if(e.readBytes){let o=e.readBytes(r);if(o!==null)return o}let n=e.read(r);if(n===null)return null;try{let o=JSON.parse(n);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,o)=>n.key.localeCompare(o.key))},remove(r){e.remove(r);}}}function xn(){function e(o,s){if(!Array.isArray(o))return [];let a=[];for(let i of o){if(!i||typeof i!="object")continue;let u=i;typeof u.stored_name=="string"&&a.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:s||null,chat:u.chat===true});}return a}function t(o){return !o||typeof o!="object"?[]:e(o.files,void 0)}function r(o,s){let a=t(o);if(s.length===0)return o.files=a,a;let i=new Set(a.map(u=>u.stored_name));for(let u of s)i.has(u.stored_name)||(a.push(u),i.add(u.stored_name));return o.files=a,a}function n(o,s,a){let i=t(o);if(!Number.isInteger(s)||s<0||s>=i.length)return {ok:false,reason:"index_out_of_range"};let u=i[s];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function $o(){let e=globalThis.crypto;return typeof e?.randomUUID=="function"?String(e.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function In(){let e=new Map,t=new Map;function r(n){return e.has(n)||e.set(n,[]),e.get(n)}return {append(n,o,s,a=[],i=""){let u={id:$o(),role:o,text:s,files:a,turn:i,updated_at:new Date().toISOString()};return r(n).push(u),u.id},readAll(n){return r(n).slice()},readAfter(n,o){let s=r(n);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let a=s.findIndex(u=>u.id===o),i=a===-1?s.slice():s.slice(a+1);return {records:i,cursor:i.length>0?i[i.length-1].id:o}},clear(n){e.set(n,[]);},setProcessing(n,o){o?t.set(`p:${n}`,true):t.delete(`p:${n}`);},isProcessing(n){return t.get(`p:${n}`)===true},getConfig(n){return t.get(`c:${n}`)??{}},setConfig(n,o){let s=t.get(`c:${n}`)??{};t.set(`c:${n}`,{...s,...o});}}}function Tn(e){function t(l){let g=typeof l=="number"?l:Number(l);return Number.isInteger(g)&&g>0?g:null}function r(l,g){let A=g;for(let S=l.length-1;S>=0;S-=1)if(l[S]?.role==="user"&&(A-=1,A===0))return l.slice(S);return l}function n(l){return l.some(g=>typeof g?.turn=="string"&&g.turn!=="")}function o(l,g){if(g<=0)return [];if(!n(l))return r(l,g);let A=new Map,S=[];for(let f of l){let y=typeof f?.turn=="string"?f.turn:"";A.has(y)||(A.set(y,[]),S.push(y)),A.get(y).push(f);}return S.slice(Math.max(0,S.length-g)).flatMap(f=>A.get(f)??[])}function s(l){return {status:"success",data:l}}function a(l){return {status:"fail",error:l}}function i(l){return {status:"error",error:l instanceof Error?l.message:String(l)}}function u(l,g="command envelope"){let A=typeof l.cardId=="string"?l.cardId:void 0;if(!l.command)return a(`chat-store: ${g} missing "command"`);if(!A)return a(`chat-store: ${g} missing "cardId"`);if(l.command==="append")return v.append({params:{cardId:A},body:{role:l.role,text:l.text,files:l.files,turn:l.turn}});if(l.command==="read-all")return v.readAll({params:{cardId:A},body:{lastUserTurns:l.lastUserTurns,tailTurns:l.tailTurns,turnId:l.turnId,allTurns:l.allTurns,tailTurnsBeforeId:l.tailTurnsBeforeId}});if(l.command==="read-after")return v.readAfter({params:{cardId:A},body:{cursor:l.cursor??null}});if(l.command==="clear")return v.clear({params:{cardId:A}});if(l.command==="set-processing")return v.setProcessing({params:{cardId:A},body:{active:l.active}});if(l.command==="is-processing")return v.isProcessing({params:{cardId:A}});if(l.command==="get-config")return v.getConfig({params:{cardId:A}});if(l.command==="set-config"){let{command:S,cardId:C,...f}=l;return v.setConfig({params:{cardId:A},body:f})}return a(`chat-store: unknown command "${String(l.command)}"`)}function b(l){if(!Array.isArray(l.commands)||l.commands.length===0)return a('chat-store: command envelope must include a non-empty "commands" array');let g=[];for(let A=0;A<l.commands.length;A+=1){let S=l.commands[A];if(!S||typeof S!="object"||Array.isArray(S))return a(`chat-store: command envelope entry ${A} must be an object`);let C={cardId:l.cardId,...S},f=u(C,`command envelope entry ${A}`);if(f.status!=="success")return f;g.push({index:A,command:String(C.command),data:f.data});}return s({results:g})}let v={append(l){try{let g=l.params?.cardId;if(!g)return a("append requires params.cardId");let A=l.body??{},S=typeof A.role=="string"?A.role:"",C=typeof A.text=="string"?A.text:"",f=Array.isArray(A.files)?A.files:[],y=typeof A.turn=="string"?A.turn:"";if(!S)return a("append requires body.role");let B=e.append(g,S,C,f,y);return s({id:B})}catch(g){return i(g)}},readAll(l){try{let g=l.params?.cardId;if(!g)return a("readAll requires params.cardId");let A=l.body??{},S=typeof A.turnId=="string"?A.turnId:"",C=A.allTurns===!0,f=typeof A.tailTurnsBeforeId=="string"?A.tailTurnsBeforeId:"",y=A.tailTurns===void 0?A.lastUserTurns:A.tailTurns,B=y===void 0?C||S?void 0:1:t(y);if(y!==void 0&&B===null)return a("readAll requires body.tailTurns (positive integer)");let R=e.readAll(g),I=R.filter(m=>!S||String(m.turn||"")===S);if(f){let m=B;if(typeof m!="number"||!Number.isInteger(m)||m<=0)return a("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let p=new Map,k=[];for(let h of R){let U=String(h.turn||"");p.has(U)||(p.set(U,[]),k.push(U)),p.get(U).push(h);}let w=k.findIndex(h=>h===f),q=Math.max(0,w-m);return I=(w===-1?[]:k.slice(q,w)).flatMap(h=>p.get(h)??[]),s({records:I})}return s(typeof B=="number"?{records:o(I,B)}:{records:I})}catch(g){return i(g)}},readAfter(l){try{let g=l.params?.cardId;if(!g)return a("readAfter requires params.cardId");let S=(l.body??{}).cursor??null;return s(e.readAfter(g,S))}catch(g){return i(g)}},clear(l){try{let g=l.params?.cardId;return g?(e.clear(g),s({ok:!0})):a("clear requires params.cardId")}catch(g){return i(g)}},setProcessing(l){try{let g=l.params?.cardId;if(!g)return a("setProcessing requires params.cardId");let A=l.body??{};return typeof A.active!="boolean"?a("setProcessing requires body.active (boolean)"):(e.setProcessing(g,A.active),s({ok:!0}))}catch(g){return i(g)}},isProcessing(l){try{let g=l.params?.cardId;return g?s({active:e.isProcessing(g)}):a("isProcessing requires params.cardId")}catch(g){return i(g)}},getConfig(l){try{let g=l.params?.cardId;return g?s({config:e.getConfig(g)}):a("getConfig requires params.cardId")}catch(g){return i(g)}},setConfig(l){try{let g=l.params?.cardId;if(!g)return a("setConfig requires params.cardId");let A=l.body??{};return e.setConfig(g,A),s({ok:!0})}catch(g){return i(g)}},run:u,runBatch:b};return v}function Pn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function br(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 vr(e,t){if(!t||typeof t!="object")return;let r=t;if(r.kind==="notification-batch"&&Array.isArray(r.notifications)){for(let n of r.notifications)vr(e,n);return}r.kind==="status"&&br(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 _n(e){let t=new Map,r=new Map,n=new Map,o=0,s=null;function a(m){let p=JSON.stringify(m);return o++,`id: ${o}
2
+ data: ${p}
3
+
4
+ `}function i(m){let p=m;try{p.flushHeaders?.();}catch{}try{p.flush?.();}catch{}try{p.socket?.setNoDelay?.(!0);}catch{}try{p.socket?.uncork?.();}catch{}}function u(m,p){let k=t.get(m);if(k&&!(p&&k.res!==p)){t.delete(m),C();try{e.onSseClientDisconnected?.(m);}catch{}try{k.res.end();}catch{}}}function b(m,p,k){let w=t.get(m);w&&u(m,w.res),t.set(m,{res:p,subscribedChatCardIds:k??new Set});}function v(m,p){let k=t.get(m);if(!k)return;let w=a(p);try{k.res.write(w),i(k.res);}catch{u(m,k.res);}}function l(){let m=new Set;for(let p of t.values())for(let k of p.subscribedChatCardIds)m.add(k);return Array.from(m)}function g(m){let p=r.has(m)?r.get(m):null,{cursor:k}=e.chatStorage.readAfter(m,p),w=e.chatStorage.isProcessing(m),q=w!==(n.get(m)??false),T=k!==p;return T&&r.set(m,k),n.set(m,w),T||q}function A(m,p){let k=e.readChatRecords(m),w=Date.now();return {kind:"card_chats",cardId:m,sentAt:new Date(w).toISOString(),sentAtMs:w,messages:k.map(q=>({role:String(q.role||"system"),text:String(q.text||""),files:Array.isArray(q.files)?q.files:[]})),receiving:p,processing:e.chatStorage.isProcessing(m)}}function S(m,p=true){let k={kind:"notification-batch",notifications:[A(m,p)]};for(let[w,q]of t.entries())q.subscribedChatCardIds.has(m)&&v(w,k);}function C(){l().length>0||(s&&(clearInterval(s),s=null),r.clear(),n.clear());}function f(){if(s)return;let m=()=>{let p=l();if(p.length===0){C();return}let k=new Set(p);for(let w of Array.from(r.keys()))k.has(w)||r.delete(w);for(let w of Array.from(n.keys()))k.has(w)||n.delete(w);for(let w of p)g(w)&&S(w,true);};m(),s=setInterval(m,1e3);}function y(m,p){let k=t.get(m);if(!k)return false;k.subscribedChatCardIds.add(p);let{cursor:w}=e.chatStorage.readAfter(p,null);return r.set(p,w),n.set(p,e.chatStorage.isProcessing(p)),f(),v(m,{kind:"notification-batch",notifications:[A(p,true)]}),true}function B(m,p){let k=t.get(m);return k?(k.subscribedChatCardIds.delete(p),l().includes(p)||(r.delete(p),n.delete(p)),C(),true):false}function R(m){if(!m||typeof m!="object")return false;let p=m.kind;return p==="card_chats"||p==="chat_messages"}function I(m){if(!m||m.length===0)return;let p=[],k=new Set;for(let w of m)R(w)&&typeof w.cardId=="string"?k.add(String(w.cardId)):p.push(w);if(p.length>0){let w={kind:"notification-batch",notifications:p};for(let q of t.keys())v(q,w);}for(let w of k)S(w,true);}return {size:()=>t.size,has:m=>t.has(m),get:m=>t.get(m),buildFrame:a,flushTransport:i,register:b,disconnect:u,writeFrame:v,subscribeChat:y,unsubscribeChat:B,broadcastNotificationBatch:I,broadcastCardChats:S}}function pe(e,...t){for(let r of t)if(typeof e[r]=="string")return String(e[r]);return ""}function tt(e,...t){for(let r of t)if(e[r]!==void 0)return Number(e[r])}function ft(e,...t){for(let r of t){let n=e[r];if(n&&typeof n=="object"&&!Array.isArray(n))return n}return {}}function nt(e,t,...r){for(let n of r){let o=e[n];if(o&&typeof o=="object"&&!Array.isArray(o))return o}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function sr(e,t,...r){for(let n of r){let o=e[n];if(o!==void 0){let s=Number(o);if(Number.isFinite(s))return s}}throw Object.assign(new Error(`MCP tool requires ${t}`),{statusCode:400})}function En(e){if(Array.isArray(e.bytes))return new Uint8Array(e.bytes.map(t=>Math.max(0,Math.min(255,Number(t)||0))));if(typeof e.text=="string")return new TextEncoder().encode(e.text);if(typeof e.base64=="string"){let t=String(e.base64).replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r);return Uint8Array.from(n,o=>o.charCodeAt(0))}return null}function Ar(e,t){if(e?.status==="success")return Object.prototype.hasOwnProperty.call(e,"data")?e.data:void 0;throw e?.status==="fail"||e?.status==="error"?Object.assign(new Error(e.error||`${t} failed`),{statusCode:400}):Object.assign(new Error(`${t} returned an unexpected response`),{statusCode:500})}async function xr(e,t){return Ar(await e,t)}function Ir(e){let t=pe(e,"key");if(!t)throw Object.assign(new Error("MCP tool requires key"),{statusCode:400});let r=t.split(".");if(!(r.length>=2&&r[0]==="chat"&&r.every(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o))))throw Object.assign(new Error("MCP tool only supports card meta keys under chat.*"),{statusCode:400});return t}function Tr(e,t){let r=e.meta;for(let n of t.split(".")){if(!r||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,n))return {exists:false,value:null};r=r[n];}return {exists:true,value:r}}function On(e){let{boardId:t,getMcpFacade:r,getMcpCardStoreFacade:n}=e;function o(b){let v=pe(b,"board_id"),l=pe(b,"card_id");if(!v)throw Object.assign(new Error("MCP tool requires board_id"),{statusCode:400});if(!l)throw Object.assign(new Error("MCP tool requires card_id"),{statusCode:400});if(v!==t)throw Object.assign(new Error(`Unknown board_id: ${v}`),{statusCode:400});return {cardId:l}}function s(b,v){let{cardId:l}=o(b);return r().setChatProcessing({cardId:l,active:v}),{status:"success",data:{boardId:t,cardId:l,active:v}}}function a(b){let{cardId:v}=o(b),l=r().getChatProcessing({cardId:v});return {status:"success",data:{boardId:t,cardId:v,active:l.active}}}async function i(b){let{cardId:v}=o(b),l=Ir(b);if(!Object.prototype.hasOwnProperty.call(b,"value"))throw Object.assign(new Error("MCP tool requires value"),{statusCode:400});if(l.split(".").includes("__visible_controlplane_only")){let g=await xr(n().get({params:{id:v}}),"cardStore.get"),A=Array.isArray(g.cards)&&g.cards.length>0&&typeof g.cards[0]=="object"&&!Array.isArray(g.cards[0])?g.cards[0]:null,S=A?Tr(A,"__visible_controlplane_only").value:void 0;if(b.value!==S)throw Object.assign(new Error("MCP tool cannot change the reserved meta flag __visible_controlplane_only"),{statusCode:403});return {status:"success",data:{boardId:t,cardId:v,key:l}}}return Ar(await n().patch({params:{id:v,path:`meta.${l}`},body:{value:b.value}}),"cardStore.patch"),{status:"success",data:{boardId:t,cardId:v,key:l}}}async function u(b){let{cardId:v}=o(b),l=Ir(b),g=await xr(n().get({params:{id:v}}),"cardStore.get"),A=Array.isArray(g.cards)&&g.cards.length>0&&g.cards[0]&&typeof g.cards[0]=="object"&&!Array.isArray(g.cards[0])?g.cards[0]:null;if(!A)throw Object.assign(new Error(`Card "${v}" not found`),{statusCode:404});let S=Tr(A,l);return {status:"success",data:{boardId:t,cardId:v,key:l,exists:S.exists,value:S.value}}}return {requireCardArgs:o,setChatProcessing:s,getChatProcessing:a,setCardMeta:i,getCardMeta:u}}function Bn(e){let{boardId:t,boardContexts:r,readCardDefinitions:n,readChatRecords:o,getChatProcessing:s}=e;async function a(){let v=(await Promise.all(r.map(async C=>{try{let f=C.boardAdapter.kvStorageForRef(C.outputsStoreRef),y=await Promise.resolve(f.read("status"));if(y!=null)return y}catch{}return C.notification.status}))).filter(Boolean);if(v.length===0)return null;if(v.length===1)return v[0];let l=[],g=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],A={};for(let C of g)A[C]=0;for(let C of v){let f=C,y=Array.isArray(f.cards)?f.cards:[];l.push(...y);for(let B of g)A[B]+=Number(f?.summary?.[B]||0);}let S=v[0];return {...S,cards:l,summary:{...S.summary||{},card_count:l.length,...A}}}async function i(){let v={},l=async g=>{try{let A=await g.boardOps.getAllOutputsComputedValues({});if(A.status==="success"&&A.data&&typeof A.data=="object"){for(let[S,C]of Object.entries(A.data)){let f=g.notification.cards[S];v[S]={schema_version:"v1",card_id:S,card_data:f?.card_data??{},computed_values:C??{}};}return}}catch{}for(let[A,S]of Object.entries(g.notification.computedValues)){let C=g.notification.cards[A];v[A]={schema_version:"v1",card_id:A,card_data:C?.card_data??{},computed_values:S??{}};}};for(let g of r)await l(g);return v}async function u(){let v={};for(let l of r){try{let g=await l.boardOps.getAllOutputsDataObjects({});if(g.status==="success"&&g.data&&typeof g.data=="object"){Object.assign(v,g.data);continue}}catch{}Object.assign(v,l.notification.dataObjects||{});}return v}async function b(){let v=await n(),l=await i(),g=await u(),A={};for(let C of v){if(!C?.id)continue;let f=C.id,y=l[f]||{},B={...y.card_data&&typeof y.card_data=="object"?y.card_data:C.card_data&&typeof C.card_data=="object"?C.card_data:{}};A[f]={schema_version:y.schema_version||"v1",card_id:y.card_id||f,card_data:B,computed_values:y.computed_values&&typeof y.computed_values=="object"?y.computed_values:{}};}let S={};for(let C of v){if(!C?.id)continue;let f=C.id;try{let y=o(f),B=s(f);(y.length>0||B)&&(S[f]={messages:y.map(R=>({role:String(R.role||"system"),text:String(R.text||""),files:Array.isArray(R.files)?R.files:[]})),receiving:!1,processing:B});}catch{}}return {boardId:t,cardDefinitions:v,statusSnapshot:await a(),dataObjectsByToken:g,cardRuntimeById:A,cardChatsByCardId:S}}return {readStatusSnapshot:a,readCardRuntimeArtifacts:i,readDataObjectsByToken:u,buildPublishedRuntimePayload:b}}function Uo(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 Fn(e){let{safeCardId:t,artifactsStores:r,cardFileMetadataStore:n,readCardFromStore:o,updateCardLocalOnly:s,writeChatRecord:a}=e;async function i(v){let l=[];try{let g=await o(v);if(!g)return l;let A=n().read(g.card_data&&typeof g.card_data=="object"?g.card_data:null);for(let S of A)l.push(String(S.stored_name??""));}catch{}return l}async function u(v,l,g,A){let S=t(v),C=r(v),f=Uo(l),y=await i(v),R=`${String(y.length+1).padStart(3,"0")}-${f}`.slice(-36);return C.files&&await C.files.putBytes(`${S}/${R}`,new Uint8Array(A),g||"application/octet-stream"),{name:f,stored_name:R,size:A.length,mime_type:g||"application/octet-stream",uploaded_at:new Date().toISOString()}}async function b(v,l,g,A,S){if(!A.length)throw Object.assign(new Error("Empty upload body"),{statusCode:400});let C=S?.inChat===true,f=await u(v,l,g,A),y=null;if(await s(v,B=>{let R=new Date().toISOString(),I=B.card_data&&typeof B.card_data=="object"?B.card_data:{};B.card_data=I;let m=n().normalizeIncoming([{name:f.name,stored_name:f.stored_name,size:f.size,mime_type:f.mime_type,uploaded_at:f.uploaded_at||R,chat:C}],R);return y=n().merge(I,m).findIndex(k=>k.stored_name===f.stored_name),B}),C){let B=typeof y=="number"&&y>=0?` #${y}`:"";a(v,"system",`file uploaded: ${f.name} as ${f.stored_name}${B}`,[],S?.turnId??"");}return {ok:true,file:{...f,...typeof y=="number"&&y>=0?{file_idx:y}:{},chat:C},...typeof y=="number"&&y>=0?{file_idx:y}:{}}}return {uploadCardFile:b,readCardStoredFileNames:i}}function jn(e){return {"discover.source-kinds":()=>e.discoverSourceKinds(),"inspect.board-runtime-status":()=>e.inspectBoardRuntimeStatus(),"inspect.card-definition-and-runtime":t=>e.inspectCardDefinitionAndRuntime({cardId:pe(t,"card_id")}),"inspect.chat-messages-on-cards":t=>{let r=tt(t,"tail_turns"),n=tt(t,"tail"),o=pe(t,"turn_id"),s=t.all_turns===true,a=pe(t,"tail_turns_before_id");return e.inspectChatMessagesOnCards({cardId:pe(t,"card_id"),...r!==void 0?{lastUserTurns:r}:{},...n!==void 0?{tail:n}:{},...o?{turnId:o}:{},...s?{allTurns:true}:{},...a?{tailTurnsBeforeId:a}:{}})},"inspect.file-contents":t=>e.inspectFileContents({cardId:pe(t,"card_id"),fileIdx:Number(tt(t,"file_idx"))}),"preflight.validate-candidate-card-definition":t=>e.preflightValidateCandidateCardDefinition({candidateCardContent:nt(t,"candidate_card_content","candidate_card_content")}),"preflight.materialize-candidate-card":t=>e.preflightMaterializeCandidateCard({candidateCardContent:nt(t,"candidate_card_content","candidate_card_content"),mockRequires:nt(t,"mock_requires","mock_requires"),mockFetchedSources:nt(t,"mock_fetched_sources","mock_fetched_sources")}),"preflight.probe-single-source-in-candidate-card":t=>e.preflightProbeSingleSourceInCandidateCard({candidateCardContent:nt(t,"candidate_card_content","candidate_card_content"),mockProjections:ft(t,"mock_projections"),sourceIdx:sr(t,"source_idx","source_idx")}),"preflight.run-single-source-in-candidate-card":t=>e.preflightRunSingleSourceInCandidateCard({candidateCardContent:nt(t,"candidate_card_content","candidate_card_content"),mockProjections:ft(t,"mock_projections"),sourceIdx:sr(t,"source_idx","source_idx")}),"preflight.run-single-source-in-live-card":t=>e.preflightRunSingleSourceInLiveCard({cardId:pe(t,"card_id"),sourceIdx:sr(t,"source_idx","source_idx"),mockRequires:nt(t,"mock_requires","mock_requires")}),"preflight.run-one-cycle-with-candidate-card":t=>e.preflightRunOneCycleWithCandidateCard({candidateCardContent:nt(t,"candidate_card_content","candidate_card_content"),mockRequires:ft(t,"mock_requires")}),"manage.read-card":t=>e.manageReadCard({cardId:pe(t,"card_id")}),"stage-ai-response-and-any-attachments":t=>{let r=pe(t,"turn_id");if(!r)throw Object.assign(new Error("stage-ai-response-and-any-attachments requires a non-empty turn_id"),{statusCode:400});return e.manageAddChatEntryAndAnyAttachments({cardId:pe(t,"card_id"),role:"assistant",...typeof t.text=="string"?{text:t.text}:{},...r?{turn:r}:{},...Array.isArray(t.files)?{files:t.files}:{}})},"manage.upsert-card":t=>e.manageUpsertCard({cardId:pe(t,"card_id"),candidateCardContent:ft(t,"candidate_card_content")}),"manage.remove-card":t=>e.manageRemoveCard({cardId:pe(t,"card_id")})}}function qn(e){return {"webhook.process-accumulated":()=>e.webhookProcessAccumulated(),"webhook.source-fetch-done":t=>e.webhookSourceFetchDone({token:pe(t,"token"),ref:pe(t,"ref")}),"webhook.source-fetch-failed":t=>e.webhookSourceFetchFailed({token:pe(t,"token"),reason:pe(t,"reason")})}}function Ln(e){let{boardId:t,uploadCardFile:r,getMcpFacade:n,controlplane:o}=e;function s(i,u){let b=pe(i,"board_id");if(!b)throw Object.assign(new Error(`${u} requires board_id`),{statusCode:400});if(b!==t)throw Object.assign(new Error(`Unknown board_id: ${b}`),{statusCode:400})}function a(i,u){let{cardId:b}=o.requireCardArgs(i),v=pe(i,"turn_id");return s(i,u),n().manageAddChatAttachment({cardId:b,role:pe(i,"role")||"user",...v?{turn:v}:{},files:[{file_name:pe(i,"file_name"),content_type:pe(i,"content_type")||"application/octet-stream",...typeof i.text=="string"?{text:i.text}:{},...typeof i.base64=="string"?{base64:i.base64}:{},...Array.isArray(i.bytes)?{bytes:i.bytes}:{}}]})}return {"list-runtime-cards":i=>(s(i,"list-runtime-cards"),n().listRuntimeCards()),"getstate.is-chat-processing":i=>o.getChatProcessing(i),"setstate.chat-processing-started":i=>o.setChatProcessing(i,true),"setstate.chat-processing-done":i=>o.setChatProcessing(i,false),"getstate.card-meta":i=>o.getCardMeta(i),"setstate.card-meta":i=>o.setCardMeta(i),"manage.upload-card-file":i=>{let u=pe(i,"card_id"),b=pe(i,"file_name"),v=pe(i,"content_type")||"application/octet-stream",l=En(i);if(s(i,"manage.upload-card-file"),!u)throw Object.assign(new Error("manage.upload-card-file requires card_id"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.upload-card-file requires file_name"),{statusCode:400});if(!l)throw Object.assign(new Error("manage.upload-card-file requires args.bytes, args.text, or args.base64"),{statusCode:400});return r(u,b,v,l,{inChat:false})},"manage.add-chat-attachment":i=>a(i,"manage.add-chat-attachment"),"manage.add-chat-attachement":i=>a(i,"manage.add-chat-attachement"),"manage.add-chat-entry-and-any-attachments":i=>{let{cardId:u}=o.requireCardArgs(i),b=pe(i,"role")||"user",v=pe(i,"turn_id");return s(i,"manage.add-chat-entry-and-any-attachments"),n().manageAddChatEntryAndAnyAttachments({cardId:u,role:b,...typeof i.text=="string"?{text:i.text}:{},...v?{turn:v}:{},...Array.isArray(i.files)?{files:i.files}:{}})},"manage.patch-card":i=>{let{cardId:u}=o.requireCardArgs(i);return s(i,"manage.patch-card"),n().managePatchCard({cardId:u,patch:ft(i,"patch")})},"manage.upsert-card":i=>{let{cardId:u}=o.requireCardArgs(i);return s(i,"manage.upsert-card"),n().manageUpsertCard({cardId:u,candidateCardContent:ft(i,"candidate_card_content")})},"manage.remove-card":i=>{let{cardId:u}=o.requireCardArgs(i);return s(i,"manage.remove-card"),n().manageRemoveCard({cardId:u})},"manage.admin-read-card":async i=>{let{cardId:u}=o.requireCardArgs(i);return {status:"success",data:{cards:await n().adminReadCard({cardId:u})}}},"manage.admin-upsert-card":i=>{let u=pe(i,"board_id"),b=pe(i,"card_id");if(!u)throw Object.assign(new Error("manage.admin-upsert-card requires board_id"),{statusCode:400});if(!b)throw Object.assign(new Error("manage.admin-upsert-card requires card_id"),{statusCode:400});if(u!==t)throw Object.assign(new Error(`Unknown board_id: ${u}`),{statusCode:400});return n().adminUpsertCard({cardId:b,candidateCardContent:ft(i,"candidate_card_content")})}}}function Ge(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 Mn(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 Y(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Fe(e){return Array.isArray(e)?e:[]}function _r(e,t){if(typeof t!="string"||t.length===0)return;let r=e,n=t;n.startsWith("fetched_sources.")&&(r=Y(e).fetched_sources,n=n.slice(16));for(let o of n.split(".")){if(r==null||typeof r!="object")return;r=r[o];}return r}function Pr(e,t){let r=Y(e.view),n=Fe(r.elements);return {layout:r.layout,features:r.features,elements:n.map((o,s)=>{let a=Y(o),i=Y(a.data),u=typeof a.visible=="string"?!!_r(t,a.visible):true,b=typeof i.bind=="string"?i.bind:void 0,v=typeof i.maxRows=="number"?i.maxRows:void 0,l=b?_r(t,b):void 0,g={id:typeof a.id=="string"&&a.id?a.id:`element-${s}`,kind:a.kind,label:a.label,visible:u};return l!==void 0&&(g.resolved=Array.isArray(l)&&typeof v=="number"?l.slice(0,v):l),g})}}function Dn(e,t){let r=typeof e.id=="string"&&e.id?e.id:"card",n=Fe(e.provides),o=n.length>0?n:[{bindTo:r,ref:"card_data"}],s={};for(let a of o){let i=Y(a),u=typeof i.bindTo=="string"?i.bindTo:"",b=typeof i.ref=="string"?i.ref:"";if(!u||!b)continue;let v=_r(t,b);v!==void 0&&(s[u]=v);}return s}function Vo(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 Ko(e){return {"card-content":e}}function ar(e){let{meta:t,...r}=e;return r}function Ho(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Go(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function Jo(e,t){let r=Go(e);if(!t||Object.keys(t).length===0)return r;function n(o,s,a){let i=String(s||"").split(".").filter(Boolean);if(!i.length)return;let u=o;for(let b=0;b<i.length-1;b+=1){let v=i[b];(!u[v]||typeof u[v]!="object")&&(u[v]={}),u=u[v];}u[i[i.length-1]]=a;}if(t.fieldValues!==void 0&&t.fieldValues!==null){let o=null,s=Y(r.view),a=Fe(s.elements);for(let i of a){let u=Y(Y(i).data);if(typeof u.writeTo=="string"&&u.writeTo){o=u.writeTo;break}}return o?n(r,o,t.fieldValues):typeof t.fieldValues=="object"&&!Array.isArray(t.fieldValues)&&(r.card_data={...Y(r.card_data),...t.fieldValues}),r}if(Array.isArray(t._stagedFiles)&&t._stagedFiles.length>0)return r;for(let[o,s]of Object.entries(t))o!=="_stagedFiles"&&(s!==null&&typeof s=="object"&&!Array.isArray(s)&&r[o]!==null&&typeof r[o]=="object"&&!Array.isArray(r[o])?r[o]={...r[o],...s}:r[o]=s);return r}function Nn(e){return Y(e.meta).__visible_controlplane_only===true}async function Ct(e,t){let r=await Qe(e.get({params:{id:t}}),"cardStore.get"),n=Array.isArray(r?.cards)?r.cards:[];if(n.length===0)throw new Error(`Card "${t}" not found`);return n[0]}function $n(e){let{board:t,nonCore:r,cardStore:n,chatStore:o,processAccumulated:s,sourceFetchDone:a,sourceFetchFailed:i,uploadCardFile:u,buildFileDownloadUrl:b,readFetchedSourceJsonByRef:v}=e;function l(P,_){if(typeof P=="function")return P;throw new Error(`${_} is not configured for this MCP facade`)}async function g(){let P=await Qe(n.get({}),"cardStore.get");return Array.isArray(P.cards)?P.cards.map(_=>Y(_)):[]}function A(P){if(Array.isArray(P.bytes))return new Uint8Array(P.bytes.map(_=>Math.max(0,Math.min(255,Number(_)||0))));if(typeof P.text=="string")return new TextEncoder().encode(P.text);if(typeof P.base64=="string"){let _=String(P.base64).replace(/-/g,"+").replace(/_/g,"/"),K=_+"=".repeat((4-_.length%4)%4),J=atob(K);return Uint8Array.from(J,Q=>Q.charCodeAt(0))}throw new Error("file entry requires bytes, text, or base64")}async function S(){let P=Y(await Qe(r.describeTaskExecutorCapabilities({}),"describeTaskExecutorCapabilities"));return {version:P.version,commonSourceFields:Y(P.commonSourceDefFields),sourceKinds:Y(P.sourceKinds)}}async function C(){let P=Y(await Qe(t.status({}),"status")),_=Y(P.summary),K=Fe(P.cards);return {meta:Y(P.meta),summary:{card_count:typeof _.card_count=="number"?_.card_count:0,completed:typeof _.completed=="number"?_.completed:0,eligible:typeof _.eligible=="number"?_.eligible:0,pending:typeof _.pending=="number"?_.pending:0,blocked:typeof _.blocked=="number"?_.blocked:0,in_progress:typeof _.in_progress=="number"?_.in_progress:0,failed:typeof _.failed=="number"?_.failed:0,unresolved:typeof _.unresolved=="number"?_.unresolved:0},cards:K.map(J=>{let Q=Y(J);return {"card-id":typeof Q.name=="string"?Q.name:null,status:Q.status??null,error:Q.error??null,requires:Fe(Q.requires),requires_satisfied:Fe(Q.requires_satisfied),requires_missing:Fe(Q.requires_missing),provides_declared:Fe(Q.provides_declared),provides_runtime:Fe(Q.provides_runtime)}})}}async function f(P){let _=String(P.cardId||"").trim();if(!_)throw new Error("inspectCardDefinitionAndRuntime requires cardId");let K=Y(await Qe(t.status({}),"status")),Q=Fe(K.cards).map(Y).find(ne=>ne.name===_);if(!Q)throw new Error(`card "${_}" not found in board status`);let re=Y(await Ct(n,_));if(Nn(re))throw Object.assign(new Error(`card "${_}" not found`),{statusCode:404});let ue=ar(re),ye=Fe(Q.requires_satisfied).filter(ne=>typeof ne=="string"&&!!ne),Be=Fe(Q.provides_runtime).filter(ne=>typeof ne=="string"&&!!ne),Ae=Object.fromEntries(await Promise.all(ye.map(async ne=>[ne,await Qe(t.getOutputsDataObject({params:{key:ne}}),`getOutputsDataObject(${ne})`)]))),Te=Object.fromEntries(await Promise.all(Be.map(async ne=>[ne,await Qe(t.getOutputsDataObject({params:{key:ne}}),`getOutputsDataObject(${ne})`)]))),F=Y(await Qe(t.getOutputsComputedValues({params:{key:_}}),"getOutputsComputedValues")),c=await Qe(t.getOutputsFetchedSources({params:{key:_}}),"getOutputsFetchedSources"),O=Fe(re.source_defs).map(Y),N={};for(let ne of O)typeof ne.bindTo=="string"&&typeof ne.outputFile=="string"&&(N[ne.outputFile]=ne.bindTo);let te={};for(let[ne,le]of Object.entries(c)){let xe=N[ne]??ne;if(!v||typeof le!="string"){te[xe]=null;continue}try{te[xe]=v({cardId:_,ref:le});}catch{te[xe]=null;}}let se={card_data:Y(re.card_data),requires:Ae,fetched_sources:te,computed_values:F};return {cardId:_,card_status_in_board:Q,card_definition_and_static_data:ue,refs_for_fetched_source_files:c,runtime_data:{requires:Ae,provides:Te,computed_values:F,rendered_view:Pr(re,se)}}}async function y(P){let _=String(P.cardId||"").trim();if(!_)throw new Error("inspectChatMessagesOnCards requires cardId");let K=typeof P.turnId=="string"?P.turnId:"",J=P.allTurns===true,Q=typeof P.tailTurnsBeforeId=="string"?P.tailTurnsBeforeId:"",re=J?void 0:P.lastUserTurns??(K?void 0:1),ue=P.tail,ye={...re===void 0?{}:{tailTurns:re},...K?{turnId:K}:{},...J?{allTurns:true}:{},...Q?{tailTurnsBeforeId:Q}:{}},Be=Object.keys(ye).length>0?{params:{cardId:_},body:ye}:{params:{cardId:_}},Ae=Ge(o.readAll(Be),"chatStore.readAll"),Te=Y(await Ct(n,_)),F=Fe(Y(Te.card_data).files).map((N,te)=>({idx:te,stored_name:Y(N).stored_name})).filter(N=>typeof N.stored_name=="string"&&N.stored_name.length>0),O=(Array.isArray(Ae.records)?Ae.records:[]).map(N=>{let se=Y(N.payload),ne={...N},le=typeof N?.role=="string"?N.role:typeof se.role=="string"?String(se.role):"",xe=typeof N?.text=="string"?N.text:typeof se.text=="string"?String(se.text):"";if(le==="system"){let Ce=Vo(xe);if(Ce!==null&&F.some(Le=>Le.idx===Ce)){let Le=`Retrieve using inspect-file-contents --card-id ${_} --file-idx ${Ce}`;ne.retrieval_hint=Le,Object.keys(se).length>0&&typeof N.role!="string"&&(ne.payload={...se,retrieval_hint:Le});}}return ne});return {cardId:_,messages:typeof ue=="number"&&ue>=0?O.slice(-ue):O}}async function B(P){let _=String(P.cardId||"").trim(),K=Number(P.fileIdx);if(!_)throw new Error("inspectFileContents requires cardId");if(!Number.isInteger(K)||K<0)throw new Error("inspectFileContents requires fileIdx to be a non-negative integer");let J=Y(await Ct(n,_)),Q=Fe(Y(J.card_data).files).map(Y);if(K>=Q.length)throw new Error(`attachment index ${K} is out of range for card "${_}"`);let re=Q[K],ue=typeof re.stored_name=="string"?re.stored_name:null;return {cardId:_,fileIdx:K,downloadUrl:b({cardId:_,fileIdx:K,storedName:ue}),...typeof re.name=="string"?{name:re.name}:{},...typeof re.stored_name=="string"?{stored_name:re.stored_name}:{},...typeof re.mime_type=="string"?{mime_type:re.mime_type}:{},...typeof re.size=="number"?{size:re.size}:{},...typeof re.uploaded_at=="string"?{uploaded_at:re.uploaded_at}:{}}}async function R(P){return await r.validateCardPreflight({body:Ko(P.candidateCardContent)})}function I(P){if(!P.mockRequires||typeof P.mockRequires!="object"||Array.isArray(P.mockRequires))throw new Error("preflightMaterializeCandidateCard requires mockRequires");if(!P.mockFetchedSources||typeof P.mockFetchedSources!="object"||Array.isArray(P.mockFetchedSources))throw new Error("preflightMaterializeCandidateCard requires mockFetchedSources");let _=r.evalCardCompute({body:{"card-content":P.candidateCardContent,"mock-requires":P.mockRequires,"mock-fetched-sources":P.mockFetchedSources}});if(_.status!=="success")return _;let K=Y(Mn(_,"evalCardCompute")),J=Y(P.candidateCardContent),Q={card_data:Y(J.card_data),requires:Y(P.mockRequires),fetched_sources:Y(P.mockFetchedSources),computed_values:Y(K.computed_values)};return {status:"success",data:{cardId:typeof K.cardId=="string"?K.cardId:typeof J.id=="string"?J.id:"(unknown)",ok:K.ok===true,computed_values:Y(K.computed_values),errors:Fe(K.errors).map(re=>{let ue=Y(re);return {bindTo:typeof ue.bindTo=="string"?ue.bindTo:"",error:typeof ue.error=="string"?ue.error:""}}),provides_outputs:Dn(J,Q),rendered_view:Pr(J,Q)}}}async function m(P){return await r.probeSourcePreflight({params:{sourceIdx:P.sourceIdx},body:{"card-content":P.candidateCardContent,"mock-projections":P.mockProjections}})}async function p(P){return await r.runSourcePreflight({params:{sourceIdx:P.sourceIdx},body:{"card-content":P.candidateCardContent,"mock-projections":P.mockProjections}})}async function k(P){let _=String(P.cardId||"").trim();if(!_)throw new Error("preflightRunSingleSourceInLiveCard requires cardId");if(!P.mockRequires||typeof P.mockRequires!="object"||Array.isArray(P.mockRequires))throw new Error("preflightRunSingleSourceInLiveCard requires mockRequires");let K=Y(await Ct(n,_)),J=Fe(K.source_defs).filter(re=>!!re&&typeof re=="object"&&!Array.isArray(re)),Q={};if(P.sourceIdx>=0&&P.sourceIdx<J.length){let re=J[P.sourceIdx],ue=Ke.enrichSourcesSync([re],{card_data:Y(K.card_data),requires:P.mockRequires});Array.isArray(ue)&&ue.length>0&&(Q=Y(ue[0]._projections));}return await r.runSourcePreflight({params:{sourceIdx:P.sourceIdx},body:{"card-content":K,"mock-requires":P.mockRequires,"mock-projections":Q}})}async function w(P){let _=Y(await Qe(r.simulateCardCycle({body:{"card-content":P.candidateCardContent,"mock-requires":P.mockRequires}}),"simulateCardCycle")),K=Y(P.candidateCardContent),J=Y(_.validation),Q=Fe(_.source_probes),re=Fe(_.projection_errors),ue=Y(_.fetched_sources),ye=Fe(_.compute_errors),Be=Y(_.computed_values),Ae={card_data:Y(K.card_data),requires:P.mockRequires,fetched_sources:ue,computed_values:Be},Te=[];for(let F of Fe(J.issues))typeof F=="string"&&F&&Te.push(F);for(let F of Q){let c=Y(F),O=typeof c.bindTo=="string"?c.bindTo:"source",N=typeof c.error=="string"?c.error:"";N&&Te.push(`${O}: ${N}`);}for(let F of re){let c=Y(F),O=typeof c.bindTo=="string"?c.bindTo:"source",N=typeof c.key=="string"?c.key:"projection",te=typeof c.error=="string"?c.error:"projection failed";Te.push(`${O}.${N}: ${te}`);}for(let F of ye){let c=Y(F),O=typeof c.bindTo=="string"?c.bindTo:"compute",N=typeof c.error=="string"?c.error:"compute failed";Te.push(`${O}: ${N}`);}return {status:"success",data:{cardId:typeof _.cardId=="string"?_.cardId:"(unknown)",ok:_.ok===true,issues:Te,provides_outputs:Dn(K,Ae),rendered_view:Pr(K,Ae)}}}async function q(P){let _=String(P.cardId||"").trim();if(!_)throw new Error("manageReadCard requires cardId");let K=await Qe(n.get({params:{id:_}}),"cardStore.get"),J=Array.isArray(K.cards)?K.cards.map(Y):[];if(J.some(Nn))throw Object.assign(new Error(`Card "${_}" not found`),{statusCode:404});return J.map(Q=>ar(Q))}async function T(P){let _=await Promise.all(Fe(P.files).map(async K=>{let J=Y(K),Q=String(J.file_name??J.fileName??J.name??"").trim(),re=String(J.content_type??J.contentType??"application/octet-stream");if(!Q)throw new Error("file entry requires file_name");return await u({cardId:P.cardId,fileName:Q,contentType:re,bytes:A(J)})}));return _.forEach((K,J)=>{let Q=Y(K.file),re=typeof K.file_idx=="number"&&Number.isInteger(K.file_idx)&&K.file_idx>=0?K.file_idx:J,ue=P.role==="assistant"?`AI generated: ${String(Q.name||"")} as ${String(Q.stored_name||"")} #${re}`:`file uploaded: ${String(Q.name||"")} as ${String(Q.stored_name||"")} #${re}`;Ge(o.append({params:{cardId:P.cardId},body:{role:"system",text:ue,files:[],turn:P.turn}}),"chatStore.append(system attachment message)");}),_.map(K=>K.file)}async function h(P){let _=String(P.cardId||"").trim(),K=String(P.role||"user").trim()||"user",J=typeof P.turn=="string"?P.turn:"";if(!_)throw new Error("manageAddChatAttachment requires cardId");let Q=await T({cardId:_,role:K,turn:J,files:P.files});return {status:"success",data:{cardId:_,turn:J,files:Q}}}async function U(P){let _=String(P.cardId||"").trim(),K=String(P.role||"").trim(),J=typeof P.text=="string"?P.text:"",Q=typeof P.turn=="string"?P.turn:"";if(!_)throw new Error("manageAddChatEntryAndAnyAttachments requires cardId");if(!K)throw new Error("manageAddChatEntryAndAnyAttachments requires role");if(K==="assistant"&&Q){let ye=Ge(o.readAll({params:{cardId:_},body:{turnId:Q}}),"chatStore.readAll(existing turn messages)"),Be=Array.isArray(ye.records)?ye.records.find(Ae=>Ae.role==="assistant"&&String(Ae.turn||"")===Q):void 0;if(Be)return {status:"success",data:{cardId:_,id:String(Be.id),role:K,turn:Q,files:Array.isArray(Be.files)?Be.files:[]}}}let re=await T({cardId:_,role:K,turn:Q,files:P.files}),ue=Ge(o.append({params:{cardId:_},body:{role:K,text:J,files:re,turn:Q}}),"chatStore.append");return {status:"success",data:{cardId:_,id:String(ue.id),role:K,turn:Q,files:re}}}async function M(P){let _=String(P.cardId||"").trim(),K=Y(P.patch);if(!_)throw new Error("managePatchCard requires cardId");let J=await q({cardId:_}),Q=Y(J[0]),re=Jo(Q,K);return X({cardId:_,candidateCardContent:re})}async function X(P){let _=String(P.cardId||"").trim(),K=Y(P.candidateCardContent),J=ar(K);if(!_)throw new Error("manageUpsertCard requires cardId");if(typeof J.id!="string"||!J.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(J.id!==_)throw new Error(`candidateCardContent.id must match cardId (${_})`);let Q=await R({candidateCardContent:J}),re=Y(Q),ue=Y(re.data);if(re.status!=="success"||ue.isValid!==true)return {status:"fail",step:"validate",validation:Q};let ye=null;try{ye=await Ct(n,_);}catch{ye=null;}let Be=ye&&Ho(Y(ye),"meta")?{...J,meta:Y(ye).meta}:J,Ae=await n.set({body:Be});Ge(Ae,"cardStore.set");let Te;try{Te=await t.upsertCard({params:{cardId:_,restart:!0}}),Ge(Te,"upsertCard");}catch(c){try{ye&&await n.set({body:ye});}catch{}throw c}let F=null;try{F=await t.cardRefreshedNotify({params:{cardId:_}}),Ge(F,"cardRefreshedNotify");}catch{F=null;}return {status:"success",data:{validation:Q,card_saved:null,board_result:Te,refresh_notify:F}}}async function L(P){let _=String(P.cardId||"").trim();if(!_)throw new Error("manageRemoveCard requires cardId");let K=await t.removeCard({params:{id:_}});Ge(K,"removeCard");let J=await n.del({params:{id:_}});return Ge(J,"cardStore.del"),{status:"success",data:{board_result:K,store_result:J}}}async function j(P){let _=String(P.cardId||"").trim();if(!_)throw new Error("adminReadCard requires cardId");let K=await Qe(n.get({params:{id:_}}),"cardStore.get");return Array.isArray(K.cards)?K.cards.map(J=>Y(J)):[]}async function H(P){let _=String(P.cardId||"").trim(),K=Y(P.candidateCardContent),J=ar(K);if(!_)throw new Error("adminUpsertCard requires cardId");if(typeof J.id!="string"||!J.id.trim())throw new Error("candidateCardContent.id must be a non-empty string");if(J.id!==_)throw new Error(`candidateCardContent.id must match cardId (${_})`);let Q=await R({candidateCardContent:J}),re=Y(Q),ue=Y(re.data);if(re.status!=="success"||ue.isValid!==true)return {status:"fail",step:"validate",validation:Q};let ye=null;try{ye=await Ct(n,_);}catch{ye=null;}let Be=ye?Y(Y(ye).meta):{},Ae={...J,meta:{...Be,__visible_controlplane_only:true}},Te=await n.set({body:Ae});Ge(Te,"cardStore.set");let F;try{F=await t.upsertCard({params:{cardId:_,restart:!0}}),Ge(F,"upsertCard");}catch(O){try{ye&&await n.set({body:ye});}catch{}throw O}let c=null;try{c=await t.cardRefreshedNotify({params:{cardId:_}}),Ge(c,"cardRefreshedNotify");}catch{c=null;}return {status:"success",data:{validation:Q,card_saved:null,board_result:F,refresh_notify:c}}}function D(P){let _=String(P.cardId||"").trim();if(!_)throw new Error("getChatProcessing requires cardId");let K=Mn(o.isProcessing({params:{cardId:_}}),"chatStore.isProcessing");return {cardId:_,active:!!K.active}}function $(P){let _=String(P.cardId||"").trim();if(!_)throw new Error("setChatProcessing requires cardId");if(typeof P.active!="boolean")throw new Error("setChatProcessing requires boolean active");return Ge(o.setProcessing({params:{cardId:_},body:{active:P.active}}),"chatStore.setProcessing"),{cardId:_,active:P.active}}async function G(){let P=await l(s,"webhook.process-accumulated")();return P?.status==="fail"||P?.status==="error"?P:{status:"success",data:{runtime_result:Object.prototype.hasOwnProperty.call(P??{},"data")?P.data??null:null}}}async function ee(P){let _=String(P.token||"").trim(),K=String(P.ref||"").trim();if(!_)throw new Error("webhookSourceFetchDone requires token");if(!K)throw new Error("webhookSourceFetchDone requires ref");let J=await l(a,"webhook.source-fetch-done")({token:_,ref:K});return J?.status==="fail"||J?.status==="error"?J:{status:"success",data:{token:_,ref:K,runtime_result:Object.prototype.hasOwnProperty.call(J??{},"data")?J.data??null:null}}}async function ce(P){let _=String(P.token||"").trim(),K=String(P.reason||"").trim();if(!_)throw new Error("webhookSourceFetchFailed requires token");if(!K)throw new Error("webhookSourceFetchFailed requires reason");let J=await l(i,"webhook.source-fetch-failed")({token:_,reason:K});return J?.status==="fail"||J?.status==="error"?J:{status:"success",data:{token:_,reason:K,runtime_result:Object.prototype.hasOwnProperty.call(J??{},"data")?J.data??null:null}}}return {listRuntimeCards:g,discoverSourceKinds:S,inspectBoardRuntimeStatus:C,inspectCardDefinitionAndRuntime:f,inspectChatMessagesOnCards:y,inspectFileContents:B,preflightValidateCandidateCardDefinition:R,preflightMaterializeCandidateCard:I,preflightProbeSingleSourceInCandidateCard:m,preflightRunSingleSourceInCandidateCard:p,preflightRunSingleSourceInLiveCard:k,preflightRunOneCycleWithCandidateCard:w,manageReadCard:q,manageAddChatAttachment:h,manageAddChatEntryAndAnyAttachments:U,managePatchCard:M,manageUpsertCard:X,manageRemoveCard:L,adminReadCard:j,adminUpsertCard:H,getChatProcessing:D,setChatProcessing:$,webhookProcessAccumulated:G,webhookSourceFetchDone:ee,webhookSourceFetchFailed:ce}}async function Qe(e,t){return Ge(await e,t)}function Un(e){let{boardContexts:t,cardOwnerIndex:r,cardContextForCard:n,readStatusSnapshot:o,readDataObjectsByToken:s,readCardRuntimeArtifacts:a,readCardFromStore:i,readCardDefinitions:u,processAccumulatedLaneInternal:b,reportSourceFetched:v,reportSourceFetchFailure:l,uploadCardFile:g,chatStorePublic:A,serverUrl:S,apiBasePath:C}=e;function f(){return t[0]??null}function y(){return {async status(){let m=await o();return m==null?{status:"fail",error:"Board status is unavailable"}:{status:"success",data:m}},async getOutputsDataObject(m){let p=m?.params?.key;return p?{status:"success",data:(await s())[p]}:{status:"fail",error:"getOutputsDataObject requires params.key"}},async getOutputsComputedValues(m){let p=m?.params?.key;return p?{status:"success",data:(await a())[p]?.computed_values}:{status:"fail",error:"getOutputsComputedValues requires params.key"}},async getOutputsFetchedSources(m){let p=m?.params?.key;if(!p)return {status:"fail",error:"getOutputsFetchedSources requires params.key"};let k=n(p)??f();return k?k.boardOps.getOutputsFetchedSources({params:{key:p}}):{status:"fail",error:"Board context is unavailable"}},async removeCard(m){let p=m?.params?.id;if(!p)return {status:"fail",error:"removeCard requires params.id"};let k=n(p)??f();return k?k.boardOps.removeCard({params:{id:p}}):{status:"fail",error:"Board context is unavailable"}},async cardRefreshedNotify(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"cardRefreshedNotify requires params.cardId"};let k=n(p)??f();return k?k.boardOps.cardRefreshedNotify({params:{cardId:p}}):{status:"fail",error:"Board context is unavailable"}},async upsertCard(m){let p=m?.params?.cardId;if(!p)return {status:"fail",error:"upsertCard requires params.cardId"};let k=n(p)??f();if(!k)return {status:"fail",error:"Board context is unavailable"};let w=await k.boardOps.upsertCard({params:{cardId:p,restart:m.params.restart===true}});if(w.status!=="success")return w;if(Ze(k.boardAdapter)){let q=await b(true);if(q.status!=="success")return q}return w}}}function B(){let m=()=>{let p=f();if(!p?.nonCore)throw new Error("Board non-core adapter is not configured for MCP preflight/discovery tools");return p.nonCore};return {describeTaskExecutorCapabilities(p){return m().describeTaskExecutorCapabilities(p)},validateCardPreflight(p){return m().validateCardPreflight(p)},evalCardCompute(p){return m().evalCardCompute(p)},probeSourcePreflight(p){return m().probeSourcePreflight(p)},runSourcePreflight(p){return m().runSourcePreflight(p)},simulateCardCycle(p){return m().simulateCardCycle(p)}}}function R(){return {async get(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(p){let k=await i(p);return k?{status:"success",data:{cards:[k]}}:{status:"success",data:{cards:[]}}}return {status:"success",data:{cards:await u()}}},async set(m){let p=m.body;if(p==null)return {status:"fail",error:"set requires a body (card object or array of cards)"};let k=Array.isArray(p)?p:[p];for(let w of k){let q=w,T=typeof q.id=="string"?q.id:"";if(!T)return {status:"fail",error:"each card must have a string `id` field"};let h=r.get(T)??0,U=t[h]??f();if(!U)return {status:"fail",error:"Board context is unavailable"};let M=await U.cardStoreOps.set({body:q});if(M.status!=="success")return M;r.set(T,h);}return {status:"success",data:{count:k.length}}},async del(m){let p=[m.params?.id,...m.body?.ids??[]].filter(k=>typeof k=="string"&&!!k);if(p.length===0)return {status:"fail",error:"del requires body.ids (string[]) or params.id"};for(let k of p){let w=n(k)??f();if(!w)return {status:"fail",error:"Board context is unavailable"};let q=await w.cardStoreOps.del({params:{id:k}});if(q.status!=="success")return q;r.delete(k);}return {status:"success",data:{count:p.length}}},async patch(m){let p=typeof m.params?.id=="string"?m.params.id:void 0,k=typeof m.params?.path=="string"?m.params.path:void 0;if(!p||!k)return {status:"fail",error:"patch requires params.id and params.path"};let w=n(p)??f();return w?w.cardStoreOps.patch(m):{status:"fail",error:"Board context is unavailable"}},async appendFiles(m){let p=typeof m.params?.id=="string"?m.params.id:void 0;if(!p)return {status:"fail",error:"appendFiles requires params.id"};let k=n(p)??f();return k?k.cardStoreOps.appendFiles(m):{status:"fail",error:"Board context is unavailable"}}}}function I(){return $n({board:y(),nonCore:B(),cardStore:R(),chatStore:A,processAccumulated:()=>b(true),sourceFetchDone:({token:m,ref:p})=>v(m,p),sourceFetchFailed:({token:m,reason:p})=>l(m,p),uploadCardFile({cardId:m,fileName:p,contentType:k,bytes:w}){return g(m,p,k,w,{inChat:true})},buildFileDownloadUrl({cardId:m,fileIdx:p,storedName:k}){let w=`${S||""}${C}/cards/${encodeURIComponent(m)}/files/${p}`;return k?`${w}?sn=${encodeURIComponent(k)}`:w},readFetchedSourceJsonByRef({cardId:m,ref:p}){let k=n(m)??f();if(!k||Ze(k.boardAdapter))return null;let T=k.boardAdapter.resolveBlob(Xe(p)).trim();return T?JSON.parse(T):null}})}return {mcpBoardFacade:y,mcpNonCoreFacade:B,mcpCardStoreFacade:R,createMcpFacade:I}}function Vn(e){let{apiBasePath:t,json:r,readJsonBody:n,bootstrapBoard:o,createMcpFacade:s,createMcpToolRegistry:a,resolveCardFileDownloadPayload:i,isLikelyTextMimeType:u,sliceTextByLines:b}=e;async function v(l,g,A){let S=l.method||"GET",C=A,f=C.pathname;try{if(S==="POST"&&f===`${t}/mcp`){await o();let y=await n(l),B=typeof y.tool=="string"?y.tool.trim():"",R=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!B)return r(g,400,{error:"tool is required"}),!0;if(B==="inspect.file-contents")return r(g,400,{error:"inspect.file-contents is only available on /mcp-raw"}),!0;try{let I=await ht(B,R,a(s()));if(I&&typeof I=="object"&&!Array.isArray(I)){let m=I;if(m.status==="fail")return r(g,400,{error:rt(I,"Request failed")}),!0;if(m.status==="error")return r(g,500,{error:rt(I,"Internal error")}),!0}r(g,200,I);}catch(I){let m=typeof I?.statusCode=="number"?Number(I.statusCode):500,p=I instanceof Error?I.message:String(I);r(g,m,{error:p});}return !0}if(S==="POST"&&f===`${t}/mcp-raw`){await o();let y=await n(l),B=typeof y.tool=="string"?y.tool.trim():"",R=y.args&&typeof y.args=="object"&&!Array.isArray(y.args)?y.args:{};if(!B)return r(g,400,{error:"tool is required"}),!0;if(B!=="inspect.file-contents")return r(g,400,{error:`Tool does not support raw response: ${B}`}),!0;let I=pe(R,"card_id","cardId"),m=tt(R,"file_idx","fileIdx"),p=tt(R,"head-lines","headLines"),k=tt(R,"tail-lines","tailLines"),w=tt(R,"head-bytes","headBytes"),q=tt(R,"tail-bytes","tailBytes");if(!I)return r(g,400,{error:"inspect.file-contents requires card_id"}),!0;if(m===void 0||!Number.isInteger(m)||m<0)return r(g,400,{error:"inspect.file-contents requires file_idx to be a non-negative integer"}),!0;if([p,k,w,q].filter(G=>G!==void 0).length>1)return r(g,400,{error:"inspect.file-contents accepts at most one of head-lines, tail-lines, head-bytes, tail-bytes"}),!0;for(let[G,ee]of [["head-lines",p],["tail-lines",k],["head-bytes",w],["tail-bytes",q]])if(ee!==void 0&&(!Number.isInteger(ee)||ee<0))return r(g,400,{error:`inspect.file-contents requires ${G} to be a non-negative integer`}),!0;let h=await s().inspectFileContents({cardId:I,fileIdx:m}),U=typeof h?.stored_name=="string"?h.stored_name:null,{fileRecord:M,bytes:X}=await i(I,m,U),L=String(M.name||M.stored_name||"download.bin"),j=String(M.mime_type||"application/octet-stream"),H=(C.searchParams.get("resp")||"").trim().toLowerCase();if(H&&H!=="json-b64")return r(g,400,{error:`unsupported resp mode: ${H}`}),!0;let D=H==="json-b64",$;if(p!==void 0||k!==void 0){if(!u(j))return r(g,400,{error:"head-lines/tail-lines are only supported for text-like files; use head-bytes/tail-bytes for binary content"}),!0;let G=new TextDecoder().decode(X),ee=p!==void 0?b(G,"head",p):b(G,"tail",k);$=typeof Buffer<"u"?Buffer.from(ee,"utf8"):new TextEncoder().encode(ee);}else if(w!==void 0||q!==void 0){let G=w??q;$=w!==void 0?X.slice(0,G):X.slice(Math.max(0,X.length-G));}else $=X;if(D){let G=typeof Buffer<"u"?Buffer.from($).toString("base64"):btoa(String.fromCharCode(...$));return r(g,200,{bodyBase64:G,mimeType:j,filename:L,byteLength:$.length}),!0}return g.writeHead(200,{"Content-Type":j,"Content-Disposition":`attachment; filename="${L}"`,"Content-Length":$.length}),g.end($),!0}return !1}catch(y){let B=y?.statusCode||500;return r(g,B,{error:String(y?.message||y)}),true}}return {handleAgentfaceApi:v}}function Kn(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,createMcpWebhookToolRegistry:s}=e;async function a(i,u,b){let v=i.method||"GET",l=b.pathname;try{if(v==="POST"&&l===`${t}/mcp-webhooks`){await o();let g=await n(i),A=typeof g.tool=="string"?g.tool.trim():"",S=g.args&&typeof g.args=="object"&&!Array.isArray(g.args)?g.args:{};if(!A)return r(u,400,{error:"tool is required"}),!0;try{let C=await ht(A,S,s());if(C&&typeof C=="object"&&!Array.isArray(C)){let f=C;if(f.status==="fail")return r(u,400,{error:rt(C,"Request failed")}),!0;if(f.status==="error")return r(u,500,{error:rt(C,"Internal error")}),!0}r(u,200,C);}catch(C){let f=typeof C?.statusCode=="number"?Number(C.statusCode):500,y=C instanceof Error?C.message:String(C);r(u,f,{error:y});}return !0}return !1}catch(g){let A=g?.statusCode||500;return r(u,A,{error:String(g?.message||g)}),true}}return {handleWebhooksApi:a}}function Hn(e){let{sseHub:t,corsHeaders:r,json:n,buildPublishedRuntimePayload:o,onSseClientConnected:s,onChannelSubscribed:a,onChannelUnsubscribed:i}=e;function u(v,l,g,A,S){if(!t.has(l)){n(v,404,{error:`SSE client not connected: ${l}`});return}S?a?.(l,g,A):i?.(l,g,A),n(v,200,{ok:true,clientId:l,channelName:g,...A.cardId?{cardId:A.cardId}:{},subscribed:S});}async function b(v,l,g){let A=t.get(g),S=A?new Set(A.subscribedChatCardIds):new Set;l.writeHead(200,{...r,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),t.flushTransport(l),t.register(g,l,S);let C=await o(),f=t.buildFrame(C);l.write(f);try{s?.(g,B=>{t.writeFrame(g,B);});}catch{}let y=setInterval(()=>{try{l.write(`: keepalive
5
+
6
+ `);}catch{}},15e3);v.on("close",()=>{clearInterval(y),t.disconnect(g,l);});}return {handleChannelSubscription:u,handleSse:b}}function Gn(e){let{apiBasePath:t,json:r,readJsonBody:n,initBoardAndSetup:o,bootstrapBoard:s,boardContexts:a,publishPersistedStateSnapshot:i,upsertCardsFromSource:u,sseHub:b}=e,{handleSse:v,handleChannelSubscription:l}=Hn(e);async function g(A,S,C){let f=A.method||"GET",y=C,B=y.pathname;try{if(f==="GET"&&B===`${t}/sse`){await o();let k=String(y.searchParams.get("clientId")||"").trim();if(!k)return r(S,400,{error:"clientId query param is required for SSE"}),!0;await v(A,S,k);for(let w=0;w<a.length;w++)await i(a[w]),await u(a[w],w),await i(a[w]);return !0}let R=B.match(new RegExp(`^${Ve(t)}/cards/([^/]+)/chats/subscribe-sse$`));if(f==="POST"&&R){await s();let k=decodeURIComponent(R[1]),w=await n(A),q=typeof w?.clientId=="string"?w.clientId.trim():"";return q?b.subscribeChat(q,k)?(r(S,200,{ok:!0,clientId:q,cardId:k,subscribed:!0}),!0):(r(S,404,{error:`SSE client not connected: ${q}`}),!0):(r(S,400,{error:"clientId is required"}),!0)}let I=B.match(new RegExp(`^${Ve(t)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(f==="POST"&&I){await s();let k=decodeURIComponent(I[1]),w=await n(A),q=typeof w?.clientId=="string"?w.clientId.trim():"";return q?b.unsubscribeChat(q,k)?(r(S,200,{ok:!0,clientId:q,cardId:k,subscribed:!1}),!0):(r(S,404,{error:`SSE client not connected: ${q}`}),!0):(r(S,400,{error:"clientId is required"}),!0)}let m=B.match(new RegExp(`^${Ve(t)}/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&m){await s();let k=decodeURIComponent(m[1]),w=m[2]==="subscribe",q=await n(A),T=typeof q?.clientId=="string"?q.clientId.trim():"";return T?(l(S,T,k,{},w),!0):(r(S,400,{error:"clientId is required"}),!0)}let p=B.match(new RegExp(`^${Ve(t)}/cards/([^/]+)/watch-channel/([^/]+)/(subscribe|unsubscribe)-sse$`));if(f==="POST"&&p){await s();let k=decodeURIComponent(p[1]),w=decodeURIComponent(p[2]),q=p[3]==="subscribe",T=await n(A),h=typeof T?.clientId=="string"?T.clientId.trim():"";return h?(l(S,h,w,{cardId:k},q),!0):(r(S,400,{error:"clientId is required"}),!0)}return !1}catch(R){let I=R?.statusCode||500;return r(S,I,{error:String(R?.message||R)}),true}}return {handleWatchersRoutes:g,handleSse:v,handleChannelSubscription:l}}var Wn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Jn="chat-handler-flow-queue";function Wo(e){let t=String(e.apiBasePath||"/api/board").replace(/\/$/,""),r={...Wn,...e.corsHeaders||{}},n=e.queueLaneTuning??{},o=e.boardId||"",s=e.logger||{info:console.log,warn:console.warn,error:console.error},a=e.invocationAdapter,i=e.chatFlowRunner||null,u=e.chatStorage??In(),b=Tn(u),v=e.notificationTransport||null,l=e.serverUrl||null,g=e.executionExtra||{},A=e.onSseClientConnected,S=e.onSseClientDisconnected,C=e.onChannelSubscribed,f=e.onChannelUnsubscribed,y=_n({chatStorage:u,readChatRecords:d=>le(d),onSseClientDisconnected:S});function B(d){function x(z){if(Array.isArray(z))return z;if(z&&typeof z=="object"){let de=z;return Array.isArray(de.files)?de.files:[z]}return null}function E(z){return {async get(de){return z.get(de)},async set(de){return z.set(de)},async del(de){return z.del(de)},async patch(de){return z.patch(de)},async appendFiles(de){return z.appendFiles(de)}}}function W(z){function de(Ie){return {status:"success",data:Ie}}function ke(Ie){return {status:"fail",error:Ie}}function he(Ie){return {status:"error",error:Ie instanceof Error?Ie.message:String(Ie)}}return {async get(Ie){try{let we=Ie.params?.id;if(we){let qe=await z.readCard(we);return qe?de({cards:[qe]}):ke(`card "${we}" not found`)}return de({cards:await z.readAllCards()})}catch(we){return he(we)}},async set(Ie){try{let we=Ie.body;if(we==null)return ke("set requires a body (card object or array of cards)");let qe=Array.isArray(we)?we:[we];for(let Me of qe){if(typeof Me.id!="string")return ke("each card must have a string `id` field");await z.writeCard(Me.id,Me);}return de({count:qe.length})}catch(we){return he(we)}},async del(Ie){try{let we=Ie.body?.ids??[],qe=Ie.params?.id,Me=qe?[...we,qe]:we;if(Me.length===0)return ke("del requires body.ids (string[]) or params.id");for(let yt of Me)await z.removeCard(yt);return de({count:Me.length})}catch(we){return he(we)}},async patch(Ie){try{let we=Ie.params?.id,qe=Ie.params?.path;if(!we)return ke("patch requires params.id");if(!qe)return ke("patch requires params.path");let Me=Ie.body,yt=Me&&Object.prototype.hasOwnProperty.call(Me,"value")?Me.value:Ie.body;return await z.patchCard(we,qe,yt),de({count:1})}catch(we){return he(we)}},async appendFiles(Ie){try{let we=Ie.params?.id;if(!we)return ke("appendFiles requires params.id");let qe=await z.readCard(we);if(!qe)return ke(`card "${we}" not found`);let Me=x(Ie.body);if(!Me||Me.length===0)return ke("appendFiles requires a file metadata object, array, or body.files array");let yt=qe.card_data&&typeof qe.card_data=="object"&&!Array.isArray(qe.card_data)?qe.card_data:{},Or=Array.isArray(yt.files)?yt.files:[],Qn=[...Or,...Me];return await z.patchCard(we,"card_data.files",Qn),de({files_added:Me.map((zn,Yn)=>({idx:Or.length+Yn,entry:zn}))})}catch(we){return he(we)}}}}let V=Ze(d.boardAdapter)?Sn(d.baseRef,d.boardAdapter):mn(d.baseRef,d.boardAdapter),oe=d.nonCoreAdapter??(!Ze(d.boardAdapter)&&p(d.boardAdapter)?d.boardAdapter:null),me=oe?gn(d.baseRef,oe):null,Oe,be=Ze(d.boardAdapter)?(()=>{let z=nr(rr(tr(d.boardAdapter.kvStorageForRef(d.cardStoreRef)),d.boardAdapter.hashFn),s.warn),de=W(z);return Oe={get(ke){return de.get(ke)},set(ke){return de.set(ke)}},de})():(()=>{let z=d.boardAdapter.kvStorageForRef(d.cardStoreRef),ke=Yt(It({readIndex:()=>z.read("_index"),writeIndex:he=>z.write("_index",he),readCard:he=>z.read(he),writeCard:(he,Ie)=>(z.write(he,Ie),he),removeCard:he=>{z.delete(he);},cardExists:he=>z.read(he)!==null,defaultCardKey:he=>he},s.warn));return Oe=ke,E(ke)})(),je=d.artifactsAdapter||d.boardAdapter,Ee=d.filesArtifactsStore??null,$e=Ee?{putBytes(z,de,ke){Ee.putBytes(z,de,ke);},getBytes(z){return Ee.getBytes(z)},listKeys(z){return Ee.list(z).map(de=>de.key)}}:null;if(!$e&&!Ze(je)){let z=d.artifactsAdapter?je.blobStorage(""):je.blobStorage("files"),de=An(z);$e={putBytes(ke,he,Ie){de.putBytes(ke,he,Ie);},getBytes(ke){return de.getBytes(ke)},listKeys(ke){return de.list(ke).map(he=>he.key)}};}else if(!$e&&Ze(je)){let z=d.artifactsAdapter?je.blobStorage(""):je.blobStorage("files");$e={async putBytes(de,ke){if(z.writeBytes){await z.writeBytes(de,ke);return}let he=JSON.stringify({__kind:"bytes-array",data:[...ke]});await z.write(de,he);},async getBytes(de){if(z.readBytes){let he=await z.readBytes(de);if(he!==null)return he}let ke=await z.read(de);if(ke===null)return null;try{let he=JSON.parse(ke);if(he&&he.__kind==="bytes-array"&&Array.isArray(he.data))return new Uint8Array(he.data)}catch{}return new TextEncoder().encode(ke)},async listKeys(de){return await z.listKeys(de)}};}let Je={async init(z){return V.init(z)},async status(z){return V.status(z)},async getConfig(z){return V.getConfig(z)},async getAllOutputsDataObjects(z){return V.getAllOutputsDataObjects(z)},async getAllOutputsComputedValues(z){return V.getAllOutputsComputedValues(z)},async getOutputsFetchedSources(z){return V.getOutputsFetchedSources(z)},async upsertCard(z){return V.upsertCard(z)},async removeCard(z){return V.removeCard(z)},async cardRefreshedNotify(z){return V.cardRefreshedNotify(z)},async sourceDataFetched(z){return V.sourceDataFetched(z)},async sourceDataFetchFailure(z){return V.sourceDataFetchFailure(z)}};return {label:d.label,board:V,nonCore:me,publicCardStore:Oe,boardOps:Je,cardStoreOps:be,get filesArtifacts(){return $e},boardAdapter:d.boardAdapter,cardStoreRef:d.cardStoreRef,outputsStoreRef:d.outputsStoreRef,artifactsStoreRef:d.artifactsStoreRef,chatStoreRef:d.chatStoreRef,scratchStoreRef:d.scratchStoreRef,archiveStoreRef:d.archiveStoreRef,notifyRef:d.notifyRef,taskExecutorRef:d.taskExecutorRef,chatHandlerRef:d.chatHandlerRef,chatHandlerFlow:d.chatHandlerFlow,inferenceAdapterRef:d.inferenceAdapterRef,notification:Pn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let R=e.boards.map(B),I=new Map;function m(d){return I.get(d)??0}function p(d){let x=d;return typeof x.invokeExecutor=="function"&&typeof x.validateSchema=="function"}function k(d){let x=R[m(d)];return {files:x?x.filesArtifacts:null}}function w(){return xn()}function q(d){return String(d||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function T(d){if(!d||d.notificationTeardown||!v||!d.notifyRef)return;let x=await v.subscribe(d.notifyRef,E=>{vr(d.notification,E);let W=E.kind==="notification-batch"?E.notifications:[E];y.broadcastNotificationBatch(W);});d.notificationTeardown=x;}async function h(d){if(!d||d.initialized)return;let x={cardStoreRef:d.cardStoreRef,outputsStoreRef:d.outputsStoreRef};d.artifactsStoreRef&&(x.artifactsStoreRef=d.artifactsStoreRef),d.chatStoreRef&&(x.chatStoreRef=d.chatStoreRef),d.scratchStoreRef&&(x.scratchStoreRef=d.scratchStoreRef),d.archiveStoreRef&&(x.archiveStoreRef=d.archiveStoreRef);let E={};d.taskExecutorRef&&(E["task-executor-ref"]=d.taskExecutorRef),d.chatHandlerFlow!==void 0&&(E["chat-handler-flow"]=d.chatHandlerFlow),d.inferenceAdapterRef&&(E["inference-adapter-ref"]=d.inferenceAdapterRef);let W=await d.boardOps.init({params:x,body:E});if(W.status!=="success")throw Object.assign(new Error(W.error||`init failed for ${d.label}`),{statusCode:500});if(await T(d),!d.chatHandlerFlow&&d.chatHandlerRef&&a.describe)try{let V=await a.describe(d.chatHandlerRef);V&&V.kind!=="chat-handler"?s.warn(`[init] chat-handler describe returned kind="${V.kind}", expected "chat-handler" for ${d.label}`):V&&s.info(`[init] chat-handler validated: ${V.name} (protocol ${V.protocolVersion}) for ${d.label}`);}catch(V){s.warn(`[init] chat-handler describe failed for ${d.label}: ${V?.message||String(V)}`);}d.initialized=true;}async function U(d){if(!d.boardAdapter.publishBoardChangeNotifications)return;let x=[],E=await d.boardOps.status({});E.status==="success"&&E.data!=null&&br(E.data)&&x.push({kind:"status",status:E.data});let W=await d.boardOps.getAllOutputsDataObjects({});if(W.status==="success"&&W.data!=null)for(let[oe,me]of Object.entries(W.data))oe&&x.push({kind:"data_object",key:oe,payload:me});let V=await d.boardOps.getAllOutputsComputedValues({});if(V.status==="success"&&V.data!=null)for(let[oe,me]of Object.entries(V.data))oe&&x.push({kind:"computed_values",cardId:oe,values:me});x.length>0&&d.boardAdapter.publishBoardChangeNotifications(x);}async function M(d,x){if(!d||d.cardsBootstrapped)return;let E=await d.cardStoreOps.get({}),W=E.status==="success"&&Array.isArray(E.data?.cards)?E.data.cards:[];for(let V of W)typeof V.id=="string"&&(I.set(V.id,x),await d.boardOps.upsertCard({params:{cardId:V.id}}));d.cardsBootstrapped=true;}async function X(){for(let d of R)await h(d);}async function L(){await X();for(let d=0;d<R.length;d++)await U(R[d]),await M(R[d],d),await U(R[d]);}async function j(d=false){d||await X();for(let x of R){let E=await x.board.processAccumulatedEvents({});if(E.status!=="success")return E}return {status:"success"}}async function H(){return await X(),j(true)}function D(d){return R[m(d)]??null}async function $(d){let x=D(d);if(!x)return null;let E=await x.cardStoreOps.get({params:{id:d}});if(E.status!=="success")return null;let W=Array.isArray(E.data?.cards)?E.data.cards:[];return W.length>0?W[0]:null}async function G(){let d=async E=>{if(!E)return [];let W=await E.cardStoreOps.get({});return W.status!=="success"||!Array.isArray(W.data?.cards)?[]:W.data.cards},x=[];for(let E of R)x.push(...await d(E));return x}function ee(){return R[0]??null}let ce=Un({boardContexts:R,cardOwnerIndex:I,cardContextForCard:d=>D(d),readStatusSnapshot:()=>ye(),readDataObjectsByToken:()=>Ae(),readCardRuntimeArtifacts:()=>Be(),readCardFromStore:d=>$(d),readCardDefinitions:()=>G(),processAccumulatedLaneInternal:d=>j(d),reportSourceFetched:(d,x)=>dr(d,{ref:x}),reportSourceFetchFailure:(d,x)=>mt(d,{reason:x}),uploadCardFile:(d,x,E,W,V)=>Ce(d,x,E,W,V),chatStorePublic:b,serverUrl:l,apiBasePath:t}),P=ce.mcpCardStoreFacade,_=ce.createMcpFacade,K=On({boardId:o,getMcpFacade:()=>_(),getMcpCardStoreFacade:()=>P()});function J(d){return jn(d)}function Q(){return qn(_())}function re(){return Ln({boardId:o,uploadCardFile:Ce,getMcpFacade:()=>_(),controlplane:K})}let ue=Bn({boardId:o,boardContexts:R,readCardDefinitions:()=>G(),readChatRecords:d=>le(d),getChatProcessing:d=>_().getChatProcessing({cardId:d}).active}),ye=ue.readStatusSnapshot,Be=ue.readCardRuntimeArtifacts,Ae=ue.readDataObjectsByToken,Te=ue.buildPublishedRuntimePayload;async function F(d,x,E){let W=E?.syncBoard!==false,V=E?.restartOnlyIfChanged===true,oe=D(d);if(!oe)throw Object.assign(new Error(`Card not found: ${d}`),{statusCode:404});let me=await $(d);if(!me)throw Object.assign(new Error(`Card not found: ${d}`),{statusCode:404});let Oe=V?JSON.stringify(me):null,be=x(me)||me;if(V&&JSON.stringify(be)===Oe)return;let je=await oe.cardStoreOps.set({body:be});if(je.status!=="success")throw Object.assign(new Error(je.error||`Failed to persist card: ${d}`),{statusCode:500});if(W){let Ee=await oe.boardOps.upsertCard({params:{cardId:d,restart:true}});if(Ee.status!=="success")throw Object.assign(new Error(Ee.error||`Failed to upsert card: ${d}`),{statusCode:500})}}async function c(d,x){await F(d,x,{syncBoard:true});}async function O(d,x){await F(d,x,{syncBoard:false});}async function N(d){let x=D(d);if(!x)throw Object.assign(new Error(`Card not found: ${d}`),{statusCode:404});if(!await $(d))throw Object.assign(new Error(`Card not found: ${d}`),{statusCode:404});let W=await x.boardOps.upsertCard({params:{cardId:d,restart:true}});if(W.status!=="success")throw Object.assign(new Error(W.error||`Failed to retrigger card: ${d}`),{statusCode:500})}async function te(d,x){await F(d,E=>{if(!x||typeof x!="object"||Object.keys(x).length===0)return E;function W(V,oe,me){let Oe=String(oe||"").split(".").filter(Boolean);if(!Oe.length)return;let be=V;for(let je=0;je<Oe.length-1;je++){let Ee=Oe[je];(!be[Ee]||typeof be[Ee]!="object")&&(be[Ee]={}),be=be[Ee];}be[Oe[Oe.length-1]]=me;}if(x.fieldValues!==void 0&&x.fieldValues!==null){let V=null,oe=E.view;if(oe&&Array.isArray(oe.elements)){for(let me of oe.elements)if(me?.data&&me.data.writeTo){V=me.data.writeTo;break}}V?W(E,V,x.fieldValues):typeof x.fieldValues=="object"&&!Array.isArray(x.fieldValues)&&(E.card_data={...E.card_data||{},...x.fieldValues});}else {if(Array.isArray(x._stagedFiles)&&x._stagedFiles.length>0)return E;for(let[V,oe]of Object.entries(x))V!=="_stagedFiles"&&(oe!==null&&typeof oe=="object"&&!Array.isArray(oe)&&E[V]!==null&&typeof E[V]=="object"&&!Array.isArray(E[V])?E[V]={...E[V],...oe}:E[V]=oe);}return E},{syncBoard:true,restartOnlyIfChanged:true});}function se(d){u.clear(d);try{_().setChatProcessing({cardId:d,active:!1});}catch{}}function ne(d,x,E,W,V=""){let oe=typeof E=="string"?E.trim():"";return u.append(d,x||"system",oe,W,V)}function le(d){return u.readAll(d)}let Ce=Fn({safeCardId:d=>q(d),artifactsStores:d=>k(d),cardFileMetadataStore:()=>w(),readCardFromStore:d=>$(d),updateCardLocalOnly:(d,x)=>O(d,x),writeChatRecord:(d,x,E,W,V)=>ne(d,x,E,W,V)}).uploadCardFile;async function Ue(d){let x=D(d);if(!x)return null;let E=await x.boardOps.getConfig({params:{key:"chat-handler-flow"}}),W=E.status==="success"?E.data?.value:null,V=x.chatHandlerRef;return W==null&&(!V||typeof V!="object")?null:{ctx:x,handlerFlow:W,handlerRef:V}}async function Le(d,x,E=false,W=""){let V=await Ue(d);if(!V)return;let{ctx:oe,handlerFlow:me,handlerRef:Oe}=V;if(!E)try{_().setChatProcessing({cardId:d,active:!0});}catch{}let be={boardId:o,cardId:String(d),lastChatEntryId:x,...W?{turnId:W}:{},...g,...l?{serverUrl:l}:{}},je=me!=null?{meta:"chat-handler-flow",howToRun:"built-in",whatToRun:{kind:"built-in",value:Jn}}:Oe;try{Ze(oe.boardAdapter)?await oe.boardAdapter.chatAgentStore().enqueueRequest({boardId:o,ref:je,args:me!=null?{...be,__chatHandlerFlow:me}:be}):oe.boardAdapter.chatAgentStore().enqueueRequest({boardId:o,ref:je,args:me!=null?{...be,__chatHandlerFlow:me}:be}),await Promise.resolve(oe.boardAdapter.requestProcessAccumulated?.());}catch(Ee){try{_().setChatProcessing({cardId:d,active:!1});}catch{}s.warn(`[chat-handler] queue failed for card "${d}": ${Ee instanceof Error?Ee.message:String(Ee)}`);}}async function ot(d,x,E){if(x.howToRun==="built-in"&&jr(x)===Jn){let W=i,V=E.__chatHandlerFlow,oe={...E};return delete oe.__chatHandlerFlow,W?W.run(V,oe,{boardId:o,cardId:String(oe.cardId||""),label:d.label,logger:s,serverUrl:l,executionExtra:g}):{dispatched:false,error:"chat-handler-flow configured but no chatFlowRunner was provided"}}return a.invoke(x,E)}async function st(d,x=false){x||await X();let E=typeof d.args?.cardId=="string"?d.args.cardId:"",W=E?D(E):ee();if(!W)throw new Error(E?`Board context is unavailable for chat-agent request: ${E}`:"Board context is unavailable for chat-agent request");let V=await ot(W,d.ref,d.args);if(!V.dispatched){if(E)try{u.setProcessing(E,!1);}catch{}throw new Error(V.error||`chat-agent dispatch failed for card "${E||"unknown"}"`)}}async function ze(d,x,E){let W=x==="chat-send"?O:c,V;await W(d,oe=>{let me=new Date().toISOString(),Oe=oe.card_data&&typeof oe.card_data=="object"?oe.card_data:{};if(oe.card_data=Oe,x==="chat-send"){let be=E&&typeof E.text=="string"?E.text.trim():"",je=E&&typeof E["turn-id"]=="string"?E["turn-id"]:E&&typeof E.turnId=="string"?E.turnId:E&&typeof E.turn=="string"?E.turn:"",Ee=[];if(Array.isArray(E?.files)){for(let $e of E.files)if($e){if(typeof $e=="string"){Ee.push({name:$e});continue}if(typeof $e=="object"){let Je=$e;typeof Je.name=="string"&&Ee.push({name:Je.name,size:Je.size,mime_type:Je.mime_type,uploaded_at:Je.uploaded_at,stored_name:Je.stored_name,chat:Je.chat===true});}}}if(be||Ee.length>0){let $e=b.runBatch({cardId:d,commands:[{command:"append",role:"user",text:be,files:Ee,turn:je},{command:"set-processing",active:true}]});if($e.status!=="success")throw new Error($e.error);let Je=$e.data.results[0]?.data?.id;if(typeof Je!="string"||!Je)throw new Error(`chat-send did not return an append id for card ${d}`);V={cardId:d,lastEntryId:Je,processingAlreadySet:true,turnId:je};try{y.broadcastCardChats(d);}catch{}}return oe}if(x==="file-upload"){let be=w().normalizeIncoming(E?.files,me);return be.length>0&&w().merge(Oe,be),oe}if(x==="action"){let be=E&&typeof E.buttonId=="string"?E.buttonId:"";if(!be)return oe;Oe.lastAction={buttonId:be,at:me},Oe.lastActionText=`${be} @ ${me}`;}return oe}),V&&Le(V.cardId,V.lastEntryId,V.processingAlreadySet,V.turnId??"");}function Ye(d,x,E){let W=JSON.stringify(E),V=typeof Buffer<"u"?Buffer.byteLength(W):new TextEncoder().encode(W).length;d.writeHead(x,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":V}),d.end(W);}async function gt(d,x,E){let W=await $(d);if(!W)throw Object.assign(new Error("Card not found"),{statusCode:404});let V=w().resolve(W.card_data,x,E);if(!V.ok&&V.reason==="stale_reference")throw Object.assign(new Error("File reference is stale. Refresh and try again."),{statusCode:409});if(!V.ok)throw Object.assign(new Error("File not found"),{statusCode:404});let oe=V.file,me=q(d),Oe=k(d),be=String(oe.stored_name||""),je=`${me}/${be}`,Ee=Oe.files?await Oe.files.getBytes(je):null;if(!Ee)throw Object.assign(new Error("File not found"),{statusCode:404});return {fileRecord:oe,bytes:Ee}}async function Rt(d,x,E,W){let{fileRecord:V,bytes:oe}=await gt(x,E,W),me=String(V.name||V.stored_name||"download.bin"),Oe=String(V.mime_type||"application/octet-stream");d.writeHead(200,{"Content-Type":Oe,"Content-Disposition":`attachment; filename="${me}"`,"Content-Length":oe.length}),d.end(oe);}function Pt(d){let x=String(d||"").toLowerCase();return x.startsWith("text/")||x.includes("json")||x.includes("xml")||x.includes("javascript")||x.includes("typescript")||x.includes("yaml")||x.includes("csv")}function ir(d,x,E){let W=d.split(/\r?\n/);return (x==="head"?W.slice(0,E):W.slice(-E)).join(`
7
+ `)}async function pt(d){let x=[];for await(let W of d)x.push(W);let E=typeof Buffer<"u"?Buffer.concat(x).toString("utf-8").trim():new TextDecoder().decode(Et(x)).trim();return E?JSON.parse(E):{}}async function Er(d){let x=[];for await(let E of d)x.push(E);return typeof Buffer<"u"?Buffer.concat(x):Et(x)}async function dr(d,x){let E=typeof x.ref=="string"?x.ref.trim():"";if(!E)return {status:"fail",error:"board-worker success callback requires body.ref"};let W=R[0];return W?W.boardOps.sourceDataFetched({params:{token:d,ref:E}}):{status:"fail",error:"no board context"}}async function mt(d,x){let E=typeof x.reason=="string"&&x.reason.trim()?x.reason:"unknown",W=R[0];return W?W.boardOps.sourceDataFetchFailure({params:{token:d,reason:E}}):{status:"fail",error:"no board context"}}let ur=Gn({sseHub:y,corsHeaders:r,json:Ye,buildPublishedRuntimePayload:()=>Te(),onSseClientConnected:A,onChannelSubscribed:C,onChannelUnsubscribed:f,apiBasePath:t,readJsonBody:d=>pt(d),initBoardAndSetup:()=>X(),bootstrapBoard:()=>L(),boardContexts:R,publishPersistedStateSnapshot:d=>U(d),upsertCardsFromSource:(d,x)=>M(d,x)}).handleWatchersRoutes,at=Vn({apiBasePath:t,json:Ye,readJsonBody:d=>pt(d),bootstrapBoard:()=>L(),createMcpFacade:()=>_(),createMcpToolRegistry:d=>J(d),resolveCardFileDownloadPayload:(d,x,E)=>gt(d,x,E),isLikelyTextMimeType:d=>Pt(d),sliceTextByLines:(d,x,E)=>ir(d,x,E)}).handleAgentfaceApi,fr=Kn({apiBasePath:t,json:Ye,readJsonBody:d=>pt(d),initBoardAndSetup:()=>X(),createMcpWebhookToolRegistry:()=>Q()}).handleWebhooksApi,ae=pr({apiBasePath:t,json:Ye,readJsonBody:d=>pt(d),readRawBody:d=>Er(d),initBoardAndSetup:()=>X(),bootstrapBoard:()=>L(),buildPublishedRuntimePayload:()=>Te(),createMcpControlplaneToolRegistry:()=>re(),readCardFromStore:d=>$(d),patchCard:(d,x)=>te(d,x),retriggerCard:d=>N(d),applyCardAction:(d,x,E)=>ze(d,x,E),resolveChatHandlerTarget:d=>Ue(d),createMcpFacade:()=>_(),chatStorePublic:b,uploadCardFile:(d,x,E,W,V)=>Ce(d,x,E,W,V),sendCardFileDownloadResponse:(d,x,E,W)=>Rt(d,x,E,W)}).handleRuntimeApi;async function Re(d,x,E){return !!(await at(d,x,E)||await fr(d,x,E)||await ur(d,x,E)||await ae(d,x,E))}return {get apiBasePath(){return t},get corsHeaders(){return r},get queueLaneTuning(){return n},handleRuntimeApi:Re,buildPublishedRuntimePayload:Te,processAccumulatedEvents:H,processAccumulatedLane:j,handleChatAgentRequest:st,clearChatRecords:se,reportSourceFetched(d,x){return dr(d,{ref:x})},reportSourceFetchFailure(d,x){return mt(d,{reason:x})},get cardStore(){return R[0]?.publicCardStore??{get(){return Promise.resolve({status:"fail",error:"no board context"})},set(){return Promise.resolve({status:"fail",error:"no board context"})}}}}}function Qo(e){let t=String(e.apiBasePath||"/api/boards").replace(/\/$/,""),r={...Wn,...e.corsHeaders||{}},n=e.serverMetaStore,o=e.boardRuntimeFactory,s=new Map,a="boards-config.json";function i(){let f=n.getText(a);if(!f)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(f)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function u(f){n.putText(a,JSON.stringify(f,null,2));}function b(f){let y=String(f||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return y.length>0&&y.length<=64?y:null}function v(f){if(s.has(f))return s.get(f);let B=i().boards.find(I=>I.id===f)||{},R=o(f,B);return s.set(f,R),R}function l(f,y,B){let R=JSON.stringify(B),I=typeof Buffer<"u"?Buffer.byteLength(R):new TextEncoder().encode(R).length;f.writeHead(y,{...r,"Content-Type":"application/json; charset=utf-8","Content-Length":I}),f.end(R);}async function g(f,y,B){let R=f.method||"GET",I=B.pathname;if(R==="GET"&&I===t)return l(y,200,{ok:true,boards:i().boards}),true;if(R==="POST"&&I===t){let m=[];for await(let U of f)m.push(U);let p=typeof Buffer<"u"?Buffer.concat(m).toString("utf-8").trim():new TextDecoder().decode(Et(m)).trim(),k={};try{k=p?JSON.parse(p):{};}catch{k={};}let w=b(k.id);if(!w)return l(y,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let q=i();if(q.boards.some(U=>U.id===w))return l(y,409,{error:`Board "${w}" is already registered`}),true;let T=typeof k.label=="string"&&k.label.trim()?k.label.trim():w,h={id:w,label:T};for(let[U,M]of Object.entries(k))U==="id"||U==="label"||M!=null&&(h[U]=M);return q.boards.push(h),u(q),l(y,200,{ok:true,board:h}),true}return false}async function A(f,y,B){let I=B.pathname.match(new RegExp(`^${Ve(t)}/([^/]+)(/|$)`));if(!I)return false;let m=b(decodeURIComponent(I[1]));return m?i().boards.some(w=>w.id===m)?!!await v(m).handleRuntimeApi(f,y,B):(l(y,404,{error:`Board "${m}" not registered. POST ${t} with {id} to register it first.`}),true):(l(y,400,{error:"Invalid board id"}),true)}async function S(f,y,B){return !!(await g(f,y,B)||await A(f,y,B))}function C(f){if(!i().boards.some(B=>B.id===f))throw Object.assign(new Error(`Board "${f}" not registered`),{statusCode:404});return {service:v(f)}}return {get apiBasePath(){return t},get corsHeaders(){return r},handleApi:S,requireBoardService:C}}exports.createMultiBoardServerRuntime=Qo;exports.createRoutesRuntimeApi=pr;exports.createSingleBoardServerRuntime=Wo;return exports;})({});//# sourceMappingURL=server-runtime-controlface.js.map
8
+ //# sourceMappingURL=server-runtime-controlface.js.map