yaml-flow 8.7.0 → 8.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/browser/adapters/firestore-storage.js +2 -2
  2. package/browser/asset-integrity.json +7 -7
  3. package/browser/live-cards.schema.json +10 -1
  4. package/browser/server-runtime-controlface.js +4 -4
  5. package/examples/board/demo-shell-with-server.html +2 -2
  6. package/examples/board/doc.html +2 -2
  7. package/examples/board/server/board-server.js +1 -1
  8. package/examples/board/test/server-http-test.js +73 -79
  9. package/examples/board-firestore/server/worker.js +1 -1
  10. package/lib/artifacts-store-public.d.cts +1 -1
  11. package/lib/artifacts-store-public.d.ts +1 -1
  12. package/lib/board-live-cards-mcp.cjs +1 -1
  13. package/lib/board-live-cards-mcp.d.cts +2 -1
  14. package/lib/board-live-cards-mcp.d.ts +2 -1
  15. package/lib/board-live-cards-mcp.js +1 -1
  16. package/lib/board-live-cards-node.cjs +8 -8
  17. package/lib/board-live-cards-node.d.cts +9 -8
  18. package/lib/board-live-cards-node.d.ts +9 -8
  19. package/lib/board-live-cards-node.js +8 -8
  20. package/lib/{board-live-cards-public-D-DJek3X.d.ts → board-live-cards-public-JNRKfBZy.d.ts} +1 -1
  21. package/lib/{board-live-cards-public-DQzPe7A9.d.cts → board-live-cards-public-LlVUQPL2.d.cts} +1 -1
  22. package/lib/{board-live-cards-public-async-CgMCYYft.d.cts → board-live-cards-public-async-Di9QB141.d.cts} +2 -2
  23. package/lib/{board-live-cards-public-async-3hUuHxDx.d.ts → board-live-cards-public-async-fwd1QI82.d.ts} +2 -2
  24. package/lib/board-live-cards-public.cjs +1 -1
  25. package/lib/board-live-cards-public.d.cts +1 -1
  26. package/lib/board-live-cards-public.d.ts +1 -1
  27. package/lib/board-live-cards-public.js +1 -1
  28. package/lib/board-live-cards-server-runtime.cjs +1 -1
  29. package/lib/board-live-cards-server-runtime.d.cts +4 -4
  30. package/lib/board-live-cards-server-runtime.d.ts +4 -4
  31. package/lib/board-live-cards-server-runtime.js +1 -1
  32. package/lib/board-livegraph-runtime/index.cjs +1 -1
  33. package/lib/board-livegraph-runtime/index.js +1 -1
  34. package/lib/{board-platform-adapter-async-DOfEq_HC.d.cts → board-platform-adapter-async-BfHmHdx2.d.cts} +1 -1
  35. package/lib/{board-platform-adapter-async-JZPCzZnH.d.ts → board-platform-adapter-async-DYahVzIK.d.ts} +1 -1
  36. package/lib/card-compute/index.cjs +1 -1
  37. package/lib/card-compute/index.js +1 -1
  38. package/lib/card-store-public.d.cts +1 -1
  39. package/lib/card-store-public.d.ts +1 -1
  40. package/lib/card-validation.cjs +1 -1
  41. package/lib/card-validation.js +1 -1
  42. package/lib/chat-store-public.d.cts +1 -1
  43. package/lib/chat-store-public.d.ts +1 -1
  44. package/lib/chunk-3KC6LBOG.js +3 -0
  45. package/lib/chunk-76C7N4YT.js +3 -0
  46. package/lib/chunk-ASR44K7H.cjs +3 -0
  47. package/lib/chunk-EZENHAVZ.cjs +2 -0
  48. package/lib/chunk-FO4KNVU7.cjs +2 -0
  49. package/lib/chunk-HWYMZK3N.cjs +3 -0
  50. package/lib/{chunk-H5HBXPOI.cjs → chunk-J6EGN6S4.cjs} +3 -3
  51. package/lib/chunk-JH37NJGP.js +3 -0
  52. package/lib/chunk-JJL5VOQZ.cjs +3 -0
  53. package/lib/chunk-PBOQ4HYB.cjs +2 -0
  54. package/lib/{chunk-VMW4Z6EF.js → chunk-PRKRXAVN.js} +3 -3
  55. package/lib/chunk-QJVR3FWQ.js +2 -0
  56. package/lib/chunk-YBYXCFAI.js +2 -0
  57. package/lib/chunk-ZCNN6XPV.js +2 -0
  58. package/lib/cloud-storage.cjs +1 -1
  59. package/lib/cloud-storage.d.cts +3 -3
  60. package/lib/cloud-storage.d.ts +3 -3
  61. package/lib/cloud-storage.js +1 -1
  62. package/lib/continuous-event-graph/index.cjs +1 -1
  63. package/lib/continuous-event-graph/index.js +1 -1
  64. package/lib/firestore-storage/index.cjs +2 -2
  65. package/lib/firestore-storage/index.d.cts +17 -4
  66. package/lib/firestore-storage/index.d.ts +17 -4
  67. package/lib/firestore-storage/index.js +2 -2
  68. package/lib/index.cjs +2 -2
  69. package/lib/index.js +1 -1
  70. package/lib/localstorage-storage/index.cjs +1 -1
  71. package/lib/localstorage-storage/index.d.cts +2 -2
  72. package/lib/localstorage-storage/index.d.ts +2 -2
  73. package/lib/localstorage-storage/index.js +1 -1
  74. package/lib/server-jobs-queue-runner/index.d.cts +4 -4
  75. package/lib/server-jobs-queue-runner/index.d.ts +4 -4
  76. package/lib/server-runtime/index.cjs +1 -1
  77. package/lib/server-runtime/index.d.cts +5 -5
  78. package/lib/server-runtime/index.d.ts +5 -5
  79. package/lib/server-runtime/index.js +1 -1
  80. package/lib/server-runtime-agentface/index.d.cts +4 -4
  81. package/lib/server-runtime-agentface/index.d.ts +4 -4
  82. package/lib/server-runtime-controlface/index.cjs +1 -1
  83. package/lib/server-runtime-controlface/index.d.cts +16 -67
  84. package/lib/server-runtime-controlface/index.d.ts +16 -67
  85. package/lib/server-runtime-controlface/index.js +1 -1
  86. package/lib/server-runtime-core/index.cjs +1 -1
  87. package/lib/server-runtime-core/index.d.cts +8 -6
  88. package/lib/server-runtime-core/index.d.ts +8 -6
  89. package/lib/server-runtime-core/index.js +1 -1
  90. package/lib/server-runtime-watchers/index.d.cts +4 -4
  91. package/lib/server-runtime-watchers/index.d.ts +4 -4
  92. package/lib/server-runtime-webhooks/index.d.cts +4 -4
  93. package/lib/server-runtime-webhooks/index.d.ts +4 -4
  94. package/lib/{types-BzQY45dH.d.cts → types-Ba8H5_Wo.d.cts} +6 -4
  95. package/lib/{types-CF2xUcZW.d.ts → types-SO5OZm4s.d.ts} +6 -4
  96. package/package.json +1 -1
  97. package/schema/live-cards.schema.json +10 -1
  98. package/lib/chunk-DDYSXP2A.cjs +0 -3
  99. package/lib/chunk-J5J6BG7B.js +0 -2
  100. package/lib/chunk-M3OU6IS5.cjs +0 -2
  101. package/lib/chunk-M6STQR5F.cjs +0 -2
  102. package/lib/chunk-N6P2JW4W.js +0 -3
  103. package/lib/chunk-NMZ6XNLB.cjs +0 -3
  104. package/lib/chunk-OEFTOO47.cjs +0 -3
  105. package/lib/chunk-PRHQBGPT.js +0 -2
  106. package/lib/chunk-VLBB3D6B.js +0 -3
  107. package/lib/chunk-ZXQR7GHT.js +0 -3
