yaml-flow 8.7.0 → 8.8.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 (200) hide show
  1. package/browser/adapters/firebase-storage.js +2 -2
  2. package/browser/adapters/firestore-storage.js +2 -2
  3. package/browser/adapters/localstorage-storage.js +3 -3
  4. package/browser/asset-integrity.json +11 -15
  5. package/browser/live-cards.schema.json +10 -1
  6. package/browser/server-runtime-controlface.js +5 -5
  7. package/examples/ARCHITECTURE.md +0 -27
  8. package/examples/board/server/board-server.js +151 -101
  9. package/examples/board/server/board-worker/source_def_flows.json +0 -8
  10. package/examples/board/server/board-worker/task-executor.js +1 -3
  11. package/examples/board/test/server-http-test.js +181 -152
  12. package/examples/board-firestore/server/worker.js +9 -1
  13. package/examples/portfolio-tracker/portfolio-tracker.js +11 -1
  14. package/examples/portfolio-tracker/test/portfolio-t4.js +12 -2
  15. package/lib/{artifacts-store-lib-D9nMkVcE.d.cts → artifacts-store-lib-C6qBpMfU.d.cts} +1 -1
  16. package/lib/{artifacts-store-lib-DSSMqVL2.d.ts → artifacts-store-lib-D4qf7Q-7.d.ts} +1 -1
  17. package/lib/artifacts-store-public.d.cts +3 -3
  18. package/lib/artifacts-store-public.d.ts +3 -3
  19. package/lib/board-live-cards-mcp.cjs +1 -1
  20. package/lib/board-live-cards-mcp.d.cts +7 -7
  21. package/lib/board-live-cards-mcp.d.ts +7 -7
  22. package/lib/board-live-cards-mcp.js +1 -1
  23. package/lib/board-live-cards-node.cjs +8 -8
  24. package/lib/board-live-cards-node.d.cts +16 -14
  25. package/lib/board-live-cards-node.d.ts +16 -14
  26. package/lib/board-live-cards-node.js +8 -8
  27. package/lib/{board-live-cards-public-DQzPe7A9.d.cts → board-live-cards-public-BT5HrgqZ.d.cts} +82 -59
  28. package/lib/{board-live-cards-public-D-DJek3X.d.ts → board-live-cards-public-DSRamFm8.d.ts} +82 -59
  29. package/lib/{board-live-cards-public-async-CgMCYYft.d.cts → board-live-cards-public-async-CYjr4mgX.d.cts} +18 -8
  30. package/lib/{board-live-cards-public-async-3hUuHxDx.d.ts → board-live-cards-public-async-DlyC3PgC.d.ts} +18 -8
  31. package/lib/board-live-cards-public.cjs +1 -1
  32. package/lib/board-live-cards-public.d.cts +2 -2
  33. package/lib/board-live-cards-public.d.ts +2 -2
  34. package/lib/board-live-cards-public.js +1 -1
  35. package/lib/board-live-cards-server-runtime.cjs +1 -1
  36. package/lib/board-live-cards-server-runtime.d.cts +6 -8
  37. package/lib/board-live-cards-server-runtime.d.ts +6 -8
  38. package/lib/board-live-cards-server-runtime.js +1 -1
  39. package/lib/board-livegraph-runtime/index.cjs +1 -1
  40. package/lib/board-livegraph-runtime/index.js +1 -1
  41. package/lib/{board-platform-adapter-async-DOfEq_HC.d.cts → board-platform-adapter-async-BZIftm36.d.cts} +18 -14
  42. package/lib/{board-platform-adapter-async-JZPCzZnH.d.ts → board-platform-adapter-async-JP9V-U5E.d.ts} +18 -14
  43. package/lib/board-worker-adapter.cjs +1 -24
  44. package/lib/board-worker-adapter.d.cts +68 -3
  45. package/lib/board-worker-adapter.d.ts +68 -3
  46. package/lib/board-worker-adapter.js +1 -24
  47. package/lib/card-compute/index.cjs +1 -1
  48. package/lib/card-compute/index.js +1 -1
  49. package/lib/card-store-public.d.cts +2 -2
  50. package/lib/card-store-public.d.ts +2 -2
  51. package/lib/card-validation.cjs +1 -1
  52. package/lib/card-validation.js +1 -1
  53. package/lib/chat-store-public.cjs +1 -1
  54. package/lib/chat-store-public.d.cts +20 -20
  55. package/lib/chat-store-public.d.ts +20 -20
  56. package/lib/chat-store-public.js +1 -1
  57. package/lib/chunk-2GSI6C45.js +7 -0
  58. package/lib/chunk-35N7ONTH.js +2 -0
  59. package/lib/chunk-37HDEW26.cjs +2 -0
  60. package/lib/{chunk-PMUSJQSR.cjs → chunk-3CZCGNY4.cjs} +2 -2
  61. package/lib/chunk-3KC6LBOG.js +3 -0
  62. package/lib/{chunk-BQS3EIEK.js → chunk-44L64VQ2.js} +3 -3
  63. package/lib/chunk-6OPXQPSC.js +2 -0
  64. package/lib/chunk-7BTZCOT5.js +2 -0
  65. package/lib/{chunk-U2N6MCD5.cjs → chunk-7JVHYHT2.cjs} +2 -2
  66. package/lib/chunk-7QZ267XP.cjs +2 -0
  67. package/lib/{chunk-XQRNDX4Q.js → chunk-ANKA7HEJ.js} +2 -2
  68. package/lib/{chunk-KAWQPLIE.cjs → chunk-BQUQTOPB.cjs} +2 -2
  69. package/lib/chunk-CMFD27ZC.cjs +3 -0
  70. package/lib/chunk-DOFNXJ4C.js +3 -0
  71. package/lib/chunk-ETW3BXHD.cjs +2 -0
  72. package/lib/chunk-FO4KNVU7.cjs +2 -0
  73. package/lib/{chunk-SGV7PU4H.js → chunk-FOFGEABN.js} +2 -2
  74. package/lib/chunk-GPCMBPLK.cjs +2 -0
  75. package/lib/chunk-GU3T75C4.js +3 -0
  76. package/lib/chunk-H3EHFCDZ.js +3 -0
  77. package/lib/chunk-H4TYOSMD.cjs +45 -0
  78. package/lib/chunk-HFW7E2Z7.cjs +4 -0
  79. package/lib/chunk-HWYMZK3N.cjs +3 -0
  80. package/lib/chunk-IQIZA7TN.cjs +7 -0
  81. package/lib/chunk-J4MHQ7JF.js +45 -0
  82. package/lib/chunk-MCPADH33.cjs +2 -0
  83. package/lib/chunk-NBJTYAYN.cjs +2 -0
  84. package/lib/chunk-NDAKMJQK.cjs +3 -0
  85. package/lib/chunk-NNSBBO5R.js +2 -0
  86. package/lib/chunk-NU5NO5NM.js +2 -0
  87. package/lib/chunk-O4RKTQBP.cjs +3 -0
  88. package/lib/chunk-O5UYCGIN.js +2 -0
  89. package/lib/chunk-Q3OTUDIE.js +2 -0
  90. package/lib/chunk-R44X3RQB.cjs +2 -0
  91. package/lib/chunk-RKKSVOP2.js +2 -0
  92. package/lib/chunk-UB54HZA4.cjs +2 -0
  93. package/lib/{chunk-CIAJNUR4.js → chunk-VGDLSS2H.js} +2 -2
  94. package/lib/{chunk-SFVO2LB2.cjs → chunk-VQCIOKJV.cjs} +3 -3
  95. package/lib/chunk-VS3BXEYK.js +4 -0
  96. package/lib/chunk-Y4WK7HE4.js +2 -0
  97. package/lib/chunk-YBYXCFAI.js +2 -0
  98. package/lib/chunk-ZK3E7L4Y.cjs +2 -0
  99. package/lib/cloud-storage.cjs +1 -1
  100. package/lib/cloud-storage.d.cts +6 -6
  101. package/lib/cloud-storage.d.ts +6 -6
  102. package/lib/cloud-storage.js +1 -1
  103. package/lib/continuous-event-graph/index.cjs +1 -1
  104. package/lib/continuous-event-graph/index.js +1 -1
  105. package/lib/execution-refs.cjs +1 -1
  106. package/lib/execution-refs.js +1 -1
  107. package/lib/firebase-storage/index.cjs +2 -2
  108. package/lib/firebase-storage/index.d.cts +2 -2
  109. package/lib/firebase-storage/index.d.ts +2 -2
  110. package/lib/firebase-storage/index.js +2 -2
  111. package/lib/firestore-storage/index.cjs +2 -2
  112. package/lib/firestore-storage/index.d.cts +23 -8
  113. package/lib/firestore-storage/index.d.ts +23 -8
  114. package/lib/firestore-storage/index.js +2 -2
  115. package/lib/index.cjs +2 -2
  116. package/lib/index.d.cts +1 -1
  117. package/lib/index.d.ts +1 -1
  118. package/lib/index.js +1 -1
  119. package/lib/localstorage-storage/index.cjs +1 -1
  120. package/lib/localstorage-storage/index.d.cts +10 -6
  121. package/lib/localstorage-storage/index.d.ts +10 -6
  122. package/lib/localstorage-storage/index.js +1 -1
  123. package/lib/{mcp-tool-registries-W3TRj6O5.d.cts → mcp-tool-registries-CRtea2x4.d.cts} +3 -0
  124. package/lib/{mcp-tool-registries-BBObLYga.d.ts → mcp-tool-registries-D3rWSppt.d.ts} +3 -0
  125. package/lib/server-jobs-queue-runner/index.cjs +1 -1
  126. package/lib/server-jobs-queue-runner/index.d.cts +12 -9
  127. package/lib/server-jobs-queue-runner/index.d.ts +12 -9
  128. package/lib/server-jobs-queue-runner/index.js +1 -1
  129. package/lib/server-runtime/index.cjs +1 -1
  130. package/lib/server-runtime/index.d.cts +7 -9
  131. package/lib/server-runtime/index.d.ts +7 -9
  132. package/lib/server-runtime/index.js +1 -1
  133. package/lib/server-runtime-agentface/index.d.cts +7 -9
  134. package/lib/server-runtime-agentface/index.d.ts +7 -9
  135. package/lib/server-runtime-controlface/index.cjs +1 -1
  136. package/lib/server-runtime-controlface/index.d.cts +19 -71
  137. package/lib/server-runtime-controlface/index.d.ts +19 -71
  138. package/lib/server-runtime-controlface/index.js +1 -1
  139. package/lib/server-runtime-core/index.cjs +1 -1
  140. package/lib/server-runtime-core/index.d.cts +61 -21
  141. package/lib/server-runtime-core/index.d.ts +61 -21
  142. package/lib/server-runtime-core/index.js +1 -1
  143. package/lib/server-runtime-watchers/index.cjs +1 -1
  144. package/lib/server-runtime-watchers/index.d.cts +9 -65
  145. package/lib/server-runtime-watchers/index.d.ts +9 -65
  146. package/lib/server-runtime-watchers/index.js +1 -1
  147. package/lib/server-runtime-webhooks/index.d.cts +7 -9
  148. package/lib/server-runtime-webhooks/index.d.ts +7 -9
  149. package/lib/sse-hub-CYXisfXJ.d.cts +63 -0
  150. package/lib/sse-hub-Dodwtc3_.d.ts +63 -0
  151. package/lib/step-machine-public/index.cjs +1 -1
  152. package/lib/step-machine-public/index.d.cts +1 -1
  153. package/lib/step-machine-public/index.d.ts +1 -1
  154. package/lib/step-machine-public/index.js +1 -1
  155. package/lib/{storage-async-interface-BRR4eBjx.d.cts → storage-async-interface-CG0bMqvE.d.ts} +20 -1
  156. package/lib/{storage-async-interface-DhlOVPSp.d.ts → storage-async-interface-CyO-zwVQ.d.cts} +20 -1
  157. package/lib/{storage-interface-BFiD3kyB.d.ts → storage-interface-D-iEiTJA.d.cts} +45 -1
  158. package/lib/{storage-interface-BFiD3kyB.d.cts → storage-interface-D-iEiTJA.d.ts} +45 -1
  159. package/lib/stores/index.d.cts +1 -1
  160. package/lib/stores/index.d.ts +1 -1
  161. package/lib/stores/kv.d.cts +1 -1
  162. package/lib/stores/kv.d.ts +1 -1
  163. package/lib/{types-CF2xUcZW.d.ts → types-BtH3scgE.d.ts} +66 -29
  164. package/lib/{types-BzQY45dH.d.cts → types-Ch0u3FKP.d.cts} +66 -29
  165. package/package.json +4 -5
  166. package/schema/live-cards.schema.json +10 -1
  167. package/browser/board-livecards-client.js +0 -2
  168. package/examples/board/demo-shell-with-server.html +0 -272
  169. package/examples/board/doc.html +0 -465
  170. package/examples/board/server-config.json +0 -24
  171. package/lib/chat-storage-lib-B9Q34Dyv.d.cts +0 -54
  172. package/lib/chat-storage-lib-DB9iSai2.d.ts +0 -54
  173. package/lib/chunk-5XHOHTLZ.cjs +0 -2
  174. package/lib/chunk-6APH25VI.js +0 -2
  175. package/lib/chunk-76ON3V7R.js +0 -2
  176. package/lib/chunk-7ICPAABP.cjs +0 -7
  177. package/lib/chunk-CPAXTVBQ.cjs +0 -2
  178. package/lib/chunk-DDYSXP2A.cjs +0 -3
  179. package/lib/chunk-EGRHWZRV.js +0 -2
  180. package/lib/chunk-GL2OHR2E.cjs +0 -2
  181. package/lib/chunk-GYQXDNNI.cjs +0 -2
  182. package/lib/chunk-H5HBXPOI.cjs +0 -3
  183. package/lib/chunk-IPLSRN6P.cjs +0 -4
  184. package/lib/chunk-J5J6BG7B.js +0 -2
  185. package/lib/chunk-M3OU6IS5.cjs +0 -2
  186. package/lib/chunk-M6STQR5F.cjs +0 -2
  187. package/lib/chunk-N6P2JW4W.js +0 -3
  188. package/lib/chunk-NJJ7WEDT.cjs +0 -2
  189. package/lib/chunk-NKIQRCOM.cjs +0 -2
  190. package/lib/chunk-NMZ6XNLB.cjs +0 -3
  191. package/lib/chunk-OEFTOO47.cjs +0 -3
  192. package/lib/chunk-PRHQBGPT.js +0 -2
  193. package/lib/chunk-S44QZUDX.js +0 -2
  194. package/lib/chunk-TSN3RTXT.js +0 -4
  195. package/lib/chunk-VLBB3D6B.js +0 -3
  196. package/lib/chunk-VMW4Z6EF.js +0 -3
  197. package/lib/chunk-VXJHBWK3.js +0 -2
  198. package/lib/chunk-WHDEBJLT.js +0 -7
  199. package/lib/chunk-YGALANRO.js +0 -2
  200. package/lib/chunk-ZXQR7GHT.js +0 -3
