chainlesschain 0.166.130 → 0.166.132

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 (469) hide show
  1. package/README.md +30 -4
  2. package/package.json +2 -2
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/AIOps-CHItp4vg.js +1 -0
  7. package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +1 -0
  8. package/src/assets/web-panel/assets/{ActionButton-Dzv1ReHF.js → ActionButton-nhMNWW_d.js} +1 -1
  9. package/src/assets/web-panel/assets/Analytics-DRc81BBI.js +3 -0
  10. package/src/assets/web-panel/assets/Analytics-Dr-1kvaM.css +1 -0
  11. package/src/assets/web-panel/assets/AppLayout-BTBIIl1e.css +1 -0
  12. package/src/assets/web-panel/assets/AppLayout-CVt7HMkp.js +3 -0
  13. package/src/assets/web-panel/assets/Artifacts-BuJgG5jf.js +1 -0
  14. package/src/assets/web-panel/assets/Artifacts-Dohtjyfl.css +1 -0
  15. package/src/assets/web-panel/assets/Audit-DDnViLtj.css +1 -0
  16. package/src/assets/web-panel/assets/Audit-msNg0aH-.js +1 -0
  17. package/src/assets/web-panel/assets/BackgroundAgents-BpcV8yWC.js +1 -0
  18. package/src/assets/web-panel/assets/BackgroundAgents-CH3Uc9sF.css +1 -0
  19. package/src/assets/web-panel/assets/Backup-CYh10zO3.css +1 -0
  20. package/src/assets/web-panel/assets/Backup-P53DADwG.js +1 -0
  21. package/src/assets/web-panel/assets/BaseInput-DFxT2yWN.js +1 -0
  22. package/src/assets/web-panel/assets/Chat-B5JvvQJb.css +1 -0
  23. package/src/assets/web-panel/assets/Chat-BXoHisHW.js +7 -0
  24. package/src/assets/web-panel/assets/ChatBubbleRenderer-CO908iBt.css +1 -0
  25. package/src/assets/web-panel/assets/ChatBubbleRenderer-DMGtSdDx.js +1 -0
  26. package/src/assets/web-panel/assets/{Checkbox-B5uzaLLP.js → Checkbox-B4g_ckJq.js} +1 -1
  27. package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +1 -0
  28. package/src/assets/web-panel/assets/Codegen-C6SSSOfp.js +1 -0
  29. package/src/assets/web-panel/assets/{Col-D3I2kUGu.js → Col-IO1NEUYL.js} +1 -1
  30. package/src/assets/web-panel/assets/Community-C2RejeOY.css +1 -0
  31. package/src/assets/web-panel/assets/Community-CdEBl93F.js +1 -0
  32. package/src/assets/web-panel/assets/{Compact-5GigOmb8.js → Compact-DYs0a9k7.js} +1 -1
  33. package/src/assets/web-panel/assets/Compliance-BPnk7948.js +1 -0
  34. package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +1 -0
  35. package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +1 -0
  36. package/src/assets/web-panel/assets/Cowork-VLOTGbza.js +6 -0
  37. package/src/assets/web-panel/assets/Cron-_9GgQLJo.js +2 -0
  38. package/src/assets/web-panel/assets/Crosschain-B21yn0qy.js +1 -0
  39. package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +1 -0
  40. package/src/assets/web-panel/assets/DID-BX6k3jZi.css +1 -0
  41. package/src/assets/web-panel/assets/DID-mBeDgRZ7.js +2 -0
  42. package/src/assets/web-panel/assets/Dashboard-BckYYzhP.js +3 -0
  43. package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +1 -0
  44. package/src/assets/web-panel/assets/Dropdown-DEedqFiE.js +1 -0
  45. package/src/assets/web-panel/assets/EmailListRenderer-CMs0k9TB.js +1 -0
  46. package/src/assets/web-panel/assets/EmailListRenderer-CVJ1j3Ll.css +1 -0
  47. package/src/assets/web-panel/assets/EvolutionSettings-B00Qd0fN.js +1 -0
  48. package/src/assets/web-panel/assets/EvolutionSettings-BnQ91YHJ.css +1 -0
  49. package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +1 -0
  50. package/src/assets/web-panel/assets/FamilyGuardDashboard-DxMTAMa8.js +1 -0
  51. package/src/assets/web-panel/assets/Federation-B-UZw0LO.js +1 -0
  52. package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +1 -0
  53. package/src/assets/web-panel/assets/FormItemContext-CkafazEw.js +1 -0
  54. package/src/assets/web-panel/assets/GenericCardRenderer-DEUG25ZJ.js +1 -0
  55. package/src/assets/web-panel/assets/GenericCardRenderer-DtJFcJYl.css +1 -0
  56. package/src/assets/web-panel/assets/Git-D7dr9oz9.js +2 -0
  57. package/src/assets/web-panel/assets/{Git-BdHhxBWR.css → Git-DPuaGtg7.css} +1 -1
  58. package/src/assets/web-panel/assets/Governance-BoipmXaM.css +1 -0
  59. package/src/assets/web-panel/assets/Governance-DKlUJ1wg.js +1 -0
  60. package/src/assets/web-panel/assets/Inference-BJKqplap.js +1 -0
  61. package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +1 -0
  62. package/src/assets/web-panel/assets/KnowledgeGraph-B78fB-bz.js +1 -0
  63. package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +1 -0
  64. package/src/assets/web-panel/assets/Logs-DJGcHYH_.js +2 -0
  65. package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +1 -0
  66. package/src/assets/web-panel/assets/MarkdownRenderer-BAxj61I3.css +1 -0
  67. package/src/assets/web-panel/assets/MarkdownRenderer-DkcG_MxW.js +1 -0
  68. package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +1 -0
  69. package/src/assets/web-panel/assets/Marketplace-ucTbwByD.js +1 -0
  70. package/src/assets/web-panel/assets/McpTools-Cu1xZYYk.js +2 -0
  71. package/src/assets/web-panel/assets/McpTools-DSGHWYS_.css +1 -0
  72. package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +1 -0
  73. package/src/assets/web-panel/assets/Memory-DCGpXmi-.js +2 -0
  74. package/src/assets/web-panel/assets/MobileBridge-BQ-Uwwg7.css +1 -0
  75. package/src/assets/web-panel/assets/MobileBridge-BnKr0aAS.js +1 -0
  76. package/src/assets/web-panel/assets/MobileProjects-C5UvYJTP.js +1 -0
  77. package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +1 -0
  78. package/src/assets/web-panel/assets/Mtc-D1UUl4WH.js +6 -0
  79. package/src/assets/web-panel/assets/Mtc-DHwbdUqA.css +1 -0
  80. package/src/assets/web-panel/assets/MtcAudit-B0x8gahq.css +1 -0
  81. package/src/assets/web-panel/assets/MtcAudit-D3aa8XP4.js +19 -0
  82. package/src/assets/web-panel/assets/Multisig-DiXdfJjO.js +7 -0
  83. package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +1 -0
  84. package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +1 -0
  85. package/src/assets/web-panel/assets/NLProgramming-DbWABgSE.js +1 -0
  86. package/src/assets/web-panel/assets/Notes-BP1DPl-R.js +7 -0
  87. package/src/assets/web-panel/assets/Notes-COE2q2gD.css +1 -0
  88. package/src/assets/web-panel/assets/NotificationSettings-Co0e0uEO.css +1 -0
  89. package/src/assets/web-panel/assets/NotificationSettings-xaB6ONe7.js +1 -0
  90. package/src/assets/web-panel/assets/OrderTableRenderer-BnOISpKI.css +1 -0
  91. package/src/assets/web-panel/assets/OrderTableRenderer-D1uNcz3b.js +1 -0
  92. package/src/assets/web-panel/assets/Organization-BM3Lh8Q8.css +1 -0
  93. package/src/assets/web-panel/assets/Organization-DMLDGaf1.js +4 -0
  94. package/src/assets/web-panel/assets/{Overflow-ky9UfGv4.js → Overflow-DH4QPEoI.js} +1 -1
  95. package/src/assets/web-panel/assets/{OverrideContext-C0w0P4A3.js → OverrideContext-DLR1AtLy.js} +1 -1
  96. package/src/assets/web-panel/assets/P2P-Bl4OS10o.js +2 -0
  97. package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +1 -0
  98. package/src/assets/web-panel/assets/PdhVaultBrowser-B9ZGFpn4.css +1 -0
  99. package/src/assets/web-panel/assets/PdhVaultBrowser-D9XSE2YI.js +7 -0
  100. package/src/assets/web-panel/assets/Permissions-CUaPlr6d.js +4 -0
  101. package/src/assets/web-panel/assets/Permissions-Diejgkbs.css +1 -0
  102. package/src/assets/web-panel/assets/PersonalDataHub-Ba92dZk-.js +3 -0
  103. package/src/assets/web-panel/assets/PersonalDataHub-C_xhspRy.css +1 -0
  104. package/src/assets/web-panel/assets/Pipeline-Bh2okm-8.js +1 -0
  105. package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +1 -0
  106. package/src/assets/web-panel/assets/Privacy-Bmq3p4gC.js +1 -0
  107. package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +1 -0
  108. package/src/assets/web-panel/assets/ProjectInit-BPu2fdKR.js +2 -0
  109. package/src/assets/web-panel/assets/ProjectInit-CteEo-wF.css +1 -0
  110. package/src/assets/web-panel/assets/ProjectSettings-D6ABLpmt.js +2 -0
  111. package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +1 -0
  112. package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +1 -0
  113. package/src/assets/web-panel/assets/Projects-qWHEve0z.js +1 -0
  114. package/src/assets/web-panel/assets/Providers-CpAXh_6c.css +1 -0
  115. package/src/assets/web-panel/assets/Providers-D9DI-2hc.js +1 -0
  116. package/src/assets/web-panel/assets/{QrScannerModal-er_HkLCI.js → QrScannerModal-CxifoeD5.js} +1 -1
  117. package/src/assets/web-panel/assets/QrScannerModal-DFrn7rxS.css +1 -0
  118. package/src/assets/web-panel/assets/QuickAsk-DC1BvwR7.js +1 -0
  119. package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +1 -0
  120. package/src/assets/web-panel/assets/Recommend-CKqbMB5o.js +1 -0
  121. package/src/assets/web-panel/assets/RemoteSession-BGGzPdS5.js +5 -0
  122. package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +1 -0
  123. package/src/assets/web-panel/assets/Reputation-DH90O9-5.js +1 -0
  124. package/src/assets/web-panel/assets/Row-h7ovueJc.js +1 -0
  125. package/src/assets/web-panel/assets/RssFeed-Cze7YLaG.css +1 -0
  126. package/src/assets/web-panel/assets/RssFeed-DaHxXTZg.js +3 -0
  127. package/src/assets/web-panel/assets/Search-B6RalzTB.css +1 -0
  128. package/src/assets/web-panel/assets/Search-Bn6Nqpn4.js +1 -0
  129. package/src/assets/web-panel/assets/Security-13K57V_v.css +1 -0
  130. package/src/assets/web-panel/assets/Security-ClbBmPJi.js +4 -0
  131. package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +1 -0
  132. package/src/assets/web-panel/assets/Services-ChHLQwRn.js +2 -0
  133. package/src/assets/web-panel/assets/{Skeleton-CrFs6rUL.js → Skeleton-DfN6BFzt.js} +1 -1
  134. package/src/assets/web-panel/assets/Skills-BdjRyorN.css +1 -0
  135. package/src/assets/web-panel/assets/Skills-C926wDev.js +1 -0
  136. package/src/assets/web-panel/assets/Sla-DJzi1l1M.js +1 -0
  137. package/src/assets/web-panel/assets/Sla-K19oOyQc.css +1 -0
  138. package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +1 -0
  139. package/src/assets/web-panel/assets/SpeechSettings-_GSyVjm_.js +1 -0
  140. package/src/assets/web-panel/assets/SyncSettings-B67xnERe.js +1 -0
  141. package/src/assets/web-panel/assets/SyncSettings-C6cDrwDR.css +1 -0
  142. package/src/assets/web-panel/assets/Tasks-BJjN_YEm.css +1 -0
  143. package/src/assets/web-panel/assets/Tasks-BaYZadcG.js +1 -0
  144. package/src/assets/web-panel/assets/Templates-BsMmCdZI.css +1 -0
  145. package/src/assets/web-panel/assets/Templates-Bu8kN1Xt.js +1 -0
  146. package/src/assets/web-panel/assets/Tenant-BM9qufw1.js +1 -0
  147. package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +1 -0
  148. package/src/assets/web-panel/assets/Terminal-MEdd5DjB.js +3 -0
  149. package/src/assets/web-panel/assets/Terminal-qPp9MaPu.css +1 -0
  150. package/src/assets/web-panel/assets/TimelineRenderer-C27kL2oU.js +1 -0
  151. package/src/assets/web-panel/assets/TimelineRenderer-DmztdsbF.css +1 -0
  152. package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +1 -0
  153. package/src/assets/web-panel/assets/Tokens-Cvjd98VC.js +1 -0
  154. package/src/assets/web-panel/assets/{Trigger-CXrW4Nry.js → Trigger-CLym84HI.js} +1 -1
  155. package/src/assets/web-panel/assets/Trust-Bv2JTaNN.js +1 -0
  156. package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +1 -0
  157. package/src/assets/web-panel/assets/UkeySign-CSCkNbtm.js +1 -0
  158. package/src/assets/web-panel/assets/VideoEditing-BFDXB4xh.js +1 -0
  159. package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +1 -0
  160. package/src/assets/web-panel/assets/Wallet-CMEFrG_b.js +4 -0
  161. package/src/assets/web-panel/assets/Wallet-Dw8uV4Ug.css +1 -0
  162. package/src/assets/web-panel/assets/WebAuthn-DKx6xPPl.css +1 -0
  163. package/src/assets/web-panel/assets/WebAuthn-x4eO_Q4y.js +5 -0
  164. package/src/assets/web-panel/assets/WorkflowEditor-ClWEPgV1.js +1 -0
  165. package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +1 -0
  166. package/src/assets/web-panel/assets/{_getTag-DnrRH4E6.js → _getTag-BVc6NQ_K.js} +1 -1
  167. package/src/assets/web-panel/assets/{chat-BpJsXlTK.js → chat-BdYOI4gM.js} +1 -1
  168. package/src/assets/web-panel/assets/{collapseMotion-CqM1QOwM.js → collapseMotion-B4IZiILV.js} +1 -1
  169. package/src/assets/web-panel/assets/{colors-CUNg0-fh.js → colors-DcTBrGvS.js} +1 -1
  170. package/src/assets/web-panel/assets/{compact-item-C3tFHnhu.js → compact-item-Dn2ktVuj.js} +1 -1
  171. package/src/assets/web-panel/assets/createContext-XTreuyqp.js +1 -0
  172. package/src/assets/web-panel/assets/{debounce-CFGTTtN3.js → debounce-D9xTw4Sx.js} +1 -1
  173. package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +1 -0
  174. package/src/assets/web-panel/assets/echarts-CDp6K7pj.js +19 -0
  175. package/src/assets/web-panel/assets/{hasIn-CU6RIciB.js → hasIn-CFRNsYQd.js} +1 -1
  176. package/src/assets/web-panel/assets/{icons-DG5UD-6K.js → icons-DlxlFL4g.js} +4 -4
  177. package/src/assets/web-panel/assets/index-3RqDry-K.js +71 -0
  178. package/src/assets/web-panel/assets/{index-BPWJw4Ji.js → index-8METW_Wr.js} +1 -1
  179. package/src/assets/web-panel/assets/index-BBd64wj8.js +31 -0
  180. package/src/assets/web-panel/assets/index-BEyVNbNE.js +3 -0
  181. package/src/assets/web-panel/assets/index-BMLpP8QQ.js +1 -0
  182. package/src/assets/web-panel/assets/{index-BzhobTgZ.js → index-BSqydcDa.js} +1 -1
  183. package/src/assets/web-panel/assets/index-BV6LojRv.js +21 -0
  184. package/src/assets/web-panel/assets/index-BbMWvjLZ.js +1 -0
  185. package/src/assets/web-panel/assets/{index-KgR1f2Gq.js → index-Brc0BF-k.js} +2 -2
  186. package/src/assets/web-panel/assets/{index-D4njcYFw.js → index-CG9YLDmI.js} +1 -1
  187. package/src/assets/web-panel/assets/{index-6EwPIfXu.js → index-CNHWMMDX.js} +1 -1
  188. package/src/assets/web-panel/assets/{index-CEIoRm_c.js → index-COuEJdmr.js} +3 -3
  189. package/src/assets/web-panel/assets/{index-BG4zuFf0.js → index-CRW3AWdS.js} +1 -1
  190. package/src/assets/web-panel/assets/{index-BOlAutGy.js → index-CUT4h5JB.js} +2 -2
  191. package/src/assets/web-panel/assets/index-CXMa7Z-S.js +1 -0
  192. package/src/assets/web-panel/assets/index-CbaPXyNc.js +19 -0
  193. package/src/assets/web-panel/assets/{index-Cq93VfoF.css → index-CfX1DEtk.css} +1 -1
  194. package/src/assets/web-panel/assets/{index-X6e0cGRU.js → index-CjHA_Q7s.js} +1 -1
  195. package/src/assets/web-panel/assets/index-CsnYp4qF.js +1 -0
  196. package/src/assets/web-panel/assets/index-D45vulkq.js +12 -0
  197. package/src/assets/web-panel/assets/index-D9kPBEqD.js +55 -0
  198. package/src/assets/web-panel/assets/index-DDTSgpXz.js +1 -0
  199. package/src/assets/web-panel/assets/index-DFl_a0n5.js +1 -0
  200. package/src/assets/web-panel/assets/index-DNdiAymC.js +1 -0
  201. package/src/assets/web-panel/assets/{index-BJjEAoDb.js → index-DQEu7uW0.js} +1 -1
  202. package/src/assets/web-panel/assets/index-DW9XncMy.js +21 -0
  203. package/src/assets/web-panel/assets/index-Daa1yCt_.js +1 -0
  204. package/src/assets/web-panel/assets/index-DdVpoNEQ.js +12 -0
  205. package/src/assets/web-panel/assets/index-Dhi4Oybt.js +1 -0
  206. package/src/assets/web-panel/assets/index-DoVoNjtJ.js +1 -0
  207. package/src/assets/web-panel/assets/{index-111hR8WZ.js → index-Vo7A4aiN.js} +4 -4
  208. package/src/assets/web-panel/assets/{index-lo9rgpyj.js → index-XdlYkgCa.js} +1 -1
  209. package/src/assets/web-panel/assets/{index-1L0tt7G2.js → index-ir2ZwWz5.js} +2 -2
  210. package/src/assets/web-panel/assets/index-kzyCd8a0.js +3 -0
  211. package/src/assets/web-panel/assets/{index-CyyhilXV.js → index-lnTt0Jps.js} +2 -2
  212. package/src/assets/web-panel/assets/{index-CLQjdKmE.js → index-ma-rJkfE.js} +1 -1
  213. package/src/assets/web-panel/assets/index-oE4jTpHK.js +13 -0
  214. package/src/assets/web-panel/assets/{index-K2Uqqkr1.js → index-r5sNECM5.js} +1 -1
  215. package/src/assets/web-panel/assets/index-uT4fRDzU.js +1 -0
  216. package/src/assets/web-panel/assets/index-xlS8pDS2.js +1 -0
  217. package/src/assets/web-panel/assets/{initDefaultProps-FI8D7E2x.js → initDefaultProps-mdL0oeZa.js} +1 -1
  218. package/src/assets/web-panel/assets/{isPlainObject-BWRMT62c.js → isPlainObject-_gz-soRW.js} +1 -1
  219. package/src/assets/web-panel/assets/isSymbol-DAy2hlR5.js +1 -0
  220. package/src/assets/web-panel/assets/motion-ZgVCKcEX.js +11 -0
  221. package/src/assets/web-panel/assets/{move-Vl1vUReW.js → move-A_28O5T2.js} +1 -1
  222. package/src/assets/web-panel/assets/{mtc-parser-6Cu2aFME.js → mtc-parser-0zlMjabo.js} +1 -1
  223. package/src/assets/web-panel/assets/{omit-VRKL8iSO.js → omit-DF7mU3yG.js} +1 -1
  224. package/src/assets/web-panel/assets/{pickAttrs-DZfWsOe0.js → pickAttrs-Cmt8liJP.js} +1 -1
  225. package/src/assets/web-panel/assets/{placementArrow-qmcOUc4W.js → placementArrow-DaMDC57b.js} +1 -1
  226. package/src/assets/web-panel/assets/{responsiveObserve-BLB6SsSw.js → responsiveObserve-CHw_f2d3.js} +1 -1
  227. package/src/assets/web-panel/assets/{slide-41jdYeSH.js → slide-DJS9fFQq.js} +1 -1
  228. package/src/assets/web-panel/assets/{statusUtils-Yn8OQ5ey.js → statusUtils-Bk3XdZwh.js} +1 -1
  229. package/src/assets/web-panel/assets/{styleChecker-4CEwz9Zd.js → styleChecker-DMybAFsA.js} +1 -1
  230. package/src/assets/web-panel/assets/useFlexGapSupport-_tbIIFMu.js +1 -0
  231. package/src/assets/web-panel/assets/{useFs-Bugo8HuF.js → useFs-KPklVptS.js} +1 -1
  232. package/src/assets/web-panel/assets/{useMergedState-DXbJa_zE.js → useMergedState-d-EXs3xd.js} +1 -1
  233. package/src/assets/web-panel/assets/{usePersonalDataHub-B-q2ElB0.js → usePersonalDataHub-C7FrKDhD.js} +1 -1
  234. package/src/assets/web-panel/assets/{useRefs-BrCfMLMc.js → useRefs-DHeCQehi.js} +1 -1
  235. package/src/assets/web-panel/assets/{useState-CnxtbLoC.js → useState-Dlgl7fUg.js} +1 -1
  236. package/src/assets/web-panel/assets/vendor-BXcBOG8b.js +1 -0
  237. package/src/assets/web-panel/assets/vnode-DB3JBusp.js +1 -0
  238. package/src/assets/web-panel/assets/warning-Pq00owYb.js +1 -0
  239. package/src/assets/web-panel/assets/{zoom-DM1y_KKP.js → zoom-C8rAdf81.js} +1 -1
  240. package/src/assets/web-panel/index.html +4 -4
  241. package/src/command-help-index.json +1 -1
  242. package/src/commands/agent.js +1 -1
  243. package/src/commands/governed-skill-marketplace.js +24 -10
  244. package/src/commands/llm.js +4 -3
  245. package/src/data/changelog.json +27 -1
  246. package/src/harness/worktree-isolator.js +4 -1
  247. package/src/lib/compaction-host-provenance.js +24 -0
  248. package/src/lib/context-memory-kernel/durable-memory-port.js +46 -34
  249. package/src/lib/context-memory-kernel/live-compaction.js +12 -3
  250. package/src/lib/context-memory-kernel/memory-query-bundle.js +375 -0
  251. package/src/lib/context-memory-kernel/memory-query-control.js +28 -0
  252. package/src/lib/context-memory-kernel/memory-service.js +30 -16
  253. package/src/lib/context-memory-kernel/memory-shard-snapshots.js +63 -0
  254. package/src/lib/context-memory-kernel/message-adapter.js +27 -6
  255. package/src/lib/context-memory-kernel/provider-context.js +103 -27
  256. package/src/lib/context-memory-kernel/segmented-memory-port.js +347 -138
  257. package/src/lib/cost-budget.js +2 -0
  258. package/src/lib/ephemeral-worktree-scope.js +24 -0
  259. package/src/lib/evolution/evolution-deployment-loader.js +6 -4
  260. package/src/lib/evolution/governed-skill-marketplace-abort.js +14 -0
  261. package/src/lib/evolution/governed-skill-marketplace-candidate.js +10 -2
  262. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +47 -20
  263. package/src/lib/evolution/governed-skill-marketplace.js +47 -24
  264. package/src/lib/goal-condition-engine.js +20 -3
  265. package/src/lib/goal-verification-command.js +221 -0
  266. package/src/lib/goal-verification-plan.js +372 -0
  267. package/src/lib/llm-connection-probe.js +12 -5
  268. package/src/lib/llm-onboarding-catalog.json +1 -1
  269. package/src/lib/llm-pricing.js +34 -8
  270. package/src/lib/mcp-tool-catalog-authority.js +244 -0
  271. package/src/lib/model-capabilities.js +6 -0
  272. package/src/lib/model-catalog-review.js +3 -0
  273. package/src/lib/model-context-catalog.js +44 -2
  274. package/src/lib/openai-responses.js +35 -6
  275. package/src/lib/sub-agent-context.js +12 -4
  276. package/src/lib/subagent-inheritance.js +162 -2
  277. package/src/lib/usage-pricing-context.js +34 -17
  278. package/src/repl/agent-repl.js +34 -2
  279. package/src/runtime/agent-core.js +335 -18
  280. package/src/runtime/compaction-host-context.js +72 -0
  281. package/src/runtime/headless-runner.js +133 -37
  282. package/src/runtime/headless-stream.js +38 -21
  283. package/src/runtime/mcp-agent-catalog.js +257 -0
  284. package/src/runtime/mcp-config.js +18 -69
  285. package/src/runtime/mcp-tool-search.js +16 -1
  286. package/src/runtime/message-roles.js +67 -3
  287. package/src/runtime/provider-stream-state.js +35 -1
  288. package/src/runtime/system-prompt.js +9 -0
  289. package/src/assets/web-panel/assets/AIOps-CSpp7iGY.css +0 -1
  290. package/src/assets/web-panel/assets/AIOps-o-rFKEYL.js +0 -1
  291. package/src/assets/web-panel/assets/Analytics-Bt7H_jrh.js +0 -3
  292. package/src/assets/web-panel/assets/Analytics-DJcHjy5J.css +0 -1
  293. package/src/assets/web-panel/assets/AppLayout-CgynsRFP.js +0 -9
  294. package/src/assets/web-panel/assets/AppLayout-VlanTjPw.css +0 -1
  295. package/src/assets/web-panel/assets/Artifacts-CTVt96zW.css +0 -1
  296. package/src/assets/web-panel/assets/Artifacts-gghOGDyE.js +0 -1
  297. package/src/assets/web-panel/assets/Audit-D8oxP0wr.css +0 -1
  298. package/src/assets/web-panel/assets/Audit-DBXn-AZ6.js +0 -1
  299. package/src/assets/web-panel/assets/BackgroundAgents--dxPftKa.js +0 -1
  300. package/src/assets/web-panel/assets/BackgroundAgents-Dq2340Kl.css +0 -1
  301. package/src/assets/web-panel/assets/Backup-D9Zf_2tH.js +0 -1
  302. package/src/assets/web-panel/assets/Backup-Wi9CaP3d.css +0 -1
  303. package/src/assets/web-panel/assets/BaseInput-DDTOjovq.js +0 -1
  304. package/src/assets/web-panel/assets/Chat-2ETqdBLn.js +0 -8
  305. package/src/assets/web-panel/assets/Chat-KSGPtU0L.css +0 -1
  306. package/src/assets/web-panel/assets/ChatBubbleRenderer-DSg2Xs8G.js +0 -1
  307. package/src/assets/web-panel/assets/ChatBubbleRenderer-gy5SDGw2.css +0 -1
  308. package/src/assets/web-panel/assets/Codegen-4ieEEIwt.js +0 -1
  309. package/src/assets/web-panel/assets/Codegen-BB08p1fn.css +0 -1
  310. package/src/assets/web-panel/assets/Community-Cbq1nrpo.css +0 -1
  311. package/src/assets/web-panel/assets/Community-DeYxFMJb.js +0 -1
  312. package/src/assets/web-panel/assets/Compliance-DLVjbVUh.js +0 -1
  313. package/src/assets/web-panel/assets/Compliance-NoXr2Vof.css +0 -1
  314. package/src/assets/web-panel/assets/Cowork-BlXJRu6L.css +0 -1
  315. package/src/assets/web-panel/assets/Cowork-DfUKa0T5.js +0 -6
  316. package/src/assets/web-panel/assets/Cron-_RpktpO5.js +0 -2
  317. package/src/assets/web-panel/assets/Crosschain-7x6xdbwH.js +0 -1
  318. package/src/assets/web-panel/assets/Crosschain-CgRAecoR.css +0 -1
  319. package/src/assets/web-panel/assets/DID-DVsYcgvs.css +0 -1
  320. package/src/assets/web-panel/assets/DID-ccVhToC1.js +0 -2
  321. package/src/assets/web-panel/assets/Dashboard-CAPSdFR4.css +0 -1
  322. package/src/assets/web-panel/assets/Dashboard-DhygcaoK.js +0 -3
  323. package/src/assets/web-panel/assets/Dropdown-DFplwXK7.js +0 -1
  324. package/src/assets/web-panel/assets/EmailListRenderer-Bm01soCN.js +0 -1
  325. package/src/assets/web-panel/assets/EmailListRenderer-DTPZPx_S.css +0 -1
  326. package/src/assets/web-panel/assets/EvolutionSettings-Bdw8ApoT.css +0 -1
  327. package/src/assets/web-panel/assets/EvolutionSettings-C4v--DkD.js +0 -1
  328. package/src/assets/web-panel/assets/FamilyGuardDashboard-ChQXDBA3.js +0 -1
  329. package/src/assets/web-panel/assets/FamilyGuardDashboard-nd3idUVb.css +0 -1
  330. package/src/assets/web-panel/assets/Federation-C0yomE-M.js +0 -1
  331. package/src/assets/web-panel/assets/Federation-fGN6iMX_.css +0 -1
  332. package/src/assets/web-panel/assets/FormItemContext-DtT3ZEZK.js +0 -2
  333. package/src/assets/web-panel/assets/GenericCardRenderer-DgITtFRv.js +0 -1
  334. package/src/assets/web-panel/assets/GenericCardRenderer-o85VDYQS.css +0 -1
  335. package/src/assets/web-panel/assets/Git-CCY42R8S.js +0 -2
  336. package/src/assets/web-panel/assets/Governance-DtCS4NDm.css +0 -1
  337. package/src/assets/web-panel/assets/Governance-N66Bwvqg.js +0 -1
  338. package/src/assets/web-panel/assets/Inference-BkbPuR_2.js +0 -1
  339. package/src/assets/web-panel/assets/Inference-t-w0NgIS.css +0 -1
  340. package/src/assets/web-panel/assets/KnowledgeGraph-4NU1S2Xm.css +0 -1
  341. package/src/assets/web-panel/assets/KnowledgeGraph-B3PibXdA.js +0 -1
  342. package/src/assets/web-panel/assets/Logs-CUtNB_N6.js +0 -2
  343. package/src/assets/web-panel/assets/Logs-DQbCaYhL.css +0 -1
  344. package/src/assets/web-panel/assets/MarkdownRenderer-D-V4dOe3.js +0 -1
  345. package/src/assets/web-panel/assets/MarkdownRenderer-DbzhFwvz.css +0 -1
  346. package/src/assets/web-panel/assets/Marketplace-Bvo5cuGa.css +0 -1
  347. package/src/assets/web-panel/assets/Marketplace-DLNJb6Nr.js +0 -1
  348. package/src/assets/web-panel/assets/McpTools-2zGjJb5K.js +0 -4
  349. package/src/assets/web-panel/assets/McpTools-534Q95Mx.css +0 -1
  350. package/src/assets/web-panel/assets/Memory-9rNZ1EvR.js +0 -2
  351. package/src/assets/web-panel/assets/Memory-CleW_R6V.css +0 -1
  352. package/src/assets/web-panel/assets/MobileBridge-Cw7sAAgn.js +0 -1
  353. package/src/assets/web-panel/assets/MobileBridge-D3Arxfeg.css +0 -1
  354. package/src/assets/web-panel/assets/MobileProjects-8XACrqqy.js +0 -1
  355. package/src/assets/web-panel/assets/MobileProjects-BD4alw6-.css +0 -1
  356. package/src/assets/web-panel/assets/Mtc-CXZGO9Sh.css +0 -1
  357. package/src/assets/web-panel/assets/Mtc-mg02JNy-.js +0 -6
  358. package/src/assets/web-panel/assets/MtcAudit-B1Vkhj2l.js +0 -19
  359. package/src/assets/web-panel/assets/MtcAudit-C1JM8esp.css +0 -1
  360. package/src/assets/web-panel/assets/Multisig-BQEeA7GG.js +0 -13
  361. package/src/assets/web-panel/assets/Multisig-BryR2Jpr.css +0 -1
  362. package/src/assets/web-panel/assets/NLProgramming-BIbkjZV3.js +0 -1
  363. package/src/assets/web-panel/assets/NLProgramming-DGDHq6Z9.css +0 -1
  364. package/src/assets/web-panel/assets/Notes-BKKmMtqV.css +0 -1
  365. package/src/assets/web-panel/assets/Notes-DIwhkZNY.js +0 -7
  366. package/src/assets/web-panel/assets/NotificationSettings-CG3Kfuef.css +0 -1
  367. package/src/assets/web-panel/assets/NotificationSettings-Cj9175ce.js +0 -1
  368. package/src/assets/web-panel/assets/OrderTableRenderer-CfrDjSHT.css +0 -1
  369. package/src/assets/web-panel/assets/OrderTableRenderer-IfNpXT2R.js +0 -1
  370. package/src/assets/web-panel/assets/Organization-DPFp6G9o.js +0 -4
  371. package/src/assets/web-panel/assets/Organization-LVvqwG0D.css +0 -1
  372. package/src/assets/web-panel/assets/P2P-DcFvP7F-.css +0 -1
  373. package/src/assets/web-panel/assets/P2P-tXck8GLq.js +0 -2
  374. package/src/assets/web-panel/assets/PdhVaultBrowser-DSvpQl9k.js +0 -7
  375. package/src/assets/web-panel/assets/PdhVaultBrowser-DZZrUOr1.css +0 -1
  376. package/src/assets/web-panel/assets/Permissions-CKPkdLj-.js +0 -4
  377. package/src/assets/web-panel/assets/Permissions-DsPE_IQy.css +0 -1
  378. package/src/assets/web-panel/assets/PersonalDataHub-BhpRlh9D.css +0 -1
  379. package/src/assets/web-panel/assets/PersonalDataHub-DnqXc12l.js +0 -9
  380. package/src/assets/web-panel/assets/Pipeline-BItr5CyP.css +0 -1
  381. package/src/assets/web-panel/assets/Pipeline-BKjFU_kd.js +0 -1
  382. package/src/assets/web-panel/assets/Privacy-ChC-J5Tn.js +0 -1
  383. package/src/assets/web-panel/assets/Privacy-F_ENsxZk.css +0 -1
  384. package/src/assets/web-panel/assets/ProjectInit-B86LEzDL.css +0 -1
  385. package/src/assets/web-panel/assets/ProjectInit-ByFZG9sY.js +0 -2
  386. package/src/assets/web-panel/assets/ProjectSettings-Bbv1Kiw-.js +0 -2
  387. package/src/assets/web-panel/assets/ProjectSettings-DK7KA_iX.css +0 -1
  388. package/src/assets/web-panel/assets/Projects-CmJeUDBW.css +0 -1
  389. package/src/assets/web-panel/assets/Projects-QYyGW31-.js +0 -1
  390. package/src/assets/web-panel/assets/Providers-C6q_fvea.css +0 -1
  391. package/src/assets/web-panel/assets/Providers-CJLnWw0r.js +0 -1
  392. package/src/assets/web-panel/assets/QrScannerModal-NwAHNfiJ.css +0 -1
  393. package/src/assets/web-panel/assets/QuickAsk-DoXU0np9.js +0 -1
  394. package/src/assets/web-panel/assets/Recommend-DCo_vuaf.js +0 -1
  395. package/src/assets/web-panel/assets/Recommend-D_bf91K6.css +0 -1
  396. package/src/assets/web-panel/assets/RemoteSession-CLuL925Z.js +0 -5
  397. package/src/assets/web-panel/assets/Reputation-CNNCA_-M.js +0 -1
  398. package/src/assets/web-panel/assets/Reputation-DiOsOleI.css +0 -1
  399. package/src/assets/web-panel/assets/Row-Vu4j631i.js +0 -1
  400. package/src/assets/web-panel/assets/RssFeed-C18B4xiy.js +0 -3
  401. package/src/assets/web-panel/assets/RssFeed-CjcbkyUb.css +0 -1
  402. package/src/assets/web-panel/assets/Search-DxiqccE2.js +0 -1
  403. package/src/assets/web-panel/assets/Search-Klk29S7C.css +0 -1
  404. package/src/assets/web-panel/assets/Security-BmrukMHn.css +0 -1
  405. package/src/assets/web-panel/assets/Security-Droe_hHI.js +0 -4
  406. package/src/assets/web-panel/assets/Services-CwmmyXzq.js +0 -2
  407. package/src/assets/web-panel/assets/Services-DAnVNhUG.css +0 -1
  408. package/src/assets/web-panel/assets/Skills-BUu9owbR.css +0 -1
  409. package/src/assets/web-panel/assets/Skills-Dp-d2miK.js +0 -1
  410. package/src/assets/web-panel/assets/Sla-2DFXVbK4.js +0 -1
  411. package/src/assets/web-panel/assets/Sla-sodqCU4a.css +0 -1
  412. package/src/assets/web-panel/assets/SpeechSettings-Cdd9lCoy.js +0 -1
  413. package/src/assets/web-panel/assets/SpeechSettings-CgB9nFyq.css +0 -1
  414. package/src/assets/web-panel/assets/SyncSettings-B3hJqmBP.css +0 -1
  415. package/src/assets/web-panel/assets/SyncSettings-CxQhcYSk.js +0 -2
  416. package/src/assets/web-panel/assets/Tasks-BHWVRfXx.js +0 -1
  417. package/src/assets/web-panel/assets/Tasks-nbTUVXvt.css +0 -1
  418. package/src/assets/web-panel/assets/Templates-CpFsKk_l.css +0 -1
  419. package/src/assets/web-panel/assets/Templates-DNFk3a5_.js +0 -1
  420. package/src/assets/web-panel/assets/Tenant-B6X6dPo8.js +0 -1
  421. package/src/assets/web-panel/assets/Tenant-MuPJnOjk.css +0 -1
  422. package/src/assets/web-panel/assets/Terminal-BuUNoLGM.js +0 -3
  423. package/src/assets/web-panel/assets/Terminal-DHoveJwj.css +0 -1
  424. package/src/assets/web-panel/assets/TimelineRenderer-BlTAtkOc.css +0 -1
  425. package/src/assets/web-panel/assets/TimelineRenderer-DThrBYj8.js +0 -1
  426. package/src/assets/web-panel/assets/Tokens-CA_u4Blu.js +0 -1
  427. package/src/assets/web-panel/assets/Tokens-CynVae-o.css +0 -1
  428. package/src/assets/web-panel/assets/Trust-C-WrW0Fj.css +0 -1
  429. package/src/assets/web-panel/assets/Trust-DHcLpNy3.js +0 -1
  430. package/src/assets/web-panel/assets/UkeySign-B_fni4C2.js +0 -1
  431. package/src/assets/web-panel/assets/VideoEditing-BDFghpzP.css +0 -1
  432. package/src/assets/web-panel/assets/VideoEditing-g9nf2EhS.js +0 -1
  433. package/src/assets/web-panel/assets/Wallet-C8pOjIve.js +0 -4
  434. package/src/assets/web-panel/assets/Wallet-DUbpTRcg.css +0 -1
  435. package/src/assets/web-panel/assets/WebAuthn-BaKNjxZt.js +0 -5
  436. package/src/assets/web-panel/assets/WebAuthn-CVAFRfCQ.css +0 -1
  437. package/src/assets/web-panel/assets/WorkflowEditor-429lPWYk.css +0 -1
  438. package/src/assets/web-panel/assets/WorkflowEditor-CX030Wb1.js +0 -1
  439. package/src/assets/web-panel/assets/createContext-B8rTvO61.js +0 -1
  440. package/src/assets/web-panel/assets/devWarning-B4_IVU_n.js +0 -1
  441. package/src/assets/web-panel/assets/echarts-C61Vn3mP.js +0 -25
  442. package/src/assets/web-panel/assets/index--6BUI55w.js +0 -1
  443. package/src/assets/web-panel/assets/index-5Q1bepcM.js +0 -1
  444. package/src/assets/web-panel/assets/index-B10Ia2KL.js +0 -21
  445. package/src/assets/web-panel/assets/index-B1SLBLli.js +0 -3
  446. package/src/assets/web-panel/assets/index-B8_VQAav.js +0 -1
  447. package/src/assets/web-panel/assets/index-BMuPJra-.js +0 -1
  448. package/src/assets/web-panel/assets/index-BOCjph-k.js +0 -12
  449. package/src/assets/web-panel/assets/index-BpBaOWmV.js +0 -1
  450. package/src/assets/web-panel/assets/index-CDlHvQtw.js +0 -1
  451. package/src/assets/web-panel/assets/index-CPF7Vqri.js +0 -55
  452. package/src/assets/web-panel/assets/index-CPmgKQcl.js +0 -1
  453. package/src/assets/web-panel/assets/index-CcpMHPWd.js +0 -21
  454. package/src/assets/web-panel/assets/index-Cyksnofp.js +0 -1
  455. package/src/assets/web-panel/assets/index-Dc9pcin6.js +0 -1
  456. package/src/assets/web-panel/assets/index-DfAC55QA.js +0 -19
  457. package/src/assets/web-panel/assets/index-DgNCfwvg.js +0 -1
  458. package/src/assets/web-panel/assets/index-DvfhIBNZ.js +0 -1
  459. package/src/assets/web-panel/assets/index-Hbzd9WeI.js +0 -1
  460. package/src/assets/web-panel/assets/index-IiS7WoUl.js +0 -13
  461. package/src/assets/web-panel/assets/index-Xa6TlaD7.js +0 -31
  462. package/src/assets/web-panel/assets/index-YczWc2_0.js +0 -12
  463. package/src/assets/web-panel/assets/index-h_ANnbR8.js +0 -3
  464. package/src/assets/web-panel/assets/index-k7QsBwyo.js +0 -75
  465. package/src/assets/web-panel/assets/isSymbol-S5WZT7lS.js +0 -1
  466. package/src/assets/web-panel/assets/motion-B1hpJYSD.js +0 -11
  467. package/src/assets/web-panel/assets/useFlexGapSupport-BClv53kR.js +0 -1
  468. package/src/assets/web-panel/assets/vendor-Bn1JzzAn.js +0 -42
  469. package/src/assets/web-panel/assets/vnode-ejVeFJ0x.js +0 -1