@@ -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 Ne(e){let t=new TextEncoder().encode(e),r=globalThis.Buffer,n;if(r)n=r.from(t).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of t)o+=String.fromCharCode(s);n=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function $e(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4),r=globalThis.Buffer;if(r)return r.from(t,"base64").toString("utf8");if(typeof atob=="function"){let n=atob(t),o=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function I(e){return `${V}${Ne(JSON.stringify(e))}`}function q(e){if(!e.startsWith(V))throw new Error(`Invalid ref format (expected ${V}<base64url(json)>): ${e}`);let t;try{t=JSON.parse($e(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 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 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 ue={$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 ce=void 0;var de=void 0;var Ve=M(),Me=Ve("./jsonata-sync.cjs"),J=null;var le=/\b(card_data|requires|fetched_sources|computed_values|source_defs)\b/g,Je=/^\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\.|$)/;function Ge(e){let t=new Set,r;for(le.lastIndex=0;(r=le.exec(e))!==null;)t.add(r[1]);return t}function fe(e){let t=Je.exec(e);return t?t[1]:null}function ge(e,t,r,n){try{Me(e);}catch(s){let i=s instanceof Error?s.message:String(s);n.push(`${t}: invalid JSONata expression (${i})`);return}let o=Ge(e);for(let s of o)r.has(s)||n.push(`${t}: disallowed namespace "${s}" in expression`);}function Y(e,t,r){if(Array.isArray(e)){e.forEach((o,s)=>{Y(o,`${t}/${s}`,r);});return}if(typeof e=="string"){let o=fe(e);if(!o)return;new Set(["card_data","requires","computed_values"]).has(o)||r.push(`${t}: disallowed namespace "${o}" in view reference`);return}if(!e||typeof e!="object")return;let n=e;for(let[o,s]of Object.entries(n))Y(s,`${t}/${o}`,r);}function He(){if(J)return J;let e=new ce({allErrors:true});return de(e),J=e.compile(ue),J}function pe(e){let t=He(),r=t(e),n=(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,i=new Set;o.forEach((a,f)=>{if(!a||typeof a!="object"||Array.isArray(a))return;let l=a;typeof l.bindTo=="string"&&l.bindTo&&(s.has(l.bindTo)&&n.push(`/source_defs/${f}/bindTo: bindTo "${l.bindTo}" must be unique across all source_defs`),s.add(l.bindTo)),typeof l.outputFile=="string"&&l.outputFile&&(i.has(l.outputFile)&&n.push(`/source_defs/${f}/outputFile: outputFile "${l.outputFile}" must be unique across all source_defs`),i.add(l.outputFile));});}}return !r||n.length>0?{ok:false,errors:n}:{ok:true,errors:[]}}function me(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:true,errors:[]};let r=e,n=r.compute;Array.isArray(n)&&n.forEach((l,S)=>{if(!l||typeof l!="object"||Array.isArray(l))return;let m=l.expr;typeof m!="string"||m.trim().length===0||ge(m,`/compute/${S}/expr`,new Set(["card_data","requires","fetched_sources","computed_values"]),t);});let o=new Set(["card_data","requires","fetched_sources","computed_values"]),s=r.provides;Array.isArray(s)&&s.forEach((l,S)=>{if(!l||typeof l!="object"||Array.isArray(l))return;let m=l.ref;if(typeof m!="string"||m.trim().length===0)return;let u=fe(m);u===null?t.push(`/provides/${S}/ref: path "${m}" must start with a valid namespace (${[...o].join(", ")})`):o.has(u)||t.push(`/provides/${S}/ref: disallowed namespace "${u}" in path "${m}" (valid: ${[...o].join(", ")})`);});let i=r.view;i&&typeof i=="object"&&!Array.isArray(i)&&Y(i,"/view",t);let a=new Set(["card_data","requires"]),f=r.source_defs;return Array.isArray(f)&&f.forEach((l,S)=>{if(!l||typeof l!="object"||Array.isArray(l))return;let m=l.projections;if(!(!m||typeof m!="object"||Array.isArray(m)))for(let[u,c]of Object.entries(m))typeof c!="string"||c.trim().length===0||ge(c,`/source_defs/${S}/projections/${u}`,a,t);}),{ok:t.length===0,errors:t}}function X(e){let t=pe(e);if(!t.ok)return t;let r=me(e);return r.ok?{ok:true,errors:[]}:{ok:false,errors:r.errors}}var Ue=M(),G=Ue("./jsonata-sync.cjs"),he=G;function ye(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let o=0;o<r.length;o++){if(n==null)return;n=n[r[o]];}return n}function Se(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(o[n[s]]==null||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];o[n[n.length-1]]=r;}async function Qe(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let o of e.compute)try{let s=await G(o.expr).evaluate(n);Se(e.computed_values,o.bindTo,s),n.computed_values=e.computed_values;}catch{}return e}function We(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},o=[];for(let s of e.compute)try{let i=he(s.expr).evaluate(n);Se(e.computed_values,s.bindTo,i),n.computed_values=e.computed_values;}catch(i){let a=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:a});}return o.length>0?{ok:true,node:e,errors:o}:{ok:true,node:e}}async function ze(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return G(e).evaluate(n)}function Ye(e,t){return t.startsWith("fetched_sources.")?ye(e._sourcesData??{},t.slice(16)):ye(e,t)}var ke=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Xe=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Ze(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Xe.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${o}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,o)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${o}]: must be a compute step object`);else {let s=n;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,o=new Set;r.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${i}]: must be an object`);else {let a=s;typeof a.bindTo!="string"||!a.bindTo?t.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(a.bindTo)&&t.push(`source_defs[${i}]: bindTo "${a.bindTo}" is not unique across source_defs`),n.add(a.bindTo)),typeof a.outputFile!="string"||!a.outputFile?t.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(a.outputFile)&&t.push(`source_defs[${i}]: outputFile "${a.outputFile}" is not unique across source_defs`),o.add(a.outputFile)),a.optionalForCompletionGating!=null&&typeof a.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((o,s)=>{if(!o||typeof o!="object"){t.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):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`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function et(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await G(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}}))}function tt(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let o={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[s,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=he(i).evaluate(r);}catch{o[s]=void 0;}}return {...n,_projections:o}})}var O={run:Qe,runSync:We,eval:ze,resolve:Ye,validate:Ze,enrichSources:et,enrichSourcesSync:tt};function be(e){let t=X(e);return {isValid:t.ok,issues:t.errors}}function Z(e){return JSON.stringify(e)}function ee(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 te(e){return {messageId:e.id,enqueuedAt:e.enqueuedAt,attempt:e.attempt,request:e.body}}function nt(e){return typeof e=="string"?e.startsWith("b64:")?q(e).value:e:e.value}function $(e){return {async enqueueRequest(t){return (await e.enqueue(t)).id},async leaseRequests(t){return (await e.lease(t)).map(r=>({...te(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(te)},async peekDeadLetter(){return (await e.peekDeadLetter()).map(t=>({...te(t),reason:t.reason}))}}}function H(e){async function t(r){let n=await e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {async readTaskExecutorRef(){let r=await t("task-executor");if(r?.trim())return ee(r.trim())},writeTaskExecutorRef(r){return e.write("task-executor",Z(r))},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){return e.write("chat-handler-flow",r)},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){return e.write("card-store-ref",r)},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){return e.write("outputs-store-ref",r)},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){return e.write("scratch-store-ref",r)},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){return e.write("archive-store-ref",r)},readChatStoreRef(){return t("chat-store-ref")},writeChatStoreRef(r){return e.write("chat-store-ref",r)},readArtifactsStoreRef(){return t("artifacts-store-ref")},writeArtifactsStoreRef(r){return e.write("artifacts-store-ref",r)}}}function re(e){let t,r,n,o=e.callbackTransport,s=e.resolveBlob??(async a=>{let f=await e.blobStorage("").read(a.value);if(f==null)throw new Error(`Blob not found for ref ${a.kind}:${a.value}`);return f});async function i(a,f){if(a.howToRun==="queue-storage"){let l=e.boardWorkerStore??t??(e.queueStorage?$(e.queueStorage):void 0);return l?(t||(t=l),await l.enqueueRequest({boardId:typeof a.extra?.boardId=="string"?a.extra.boardId:e.boardId,ref:a,args:f}),{dispatched:true}):{dispatched:false,error:"queue-storage dispatch requires queueStorage or boardWorkerStore"}}if(a.howToRun==="http:post"){let l=e.fetch??globalThis.fetch;if(!l)return {dispatched:false,error:"http:post dispatch requires fetch support"};let S=await l(nt(a.whatToRun),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...f,...a.extra?{extra:a.extra}:{}})});if(!S.ok){let m=await S.text().catch(()=>"");return {dispatched:false,error:`HTTP ${S.status}: ${m}`}}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=$(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=$(e.chatAgentQueueStorage);else if(e.boardWorkerStore)r=e.boardWorkerStore;else if(e.queueStorage)r=$(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 o},set callbackTransport(a){o=a;},dispatchExecution:(a,f)=>e.dispatchExecution?.(a,f)??i(a,f),supportsDirectSourceOutput:e.supportsDirectSourceOutput,resolveBlob:s,hashFn:e.hashFn,genId:e.genId,requestProcessAccumulated:e.requestProcessAccumulated,publishBoardChangeNotifications:e.publishBoardChangeNotifications,warn:e.onWarn}}function ne(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(ne).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${ne(t[n])}`).join(",")}}`}function U(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 Ee(e){let t=ne(e),r=U(t,2166136261),n=U(t,3735928559),o=U(t,19088743),s=U(t,4277009102);return [r,n,o,s].map(i=>i.toString(16).padStart(8,"0")).join("")}function P(e){return {status:"success",data:e}}function R(e){return {status:"fail",error:e}}function B(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function L(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Rt(e,t={}){let r=()=>H(e.kvStorage("config"));async function n(){return await r().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 k=await t.nonCoreTaskExecutor({subcommand:u,...c!==void 0?{input:typeof c=="string"?c:JSON.stringify(c)}:{},...d!==void 0?{timeoutMs:d}:{}});return L(k)}async function s(u){try{if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return R("validateCardPreflight requires card JSON object in body");let c=u.body,d=c["card-content"]??c,k=typeof d.id=="string"?d.id:"(unknown)",y=be(d),h=Array.isArray(d.source_defs)&&d.source_defs.length>0,g=[...y.issues];if(h)if(t.nonCoreTaskExecutor)for(let b of d.source_defs){let p=typeof b.bindTo=="string"?b.bindTo:"(unknown)";try{let A=await o("validate-source-def",b,1e4);if(A.ok!==!0&&Array.isArray(A.errors))for(let T of A.errors)typeof T=="string"&&T&&g.push(`source "${p}": ${T}`);}catch(A){g.push(`source "${p}": executor validate-source-def failed \u2014 ${A instanceof Error?A.message:String(A)}`);}}else await n()&&g.push("executor-backed source_def preflight is not supported on the hosted Firestore runtime yet");return P({cardId:k,isValid:g.length===0,issues:g})}catch(c){return B(c)}}function i(u){try{if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return R("evalCardCompute requires a JSON object in body");let c=u.body,d=c["card-content"]??c,k=typeof d.id=="string"?d.id:"(unknown)",y=c["mock-fetched-sources"]??{},h=c["mock-requires"]??{},g=d.compute;if(!g||!Array.isArray(g)||g.length===0)return P({cardId:k,ok:!0,computed_values:{},errors:[]});let b={id:k,card_data:d.card_data??{},requires:h,source_defs:d.source_defs,compute:g},p=O.runSync(b,{sourcesData:y});return P({cardId:k,ok:(p.errors??[]).length===0,computed_values:p.node.computed_values??{},errors:p.errors??[]})}catch(c){return B(c)}}async function a(u){return await n(),R(`${u} is not supported on the hosted Firestore runtime yet`)}async function f(){try{return t.nonCoreTaskExecutor?P(await o("describe-capabilities",void 0,1e4)):await a("describeTaskExecutorCapabilities")}catch(u){return B(u)}}async function l(u){try{if(!t.nonCoreTaskExecutor)return await a("probeSourcePreflight");if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return R("probeSourcePreflight requires card JSON object in body");let c=u.body,d=c["card-content"]??c,k=L(c["mock-projections"]??{}),y=u.params?.sourceIdx,h=Array.isArray(d.source_defs)?d.source_defs:[];if(y===void 0)return R("probeSourcePreflight requires params.sourceIdx");if(y<0||y>=h.length)return R(`sourceIdx ${y} out of range (card has ${h.length} source(s))`);let g=h[y],b=typeof g.bindTo=="string"?g.bindTo:"source",p=await o("probe-source-preflight",{...g,_projections:k},g.timeout??6e4);return p.ok!==!0?R(typeof p.error=="string"?p.error:"Preflight probe failed"):P({bindTo:b,reachable:p.reachable,latencyMs:p.latencyMs,...typeof p.note=="string"?{note:p.note}:{}})}catch(c){return B(c)}}async function S(u){try{if(!t.nonCoreTaskExecutor)return await a("runSourcePreflight");if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return R("runSourcePreflight requires card JSON object in body");let c=u.body,d=c["card-content"]??c,k=L(c["mock-projections"]??{}),y=u.params?.sourceIdx,h=Array.isArray(d.source_defs)?d.source_defs:[];if(y===void 0)return R("runSourcePreflight requires params.sourceIdx");if(y<0||y>=h.length)return R(`sourceIdx ${y} out of range (card has ${h.length} source(s))`);let g=h[y],b=typeof g.bindTo=="string"?g.bindTo:"source",p=await o("run-source-preflight",{...g,_projections:k},g.timeout??6e4);return p.ok!==!0?P({bindTo:b,ok:!1,result:null,issues:[typeof p.error=="string"?p.error:"Preflight run failed"]}):P({bindTo:b,ok:!0,result:Object.prototype.hasOwnProperty.call(p,"resultValue")?p.resultValue:null,issues:[]})}catch(c){return B(c)}}async function m(u){try{if(!u.body||typeof u.body!="object"||Array.isArray(u.body))return R("simulateCardCycle requires a JSON object in body");let c=u.body,d=c["card-content"]??c,k=typeof d.id=="string"?d.id:"(unknown)",y=L(c["mock-fetched-sources"]??{}),h=L(c["mock-requires"]??{}),g=await s({body:{"card-content":d}}),b=g.status==="success"?{isValid:g.data.isValid,issues:g.data.issues}:{isValid:!1,issues:[g.status==="fail"?g.error:"internal error"]},p=Array.isArray(d.source_defs)?d.source_defs:[],A=L(d.card_data??{}),T=[],Q=[];if(p.length>0){T=O.enrichSourcesSync(p,{card_data:A,requires:h});for(let w of T){let x=w.projections,E=w._projections;if(x&&E){for(let C of Object.keys(x))if(E[C]===void 0){let De=typeof w.bindTo=="string"?w.bindTo:"(unknown)";Q.push({bindTo:De,key:C,error:`Projection "${C}" resolved to undefined`});}}}}let N=[],W={...y};for(let w=0;w<T.length;w+=1){let x=T[w],E=typeof x.bindTo=="string"?x.bindTo:`source_${w}`;if(!t.nonCoreTaskExecutor){N.push({bindTo:E,skipped:!0,error:"No task executor configured"});continue}try{let C=await o("run-source-preflight",x,x.timeout??6e4);C.ok===!0&&!Object.prototype.hasOwnProperty.call(y,E)&&Object.prototype.hasOwnProperty.call(C,"resultValue")&&(W[E]=C.resultValue),N.push({bindTo:E,reachable:C.reachable,latencyMs:C.latencyMs,...C.ok===!0?{}:{error:typeof C.error=="string"?C.error:"Preflight run failed"}});}catch{N.push({bindTo:E,skipped:!0,error:"Executor does not support run-source-preflight"});}}let K=d.compute,ie={},z=[];if(K&&Array.isArray(K)&&K.length>0){let w={id:k,card_data:A,requires:h,source_defs:d.source_defs,compute:K},x=O.runSync(w,{sourcesData:W});ie=x.node.computed_values??{},z=x.errors??[];}return P({cardId:k,ok:b.isValid&&Q.length===0&&z.length===0&&N.every(w=>!w.error),validation:b,source_probes:N,projection_errors:Q,fetched_sources:W,computed_values:ie,compute_errors:z})}catch(c){return B(c)}}return {describeTaskExecutorCapabilities:f,validateCardPreflight:s,evalCardCompute:i,probeSourcePreflight:l,runSourcePreflight:S,simulateCardCycle:m}}function Fe(e){let t="";for(let r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return btoa(t)}function vt(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 At(e){let t=new TextEncoder().encode(e);return Fe(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function xt(e){return Ee(e).slice(0,16)}function qe(){return globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():`${Date.now().toString(16)}-${Math.random().toString(16).slice(2,10)}`}function v(e){return At(String(e))}function D(){let e=String(Date.now()).padStart(13,"0"),t=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `${e}-${t}`}function Be(e){try{return q(e)}catch{return null}}function Ie(e,t){let r=Be(e);return r?.kind==="firestore"&&r.value?r.value:t}function F(e){if(e===void 0)return null;if(Array.isArray(e))return e.map(t=>F(t===void 0?null:t));if(e&&typeof e=="object"){let t=Object.entries(e).filter(([,r])=>r!==void 0).map(([r,n])=>[r,F(n)]);return Object.fromEntries(t)}return e}function Le(e,t){return e.collection("boards").doc(t)}function _(e,t,r){return Le(e,t).collection(r)}function se(e){return {kind:"firestore",value:String(e)}}function j(e){return I(se(e))}function Tt(e){return {baseRef:se(`boards/${e}`),cardStoreRef:j(`boards/${e}/cards`),outputsStoreRef:j(`boards/${e}/runtime-out`),scratchStoreRef:j(`boards/${e}/scratch`),archiveStoreRef:j(`boards/${e}/archive`),chatStoreRef:j(`boards/${e}/chat`),artifactsStoreRef:j(`boards/${e}/files`)}}function Pe(e){return {async read(t){let r=await e.doc(v(t)).get();return r.exists?r.data()?.value??null:null},async write(t,r){await e.doc(v(t)).set(F({k:t,value:r}));},async delete(t){await e.doc(v(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 je(e){return {async append(t){let r=D();return await e.doc(r).set(F({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 o=(await(t?e.where("id",">",t).orderBy("id"):e.orderBy("id")).get()).docs.map(s=>{let i=s.data()??{};return {id:String(i.id??s.id),payload:i.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 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 ae(e){return {async read(t){let r=await e.doc(v(t)).get();return r.exists?r.data()?.content??null:null},async write(t,r){await e.doc(v(t)).set({k:t,content:r});},async exists(t){return (await e.doc(v(t)).get()).exists},async remove(t){await e.doc(v(t)).delete();},async readBytes(t){let r=await e.doc(v(t)).get();if(!r.exists)return null;let n=r.data()??{};return typeof n.bytesBase64=="string"?vt(n.bytesBase64):typeof n.content=="string"?new TextEncoder().encode(n.content):null},async writeBytes(t,r){await e.doc(v(t)).set({k:t,bytesBase64:Fe(r)});},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 r=await e.doc(v(t)).get();if(!r.exists)return null;let n=r.data()??{},o=typeof n.bytesBase64=="string"?Math.floor(n.bytesBase64.length*3/4):typeof n.content=="string"?n.content.length:0;return {key:t,size:o,contentType:String(n.contentType??"application/octet-stream")}}}}function _e(e){let t=ae(e);return {...t,async getUniqueKey(r="scratch-",n=""){return `${r}${D()}${n}`},async create(r,n="scratch-",o=""){let s=`${n}${D()}${o}`;return await t.write(s,r),s},keyRef(r){return se(`${e.path}/${v(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 Oe(e,t){let r=Le(e,t);return {stream(n){return je(r.collection(`archive-stream-${n}`))},blob(n){return ae(r.collection(`archive-blob-${n}`))},async listStreams(n=""){return typeof r.listCollections!="function"?[]:(await r.listCollections()).map(s=>s.path.split("/").at(-1)??"").filter(s=>s.startsWith(`archive-stream-${n}`)).map(s=>s.slice(15))},async listBlobs(n=""){return typeof r.listCollections!="function"?[]:(await r.listCollections()).map(s=>s.path.split("/").at(-1)??"").filter(s=>s.startsWith(`archive-blob-${n}`)).map(s=>s.slice(13))},config:{async get(n){let o=await r.collection("archive-config").doc("main").get();return o.exists?o.data()?.[n]??null:null},async set(n,o){await r.collection("archive-config").doc("main").set(F({[n]:o}),{merge:true});}}}}function Et(e,t={}){let r=t.holderId??qe(),n=t.ttlMs??3e4;return {async tryAcquire(){try{await e.firestore.runTransaction(async o=>{let s=await o.get(e),i=new Date().toISOString();if(s.exists){let a=s.data()??{};if(a.held===!0&&typeof a.expiresAt=="string"&&a.expiresAt>i)throw Object.assign(new Error("locked"),{code:"locked"})}o.set(e,{held:!0,holderId:r,acquiredAt:i,expiresAt:new Date(Date.now()+n).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===r&&o.update(e,{held:!1,holderId:null});});}catch{}}}}}function oe(e,t={}){let r=t.defaultVisibilityMs??3e4;return {async enqueue(n){let o=D(),s=new Date().toISOString();return await e.doc(o).set(F({id:o,body:n,enqueuedAt:s,attempt:0,visibleAfter:s,leaseToken:null,leaseExpiresAt:null,dead:false,deadReason:null})),{id:o,body:n,enqueuedAt:s,attempt:0}},async enqueueIfAbsent(n,o){if((await e.where("dedupKey","==",o).where("dead","==",false).limit(1).get()).docs.length>0)return null;let i=D(),a=new Date().toISOString();return await e.doc(i).set(F({id:i,body:n,dedupKey:o,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 o=Math.max(1,Number(n.max??1)),s=Math.max(1,Number(n.visibilityMs??r)),i=new Date().toISOString(),a=await e.where("dead","==",false).where("visibleAfter","<=",i).orderBy("visibleAfter").limit(o*4).get(),f=[];for(let l of a.docs){if(f.length>=o)break;let S=e.doc(l.id);try{let m=null;await e.firestore.runTransaction(async u=>{let c=await u.get(S);if(!c.exists)throw new Error("gone");let d=c.data()??{},k=new Date().toISOString();if(d.dead===!0)throw new Error("dead");if(typeof d.visibleAfter=="string"&&d.visibleAfter>k)throw new Error("hidden");if(d.leaseToken&&typeof d.leaseExpiresAt=="string"&&d.leaseExpiresAt>k)throw new Error("leased");let y=qe(),h=new Date(Date.now()+s).toISOString(),g=Number(d.attempt??0)+1;u.update(S,{leaseToken:y,leaseExpiresAt:h,attempt:g}),m={id:String(d.id??l.id),body:d.body,enqueuedAt:String(d.enqueuedAt??k),attempt:g,leaseToken:y,leaseExpiresAt:h};}),m&&f.push(m);}catch{}}return f},async ack(n,o){try{return await e.firestore.runTransaction(async s=>{let i=e.doc(n),a=await s.get(i);if(!a.exists)return;if((a.data()??{}).leaseToken!==o)throw new Error("token mismatch");s.delete(i);}),!0}catch{return false}},async nack(n,o,s={}){try{return await e.firestore.runTransaction(async i=>{let a=e.doc(n),f=await i.get(a);if(!f.exists)return;if((f.data()??{}).leaseToken!==o)throw new Error("token mismatch");s.dead===!0?i.update(a,{dead:!0,deadReason:s.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(s=>s.data()??{}).filter(s=>!n||String(s.id??"").startsWith(n)).map(s=>({id:String(s.id??""),body:s.body,enqueuedAt:String(s.enqueuedAt??""),attempt:Number(s.attempt??0)}))},async peekDeadLetter(n=""){return (await e.where("dead","==",true).orderBy("enqueuedAt").get()).docs.map(s=>s.data()??{}).filter(s=>!n||String(s.id??"").startsWith(n)).map(s=>({id:String(s.id??""),body:s.body,enqueuedAt:String(s.enqueuedAt??""),attempt:Number(s.attempt??0),reason:s.deadReason}))}}}function It(e,t,r={}){return re({boardId:t,kvStorage(n){return Pe(_(e,t,`kv-${n||"root"}`))},kvStorageForRef(n){return Pe(e.collection(Ie(n,`boards/${t}/kv-root`)))},blobStorage(n){return ae(_(e,t,`blobs-${n||"root"}`))},scratchStorage(){return _e(_(e,t,"scratch"))},scratchStorageForRef(n){return _e(e.collection(Ie(n,`boards/${t}/scratch`)))},archiveFactory(){return Oe(e,t)},archiveFactoryForRef(n){let o=Be(n),s=o?.kind==="firestore-board"?o.value:t;return Oe(e,s)},journalStorage(){return je(_(e,t,"journal"))},queueStorage:oe(_(e,t,"worker-queue")),chatAgentQueueStorage:oe(_(e,t,"chat-queue")),processAccumulatedQueueStorage:oe(_(e,t,"process-queue")),lock:Et(_(e,t,"locks").doc("board-lock"),{holderId:r.holderId}),hashFn(n){return xt(n)},genId(){return D()},supportsDirectSourceOutput(n){return n.howToRun==="queue-storage"||n.howToRun==="http:post"},requestProcessAccumulated:r.requestProcessAccumulated,publishBoardChangeNotifications:r.publishBoardChangeNotifications,onWarn:n=>console.warn(`[firestore-board-adapter:${t}] ${n}`)})}function bo(e,t,r={}){let n={...Tt(t),...r.refs??{}},o=It(e,t,r);return {refs:n,boardAdapter:o,nonCore:Rt(o,r)}}
2
+ exports.createFirestoreArchiveFactory=Oe;exports.createFirestoreBlobStorage=ae;exports.createFirestoreBoardAdapter=It;exports.createFirestoreBoardRefs=Tt;exports.createFirestoreBoardRuntimeBundle=bo;exports.createFirestoreJournalStorage=je;exports.createFirestoreKvStorage=Pe;exports.createFirestoreLock=Et;exports.createFirestoreQueueStorage=oe;exports.createFirestoreScratchStorage=_e;exports.makeFirestoreRef=se;exports.serializeFirestoreRef=j;return exports;})({});//# sourceMappingURL=firestore-storage.js.map
3
3
  //# sourceMappingURL=firestore-storage.js.map
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-06-02T17:05:13.645Z",
2
+ "generatedAt": "2026-06-03T06:26:48.641Z",
3
3
  "algorithm": "sha256",
4
4
  "files": {
5
5
  "browser/board-livecards-client.js": {
@@ -7,12 +7,12 @@
7
7
  "bytes": 19408
8
8
  },
9
9
  "browser/server-runtime-controlface.js": {
10
- "sha256": "sha256-/ltOD5JTaj7AEPMQWkFgMTU7WukWhKJl0NcUYXmiFtM=",
11
- "bytes": 171365
10
+ "sha256": "sha256-ZhP11U0rXONrkp/hxtCEXgT4FGziN44GLBmPV05n6Bw=",
11
+ "bytes": 168485
12
12
  },
13
13
  "browser/adapters/firestore-storage.js": {
14
- "sha256": "sha256-KaqOw1Mu8kjd3MeWg7mViNL65hF5cFYa6DQ4e7J8IgU=",
15
- "bytes": 14638
14
+ "sha256": "sha256-FWr85NCNF5z2rw1AON610qv484pUIwwL+8DZDPm6GR8=",
15
+ "bytes": 42282
16
16
  },
17
17
  "browser/adapters/localstorage-storage.js": {
18
18
  "sha256": "sha256-iUFAlxT8V8bT7Jxo+NZ11PDJwT4WKXcyuUeMXayzipo=",
@@ -23,8 +23,8 @@
23
23
  "bytes": 3639
24
24
  },
25
25
  "browser/live-cards.schema.json": {
26
- "sha256": "sha256-F5nfqDzZ5L3p0lLTMxGt4YtMa2sVzdNPh8sbQ8OiXHE=",
27
- "bytes": 17305
26
+ "sha256": "sha256-uO3o9KxAKr/hQcsna4otVM2zJLlgXvZchu2PpkF+4k8=",
27
+ "bytes": 17772
28
28
  }
29
29
  }
30
30
  }
@@ -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
  },