@@ -1,3 +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
1
+ var FirebaseStorage=(function(exports){'use strict';var b="b64:";function h(r){let n=r.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-r.length%4)%4),o=globalThis.Buffer;if(o)return o.from(n,"base64").toString("utf8");if(typeof atob=="function"){let i=atob(n),s=new Uint8Array(i.length);for(let a=0;a<i.length;a+=1)s[a]=i.charCodeAt(a);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function k(r){if(!r.startsWith(b))throw new Error(`Invalid ref format (expected ${b}<base64url(json)>): ${r}`);let n;try{n=JSON.parse(h(r.slice(b.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${r}`)}if(!n||typeof n!="object")throw new Error(`Invalid ref format (expected object payload): ${r}`);let o=n;if(typeof o.kind!="string"||typeof o.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${r}`);return {kind:o.kind,value:o.value}}var m=new TextEncoder;function p(r){let n="";for(let i of m.encode(String(r)))n+=String.fromCharCode(i);return (typeof btoa=="function"?btoa(n):Buffer.from(n,"binary").toString("base64")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function x(r){let n=String(r).replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-String(r).length%4)%4),o=typeof atob=="function"?atob(n):Buffer.from(n,"base64").toString("binary"),i=new Uint8Array(o.length);for(let s=0;s<o.length;s+=1)i[s]=o.charCodeAt(s);return new TextDecoder().decode(i)}function d(...r){return r.map(n=>String(n??"").trim()).filter(Boolean).join("/")}function u(r){return !!(r&&typeof r=="object"&&r.code==="storage/object-not-found")}function w(r,n){let o=r.ref(n);function i(e){return o.child(p(e))}async function s(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 g(){let e=[];async function t(c){let f=await c.listAll();for(let l of f.prefixes)await t(l);for(let l of f.items){let y=l.name||l.fullPath.slice(o.fullPath.length+1);e.push(x(y));}}try{await t(o);}catch(c){if(u(c))return [];throw c}return e.sort()}return {async read(e){try{return await s(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 g();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:d(n,p(e))}},async renameKey(e,t){let c=i(e),f,l;try{l=await c.getMetadata(),f=await a(c);}catch(y){if(u(y))return false;throw y}await i(t).put(f,{contentType:l.contentType??"application/octet-stream"});try{await c.delete();}catch{}return true}}}function S(r,n){let o=w(r,n);async function i(s="scratch-",a=""){let g=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`;return `${s}${g}${a}`}return {...o,getUniqueKey:i,async create(s,a="scratch-",g=""){let e=await i(a,g);return await o.write(e,s),e},keyRef(s){return {kind:"firebase-storage",value:d(n,p(s))}},config:{async get(s){let a=await o.read(`__config__/${s}`);if(a==null)return null;try{return JSON.parse(a)}catch{return a}},async set(s,a){await o.write(`__config__/${s}`,JSON.stringify(a));}}}}function T(r,n,o){let i=d("boards",o,"blobs"),s=d("boards",o,"scratch");return {...r,blobStorage(a){return w(n,d(i,a||"root"))},blobStorageForRef(a){let g=k(a);return g.kind==="firebase-storage"?w(n,g.value):r.blobStorageForRef(a)},scratchStorage(){return S(n,s)},scratchStorageForRef(){return S(n,s)},async resolveBlob(a){if(a?.kind==="firebase-storage"&&typeof a.value=="string"){let g=await n.ref(a.value).getDownloadURL(),e=await fetch(g,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to resolve storage blob ${a.value}: ${e.status}`);return e.text()}return typeof r.resolveBlob=="function"?r.resolveBlob(a):null}}}
2
+ exports.createFirebaseStorageBlobStore=w;exports.createFirebaseStorageScratchStore=S;exports.wrapWithFirebaseStorageBlobs=T;return exports;})({});//# sourceMappingURL=firebase-storage.js.map
3
3
  //# sourceMappingURL=firebase-storage.js.map
@@ -1,3 +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
1
+ var FirestoreStorage=(function(exports){'use strict';var V="b64:";function Ve(e){let t=new TextEncoder().encode(e),n=globalThis.Buffer,r;if(n)r=n.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);r=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Me(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),n=globalThis.Buffer;if(n)return n.from(t,"base64").toString("utf8");if(typeof atob=="function"){let r=atob(t),o=new Uint8Array(r.length);for(let s=0;s<r.length;s+=1)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function I(e){return `${V}${Ve(JSON.stringify(e))}`}function B(e){if(!e.startsWith(V))throw new Error(`Invalid ref format (expected ${V}<base64url(json)>): ${e}`);let t;try{t=JSON.parse(Me(e.slice(V.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 n=t;if(typeof n.kind!="string"||typeof n.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${e}`);return {kind:n.kind,value:n.value}}function M(){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 ce={$schema:"http://json-schema.org/draft-07/schema#",$id:"https://nsreehari.github.io/boards/live-cards.schema.json",definitions:{bind_ref:{description:"A card data path reference, e.g. 'card_data.raw_quotes' or 'requires.upstream'",type:"string",pattern:"^(card_data|requires|fetched_sources|computed_values)(\\.|$)"},bind_or_literal:{description:"A literal value or a bind reference object",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref"}},required:["bind"]}]},compute_expr:{description:"A declarative JSON compute expression",type:"object",required:["fn"],properties:{fn:{type:"string",description:"Function name from the built-in vocabulary",enum:["sum","avg","min","max","count","first","last","add","sub","mul","div","round","abs","mod","gt","gte","lt","lte","eq","neq","if","and","or","not","concat","upper","lower","template","filter","pluck","map","sort","slice","flat","unique","group","get","default","now","diff_days","format_date"]},input:{description:"card_data.path, literal, array of inputs, or nested compute_expr",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{$ref:"#/definitions/compute_expr"}]},field:{type:"string",description:"For pluck/sum/group \u2014 the object key to extract"},where:{$ref:"#/definitions/compute_expr",description:"For filter \u2014 predicate expression ($ = current item)"},cond:{$ref:"#/definitions/compute_expr",description:"For if \u2014 condition expression"},then:{description:"For if \u2014 value when cond is truthy"},else:{description:"For if \u2014 value when cond is falsy"},format:{type:"string",description:"For format_date \u2014 date format string"}}},meta:{type:"object",properties:{title:{type:"string"},tags:{type:"array",items:{type:"string"}}},additionalProperties:true},__private:{description:"Control-plane-owned private state. Stripped entirely from all regular /mcp read responses. Writable only via 'setstate.card-private' and 'manage.admin-upsert-card'. Agents must never author this field. Keys inside use plain names (no leading underscores).",type:"object",additionalProperties:true},requires:{type:"array",items:{type:"string"},description:"IDs of upstream nodes this node depends on"},provides:{type:"array",items:{type:"object",required:["bindTo","ref"],properties:{bindTo:{type:"string",description:"Token name published downstream"},ref:{type:"string",description:"Path to read value from (card_data.*, requires.*, fetched_sources.*, computed_values.*)"}}},description:"Explicit bindings exposing computed or card_data values downstream as named tokens"},compute_step:{description:"A single ordered compute step: reads card_data.*/requires.*/computed_values.*, writes to computed_values[bindTo]",type:"object",required:["bindTo","expr"],properties:{bindTo:{type:"string",description:"Key in computed_values to write result"},expr:{type:"string",description:"JSONata expression evaluated against { card_data, requires, fetched_sources, computed_values }"}}},source_def:{description:"One source entry. The engine requires 'bindTo' (compute namespace key) and 'outputFile' (delivery signal path). bindTo and outputFile must be unique across all source_defs in a card. Every other property is yours \u2014 add whatever your task-executor needs: kind, url, headers, mailbox, channel, model, query, etc. The full object is passed verbatim as the --in JSON to the executor.",type:"object",required:["bindTo","outputFile"],additionalProperties:true,properties:{bindTo:{type:"string",description:"Key under fetched_sources.* available in compute expressions"},outputFile:{type:"string",description:"Board-relative path the executor writes its JSON result to. Presence of this file signals delivery."},projections:{type:"object",description:"Named data projections from card_data or requires, evaluated before the executor is called. Each key is a ref name; each value is a JSONata expression rooted at card_data or requires. The resolved values are passed to the executor as _projections. fetched_sources, computed_values, and source_defs are not accessible here \u2014 sources run before those exist.",additionalProperties:{type:"string"}},optionalForCompletionGating:{type:"boolean",default:false,description:"When true this source does not gate card completion. Default false when absent, so source_defs are completion-gating by default."},timeout:{type:"integer",minimum:0,default:12e4,description:"Executor/script timeout in ms. Default: 120 000 (2 min)."},script:{type:"string",description:"Legacy direct-run: shell command executed when no .task-executor is registered. stdout is captured as the result."}}},render_element:{type:"object",required:["kind"],properties:{id:{type:"string",description:"Optional element ID for targeted updates"},kind:{enum:["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]},label:{type:"string",description:"Heading above this element"},className:{type:"string",description:"Bootstrap grid class, e.g. 'col-12 col-md-6'"},visible:{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 element shown only if truthy"},data:{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref",description:"card_data/requires/fetched_sources/computed_values path to read data from"},writeTo:{$ref:"#/definitions/bind_ref",description:"card_data path for user input (form, filter, todo, notes)"},columns:{type:"array",items:{type:"string"},description:"table: visible columns"},maxRows:{type:"integer",description:"table/list: max rows to display"},sortable:{type:"boolean",default:true,description:"table: enable click-to-sort"},placeholder:{type:"string",description:"Empty-state message"},chartType:{enum:["bar","line","pie","doughnut"]},chartOptions:{type:"object",description:"Chart.js options passthrough"},fields:{type:"object",description:"JSON Schema for form/filter fields"},thresholds:{type:"object",properties:{green:{type:"string"},amber:{type:"string"}}},colorMap:{type:"object",description:"badge: value \u2192 Bootstrap color"},style:{enum:["heading","muted","default"],description:"text: display style"},upload:{type:"boolean",default:true,description:"file-upload: show drop zone (false = read-only file list)"},accept:{type:"array",items:{type:"string"},description:"file-upload: allowed extensions"},multiple:{type:"boolean",default:true,description:"file-upload: allow multiple files"},fileAttach:{type:"boolean",default:false,description:"chat: enable inline file attachments"},fileAccept:{type:"array",items:{type:"string"},description:"chat: allowed attachment extensions"},buttons:{type:"array",description:"actions: button definitions",items:{type:"object",required:["id","label"],properties:{id:{type:"string"},label:{type:"string"},style:{type:"string",description:"Bootstrap button variant, e.g. 'success', 'outline-danger'"},size:{type:"string",default:"sm"},disabled:{oneOf:[{type:"boolean"},{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 truthy = disabled"}]}}}}}}}},view:{type:"object",required:["elements"],properties:{elements:{type:"array",minItems:1,items:{$ref:"#/definitions/render_element"}},layout:{type:"object",properties:{board:{type:"object",properties:{col:{type:"integer",minimum:1,maximum:12},order:{type:"integer"}}},canvas:{type:"object",properties:{x:{type:"number"},y:{type:"number"},w:{type:"number"},h:{type:"number"}}}}},features:{type:"object",properties:{chat:{type:"boolean",default:false},notes:{type:"boolean",default:false},refresh:{type:"boolean",default:true}}}}}},title:"LiveCard",description:"A unified card node. Behavior depends on which sections are present (source_defs, compute, view, etc.)",type:"object",required:["id"],additionalProperties:false,properties:{id:{type:"string"},requires:{$ref:"#/definitions/requires"},provides:{$ref:"#/definitions/provides"},meta:{$ref:"#/definitions/meta"},__private:{$ref:"#/definitions/__private"},view:{$ref:"#/definitions/view"},card_data:{type:"object",description:"Authored card data and runtime metadata. Includes uploaded-file metadata maintained by host handlers and inference evaluation results.",properties:{files:{type:"array",description:"Optional uploaded-file metadata maintained by host handlers. Stored name is normalized and serial-prefixed (for example 001-my_file.pdf).",items:{type:"object",required:["name","stored_name"],properties:{name:{type:"string",minLength:1},stored_name:{type:"string",minLength:5,maxLength:32,pattern:"^[0-9]{3,}-[a-z0-9._-]+$"},size:{oneOf:[{type:"integer",minimum:0},{type:"null"}]},mime_type:{type:"string"},path:{type:"string",pattern:"^[^\\s]+/files/[0-9]{3,}-[a-z0-9._-]+$"},uploaded_at:{type:"string",format:"date-time"},chat:{type:"boolean",description:"Whether this file entry is associated with a chat interaction"}},additionalProperties:false}}},additionalProperties:true},source_defs:{type:"array",description:"Source entries. Each entry is passed verbatim to the board's .task-executor (registered via init --task-executor) as the --in JSON file. The executor fetches/generates the data and writes JSON to --out. If no executor is registered, the built-in executor runs the entry's 'cli' command directly. Sources gate completion by default. Set optionalForCompletionGating: true for enrichment-only source_defs that should not block task-completed.",items:{$ref:"#/definitions/source_def"}},compute:{type:"array",description:"Ordered array of compute steps. Each reads card_data.*/requires.*/fetched_sources.*/computed_values.* and writes to ephemeral computed_values[bindTo].",items:{$ref:"#/definitions/compute_step"}}}};var de=void 0;var le=void 0;var Ge=M(),Ue=Ge("./jsonata-sync.cjs"),J=null;var fe=/\b(card_data|requires|fetched_sources|computed_values|source_defs)\b/g,He=/^\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\.|$)/;function Qe(e){let t=new Set,n;for(fe.lastIndex=0;(n=fe.exec(e))!==null;)t.add(n[1]);return t}function pe(e){let t=He.exec(e);return t?t[1]:null}function ge(e,t,n,r){try{Ue(e);}catch(s){let a=s instanceof Error?s.message:String(s);r.push(`${t}: invalid JSONata expression (${a})`);return}let o=Qe(e);for(let s of o)n.has(s)||r.push(`${t}: disallowed namespace "${s}" in expression`);}function Z(e,t,n){if(Array.isArray(e)){e.forEach((o,s)=>{Z(o,`${t}/${s}`,n);});return}if(typeof e=="string"){let o=pe(e);if(!o)return;new Set(["card_data","requires","computed_values"]).has(o)||n.push(`${t}: disallowed namespace "${o}" in view reference`);return}if(!e||typeof e!="object")return;let r=e;for(let[o,s]of Object.entries(r))Z(s,`${t}/${o}`,n);}function We(){if(J)return J;let e=new de({allErrors:true});return le(e),J=e.compile(ce),J}function me(e){let t=We(),n=t(e),r=(t.errors??[]).map(o=>`${o.instancePath||"/"}: ${o.message??"unknown error"}`);if(e&&typeof e=="object"&&!Array.isArray(e)){let o=e.source_defs;if(Array.isArray(o)){let s=new Set,a=new Set;o.forEach((i,p)=>{if(!i||typeof i!="object"||Array.isArray(i))return;let l=i;typeof l.bindTo=="string"&&l.bindTo&&(s.has(l.bindTo)&&r.push(`/source_defs/${p}/bindTo: bindTo "${l.bindTo}" must be unique across all source_defs`),s.add(l.bindTo)),typeof l.outputFile=="string"&&l.outputFile&&(a.has(l.outputFile)&&r.push(`/source_defs/${p}/outputFile: outputFile "${l.outputFile}" must be unique across all source_defs`),a.add(l.outputFile));});}}return !n||r.length>0?{ok:false,errors:r}:{ok:true,errors:[]}}function ye(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:true,errors:[]};let n=e,r=n.compute;Array.isArray(r)&&r.forEach((l,C)=>{if(!l||typeof l!="object"||Array.isArray(l))return;let y=l.expr;typeof y!="string"||y.trim().length===0||ge(y,`/compute/${C}/expr`,new Set(["card_data","requires","fetched_sources","computed_values"]),t);});let o=new Set(["card_data","requires","fetched_sources","computed_values"]),s=n.provides;Array.isArray(s)&&s.forEach((l,C)=>{if(!l||typeof l!="object"||Array.isArray(l))return;let y=l.ref;if(typeof y!="string"||y.trim().length===0)return;let u=pe(y);u===null?t.push(`/provides/${C}/ref: path "${y}" must start with a valid namespace (${[...o].join(", ")})`):o.has(u)||t.push(`/provides/${C}/ref: disallowed namespace "${u}" in path "${y}" (valid: ${[...o].join(", ")})`);});let a=n.view;a&&typeof a=="object"&&!Array.isArray(a)&&Z(a,"/view",t);let i=new Set(["card_data","requires"]),p=n.source_defs;return Array.isArray(p)&&p.forEach((l,C)=>{if(!l||typeof l!="object"||Array.isArray(l))return;let y=l.projections;if(!(!y||typeof y!="object"||Array.isArray(y)))for(let[u,c]of Object.entries(y))typeof c!="string"||c.trim().length===0||ge(c,`/source_defs/${C}/projections/${u}`,i,t);}),{ok:t.length===0,errors:t}}function ee(e){let t=me(e);if(!t.ok)return t;let n=ye(e);return n.ok?{ok:true,errors:[]}:{ok:false,errors:n.errors}}var ze=M(),G=ze("./jsonata-sync.cjs"),Se=G;function he(e,t){if(!t||!e)return;let n=t.split("."),r=e;for(let o=0;o<n.length;o++){if(r==null)return;r=r[n[o]];}return r}function be(e,t,n){let r=t.split("."),o=e;for(let s=0;s<r.length-1;s++)(o[r[s]]==null||typeof o[r[s]]!="object")&&(o[r[s]]={}),o=o[r[s]];o[r[r.length-1]]=n;}async function Ye(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let n=e.requires??{},r={card_data:e.card_data,requires:n,expects_data:n,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await G(o.expr).evaluate(r);be(e.computed_values,o.bindTo,s),r.computed_values=e.computed_values;}catch{}return e}function Xe(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 n=e.requires??{},r={card_data:e.card_data,requires:n,expects_data:n,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let a=Se(s.expr).evaluate(r);be(e.computed_values,s.bindTo,a),r.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 Ze(e,t,n){let r={...n??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return G(e).evaluate(r)}function et(e,t){return t.startsWith("fetched_sources.")?he(e._sourcesData??{},t.slice(16)):he(e,t)}var ke=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),tt=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function rt(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let n=e;(typeof n.id!="string"||!n.id)&&t.push("id: required, must be a non-empty string");for(let r of Object.keys(n))tt.has(r)||t.push(`Unknown top-level key: "${r}"`);if((n.card_data==null||typeof n.card_data!="object"||Array.isArray(n.card_data))&&t.push("card_data: required, must be an object"),n.meta!=null)if(typeof n.meta!="object"||Array.isArray(n.meta))t.push("meta: must be an object");else {let r=n.meta;r.title!=null&&typeof r.title!="string"&&t.push("meta.title: must be a string"),r.tags!=null&&!Array.isArray(r.tags)&&t.push("meta.tags: must be an array");}if(n.requires!=null&&!Array.isArray(n.requires)&&t.push("requires: must be an array of strings"),n.provides!=null&&(Array.isArray(n.provides)?n.provides.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=r;(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")),n.compute!=null&&(Array.isArray(n.compute)?n.compute.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))t.push(`compute[${o}]: must be a compute step object`);else {let s=r;(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")),n.source_defs!=null)if(!Array.isArray(n.source_defs))t.push("source_defs: must be an array");else {let r=new Set,o=new Set;n.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`):(r.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),r.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(n.view!=null)if(typeof n.view!="object"||Array.isArray(n.view))t.push("view: must be an object");else {let r=n.view;!Array.isArray(r.elements)||r.elements.length===0?t.push("view.elements: required, must be a non-empty array"):r.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`):ke.has(o.kind)||t.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...ke].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&t.push(`view.elements[${s}].data: must be an object`);}),r.layout!=null&&(typeof r.layout!="object"||Array.isArray(r.layout))&&t.push("view.layout: must be an object"),r.features!=null&&(typeof r.features!="object"||Array.isArray(r.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function nt(e,t){if(!e||e.length===0)return [];let n={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,a]of Object.entries(r.projections))if(typeof a=="string"&&a.trim().length>0)try{o[s]=await G(a).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function ot(e,t){if(!e||e.length===0)return [];let n={card_data:t.card_data??{},requires:t.requires??{}};return e.map(r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,a]of Object.entries(r.projections))if(typeof a=="string"&&a.trim().length>0)try{o[s]=Se(a).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}})}var F={run:Ye,runSync:Xe,eval:Ze,resolve:et,validate:rt,enrichSources:nt,enrichSourcesSync:ot};function Re(e){let t=ee(e);return {isValid:t.ok,issues:t.errors}}function te(e){return JSON.stringify(e)}function re(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 ne(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function at(e){return typeof e=="string"?e.startsWith("b64:")?B(e).value:e:e.value}function Ce(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(n=>({...ne(n),leaseToken:n.leaseToken,leaseExpiresAt:n.leaseExpiresAt}))},ackRequest(t,n){return e.ack(t,n)},nackRequest(t,n,r){return e.nack(t,n,r)},async peekActive(){return (await e.peekActive()).map(ne)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...ne(t),reason:t.reason}))}}}function U(e){async function t(n){let r=await e.read(n);return r==null?null:typeof r=="string"?r:JSON.stringify(r)}return {async readTaskExecutorRef(){let n=await t("task-executor");if(n?.trim())return re(n.trim())},writeTaskExecutorRef(n){return e.write("task-executor",te(n))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(n){return e.write("chat-handler-flow",n)},readBoardRuntimeStoreRef(){return t("board-runtime-store-ref")},writeBoardRuntimeStoreRef(n){return e.write("board-runtime-store-ref",n)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(n){return e.write("card-store-ref",n)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(n){return e.write("outputs-store-ref",n)},readQueueStoreRef(){return t("queue-store-ref")},writeQueueStoreRef(n){return e.write("queue-store-ref",n)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(n){return e.write("scratch-store-ref",n)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(n){return e.write("chat-store-ref",n)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(n){return e.write("artifacts-store-ref",n)},readFetchedSourcesStoreRef(){return t("fetched-sources-store-ref")},writeFetchedSourcesStoreRef(n){return e.write("fetched-sources-store-ref",n)}}}function oe(e){let t=e.callbackTransport,n=e.resolveBlob??(async o=>{let s=await e.blobStorage("").read(o.value);if(s==null)throw new Error(`Blob not found for ref ${o.kind}:${o.value}`);return s});async function r(o,s){if(o.howToRun==="queue-storage")return e.queueStoreRef?(await Ce(e.queueStorageForRef(e.queueStoreRef,"task-executor")).enqueueRequest({boardId:typeof o.extra?.boardId=="string"?o.extra.boardId:e.boardId,ref:o,args:s}),{dispatched:true}):{dispatched:false,error:"queue-storage dispatch requires queueStoreRef"};if(o.howToRun==="http:post"){let a=e.fetch??globalThis.fetch;if(!a)return {dispatched:false,error:"http:post dispatch requires fetch support"};let i=await a(at(o.whatToRun),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...s,...o.extra?{extra:o.extra}:{}})});if(!i.ok){let p=await i.text().catch(()=>"");return {dispatched:false,error:`HTTP ${i.status}: ${p}`}}return {dispatched:true}}return {dispatched:false,error:`Unsupported hosted async transport "${o.howToRun}"`}}return {kvStorage:e.kvStorage,kvStorageForRef:e.kvStorageForRef,blobStorage:e.blobStorage,blobStorageForRef:e.blobStorageForRef,chatStorageForRef:e.chatStorageForRef,queueStorageForRef:e.queueStorageForRef,scratchStorage:e.scratchStorage,scratchStorageForRef:e.scratchStorageForRef,archiveFactory:e.archiveFactory,archiveFactoryForRef:e.archiveFactoryForRef,journalStorage:e.journalStorage,journalStorageForRef:e.journalStorageForRef,lock:e.lock,get callbackTransport(){return t},set callbackTransport(o){t=o;},dispatchExecution:(o,s)=>e.dispatchExecution?.(o,s)??r(o,s),supportsDirectSourceOutput:e.supportsDirectSourceOutput,resolveBlob:n,hashFn:e.hashFn,genId:e.genId,requestProcessAccumulated:e.requestProcessAccumulated,publishBoardChangeNotifications:e.publishBoardChangeNotifications,warn:e.onWarn}}function se(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(se).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(r=>`${JSON.stringify(r)}:${se(t[r])}`).join(",")}}`}function H(e,t){let n=t>>>0;for(let r=0;r<e.length;r++)n^=e.charCodeAt(r),n=Math.imul(n,16777619)>>>0;return n}function Pe(e){let t=se(e),n=H(t,2166136261),r=H(t,3735928559),o=H(t,19088743),s=H(t,4277009102);return [n,r,o,s].map(a=>a.toString(16).padStart(8,"0")).join("")}function _e(e){return String(e).replace(/[^a-zA-Z0-9_-]/g,"_")}function Oe(e){let t=e.payload??{};return {id:e.id,role:typeof t.role=="string"?t.role:"system",text:typeof t.text=="string"?t.text:"",files:Array.isArray(t.files)?t.files:[],turn:typeof t.turn=="string"?t.turn:"",updated_at:typeof t.updated_at=="string"?t.updated_at:""}}function Fe(e,t){let n=o=>`chats/${_e(o)}/processing`,r=o=>`chats/${_e(o)}/config`;return {async append(o,s,a,i=[],p=""){return (await e(o).append({role:s,text:a,files:i,turn:p,updated_at:new Date().toISOString()})).id},async readAll(o){return (await e(o).readAll()).map(Oe)},async readAfter(o,s){let a=await e(o).readAfter(s);return {records:a.entries.map(Oe),cursor:a.newCursor}},async clear(o){await e(o).clear?.();},async setProcessing(o,s){s?await t.write(n(o),true):await t.delete(n(o));},async isProcessing(o){return await t.read(n(o))===true},async getConfig(o){return await t.read(r(o))??{}},async setConfig(o,s){let a=await t.read(r(o))??{};await t.write(r(o),{...a,...s});}}}function P(e){return {status:"success",data:e}}function v(e){return {status:"fail",error:e}}function L(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function j(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function xt(e){return String(e).replace(/[^a-zA-Z0-9_-]/g,"_")}function Tt(e,t={}){let n=()=>U(e.kvStorage("config"));async function r(){return await n().readTaskExecutorRef().catch(()=>{})}async function o(u,c,d){if(!t.nonCoreTaskExecutor)throw new Error(`${u} is not supported on the hosted Firestore runtime yet`);let h=await t.nonCoreTaskExecutor({subcommand:u,...c!==void 0?{input:typeof c=="string"?c:JSON.stringify(c)}:{},...d!==void 0?{timeoutMs:d}:{}});return j(h)}async function s(u){try{if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return v("validateCardPreflight requires card JSON object in body");let c=u.body,d=c["card-content"]??c,h=typeof d.id=="string"?d.id:"(unknown)",m=Re(d),k=Array.isArray(d.source_defs)&&d.source_defs.length>0,f=[...m.issues];if(k)if(t.nonCoreTaskExecutor)for(let S of d.source_defs){let g=typeof S.bindTo=="string"?S.bindTo:"(unknown)";try{let A=await o("validate-source-def",S,1e4);if(A.ok!==!0&&Array.isArray(A.errors))for(let T of A.errors)typeof T=="string"&&T&&f.push(`source "${g}": ${T}`);}catch(A){f.push(`source "${g}": executor validate-source-def failed \u2014 ${A instanceof Error?A.message:String(A)}`);}}else await r()&&f.push("executor-backed source_def preflight is not supported on the hosted Firestore runtime yet");return P({cardId:h,isValid:f.length===0,issues:f})}catch(c){return L(c)}}function a(u){try{if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return v("evalCardCompute requires a JSON object in body");let c=u.body,d=c["card-content"]??c,h=typeof d.id=="string"?d.id:"(unknown)",m=c["mock-fetched-sources"]??{},k=c["mock-requires"]??{},f=d.compute;if(!f||!Array.isArray(f)||f.length===0)return P({cardId:h,ok:!0,computed_values:{},errors:[]});let S={id:h,card_data:d.card_data??{},requires:k,source_defs:d.source_defs,compute:f},g=F.runSync(S,{sourcesData:m});return P({cardId:h,ok:(g.errors??[]).length===0,computed_values:g.node.computed_values??{},errors:g.errors??[]})}catch(c){return L(c)}}async function i(u){return await r(),v(`${u} is not supported on the hosted Firestore runtime yet`)}async function p(){try{return t.nonCoreTaskExecutor?P(await o("describe-capabilities",void 0,1e4)):await i("describeTaskExecutorCapabilities")}catch(u){return L(u)}}async function l(u){try{if(!t.nonCoreTaskExecutor)return await i("probeSourcePreflight");if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return v("probeSourcePreflight requires card JSON object in body");let c=u.body,d=c["card-content"]??c,h=j(c["mock-projections"]??{}),m=u.params?.sourceIdx,k=Array.isArray(d.source_defs)?d.source_defs:[];if(m===void 0)return v("probeSourcePreflight requires params.sourceIdx");if(m<0||m>=k.length)return v(`sourceIdx ${m} out of range (card has ${k.length} source(s))`);let f=k[m],S=typeof f.bindTo=="string"?f.bindTo:"source",g=await o("probe-source-preflight",{...f,_projections:h},f.timeout??6e4);return g.ok!==!0?v(typeof g.error=="string"?g.error:"Preflight probe failed"):P({bindTo:S,reachable:g.reachable,latencyMs:g.latencyMs,...typeof g.note=="string"?{note:g.note}:{}})}catch(c){return L(c)}}async function C(u){try{if(!t.nonCoreTaskExecutor)return await i("runSourcePreflight");if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return v("runSourcePreflight requires card JSON object in body");let c=u.body,d=c["card-content"]??c,h=j(c["mock-projections"]??{}),m=u.params?.sourceIdx,k=Array.isArray(d.source_defs)?d.source_defs:[];if(m===void 0)return v("runSourcePreflight requires params.sourceIdx");if(m<0||m>=k.length)return v(`sourceIdx ${m} out of range (card has ${k.length} source(s))`);let f=k[m],S=typeof f.bindTo=="string"?f.bindTo:"source",g=await o("run-source-preflight",{...f,_projections:h},f.timeout??6e4);return g.ok!==!0?P({bindTo:S,ok:!1,result:null,issues:[typeof g.error=="string"?g.error:"Preflight run failed"]}):P({bindTo:S,ok:!0,result:Object.prototype.hasOwnProperty.call(g,"resultValue")?g.resultValue:null,issues:[]})}catch(c){return L(c)}}async function y(u){try{if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return v("simulateCardCycle requires a JSON object in body");let c=u.body,d=c["card-content"]??c,h=typeof d.id=="string"?d.id:"(unknown)",m=j(c["mock-fetched-sources"]??{}),k=j(c["mock-requires"]??{}),f=await s({body:{"card-content":d}}),S=f.status==="success"?{isValid:f.data.isValid,issues:f.data.issues}:{isValid:!1,issues:[f.status==="fail"?f.error:"internal error"]},g=Array.isArray(d.source_defs)?d.source_defs:[],A=j(d.card_data??{}),T=[],z=[];if(g.length>0){T=F.enrichSourcesSync(g,{card_data:A,requires:k});for(let R of T){let x=R.projections,E=R._projections;if(x&&E){for(let w of Object.keys(x))if(E[w]===void 0){let Ke=typeof R.bindTo=="string"?R.bindTo:"(unknown)";z.push({bindTo:Ke,key:w,error:`Projection "${w}" resolved to undefined`});}}}}let N=[],Y={...m};for(let R=0;R<T.length;R+=1){let x=T[R],E=typeof x.bindTo=="string"?x.bindTo:`source_${R}`;if(!t.nonCoreTaskExecutor){N.push({bindTo:E,skipped:!0,error:"No task executor configured"});continue}try{let w=await o("run-source-preflight",x,x.timeout??6e4);w.ok===!0&&!Object.prototype.hasOwnProperty.call(m,E)&&Object.prototype.hasOwnProperty.call(w,"resultValue")&&(Y[E]=w.resultValue),N.push({bindTo:E,reachable:w.reachable,latencyMs:w.latencyMs,...w.ok===!0?{}:{error:typeof w.error=="string"?w.error:"Preflight run failed"}});}catch{N.push({bindTo:E,skipped:!0,error:"Executor does not support run-source-preflight"});}}let K=d.compute,ue={},X=[];if(K&&Array.isArray(K)&&K.length>0){let R={id:h,card_data:A,requires:k,source_defs:d.source_defs,compute:K},x=F.runSync(R,{sourcesData:Y});ue=x.node.computed_values??{},X=x.errors??[];}return P({cardId:h,ok:S.isValid&&z.length===0&&X.length===0&&N.every(R=>!R.error),validation:S,source_probes:N,projection_errors:z,fetched_sources:Y,computed_values:ue,compute_errors:X})}catch(c){return L(c)}}return {describeTaskExecutorCapabilities:p,validateCardPreflight:s,evalCardCompute:a,probeSourcePreflight:l,runSourcePreflight:C,simulateCardCycle:y}}function Le(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t)}function Et(e){let t=atob(e),n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}function It(e){let t=new TextEncoder().encode(e);return Le(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Pt(e){return Pe(e).slice(0,16)}function je(){return globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():`${Date.now().toString(16)}-${Math.random().toString(16).slice(2,10)}`}function b(e){return It(String(e))}function q(){let e=String(Date.now()).padStart(13,"0"),t=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `${e}-${t}`}function De(e){try{return B(e)}catch{return null}}function D(e,t){let n=De(e);return n?.kind==="firestore"&&n.value?n.value:t}function O(e){if(e===void 0)return null;if(Array.isArray(e))return e.map(t=>O(t===void 0?null:t));if(e&&typeof e=="object"){let t=Object.entries(e).filter(([,n])=>n!==void 0).map(([n,r])=>[n,O(r)]);return Object.fromEntries(t)}return e}function Ne(e,t){return e.collection("boards").doc(t)}function $(e,t,n){return Ne(e,t).collection(n)}function ie(e){return {kind:"firestore",value:String(e)}}function _(e){return I(ie(e))}function $e(e){return {baseRef:ie(`boards/${e}`),boardRuntimeStoreRef:_(`boards/${e}/runtime-board`),cardStoreRef:_(`boards/${e}/cards`),outputsStoreRef:_(`boards/${e}/runtime-out`),queueStoreRef:_(`boards/${e}/runtime`),scratchStoreRef:_(`boards/${e}/scratch`),chatStoreRef:_(`boards/${e}/chat`),artifactsStoreRef:_(`boards/${e}/files`),fetchedSourcesStoreRef:_(`boards/${e}/sources`)}}function ae(e){return {async read(t){let n=await e.doc(b(t)).get();return n.exists?n.data()?.value??null:null},async write(t,n){await e.doc(b(t)).set(O({k:t,value:n}));},async delete(t){await e.doc(b(t)).delete();},async listKeys(t=""){return (await(t?e.where("k",">=",t).where("k","<",`${t}\uF8FF`).orderBy("k"):e.orderBy("k")).get()).docs.map(o=>o.data()?.k??o.id)}}}function Q(e){return {async append(t){let n=q();return await e.doc(n).set(O({id:n,createdAt:new Date().toISOString(),payload:t})),{id:n,payload:t}},async readAll(){return (await e.orderBy("id").get()).docs.map(n=>{let r=n.data()??{};return {id:String(r.id??n.id),payload:r.payload}})},async readAfter(t){let o=(await(t?e.where("id",">",t).orderBy("id"):e.orderBy("id")).get()).docs.map(s=>{let a=s.data()??{};return {id:String(a.id??s.id),payload:a.payload}});return {entries:o,newCursor:o.length>0?o[o.length-1].id:t}},async clear(){let t=await e.get();if(typeof e.firestore.batch=="function"){let n=e.firestore.batch();for(let r of t.docs)n.delete(e.doc(r.id));await n.commit();return}await Promise.all(t.docs.map(n=>e.doc(n.id).delete()));}}}function W(e){return {async read(t){let n=await e.doc(b(t)).get();return n.exists?n.data()?.content??null:null},async write(t,n){await e.doc(b(t)).set({k:t,content:n});},async exists(t){return (await e.doc(b(t)).get()).exists},async remove(t){await e.doc(b(t)).delete();},async readBytes(t){let n=await e.doc(b(t)).get();if(!n.exists)return null;let r=n.data()??{};return typeof r.bytesBase64=="string"?Et(r.bytesBase64):typeof r.content=="string"?new TextEncoder().encode(r.content):null},async writeBytes(t,n){await e.doc(b(t)).set({k:t,bytesBase64:Le(n)});},async listKeys(t=""){return (await(t?e.where("k",">=",t).where("k","<",`${t}\uF8FF`).orderBy("k"):e.orderBy("k")).get()).docs.map(o=>o.data()?.k??o.id)},async stat(t){let n=await e.doc(b(t)).get();if(!n.exists)return null;let r=n.data()??{},o=typeof r.bytesBase64=="string"?Math.floor(r.bytesBase64.length*3/4):typeof r.content=="string"?r.content.length:0;return {key:t,size:o,contentType:String(r.contentType??"application/octet-stream")}},async renameKey(t,n){let r=await e.doc(b(t)).get();if(!r.exists)return false;let o=r.data()??{};return await e.doc(b(n)).set({...o,k:n}),await e.doc(b(t)).delete(),true}}}function qe(e){let t=W(e);return {...t,async getUniqueKey(n="scratch-",r=""){return `${n}${q()}${r}`},async create(n,r="scratch-",o=""){let s=`${r}${q()}${o}`;return await t.write(s,n),s},keyRef(n){return ie(`${e.path}/${b(n)}`)},config:{async get(n){let r=await t.read(`__config__/${n}`);if(r==null)return null;try{return JSON.parse(r)}catch{return r}},async set(n,r){await t.write(`__config__/${n}`,JSON.stringify(r));}}}}function Be(e,t){let n=Ne(e,t);return {stream(r){return Q(n.collection(`archive-stream-${r}`))},blob(r){return W(n.collection(`archive-blob-${r}`))},async listStreams(r=""){return typeof n.listCollections!="function"?[]:(await n.listCollections()).map(s=>s.path.split("/").at(-1)??"").filter(s=>s.startsWith(`archive-stream-${r}`)).map(s=>s.slice(15))},async listBlobs(r=""){return typeof n.listCollections!="function"?[]:(await n.listCollections()).map(s=>s.path.split("/").at(-1)??"").filter(s=>s.startsWith(`archive-blob-${r}`)).map(s=>s.slice(13))},config:{async get(r){let o=await n.collection("archive-config").doc("main").get();return o.exists?o.data()?.[r]??null:null},async set(r,o){await n.collection("archive-config").doc("main").set(O({[r]:o}),{merge:true});}}}}function _t(e,t={}){let n=t.holderId??je(),r=t.ttlMs??3e4;return {async tryAcquire(){try{await e.firestore.runTransaction(async o=>{let s=await o.get(e),a=new Date().toISOString();if(s.exists){let i=s.data()??{};if(i.held===!0&&typeof i.expiresAt=="string"&&i.expiresAt>a)throw Object.assign(new Error("locked"),{code:"locked"})}o.set(e,{held:!0,holderId:n,acquiredAt:a,expiresAt:new Date(Date.now()+r).toISOString()});});}catch(o){if(o?.code==="locked")return null;throw o}return async()=>{try{await e.firestore.runTransaction(async o=>{let s=await o.get(e);if(!s.exists)return;(s.data()??{}).holderId===n&&o.update(e,{held:!1,holderId:null});});}catch{}}}}}function Ot(e,t={}){let n=t.defaultVisibilityMs??3e4;return {async enqueue(r){let o=q(),s=new Date().toISOString();return await e.doc(o).set(O({id:o,body:r,enqueuedAt:s,attempt:0,staged:false,visibleAfter:s,leaseToken:null,leaseExpiresAt:null,dead:false,deadReason:null})),{id:o,body:r,enqueuedAt:s,attempt:0}},async enqueueMany(r){let o=[];for(let s of r)o.push(await this.enqueue(s));return o},async enqueueIfAbsent(r,o){if((await e.where("dedupKey","==",o).where("dead","==",false).limit(1).get()).docs.length>0)return null;let a=q(),i=new Date().toISOString();return await e.doc(a).set(O({id:a,body:r,dedupKey:o,enqueuedAt:i,attempt:0,staged:false,visibleAfter:i,leaseToken:null,leaseExpiresAt:null,dead:false,deadReason:null})),{id:a,body:r,enqueuedAt:i,attempt:0}},async stage(r,o={}){if(o.dedupKey&&(await e.where("dedupKey","==",o.dedupKey).where("dead","==",false).limit(1).get()).docs.length>0)return null;let s=q(),a=new Date().toISOString();return await e.doc(s).set(O({id:s,body:r,dedupKey:o.dedupKey,enqueuedAt:a,attempt:0,staged:true,visibleAfter:null,leaseToken:null,leaseExpiresAt:null,dead:false,deadReason:null})),{id:s,body:r,enqueuedAt:a,attempt:0}},async commitStaged(r){try{return await e.firestore.runTransaction(async o=>{let s=e.doc(r),a=await o.get(s);if(!a.exists)throw new Error("missing");let i=a.data()??{};if(i.dead===!0||i.staged!==!0)throw new Error("not-staged");o.update(s,{staged:!1,enqueuedAt:new Date().toISOString(),attempt:0,visibleAfter:new Date().toISOString()});}),!0}catch{return false}},async discardStaged(r,o){try{return await e.firestore.runTransaction(async s=>{let a=e.doc(r),i=await s.get(a);if(!i.exists)throw new Error("missing");let p=i.data()??{};if(p.dead===!0||p.staged!==!0)throw new Error("not-staged");s.update(a,{staged:!1,dead:!0,deadReason:o??"discarded"});}),!0}catch{return false}},async peekStaged(r=""){return (await e.where("dead","==",false).where("staged","==",true).orderBy("enqueuedAt").get()).docs.map(s=>s.data()??{}).filter(s=>!r||String(s.id??"").startsWith(r)).map(s=>({id:String(s.id??""),body:s.body,enqueuedAt:String(s.enqueuedAt??""),attempt:Number(s.attempt??0)}))},async lease(r={}){let o=Math.max(1,Number(r.max??1)),s=Math.max(1,Number(r.visibilityMs??n)),a=new Date().toISOString(),i=await e.where("dead","==",false).where("staged","==",false).where("visibleAfter","<=",a).orderBy("visibleAfter").limit(o*4).get(),p=[];for(let l of i.docs){if(p.length>=o)break;let C=e.doc(l.id);try{let y=null;await e.firestore.runTransaction(async u=>{let c=await u.get(C);if(!c.exists)throw new Error("gone");let d=c.data()??{},h=new Date().toISOString();if(d.dead===!0)throw new Error("dead");if(d.staged===!0)throw new Error("staged");if(typeof d.visibleAfter=="string"&&d.visibleAfter>h)throw new Error("hidden");if(d.leaseToken&&typeof d.leaseExpiresAt=="string"&&d.leaseExpiresAt>h)throw new Error("leased");let m=je(),k=new Date(Date.now()+s).toISOString(),f=Number(d.attempt??0)+1;u.update(C,{leaseToken:m,leaseExpiresAt:k,attempt:f}),y={id:String(d.id??l.id),body:d.body,enqueuedAt:String(d.enqueuedAt??h),attempt:f,leaseToken:m,leaseExpiresAt:k};}),y&&p.push(y);}catch{}}return p},async ack(r,o){try{return await e.firestore.runTransaction(async s=>{let a=e.doc(r),i=await s.get(a);if(!i.exists)return;if((i.data()??{}).leaseToken!==o)throw new Error("token mismatch");s.delete(a);}),!0}catch{return false}},async nack(r,o,s={}){try{return await e.firestore.runTransaction(async a=>{let i=e.doc(r),p=await a.get(i);if(!p.exists)return;if((p.data()??{}).leaseToken!==o)throw new Error("token mismatch");s.dead===!0?a.update(i,{dead:!0,deadReason:s.reason??"nacked",leaseToken:null,leaseExpiresAt:null}):a.update(i,{leaseToken:null,leaseExpiresAt:null,visibleAfter:new Date().toISOString()});}),!0}catch{return false}},async peekActive(r=""){return (await e.where("dead","==",false).where("staged","==",false).orderBy("enqueuedAt").get()).docs.map(s=>s.data()??{}).filter(s=>!r||String(s.id??"").startsWith(r)).map(s=>({id:String(s.id??""),body:s.body,enqueuedAt:String(s.enqueuedAt??""),attempt:Number(s.attempt??0)}))},async peekDeadLetter(r=""){return (await e.where("dead","==",true).orderBy("enqueuedAt").get()).docs.map(s=>s.data()??{}).filter(s=>!r||String(s.id??"").startsWith(r)).map(s=>({id:String(s.id??""),body:s.body,enqueuedAt:String(s.enqueuedAt??""),attempt:Number(s.attempt??0),reason:s.deadReason}))}}}function Ft(e,t,n={}){return oe({boardId:t,kvStorage(r){return ae($(e,t,`kv-${r||"root"}`))},kvStorageForRef(r){return ae(e.collection(D(r,`boards/${t}/kv-root`)))},blobStorage(r){return W($(e,t,`blobs-${r||"root"}`))},blobStorageForRef(r){return W(e.collection(D(r,`boards/${t}/blobs-root`)))},chatStorageForRef(r){let o=D(r,`boards/${t}/chat`);return Fe(s=>Q(e.collection(`${o}-journal-${xt(s)}`)),ae(e.collection(`${o}-kv`)))},queueStoreRef:$e(t).queueStoreRef,queueStorageForRef(r,o){let s=D(r,`boards/${t}/runtime`);return Ot(e.collection(`${s}-${o}`))},scratchStorage(){return qe($(e,t,"scratch"))},scratchStorageForRef(r){return qe(e.collection(D(r,`boards/${t}/scratch`)))},archiveFactory(){return Be(e,t)},archiveFactoryForRef(r){let o=De(r),s=o?.kind==="firestore-board"?o.value:t;return Be(e,s)},journalStorage(){return Q($(e,t,"journal"))},journalStorageForRef(r){let o=D(r,`boards/${t}/runtime-board`);return Q(e.collection(`${o}-journal`))},lock:_t($(e,t,"locks").doc("board-lock"),{holderId:n.holderId}),hashFn(r){return Pt(r)},genId(){return q()},supportsDirectSourceOutput(r){return r.howToRun==="queue-storage"||r.howToRun==="http:post"},requestProcessAccumulated:n.requestProcessAccumulated,publishBoardChangeNotifications:n.publishBoardChangeNotifications,onWarn:r=>console.warn(`[firestore-board-adapter:${t}] ${r}`)})}function vo(e,t,n={}){let r={...$e(t),...n.refs??{}},o=Ft(e,t,n);return {refs:r,boardAdapter:o,nonCore:Tt(o,n)}}
2
+ exports.createFirestoreArchiveFactory=Be;exports.createFirestoreBlobStorage=W;exports.createFirestoreBoardAdapter=Ft;exports.createFirestoreBoardRefs=$e;exports.createFirestoreBoardRuntimeBundle=vo;exports.createFirestoreJournalStorage=Q;exports.createFirestoreKvStorage=ae;exports.createFirestoreLock=_t;exports.createFirestoreQueueStorage=Ot;exports.createFirestoreScratchStorage=qe;exports.makeFirestoreRef=ie;exports.serializeFirestoreRef=_;return exports;})({});//# sourceMappingURL=firestore-storage.js.map
3
3
  //# sourceMappingURL=firestore-storage.js.map
@@ -1,4 +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
1
+ var LocalStorageStorage=(function(exports){'use strict';var A="b64:";function ce(r){let t=new TextEncoder().encode(r),n=globalThis.Buffer,o;if(n)o=n.from(t).toString("base64");else if(typeof btoa=="function"){let e="";for(let s of t)e+=String.fromCharCode(s);o=btoa(e);}else throw new Error("No base64 encoder available in this runtime");return o.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function de(r){let t=r.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-r.length%4)%4),n=globalThis.Buffer;if(n)return n.from(t,"base64").toString("utf8");if(typeof atob=="function"){let o=atob(t),e=new Uint8Array(o.length);for(let s=0;s<o.length;s+=1)e[s]=o.charCodeAt(s);return new TextDecoder().decode(e)}throw new Error("No base64 decoder available in this runtime")}function h(r){return `${A}${ce(JSON.stringify(r))}`}function v(r){if(!r.startsWith(A))throw new Error(`Invalid ref format (expected ${A}<base64url(json)>): ${r}`);let t;try{t=JSON.parse(de(r.slice(A.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${r}`)}if(!t||typeof t!="object")throw new Error(`Invalid ref format (expected object payload): ${r}`);let n=t;if(typeof n.kind!="string"||typeof n.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${r}`);return {kind:n.kind,value:n.value}}function _(r){return {messageId:r.id,enqueuedAt:r.enqueuedAt,attempt:r.attempt,request:r.body}}function pe(r){return typeof r=="string"?r.startsWith("b64:")?v(r).value:r:r.value}function j(r){return {async enqueueRequest(t){return (await r.enqueue(t)).id},async leaseRequests(t){return (await r.lease(t)).map(n=>({..._(n),leaseToken:n.leaseToken,leaseExpiresAt:n.leaseExpiresAt}))},ackRequest(t,n){return r.ack(t,n)},nackRequest(t,n,o){return r.nack(t,n,o)},async peekActive(){return (await r.peekActive()).map(_)},async peekDeadLetter(){return (await r.peekDeadLetter()).map(t=>({..._(t),reason:t.reason}))}}}function O(r){let t=r.callbackTransport,n=r.resolveBlob??(async e=>{let s=await r.blobStorage("").read(e.value);if(s==null)throw new Error(`Blob not found for ref ${e.kind}:${e.value}`);return s});async function o(e,s){if(e.howToRun==="queue-storage")return r.queueStoreRef?(await j(r.queueStorageForRef(r.queueStoreRef,"task-executor")).enqueueRequest({boardId:typeof e.extra?.boardId=="string"?e.extra.boardId:r.boardId,ref:e,args:s}),{dispatched:true}):{dispatched:false,error:"queue-storage dispatch requires queueStoreRef"};if(e.howToRun==="http:post"){let u=r.fetch??globalThis.fetch;if(!u)return {dispatched:false,error:"http:post dispatch requires fetch support"};let a=await u(pe(e.whatToRun),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...s,...e.extra?{extra:e.extra}:{}})});if(!a.ok){let c=await a.text().catch(()=>"");return {dispatched:false,error:`HTTP ${a.status}: ${c}`}}return {dispatched:true}}return {dispatched:false,error:`Unsupported hosted async transport "${e.howToRun}"`}}return {kvStorage:r.kvStorage,kvStorageForRef:r.kvStorageForRef,blobStorage:r.blobStorage,blobStorageForRef:r.blobStorageForRef,chatStorageForRef:r.chatStorageForRef,queueStorageForRef:r.queueStorageForRef,scratchStorage:r.scratchStorage,scratchStorageForRef:r.scratchStorageForRef,archiveFactory:r.archiveFactory,archiveFactoryForRef:r.archiveFactoryForRef,journalStorage:r.journalStorage,journalStorageForRef:r.journalStorageForRef,lock:r.lock,get callbackTransport(){return t},set callbackTransport(e){t=e;},dispatchExecution:(e,s)=>r.dispatchExecution?.(e,s)??o(e,s),supportsDirectSourceOutput:r.supportsDirectSourceOutput,resolveBlob:n,hashFn:r.hashFn,genId:r.genId,requestProcessAccumulated:r.requestProcessAccumulated,publishBoardChangeNotifications:r.publishBoardChangeNotifications,warn:r.onWarn}}function F(r){if(r==null||typeof r!="object")return JSON.stringify(r);if(Array.isArray(r))return `[${r.map(F).join(",")}]`;let t=r;return `{${Object.keys(t).sort().map(o=>`${JSON.stringify(o)}:${F(t[o])}`).join(",")}}`}function T(r,t){let n=t>>>0;for(let o=0;o<r.length;o++)n^=r.charCodeAt(o),n=Math.imul(n,16777619)>>>0;return n}function W(r){let t=F(r),n=T(t,2166136261),o=T(t,3735928559),e=T(t,19088743),s=T(t,4277009102);return [n,o,e,s].map(u=>u.toString(16).padStart(8,"0")).join("")}function I(r){function t(s){return `${r}:blob:${s}`}let n=new TextEncoder;function o(s){if(typeof btoa=="function"){let u="";for(let a=0;a<s.length;a++)u+=String.fromCharCode(s[a]);return btoa(u)}return ""}function e(s){if(typeof atob=="function"){let u=atob(s),a=new Uint8Array(u.length);for(let c=0;c<u.length;c++)a[c]=u.charCodeAt(c);return a}return new Uint8Array}return {read(s){return globalThis.localStorage.getItem(t(s))},write(s,u){globalThis.localStorage.setItem(t(s),u);},exists(s){return globalThis.localStorage.getItem(t(s))!==null},remove(s){globalThis.localStorage.removeItem(t(s));},readBytes(s){let u=globalThis.localStorage.getItem(t(s));if(u===null)return null;try{let a=JSON.parse(u);if(a&&a.__kind==="bytes-b64"&&typeof a.data=="string")return e(a.data)}catch{}return n.encode(u)},writeBytes(s,u){let a=JSON.stringify({__kind:"bytes-b64",data:o(u)});globalThis.localStorage.setItem(t(s),a);},listKeys(s){let u=t(s??""),a=[];for(let c=0;c<globalThis.localStorage.length;c++){let l=globalThis.localStorage.key(c);l&&l.startsWith(u)&&a.push(l.slice(t("").length));}return a.sort()},stat(s){let u=globalThis.localStorage.getItem(t(s));if(u===null)return null;let a=n.encode(u).byteLength;try{let c=JSON.parse(u);c&&c.__kind==="bytes-b64"&&typeof c.data=="string"&&(a=e(c.data).byteLength);}catch{}return {key:s,size:a}},renameKey(s,u){let a=globalThis.localStorage.getItem(t(s));return a===null?false:(globalThis.localStorage.setItem(t(u),a),globalThis.localStorage.removeItem(t(s)),true)}}}var De=":scratch-marker",je=":scratch-config",E=":scratch:",Ke=1440*60*1e3,Ne=720*60*1e3,$e=200;function U(r,t){if(!r)return t;let n=r.replace(/[^A-Za-z0-9._-]/g,"_");return n.length>0?n:t}function z(r){let t=`${r}${De}`,n=`${r}${je}`,o=i=>`${r}${E}${i}`,e=i=>`${r}${E}${i}:__ts`,s=globalThis.localStorage.getItem(t)===null;if(s)try{globalThis.localStorage.setItem(t,`scratch-store
2
+ ${new Date().toISOString()}`);}catch{}function u(){let i=globalThis.localStorage.getItem(n);if(i===null)return {};try{let d=JSON.parse(i);return d&&typeof d=="object"&&!Array.isArray(d)?d:{}}catch{return {}}}function a(i){try{globalThis.localStorage.setItem(n,JSON.stringify(i));}catch{}}if(s){let i=u();typeof i["retention.lastSweepAt"]!="number"&&(i["retention.lastSweepAt"]=Date.now(),a(i));}function c(){if(globalThis.localStorage.getItem(t)===null)return;let i=u(),d=typeof i["retention.maxAgeMs"]=="number"?i["retention.maxAgeMs"]:Ke,g=typeof i["retention.sweepIntervalMs"]=="number"?i["retention.sweepIntervalMs"]:Ne;if(d<=0||g<=0)return;let p=typeof i["retention.lastSweepAt"]=="number"?i["retention.lastSweepAt"]:0,m=Date.now();if(m-p<g)return;i["retention.lastSweepAt"]=m,a(i);let y=m,S=`${r}${E}`,k=[];for(let w=0;w<globalThis.localStorage.length;w++){let b=globalThis.localStorage.key(w);b&&b.startsWith(S)&&!b.endsWith(":__ts")&&k.push(b);}for(let w of k){if(Date.now()-y>$e)break;let b=globalThis.localStorage.getItem(`${w}:__ts`),P=b===null?0:Number(b);if(Number.isFinite(P)&&P>0&&m-P>d){try{globalThis.localStorage.removeItem(w);}catch{}try{globalThis.localStorage.removeItem(`${w}:__ts`);}catch{}}}}function l(i,d){let g=U(i,"scratch"),p=U(d,".json"),m=p.startsWith(".")?p:`.${p}`,y=Math.random().toString(36).slice(2,10);return `${g}-${Date.now()}-${y}${m}`}function f(i,d){globalThis.localStorage.setItem(o(i),d),globalThis.localStorage.setItem(e(i),String(Date.now()));}return {read(i){return globalThis.localStorage.getItem(o(i))},write(i,d){f(i,d);try{c();}catch{}},exists(i){return globalThis.localStorage.getItem(o(i))!==null},remove(i){try{globalThis.localStorage.removeItem(o(i));}catch{}try{globalThis.localStorage.removeItem(e(i));}catch{}},readBytes(i){let d=globalThis.localStorage.getItem(o(i));return d===null?null:new TextEncoder().encode(d)},writeBytes(i,d){let g="";for(let p=0;p<d.length;p++)g+=String.fromCharCode(d[p]);f(i,g);try{c();}catch{}},stat(i){let d=globalThis.localStorage.getItem(o(i));if(d===null)return null;let g=globalThis.localStorage.getItem(e(i)),p=g===null?null:Number(g);return {key:i,size:new TextEncoder().encode(d).byteLength,updatedAt:p!==null&&Number.isFinite(p)?new Date(p).toISOString():void 0}},listKeys(i){let d=`${r}${E}`,g=[];for(let p=0;p<globalThis.localStorage.length;p++){let m=globalThis.localStorage.key(p);if(m&&m.startsWith(d)&&!m.endsWith(":__ts")){let y=m.slice(d.length);(!i||y.startsWith(i))&&g.push(y);}}return g.sort()},getUniqueKey(i,d){return l(i,d)},create(i,d,g){let p=l(d,g);f(p,i);try{c();}catch{}return p},keyRef(i){return {kind:"local-storage-scratch",value:i,extra:{prefix:r}}},renameKey(i,d){let g=globalThis.localStorage.getItem(o(i));if(g===null)return false;f(d,g);try{globalThis.localStorage.removeItem(o(i));}catch{}try{globalThis.localStorage.removeItem(e(i));}catch{}return true},config:{get(i){return u()[i]??null},set(i,d){let g=u();d==null?delete g[i]:g[i]=d,a(g);}}}}var Ve=":archive-marker",Me=":archive-config",q=":archive:stream:",H=":archive:blob:";function Q(r){let t=r.replace(/[^A-Za-z0-9._-]/g,"_");if(!t)throw new Error("Archive segment name cannot be empty after sanitization");return t}function Y(r){let t=`${r}${Ve}`,n=`${r}${Me}`,o=a=>`${r}${q}${a}`;if(globalThis.localStorage.getItem(t)===null)try{globalThis.localStorage.setItem(t,`archive-store
3
+ ${new Date().toISOString()}`);}catch{}function e(){let a=globalThis.localStorage.getItem(n);if(a===null)return {};try{let c=JSON.parse(a);return c&&typeof c=="object"&&!Array.isArray(c)?c:{}}catch{return {}}}function s(a){try{globalThis.localStorage.setItem(n,JSON.stringify(a));}catch{}}function u(){if(globalThis.localStorage.getItem(t)===null)return;let a=e(),c=typeof a["retention.maxAgeMs"]=="number"?a["retention.maxAgeMs"]:0,l=typeof a["retention.sweepIntervalMs"]=="number"?a["retention.sweepIntervalMs"]:0;if(c<=0||l<=0)return;let f=typeof a["retention.lastSweepAt"]=="number"?a["retention.lastSweepAt"]:0,i=Date.now();if(i-f<l)return;a["retention.lastSweepAt"]=i,s(a);let d=`${r}${q}`;for(let g=0;g<globalThis.localStorage.length;g++){let p=globalThis.localStorage.key(g);if(!p||!p.startsWith(d))continue;let m=globalThis.localStorage.getItem(p);if(m)try{let y=JSON.parse(m),S=y.filter(k=>typeof k.__ts!="number"||i-k.__ts<=c);S.length!==y.length&&globalThis.localStorage.setItem(p,JSON.stringify(S));}catch{}}}return {stream(a){let c=Q(a),l=o(c);function f(){let d=globalThis.localStorage.getItem(l);if(!d)return [];try{return JSON.parse(d)}catch{return []}}function i(d){try{globalThis.localStorage.setItem(l,JSON.stringify(d));}catch{}}return {append(d){let g={id:globalThis.crypto.randomUUID(),payload:d,__ts:Date.now()},p=f();p.push(g),i(p);try{u();}catch{}return {id:g.id,payload:g.payload}},readAll(){return f().map(d=>({id:d.id,payload:d.payload}))},readAfter(d){let g=f();if(!d){let S=g.map(k=>({id:k.id,payload:k.payload}));return {entries:S,newCursor:S.length>0?S[S.length-1].id:null}}let p=g.findIndex(S=>S.id===d),y=(p===-1?g:g.slice(p+1)).map(S=>({id:S.id,payload:S.payload}));return {entries:y,newCursor:y.length>0?y[y.length-1].id:d}},clear(){try{globalThis.localStorage.removeItem(l);}catch{}}}},blob(a){let c=Q(a),l=I(`${r}${H}${c}`);return {read:f=>l.read(f),write:(f,i)=>{l.write(f,i);try{u();}catch{}},exists:f=>l.exists(f),remove:f=>l.remove(f),readBytes:l.readBytes?f=>l.readBytes(f):void 0,writeBytes:l.writeBytes?(f,i)=>{l.writeBytes(f,i);try{u();}catch{}}:void 0,listKeys:f=>l.listKeys(f),stat:l.stat?f=>l.stat(f):void 0,renameKey:(f,i)=>l.renameKey(f,i)}},listStreams(a){let c=`${r}${q}`,l=[];for(let f=0;f<globalThis.localStorage.length;f++){let i=globalThis.localStorage.key(f);if(!i||!i.startsWith(c))continue;let d=i.slice(c.length);(!a||d.startsWith(a))&&l.push(d);}return l.sort()},listBlobs(a){let c=`${r}${H}`,l=new Set;for(let f=0;f<globalThis.localStorage.length;f++){let i=globalThis.localStorage.key(f);if(!i||!i.startsWith(c))continue;let d=i.slice(c.length),g=d.indexOf(":"),p=g===-1?d:d.slice(0,g);(!a||p.startsWith(a))&&l.add(p);}return Array.from(l).sort()},config:{get(a){return e()[a]??null},set(a,c){let l=e();c==null?delete l[a]:l[a]=c,s(l);}}}}function X(r){function t(n){return `${r}:kv:${n}`}return {read(n){let o=globalThis.localStorage.getItem(t(n));if(o===null)return null;try{return JSON.parse(o)}catch{return null}},write(n,o){globalThis.localStorage.setItem(t(n),JSON.stringify(o));},delete(n){globalThis.localStorage.removeItem(t(n));},listKeys(n){let o=t(n??""),e=[];for(let s=0;s<globalThis.localStorage.length;s++){let u=globalThis.localStorage.key(s);u!==null&&u.startsWith(o)&&e.push(u.slice(t("").length));}return e}}}function Z(r){function t(){let o=globalThis.localStorage.getItem(r);if(!o)return [];try{return JSON.parse(o)}catch{return []}}function n(o){globalThis.localStorage.setItem(r,JSON.stringify(o));}return {readAllEntries(){return t()},appendEntry(o){let e=t();e.push(o),n(e);},generateId(){return globalThis.crypto.randomUUID()}}}function ee(r){return String(r).replace(/[^a-zA-Z0-9_-]/g,"_")}function te(r){let t=r.payload??{};return {id:r.id,role:typeof t.role=="string"?t.role:"system",text:typeof t.text=="string"?t.text:"",files:Array.isArray(t.files)?t.files:[],turn:typeof t.turn=="string"?t.turn:"",updated_at:typeof t.updated_at=="string"?t.updated_at:""}}function re(r,t){let n=e=>`chats/${ee(e)}/processing`,o=e=>`chats/${ee(e)}/config`;return {async append(e,s,u,a=[],c=""){return (await r(e).append({role:s,text:u,files:a,turn:c,updated_at:new Date().toISOString()})).id},async readAll(e){return (await r(e).readAll()).map(te)},async readAfter(e,s){let u=await r(e).readAfter(s);return {records:u.entries.map(te),cursor:u.newCursor}},async clear(e){await r(e).clear?.();},async setProcessing(e,s){s?await t.write(n(e),true):await t.delete(n(e));},async isProcessing(e){return await t.read(n(e))===true},async getConfig(e){return await t.read(o(e))??{}},async setConfig(e,s){let u=await t.read(o(e))??{};await t.write(o(e),{...u,...s});}}}function Je(){let r=false;return {async tryAcquire(){return r?null:(r=true,()=>{r=false;})}}}function Ge(){let r=new Map,t=new Map,n=new Map;return {async enqueue(o){let e={id:globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`,body:o,enqueuedAt:new Date().toISOString(),attempt:0};return r.set(e.id,e),e},async enqueueMany(o){let e=[];for(let s of o)e.push(await this.enqueue(s));return e},async enqueueIfAbsent(o,e){for(let u of r.values())if(u.dedupKey===e)return null;for(let u of t.values())if(u.dedupKey===e)return null;let s={id:globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`,body:o,enqueuedAt:new Date().toISOString(),attempt:0,dedupKey:e};return r.set(s.id,s),s},async stage(o,e){let s=e?.dedupKey;if(s){for(let a of r.values())if(a.dedupKey===s)return null;for(let a of t.values())if(a.dedupKey===s)return null}let u={id:globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`,body:o,enqueuedAt:new Date().toISOString(),attempt:0,...s?{dedupKey:s}:{}};return t.set(u.id,u),u},async commitStaged(o){let e=t.get(o);return e?(t.delete(o),r.set(o,{...e,enqueuedAt:new Date().toISOString(),attempt:0}),true):false},async discardStaged(o,e){let s=t.get(o);return s?(t.delete(o),n.set(o,{...s,reason:e}),true):false},async peekStaged(o=""){return Array.from(t.values()).filter(e=>!o||e.id.startsWith(o)).map(e=>({id:e.id,body:e.body,enqueuedAt:e.enqueuedAt,attempt:e.attempt}))},async lease(o){let e=Math.max(1,Math.floor(o?.max??1)),s=Math.max(1,Math.floor(o?.visibilityMs??6e4)),u=Date.now();for(let c of r.values())c.leaseExpiresAt&&Date.parse(c.leaseExpiresAt)<=u&&(delete c.leaseToken,delete c.leaseExpiresAt);let a=[];for(let c of r.values()){if(a.length>=e)break;c.leaseToken||(c.attempt+=1,c.leaseToken=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`,c.leaseExpiresAt=new Date(Date.now()+s).toISOString(),a.push({id:c.id,body:c.body,enqueuedAt:c.enqueuedAt,attempt:c.attempt,leaseToken:c.leaseToken,leaseExpiresAt:c.leaseExpiresAt}));}return a},async ack(o,e){let s=r.get(o);return !s||s.leaseToken!==e?false:(r.delete(o),true)},async nack(o,e,s){let u=r.get(o);return !u||u.leaseToken!==e?false:(delete u.leaseToken,delete u.leaseExpiresAt,s?.dead&&(r.delete(o),n.set(o,{...u,reason:s.reason})),true)},async peekActive(o=""){return Array.from(r.values()).filter(e=>!e.leaseToken).filter(e=>!o||e.id.startsWith(o)).map(e=>({id:e.id,body:e.body,enqueuedAt:e.enqueuedAt,attempt:e.attempt}))},async peekDeadLetter(o=""){return Array.from(n.values()).filter(e=>!o||e.id.startsWith(o)).map(e=>({id:e.id,body:e.body,enqueuedAt:e.enqueuedAt,attempt:e.attempt,reason:e.reason}))}}}function B(r){let t=X(r);return {async read(n){return t.read(n)},async write(n,o){t.write(n,o);},async delete(n){t.delete(n);},async listKeys(n){return t.listKeys(n)}}}function ne(r){let t=I(r);return {async read(n){return t.read(n)},async write(n,o){t.write(n,o);},async exists(n){return t.exists(n)},async remove(n){t.remove(n);},async readBytes(n){return t.readBytes?.(n)??null},async writeBytes(n,o){await t.writeBytes?.(n,o);},async listKeys(n){return t.listKeys(n)},async stat(n){return t.stat?.(n)??null},async renameKey(n,o){let e=await t.read(n);return e==null?false:(t.write(o,e),t.remove(n),true)}}}function oe(r){let t=z(r);return {async read(n){return t.read(n)},async write(n,o){t.write(n,o);},async exists(n){return t.exists(n)},async remove(n){t.remove(n);},async readBytes(n){return t.readBytes?.(n)??null},async writeBytes(n,o){await t.writeBytes?.(n,o);},async listKeys(n){return t.listKeys(n)},async stat(n){return t.stat?.(n)??null},async getUniqueKey(n,o){return t.getUniqueKey(n,o)},async create(n,o,e){return t.create(n,o,e)},keyRef(n){return t.keyRef(n)},async renameKey(n,o){let e=t.read(n);return e==null?false:(t.write(o,e),t.remove(n),true)},config:{async get(n){return t.config.get(n)},async set(n,o){t.config.set(n,o);}}}}function L(r){let t=Z(r);function n(o){return {id:o.id,payload:o.event}}return {async append(o){let e={id:t.generateId(),event:o};return t.appendEntry(e),n(e)},async readAll(){return t.readAllEntries().map(n)},async readAfter(o){let e=t.readAllEntries().map(n);if(!o)return {entries:e,newCursor:e.length>0?e[e.length-1].id:null};let s=e.findIndex(a=>a.id===o),u=s===-1?e:e.slice(s+1);return {entries:u,newCursor:u.length>0?u[u.length-1].id:o}}}}function se(r){let t=Y(r);return {stream(n){let o=t.stream(n);return {async append(e){return o.append(e)},async readAll(){return o.readAll()},async readAfter(e){return o.readAfter(e)},async clear(){o.clear?.();}}},blob(n){let o=t.blob(n);return {async read(e){return o.read(e)},async write(e,s){o.write(e,s);},async exists(e){return o.exists(e)},async remove(e){o.remove(e);},async readBytes(e){return o.readBytes?.(e)??null},async writeBytes(e,s){await o.writeBytes?.(e,s);},async listKeys(e){return o.listKeys(e)},async stat(e){return o.stat?.(e)??null},async renameKey(e,s){let u=o.read(e);return u==null?false:(o.write(s,u),o.remove(e),true)}}},async listStreams(n){return t.listStreams(n)},async listBlobs(n){return t.listBlobs(n)},config:{async get(n){return t.config.get(n)},async set(n,o){t.config.set(n,o);}}}}function ae(r){return String(r||"").trim()}function Ue(r){return String(r).replace(/[^a-zA-Z0-9_-]/g,"_")}function ie(r){return {kind:"local-storage",value:ae(r)}}function R(r){return h(ie(r))}function ue(r){let t=`boards:${r}`;return {baseRef:ie(t),boardRuntimeStoreRef:R(`${t}:runtime-board`),cardStoreRef:R(`${t}:cards`),outputsStoreRef:R(`${t}:runtime-out`),queueStoreRef:R(`${t}:runtime`),scratchStoreRef:R(`${t}:scratch`),chatStoreRef:R(`${t}:chat`),artifactsStoreRef:R(`${t}:files`),fetchedSourcesStoreRef:R(`${t}:sources`)}}function C(r,t){try{let n=v(r);if(n?.kind==="local-storage"&&n.value)return ae(n.value)}catch{}return t}function He(r,t={}){let n=ue(r),o=new Map;return O({boardId:r,kvStorage(e){return B(`${n.baseRef.value}:${e||"root"}`)},kvStorageForRef(e){return B(C(e,`${n.baseRef.value}:root`))},blobStorage(e){return ne(e?`${n.baseRef.value}:${e}`:n.baseRef.value)},blobStorageForRef(e){return ne(C(e,n.baseRef.value))},chatStorageForRef(e){let s=C(e,`${n.baseRef.value}:chat`);return re(u=>L(`${s}:journal:${Ue(u)}`),B(s))},queueStoreRef:n.queueStoreRef,queueStorageForRef(e,s){let u=`${C(e,`${n.baseRef.value}:runtime`)}:queue:${s}`,a=o.get(u);return a||(a=Ge(),o.set(u,a)),a},scratchStorage(){return oe(`${n.baseRef.value}:scratch`)},scratchStorageForRef(e){return oe(C(e,`${n.baseRef.value}:scratch`))},archiveFactory(){return se(`${n.baseRef.value}:archive`)},archiveFactoryForRef(e){return se(C(e,`${n.baseRef.value}:archive`))},journalStorage(){return L(`${n.baseRef.value}:journal`)},journalStorageForRef(e){return L(`${C(e,`${n.baseRef.value}:runtime-board`)}:journal`)},lock:Je(),resolveBlob:async e=>{let s=e?.kind==="local-storage"?e:null;if(!s?.value)throw new Error(`Unsupported localStorage ref: ${h(e)}`);let u=I(s.value),a=await Promise.resolve(u.read(""));if(a===null)throw new Error(`Blob not found: ${h(e)}`);try{let c=JSON.parse(a);if(c?.__kind==="bytes-b64"&&typeof c.data=="string"){let l=await Promise.resolve(u.readBytes?.(""));if(l)return new TextDecoder().decode(l)}}catch{}return a},hashFn:W,genId:()=>(globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,10)}`).replace(/-/g,""),requestProcessAccumulated:t.requestProcessAccumulated,publishBoardChangeNotifications:t.publishBoardChangeNotifications,onWarn:e=>console.warn(`[localstorage-board-adapter:${r}] ${e}`)})}function Bn(r,t={}){return {refs:{...ue(r),...t.refs??{}},boardAdapter:He(r,t)}}exports.createLocalStorageBoardAdapter=He;exports.createLocalStorageBoardRefs=ue;exports.createLocalStorageBoardRuntimeBundle=Bn;exports.makeLocalStorageRef=ie;exports.serializeLocalStorageRef=R;return exports;})({});//# sourceMappingURL=localstorage-storage.js.map
4
4
  //# sourceMappingURL=localstorage-storage.js.map
@@ -1,30 +1,26 @@
1
1
  {
2
- "generatedAt": "2026-06-02T17:05:13.645Z",
2
+ "generatedAt": "2026-06-04T04:04:47.683Z",
3
3
  "algorithm": "sha256",
4
4
  "files": {
5
- "browser/board-livecards-client.js": {
6
- "sha256": "sha256-OzqYS0wVXEYOZydAwyqGY+YJr6cMlsAn6EPO1bUGthc=",
7
- "bytes": 19408
8
- },
9
5
  "browser/server-runtime-controlface.js": {
10
- "sha256": "sha256-/ltOD5JTaj7AEPMQWkFgMTU7WukWhKJl0NcUYXmiFtM=",
11
- "bytes": 171365
6
+ "sha256": "sha256-uFy3GkS27KENlYwVG72x1tIzKIizAICnQ5gyVTxbATk=",
7
+ "bytes": 178397
12
8
  },
13
9
  "browser/adapters/firestore-storage.js": {
14
- "sha256": "sha256-KaqOw1Mu8kjd3MeWg7mViNL65hF5cFYa6DQ4e7J8IgU=",
15
- "bytes": 14638
10
+ "sha256": "sha256-D++vBkrp1RaLMoS7jG8P338qh08F174zkFp8yaOhauA=",
11
+ "bytes": 45083
16
12
  },
17
13
  "browser/adapters/localstorage-storage.js": {
18
- "sha256": "sha256-iUFAlxT8V8bT7Jxo+NZ11PDJwT4WKXcyuUeMXayzipo=",
19
- "bytes": 19820
14
+ "sha256": "sha256-QMaSvgHj9jzD7m9WyNyj4+OgKI9UJRAdsUQY/kjR4FI=",
15
+ "bytes": 22189
20
16
  },
21
17
  "browser/adapters/firebase-storage.js": {
22
- "sha256": "sha256-Y5mw3knoasYOFGPVjI3dyHRz17hCvajnfb8UCUFpeI8=",
23
- "bytes": 3639
18
+ "sha256": "sha256-luv3dI9cncRpeu7kYFnIPg5cIlKXi+nPOzCAQSEjfHc=",
19
+ "bytes": 4872
24
20
  },
25
21
  "browser/live-cards.schema.json": {
26
- "sha256": "sha256-F5nfqDzZ5L3p0lLTMxGt4YtMa2sVzdNPh8sbQ8OiXHE=",
27
- "bytes": 17305
22
+ "sha256": "sha256-uO3o9KxAKr/hQcsna4otVM2zJLlgXvZchu2PpkF+4k8=",
23
+ "bytes": 17772
28
24
  }
29
25
  }
30
26
  }
@@ -145,7 +145,13 @@
145
145
  "type": "string"
146
146
  }
147
147
  }
148
- }
148
+ },
149
+ "additionalProperties": true
150
+ },
151
+ "__private": {
152
+ "description": "Control-plane-owned private state. Stripped entirely from all regular /mcp read responses. Writable only via 'setstate.card-private' and 'manage.admin-upsert-card'. Agents must never author this field. Keys inside use plain names (no leading underscores).",
153
+ "type": "object",
154
+ "additionalProperties": true
149
155
  },
150
156
  "requires": {
151
157
  "type": "array",
@@ -506,6 +512,9 @@
506
512
  "meta": {
507
513
  "$ref": "#/definitions/meta"
508
514
  },
515
+ "__private": {
516
+ "$ref": "#/definitions/__private"
517
+ },
509
518
  "view": {
510
519
  "$ref": "#/definitions/view"
511
520
  },