@@ -40,6 +40,16 @@ import {
40
40
  queryDigest,
41
41
  selectQueryRows,
42
42
  } from "./memory-query-index.js";
43
+ import {
44
+ checkMemoryQueryAborted,
45
+ createMemoryQueryCheckpoint,
46
+ } from "./memory-query-control.js";
47
+ import { MemoryShardSnapshots } from "./memory-shard-snapshots.js";
48
+ import {
49
+ createQueryBundlePlan,
50
+ readQueryBundle,
51
+ writeQueryBundle,
52
+ } from "./memory-query-bundle.js";
43
53
 
44
54
  export const SEGMENTED_STORE_SCHEMA =
45
55
  "chainlesschain.cli-context-memory-store/v2";
@@ -103,6 +113,7 @@ function regular(file) {
103
113
  }
104
114
  function directories(directory) {
105
115
  let current = resolve(directory);
116
+ const requested = current;
106
117
  while (true) {
107
118
  const stat = lstatSync(current);
108
119
  // macOS exposes its system temporary tree through the root-owned /var
@@ -115,28 +126,27 @@ function directories(directory) {
115
126
  realpathSync(current) === `/private${current}`;
116
127
  if (!systemAlias && (!stat.isDirectory() || stat.isSymbolicLink()))
117
128
  throw corruptStore(current, "authority directory is unsafe");
118
- if (process.platform === "win32") {
119
- // Some Windows runtime adapters report an ordinary directory for a
120
- // junction whose target cannot be decoded in their DOS namespace. Keep
121
- // the lstat guard and independently reject a different native canonical
122
- // coordinate before mkdir or lock acquisition. This is an additional
123
- // consistency check, not a proof against every reparse tag or a race.
124
- let canonical;
125
- try {
126
- canonical = realpathSync.native(current);
127
- } catch {
128
- throw corruptStore(current, "authority directory cannot be resolved");
129
- }
130
- if (
131
- typeof canonical !== "string" ||
132
- resolve(canonical).toLowerCase() !== current.toLowerCase()
133
- )
134
- throw corruptStore(current, "authority directory resolves elsewhere");
135
- }
136
129
  const parent = dirname(current);
137
130
  if (parent === current) break;
138
131
  current = parent;
139
132
  }
133
+ if (process.platform === "win32") {
134
+ // Native resolution of the whole path follows redirects in every ancestor.
135
+ // Retain lstat on every ancestor, including adapters that misclassify a
136
+ // junction; avoid re-resolving all the same prefixes per shard. This is a
137
+ // consistency check, not a proof against every reparse tag or a race.
138
+ let canonical;
139
+ try {
140
+ canonical = realpathSync.native(requested);
141
+ } catch {
142
+ throw corruptStore(requested, "authority directory cannot be resolved");
143
+ }
144
+ if (
145
+ typeof canonical !== "string" ||
146
+ resolve(canonical).toLowerCase() !== requested.toLowerCase()
147
+ )
148
+ throw corruptStore(requested, "authority directory resolves elsewhere");
149
+ }
140
150
  }
141
151
  function identity(directory) {
142
152
  const stat = lstatSync(directory);
@@ -166,11 +176,15 @@ function ensureSafeDirectory(directory) {
166
176
  * authority. Audit events are retained, not truncated to buy record capacity.
167
177
  */
168
178
  export class SegmentedMemoryPort extends DurableJsonMemoryPort {
179
+ #shardSnapshots;
180
+
169
181
  constructor({
170
182
  maxTotalBytes = DEFAULT_MAX_TOTAL_BYTES,
171
183
  maxEvents = DEFAULT_SEGMENTED_MAX_EVENTS,
172
184
  readOnly = false,
173
185
  queryIndexCacheMode = "validate-disk",
186
+ queryIndexLayout = "bundle",
187
+ decodedShardCacheBytes,
174
188
  ...options
175
189
  } = {}) {
176
190
  super({ ...options, maxEvents });
@@ -181,12 +195,17 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
181
195
  if (!["validate-disk", "verified-memory"].includes(queryIndexCacheMode))
182
196
  throw new TypeError("Unknown query index cache mode");
183
197
  this.queryIndexCacheMode = queryIndexCacheMode;
198
+ if (!["bundle", "individual"].includes(queryIndexLayout))
199
+ throw new TypeError("Unknown query index layout");
200
+ this.queryIndexLayout = queryIndexLayout;
184
201
  this.filePath = resolve(this.filePath);
185
202
  this.shardDirectory = `${this.filePath}.shards`;
186
203
  this._queryIndexes = new Map();
204
+ this.#shardSnapshots = new MemoryShardSnapshots(decodedShardCacheBytes);
187
205
  }
188
206
 
189
- _locked(operation) {
207
+ _locked(operation, options = {}) {
208
+ checkMemoryQueryAborted(options.signal);
190
209
  ensureSafeDirectory(dirname(this.filePath));
191
210
  directories(dirname(this.filePath));
192
211
  return super._locked(() => {
@@ -197,31 +216,34 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
197
216
  : null;
198
217
  if (existsSync(this.filePath)) regular(this.filePath);
199
218
  return operation();
200
- });
219
+ }, options);
201
220
  }
202
221
 
203
222
  _checkDirectories() {
204
- directories(dirname(this.filePath));
223
+ // The shard path traversal already checks the authority parent and every
224
+ // ancestor, including native Windows resolution. Keep the separate identity
225
+ // comparisons below without traversing the same ancestry twice per read.
205
226
  directories(this.shardDirectory);
227
+ const parentIdentity = identity(dirname(this.filePath));
228
+ const shardStat = lstatSync(this.shardDirectory);
229
+ const shardIdentity = `${shardStat.dev}:${shardStat.ino}`;
206
230
  if (
207
- identity(dirname(this.filePath)) !== this._parentIdentity ||
208
- (this._shardIdentity !== null &&
209
- identity(this.shardDirectory) !== this._shardIdentity)
231
+ parentIdentity !== this._parentIdentity ||
232
+ (this._shardIdentity !== null && shardIdentity !== this._shardIdentity)
210
233
  ) {
211
234
  throw corruptStore(
212
235
  this.filePath,
213
236
  "authority directory was replaced during an operation",
214
237
  );
215
238
  }
216
- this._shardIdentity = identity(this.shardDirectory);
217
- if (
218
- process.platform !== "win32" &&
219
- lstatSync(this.shardDirectory).mode & 0o077
220
- )
239
+ if (process.platform !== "win32" && shardStat.mode & 0o077)
221
240
  throw corruptStore(
222
241
  this.shardDirectory,
223
242
  "shard directory must be private",
224
243
  );
244
+ // Publish precisely the identity we compared. A second lstat here could
245
+ // silently adopt a replacement between comparison and baseline update.
246
+ this._shardIdentity = shardIdentity;
225
247
  }
226
248
 
227
249
  _shardPath(bucket, descriptor) {
@@ -238,6 +260,44 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
238
260
  );
239
261
  }
240
262
 
263
+ _queryBundlePlan(manifest) {
264
+ if (
265
+ this.queryIndexLayout !== "bundle" ||
266
+ manifest.schema !== SEGMENTED_STORE_SCHEMA ||
267
+ !manifest.digest
268
+ )
269
+ return null;
270
+ const compatibilityBytes = Object.values(manifest.shards).reduce(
271
+ (sum, entry) => sum + (entry.queryBytes || 0),
272
+ 0,
273
+ );
274
+ // The bundle is an additional derived copy. Preserve the existing total
275
+ // capacity instead of making a query fail merely because it cannot fit.
276
+ const available =
277
+ this.maxTotalBytes - manifest.totalBytes - compatibilityBytes;
278
+ if (!Number.isSafeInteger(available) || available <= 0) return null;
279
+ const plan = createQueryBundlePlan(manifest, {
280
+ maxFrameBytes: this.maxStoreBytes,
281
+ maxBundleBytes: available,
282
+ });
283
+ if (!plan) return null;
284
+ const file = join(this.shardDirectory, plan.name);
285
+ const normalize = (value) =>
286
+ process.platform === "win32"
287
+ ? resolve(value).toLowerCase()
288
+ : resolve(value);
289
+ const authorityPaths = [
290
+ this.filePath,
291
+ ...Object.entries(manifest.shards).flatMap(([bucket, entry]) => [
292
+ this._shardPath(bucket, entry),
293
+ ...(entry.queryDigest ? [this._queryIndexPath(bucket, entry)] : []),
294
+ ]),
295
+ ];
296
+ if (authorityPaths.some((path) => normalize(path) === normalize(file)))
297
+ throw corruptStore(file, "query bundle path collides with authority");
298
+ return { ...plan, file };
299
+ }
300
+
241
301
  _validateManifest(input) {
242
302
  const invalid = () => {
243
303
  throw corruptStore(this.filePath, "segmented manifest is invalid");
@@ -308,7 +368,10 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
308
368
  }
309
369
 
310
370
  _loadManifest() {
311
- if (!existsSync(this.filePath)) return blankManifest();
371
+ if (!existsSync(this.filePath)) {
372
+ this.#shardSnapshots.observe(null);
373
+ return blankManifest();
374
+ }
312
375
  regular(this.filePath);
313
376
  // v1 can be larger than a manifest; preserve its existing read boundary.
314
377
  let input;
@@ -324,6 +387,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
324
387
  throw corruptStore(this.filePath, "authority cannot be parsed", cause);
325
388
  }
326
389
  if (input?.schema === STORE_SCHEMA) {
390
+ this.#shardSnapshots.observe(null);
327
391
  if (bytes.length > this.maxStoreBytes)
328
392
  throw corruptStore(
329
393
  this.filePath,
@@ -337,6 +401,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
337
401
  if (bytes.length > MANIFEST_LIMIT)
338
402
  throw corruptStore(this.filePath, "manifest is too large");
339
403
  this._checkDirectories();
404
+ this.#shardSnapshots.observe(this._snapshotGeneration(manifest));
340
405
  if (!this.readOnly) this._collect(manifest);
341
406
  return manifest;
342
407
  }
@@ -399,6 +464,26 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
399
464
  return state;
400
465
  }
401
466
 
467
+ _snapshotGeneration(manifest) {
468
+ return manifest.digest
469
+ ? JSON.stringify([
470
+ this.filePath,
471
+ this._parentIdentity,
472
+ this._shardIdentity,
473
+ manifest.digest,
474
+ ])
475
+ : null;
476
+ }
477
+
478
+ _queryShardSnapshot(manifest, bucket, bytes) {
479
+ return this.#shardSnapshots.read(
480
+ this._snapshotGeneration(manifest),
481
+ bucket,
482
+ bytes,
483
+ () => this._decodeShard(manifest, bucket, bytes),
484
+ );
485
+ }
486
+
402
487
  _collect(manifest) {
403
488
  this._checkDirectories();
404
489
  const live = new Set(
@@ -409,6 +494,8 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
409
494
  : []),
410
495
  ]),
411
496
  );
497
+ const bundle = this._queryBundlePlan(manifest);
498
+ if (bundle) live.add(bundle.name);
412
499
  // All readers hold the same authority lock. No reader can still be using
413
500
  // a superseded shard here. Unknown files are never treated as our garbage.
414
501
  const directory = opendirSync(this.shardDirectory);
@@ -449,6 +536,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
449
536
  ensureSafeDirectory(this.shardDirectory);
450
537
  this._checkDirectories();
451
538
  this._collect(manifest);
539
+ const previousBundle = this._queryBundlePlan(manifest);
452
540
  const next = cloneCanonical(manifest);
453
541
  const pending = [];
454
542
  let pendingBytes = manifest.totalBytes;
@@ -504,6 +592,19 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
504
592
  );
505
593
  next.digest = manifestDigest(next);
506
594
  this._validateManifest(next);
595
+ this._queryBundlePlan(next);
596
+ if (
597
+ previousBundle &&
598
+ pending.some(
599
+ ({ file }) =>
600
+ resolve(file).toLowerCase() ===
601
+ resolve(previousBundle.file).toLowerCase(),
602
+ )
603
+ )
604
+ throw corruptStore(
605
+ previousBundle.file,
606
+ "new query index path collides with the existing bundle",
607
+ );
507
608
  const serialized = `${JSON.stringify(next)}\n`;
508
609
  if (Buffer.byteLength(serialized) > MANIFEST_LIMIT)
509
610
  throw limit("manifest exceeds byte limit");
@@ -546,6 +647,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
546
647
  if (existsSync(this.filePath)) regular(this.filePath);
547
648
  renameSync(temporary, this.filePath);
548
649
  published = true;
650
+ this.#shardSnapshots.observe(this._snapshotGeneration(next));
549
651
  syncDirectory(dirname(this.filePath));
550
652
  directorySynced = true;
551
653
  this._collect(next);
@@ -658,7 +760,7 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
658
760
  );
659
761
  }
660
762
 
661
- _readQueryIndex(manifest, bucket) {
763
+ _readQueryIndex(manifest, bucket, validatedFrame) {
662
764
  const descriptor = manifest.shards[bucket];
663
765
  const binding = JSON.stringify([
664
766
  manifest.digest,
@@ -673,14 +775,46 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
673
775
  // decision based on filesystem timestamps. Re-read and verify the current
674
776
  // manifest on every operation; any generation/authority change invalidates
675
777
  // this binding. Selected authority shards are still read and verified.
676
- // Disk repair remains eager in validate-disk mode; verified-memory repairs
677
- // a derived index on the next cache miss, rather than every warm query.
778
+ // validate-disk verifies the bytes of the active layout on every query.
779
+ // With a valid bundle, individual indexes are compatibility copies and
780
+ // are repaired when rebuilding the bundle. verified-memory remains opt-in.
678
781
  if (
782
+ validatedFrame === undefined &&
679
783
  this.queryIndexCacheMode === "verified-memory" &&
680
784
  descriptor.queryDigest &&
681
785
  cached?.binding === binding
682
786
  )
683
787
  return cached.index;
788
+ const bytes =
789
+ validatedFrame === undefined
790
+ ? this._readQueryIndexBytes(manifest, bucket)
791
+ : validatedFrame;
792
+ // Bytes cross only the internal loader boundary: readQueryBundle hashes
793
+ // every on-disk frame before this callback; _readQueryIndexBytes validates
794
+ // or reproduces individual/read-only/rebuild frames. Do not hash the same
795
+ // frame twice. The compiled graph owns no Buffer views, so borrowed frame
796
+ // storage can be reused as soon as this synchronous decoder returns.
797
+ const digest = descriptor.queryDigest || queryDigest(bytes);
798
+ if (descriptor.queryDigest && bytes.length !== descriptor.queryBytes)
799
+ throw corruptStore(this.filePath, "query index frame changed");
800
+ if (cached?.digest === digest && cached.binding === binding)
801
+ return cached.index;
802
+ let index;
803
+ try {
804
+ index = compileQueryIndex(bytes, descriptor);
805
+ } catch (cause) {
806
+ throw corruptStore(
807
+ this.filePath,
808
+ "query index structure is invalid",
809
+ cause,
810
+ );
811
+ }
812
+ this._queryIndexes.set(bucket, { digest, binding, index });
813
+ return index;
814
+ }
815
+
816
+ _readQueryIndexBytes(manifest, bucket) {
817
+ const descriptor = manifest.shards[bucket];
684
818
  let bytes;
685
819
  if (descriptor.queryDigest) {
686
820
  const file = this._queryIndexPath(bucket, descriptor);
@@ -729,100 +863,158 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
729
863
  } else {
730
864
  bytes = encodeQueryIndex(this._readShard(manifest, bucket));
731
865
  }
732
- const digest = descriptor.queryDigest || queryDigest(bytes);
733
- if (cached?.digest === digest && cached.binding === binding)
734
- return cached.index;
735
- let index;
866
+ return bytes;
867
+ }
868
+
869
+ async _readQueryBundleIndexes(manifest, checkpoint) {
870
+ if (this.queryIndexCacheMode === "verified-memory") return null;
871
+ const plan = this._queryBundlePlan(manifest);
872
+ if (!plan) return null;
873
+ const indexes = new Map();
874
+ const onFrame = (bucket, bytes) => {
875
+ indexes.set(bucket, this._readQueryIndex(manifest, bucket, bytes));
876
+ };
877
+ this._checkDirectories();
736
878
  try {
737
- index = compileQueryIndex(bytes, descriptor);
738
- } catch (cause) {
739
- throw corruptStore(
740
- this.filePath,
741
- "query index structure is invalid",
742
- cause,
743
- );
879
+ await readQueryBundle(plan.file, plan, {
880
+ checkpoint,
881
+ onFrame,
882
+ reuseFrameBuffer: true,
883
+ });
884
+ return indexes;
885
+ } catch (error) {
886
+ if (
887
+ error.code !== "ENOENT" &&
888
+ error.code !== "CONTEXT_MEMORY_QUERY_BUNDLE_CORRUPT"
889
+ )
890
+ throw error;
891
+ } finally {
892
+ // Even an empty result must reject ancestor/directory redirection. On a
893
+ // content error, do this before deciding that rebuilding is safe.
894
+ this._checkDirectories();
744
895
  }
745
- this._queryIndexes.set(bucket, { digest, binding, index });
746
- return index;
896
+ await checkpoint(true);
897
+ indexes.clear();
898
+ if (this.readOnly) {
899
+ // A shadow query may validate the compatibility indexes in memory but
900
+ // never creates or repairs a bundle on disk.
901
+ for (const { bucket } of plan.frames) {
902
+ await checkpoint();
903
+ onFrame(bucket, this._readQueryIndexBytes(manifest, bucket));
904
+ }
905
+ return indexes;
906
+ }
907
+ await writeQueryBundle(plan.file, plan, {
908
+ checkpoint,
909
+ getFrame: (bucket) => {
910
+ const bytes = this._readQueryIndexBytes(manifest, bucket);
911
+ onFrame(bucket, bytes);
912
+ return bytes;
913
+ },
914
+ checkDirectories: () => this._checkDirectories(),
915
+ });
916
+ return indexes;
747
917
  }
748
918
 
749
919
  async _indexedRecords(
750
920
  options = {},
751
921
  { limit: count = Infinity, cursor = null } = {},
752
922
  ) {
923
+ const { signal } = options;
924
+ const checkpoint = createMemoryQueryCheckpoint(signal);
925
+ checkMemoryQueryAborted(signal);
753
926
  const query = normalizeListQuery(options);
754
- const captured = await this._locked(() => {
755
- const manifest = this._ensureQueryIndexes(this._loadManifest());
756
- const binding = listCursorBinding(
757
- this.filePath,
758
- manifest.digest || queryDigest(JSON.stringify(manifest)),
759
- query,
760
- );
761
- const after = decodeListCursor(cursor, binding);
762
- if (manifest.schema === STORE_SCHEMA) {
763
- const matches = Object.values(manifest.records)
764
- .filter(
765
- (row) =>
766
- matchesListQuery(row, query) &&
767
- (!after || compareMemoryRows(row, after) > 0),
768
- )
769
- .sort(compareMemoryRows);
770
- const records = matches.slice(0, count);
927
+ const captured = await this._locked(
928
+ async () => {
929
+ const manifest = this._ensureQueryIndexes(this._loadManifest());
930
+ const binding = listCursorBinding(
931
+ this.filePath,
932
+ manifest.digest || queryDigest(JSON.stringify(manifest)),
933
+ query,
934
+ );
935
+ const after = decodeListCursor(cursor, binding);
936
+ if (manifest.schema === STORE_SCHEMA) {
937
+ const matches = Object.values(manifest.records)
938
+ .filter(
939
+ (row) =>
940
+ matchesListQuery(row, query) &&
941
+ (!after || compareMemoryRows(row, after) > 0),
942
+ )
943
+ .sort(compareMemoryRows);
944
+ const records = matches.slice(0, count);
945
+ return {
946
+ legacy: records,
947
+ storeRevision: manifest.storeRevision,
948
+ nextCursor:
949
+ matches.length > count
950
+ ? encodeListCursor(binding, records.at(-1))
951
+ : null,
952
+ };
953
+ }
954
+ // Merge each sorted posting lazily. Only the requested page is captured;
955
+ // every candidate has already passed scope, sink and lifecycle filters.
956
+ const bundleIndexes = await this._readQueryBundleIndexes(
957
+ manifest,
958
+ checkpoint,
959
+ );
960
+ const heads = [];
961
+ for (const bucket of Object.keys(manifest.shards)) {
962
+ await checkpoint();
963
+ const iterator = selectQueryRows(
964
+ bundleIndexes
965
+ ? bundleIndexes.get(bucket)
966
+ : this._readQueryIndex(manifest, bucket),
967
+ query,
968
+ after,
969
+ );
970
+ const next = iterator.next();
971
+ if (!next.done) heads.push({ bucket, iterator, row: next.value });
972
+ }
973
+ const selected = [];
974
+ for (const row of mergeQueryRows(heads)) {
975
+ selected.push(row);
976
+ if (selected.length > count) break;
977
+ if (selected.length % 256 === 0) await checkpoint();
978
+ }
979
+ const more = selected.length > count;
980
+ if (more) selected.pop();
981
+ const shards = new Map();
982
+ for (const { bucket } of selected) {
983
+ if (!shards.has(bucket)) {
984
+ await checkpoint();
985
+ shards.set(bucket, this._readShardBytes(manifest, bucket));
986
+ }
987
+ }
771
988
  return {
772
- legacy: records,
989
+ manifest,
990
+ selected,
991
+ shards,
773
992
  storeRevision: manifest.storeRevision,
774
- nextCursor:
775
- matches.length > count
776
- ? encodeListCursor(binding, records.at(-1))
777
- : null,
993
+ nextCursor: more
994
+ ? encodeListCursor(binding, selected.at(-1).row)
995
+ : null,
778
996
  };
779
- }
780
- // Merge each sorted posting lazily. Only the requested page is captured;
781
- // every candidate has already passed scope, sink and lifecycle filters.
782
- const heads = [];
783
- for (const bucket of Object.keys(manifest.shards)) {
784
- const iterator = selectQueryRows(
785
- this._readQueryIndex(manifest, bucket),
786
- query,
787
- after,
788
- );
789
- const next = iterator.next();
790
- if (!next.done) heads.push({ bucket, iterator, row: next.value });
791
- }
792
- const selected = [];
793
- for (const row of mergeQueryRows(heads)) {
794
- selected.push(row);
795
- if (selected.length > count) break;
796
- }
797
- const more = selected.length > count;
798
- if (more) selected.pop();
799
- const shards = new Map();
800
- for (const { bucket } of selected)
801
- if (!shards.has(bucket))
802
- shards.set(bucket, this._readShardBytes(manifest, bucket));
803
- return {
804
- manifest,
805
- selected,
806
- shards,
807
- storeRevision: manifest.storeRevision,
808
- nextCursor: more
809
- ? encodeListCursor(binding, selected.at(-1).row)
810
- : null,
811
- };
812
- });
997
+ },
998
+ { signal },
999
+ );
1000
+ await checkpoint(true);
813
1001
  if (captured.legacy)
814
1002
  return {
815
1003
  records: captured.legacy,
816
1004
  nextCursor: captured.nextCursor,
817
1005
  storeRevision: captured.storeRevision,
818
1006
  };
819
- const decoded = new Map(
820
- [...captured.shards].map(([bucket, bytes]) => [
1007
+ const decoded = new Map();
1008
+ for (const [bucket, bytes] of captured.shards) {
1009
+ await checkpoint();
1010
+ decoded.set(
821
1011
  bucket,
822
- this._decodeShard(captured.manifest, bucket, bytes),
823
- ]),
824
- );
825
- const records = captured.selected.map(({ bucket, row }) => {
1012
+ this._queryShardSnapshot(captured.manifest, bucket, bytes),
1013
+ );
1014
+ }
1015
+ const records = [];
1016
+ for (const { bucket, row } of captured.selected) {
1017
+ if (records.length % 256 === 0) await checkpoint();
826
1018
  const record = own(decoded.get(bucket).records, row.memoryId);
827
1019
  if (
828
1020
  !record ||
@@ -833,8 +1025,11 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
833
1025
  this.filePath,
834
1026
  "query index result disagrees with authority",
835
1027
  );
836
- return record;
837
- });
1028
+ // The cached graph is host-owned. A caller may edit its returned record
1029
+ // without changing another query's verified snapshot.
1030
+ records.push(cloneCanonical(record));
1031
+ }
1032
+ await checkpoint(true);
838
1033
  return {
839
1034
  records,
840
1035
  nextCursor: captured.nextCursor,
@@ -857,7 +1052,8 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
857
1052
  });
858
1053
  }
859
1054
 
860
- async query(request) {
1055
+ async query(request, { signal } = {}) {
1056
+ checkMemoryQueryAborted(signal);
861
1057
  if (request?.scopeAdmissions || request?.sink) {
862
1058
  // Do not push recall's limit before lexical/semantic ranking in the
863
1059
  // kernel. Push only gates that cannot discard an admissible result.
@@ -866,42 +1062,55 @@ export class SegmentedMemoryPort extends DurableJsonMemoryPort {
866
1062
  scopeAdmissions: request.scopeAdmissions,
867
1063
  sink: request.sink,
868
1064
  states: ["active", "reinforced"],
1065
+ signal,
869
1066
  })
870
1067
  ).records;
871
1068
  }
872
- const snapshot = await this._locked(() => {
873
- const manifest = this._loadManifest();
874
- if (manifest.schema === STORE_SCHEMA) return { legacy: manifest };
875
- let capturedBytes = 0;
876
- const shards = Object.keys(manifest.shards).map((bucket) => {
877
- const bytes = this._readShardBytes(manifest, bucket);
878
- capturedBytes += bytes.length;
879
- if (
880
- capturedBytes > manifest.totalBytes ||
881
- capturedBytes > this.maxTotalBytes
882
- )
883
- throw limit("snapshot exceeds aggregate byte limit");
884
- return [bucket, bytes];
885
- });
886
- if (capturedBytes !== manifest.totalBytes)
887
- throw corruptStore(
888
- this.filePath,
889
- "snapshot byte count does not match manifest",
890
- );
891
- return { manifest, shards };
892
- });
1069
+ const checkpoint = createMemoryQueryCheckpoint(signal);
1070
+ const snapshot = await this._locked(
1071
+ async () => {
1072
+ const manifest = this._loadManifest();
1073
+ if (manifest.schema === STORE_SCHEMA) return { legacy: manifest };
1074
+ let capturedBytes = 0;
1075
+ const shards = [];
1076
+ for (const bucket of Object.keys(manifest.shards)) {
1077
+ await checkpoint();
1078
+ const bytes = this._readShardBytes(manifest, bucket);
1079
+ capturedBytes += bytes.length;
1080
+ if (
1081
+ capturedBytes > manifest.totalBytes ||
1082
+ capturedBytes > this.maxTotalBytes
1083
+ )
1084
+ throw limit("snapshot exceeds aggregate byte limit");
1085
+ shards.push([bucket, bytes]);
1086
+ }
1087
+ if (capturedBytes !== manifest.totalBytes)
1088
+ throw corruptStore(
1089
+ this.filePath,
1090
+ "snapshot byte count does not match manifest",
1091
+ );
1092
+ return { manifest, shards };
1093
+ },
1094
+ { signal },
1095
+ );
1096
+ await checkpoint(true);
893
1097
  if (snapshot.legacy) return Object.values(snapshot.legacy.records);
894
1098
  // The lock protects capture of every byte in one manifest generation.
895
1099
  // Expensive validation uses owned buffers after releasing the lock, so GC
896
1100
  // and other readers/writers need not wait for whole-store JSON validation.
897
- return snapshot.shards.flatMap(([bucket, bytes]) =>
898
- Object.values(
1101
+ const records = [];
1102
+ for (const [bucket, bytes] of snapshot.shards) {
1103
+ await checkpoint();
1104
+ for (const record of Object.values(
899
1105
  this._decodeShard(snapshot.manifest, bucket, bytes).records,
900
- ),
901
- );
1106
+ ))
1107
+ records.push(record);
1108
+ }
1109
+ await checkpoint(true);
1110
+ return records;
902
1111
  }
903
- async getRevision() {
904
- return this._locked(() => this._loadManifest().storeRevision);
1112
+ async getRevision({ signal } = {}) {
1113
+ return this._locked(() => this._loadManifest().storeRevision, { signal });
905
1114
  }
906
1115
  async exportSnapshot() {
907
1116
  return this._locked(() => {